Merge "Check for Language::getSpecialPageAliases returning null in SpecialPageFactory"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Thu, 15 May 2014 16:09:21 +0000 (16:09 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Thu, 15 May 2014 16:09:21 +0000 (16:09 +0000)
432 files changed:
.gitattributes [new file with mode: 0644]
RELEASE-NOTES-1.23
RELEASE-NOTES-1.24
composer-example.json [deleted file]
composer.json [new file with mode: 0644]
docs/hooks.txt
img_auth.php
includes/Article.php
includes/AutoLoader.php
includes/Block.php
includes/Categoryfinder.php
includes/Collation.php
includes/DefaultSettings.php
includes/FeedUtils.php
includes/FileDeleteForm.php
includes/GlobalFunctions.php
includes/Hooks.php
includes/Html.php
includes/HtmlFormatter.php
includes/ImagePage.php
includes/ImageQueryPage.php
includes/Import.php
includes/Init.php
includes/Licenses.php
includes/Linker.php
includes/MWTimestamp.php
includes/MagicWord.php
includes/Message.php
includes/MessageBlobStore.php
includes/MimeMagic.php
includes/Namespace.php
includes/OutputHandler.php
includes/OutputPage.php
includes/PHPVersionError.php
includes/Pager.php
includes/Preferences.php
includes/PrefixSearch.php
includes/ProtectionForm.php
includes/QueryPage.php
includes/RevisionList.php
includes/Sanitizer.php
includes/Setup.php
includes/SiteConfiguration.php
includes/SiteStats.php
includes/Skin.php
includes/SkinTemplate.php
includes/SquidPurgeClient.php
includes/StatCounter.php
includes/StreamFile.php
includes/StubObject.php
includes/TimestampException.php
includes/Title.php
includes/TitleArrayFromResult.php
includes/User.php
includes/UserArrayFromResult.php
includes/UserMailer.php
includes/WatchedItem.php
includes/WebRequest.php
includes/WebStart.php
includes/Wiki.php
includes/WikiFilePage.php
includes/WikiPage.php
includes/Xml.php
includes/api/ApiBase.php
includes/api/ApiFeedContributions.php
includes/api/ApiFeedWatchlist.php
includes/api/ApiMain.php
includes/api/ApiQuerySiteinfo.php
includes/api/ApiRollback.php
includes/cache/LinkCache.php
includes/changes/RecentChange.php
includes/content/AbstractContent.php
includes/content/ContentHandler.php
includes/content/CssContent.php
includes/content/JavaScriptContent.php
includes/content/TextContent.php
includes/content/WikitextContent.php
includes/db/Database.php
includes/exception/MWException.php
includes/filebackend/FSFileBackend.php
includes/filebackend/FileBackend.php
includes/filebackend/SwiftFileBackend.php
includes/filerepo/FileRepo.php
includes/filerepo/file/File.php
includes/filerepo/file/ForeignDBFile.php
includes/filerepo/file/LocalFile.php
includes/gallery/ImageGalleryBase.php
includes/htmlform/HTMLHiddenField.php
includes/installer/Installer.php
includes/installer/OracleUpdater.php
includes/installer/PostgresUpdater.php
includes/installer/WebInstaller.php
includes/installer/WebInstallerPage.php
includes/installer/i18n/ar.json
includes/installer/i18n/be-tarask.json
includes/installer/i18n/ca.json
includes/installer/i18n/cs.json
includes/installer/i18n/de.json
includes/installer/i18n/en.json
includes/installer/i18n/es.json
includes/installer/i18n/fa.json
includes/installer/i18n/fr.json
includes/installer/i18n/he.json
includes/installer/i18n/id.json
includes/installer/i18n/ja.json
includes/installer/i18n/ksh.json
includes/installer/i18n/lb.json
includes/installer/i18n/mk.json
includes/installer/i18n/ms.json
includes/installer/i18n/pl.json
includes/installer/i18n/pt.json
includes/installer/i18n/qqq.json
includes/installer/i18n/ro.json
includes/installer/i18n/ru.json
includes/installer/i18n/sco.json
includes/installer/i18n/sk.json
includes/installer/i18n/zh-hant.json
includes/libs/JavaScriptMinifier.php
includes/libs/jsminplus.php
includes/libs/lessc.inc.php
includes/media/Bitmap.php
includes/media/Jpeg.php
includes/media/MediaTransformOutput.php
includes/objectcache/HashBagOStuff.php
includes/objectcache/MemcachedClient.php
includes/objectcache/MultiWriteBagOStuff.php
includes/objectcache/ObjectCache.php
includes/objectcache/SqlBagOStuff.php
includes/parser/CacheTime.php
includes/parser/CoreParserFunctions.php
includes/parser/DateFormatter.php
includes/parser/LinkHolderArray.php
includes/parser/Parser.php
includes/parser/ParserCache.php
includes/parser/ParserOptions.php
includes/parser/ParserOutput.php
includes/parser/Parser_DiffTest.php
includes/parser/Preprocessor.php
includes/parser/Preprocessor_DOM.php
includes/parser/Preprocessor_Hash.php
includes/poolcounter/PoolCounter.php
includes/poolcounter/PoolCounterRedis.php
includes/profiler/Profiler.php
includes/profiler/ProfilerSimpleDB.php
includes/profiler/ProfilerStub.php
includes/rcfeed/IRCColourfulRCFeedFormatter.php
includes/rcfeed/MachineReadableRCFeedFormatter.php
includes/resourceloader/ResourceLoader.php
includes/resourceloader/ResourceLoaderContext.php
includes/resourceloader/ResourceLoaderFileModule.php
includes/resourceloader/ResourceLoaderModule.php
includes/resourceloader/ResourceLoaderStartUpModule.php
includes/revisiondelete/RevisionDelete.php
includes/revisiondelete/RevisionDeleteAbstracts.php
includes/revisiondelete/RevisionDeleter.php
includes/search/SearchEngine.php
includes/search/SearchHighlighter.php
includes/search/SearchMssql.php
includes/search/SearchMySQL.php
includes/search/SearchOracle.php
includes/search/SearchSqlite.php
includes/site/MediaWikiSite.php
includes/site/Site.php
includes/site/SiteList.php
includes/site/SiteSQLStore.php
includes/specialpage/ChangesListSpecialPage.php
includes/specialpage/SpecialPageFactory.php
includes/specials/SpecialActiveusers.php
includes/specials/SpecialAllpages.php
includes/specials/SpecialBlock.php
includes/specials/SpecialBlockList.php
includes/specials/SpecialBooksources.php
includes/specials/SpecialBrokenRedirects.php
includes/specials/SpecialCachedPage.php
includes/specials/SpecialChangeEmail.php
includes/specials/SpecialChangePassword.php
includes/specials/SpecialContributions.php
includes/specials/SpecialCreateAccount.php
includes/specials/SpecialEditWatchlist.php
includes/specials/SpecialExport.php
includes/specials/SpecialImport.php
includes/specials/SpecialJavaScriptTest.php
includes/specials/SpecialListfiles.php
includes/specials/SpecialListgrouprights.php
includes/specials/SpecialLockdb.php
includes/specials/SpecialLog.php
includes/specials/SpecialMergeHistory.php
includes/specials/SpecialMovepage.php
includes/specials/SpecialNewimages.php
includes/specials/SpecialNewpages.php
includes/specials/SpecialProtectedpages.php
includes/specials/SpecialRevisiondelete.php
includes/specials/SpecialRunJobs.php
includes/specials/SpecialSearch.php
includes/specials/SpecialUserlogin.php
includes/specials/SpecialWatchlist.php
includes/templates/NoLocalSettings.php
includes/templates/Usercreate.php
includes/templates/Userlogin.php
includes/upload/UploadBase.php
includes/upload/UploadFromChunks.php
includes/upload/UploadFromFile.php
includes/upload/UploadFromStash.php
includes/upload/UploadFromUrl.php
includes/upload/UploadStash.php
includes/utils/ArrayUtils.php
includes/utils/Cdb.php
includes/utils/CdbPHP.php
includes/utils/ConfEditor.php [deleted file]
includes/utils/UIDGenerator.php
languages/Language.php
languages/LanguageConverter.php
languages/i18n/aeb.json
languages/i18n/af.json
languages/i18n/am.json
languages/i18n/an.json
languages/i18n/ar.json
languages/i18n/arz.json
languages/i18n/as.json
languages/i18n/ast.json
languages/i18n/avk.json
languages/i18n/az.json
languages/i18n/azb.json
languages/i18n/ba.json
languages/i18n/bcc.json
languages/i18n/bcl.json
languages/i18n/be-tarask.json
languages/i18n/be.json
languages/i18n/bg.json
languages/i18n/bjn.json
languages/i18n/bn.json
languages/i18n/br.json
languages/i18n/bs.json
languages/i18n/ca.json
languages/i18n/ce.json
languages/i18n/ckb.json
languages/i18n/co.json
languages/i18n/crh-cyrl.json
languages/i18n/crh-latn.json
languages/i18n/cs.json
languages/i18n/cy.json
languages/i18n/da.json
languages/i18n/de.json
languages/i18n/diq.json
languages/i18n/dsb.json
languages/i18n/egl.json
languages/i18n/el.json
languages/i18n/en.json
languages/i18n/eo.json
languages/i18n/es.json
languages/i18n/et.json
languages/i18n/eu.json
languages/i18n/ext.json
languages/i18n/fa.json
languages/i18n/fi.json
languages/i18n/fr.json
languages/i18n/frp.json
languages/i18n/frr.json
languages/i18n/fy.json
languages/i18n/ga.json
languages/i18n/gan-hans.json
languages/i18n/gan-hant.json
languages/i18n/gl.json
languages/i18n/grc.json
languages/i18n/gsw.json
languages/i18n/gu.json
languages/i18n/gv.json
languages/i18n/hak.json
languages/i18n/he.json
languages/i18n/hi.json
languages/i18n/hif-latn.json
languages/i18n/hr.json
languages/i18n/hrx.json
languages/i18n/hsb.json
languages/i18n/hu.json
languages/i18n/hy.json
languages/i18n/ia.json
languages/i18n/id.json
languages/i18n/ilo.json
languages/i18n/is.json
languages/i18n/it.json
languages/i18n/ja.json
languages/i18n/jv.json
languages/i18n/ka.json
languages/i18n/kab.json
languages/i18n/kiu.json
languages/i18n/kk-cyrl.json
languages/i18n/km.json
languages/i18n/ko.json
languages/i18n/krc.json
languages/i18n/ksh.json
languages/i18n/ku-latn.json
languages/i18n/la.json
languages/i18n/lb.json
languages/i18n/lez.json
languages/i18n/li.json
languages/i18n/lt.json
languages/i18n/lv.json
languages/i18n/lzh.json
languages/i18n/mai.json
languages/i18n/mdf.json
languages/i18n/mg.json
languages/i18n/mhr.json
languages/i18n/mk.json
languages/i18n/ml.json
languages/i18n/mn.json
languages/i18n/mr.json
languages/i18n/ms.json
languages/i18n/mt.json
languages/i18n/nah.json
languages/i18n/nan.json
languages/i18n/nb.json
languages/i18n/nds-nl.json
languages/i18n/ne.json
languages/i18n/nl.json
languages/i18n/nn.json
languages/i18n/oc.json
languages/i18n/or.json
languages/i18n/pam.json
languages/i18n/pl.json
languages/i18n/pms.json
languages/i18n/pnb.json
languages/i18n/ps.json
languages/i18n/pt-br.json
languages/i18n/pt.json
languages/i18n/qqq.json
languages/i18n/qu.json
languages/i18n/rm.json
languages/i18n/ro.json
languages/i18n/roa-tara.json
languages/i18n/ru.json
languages/i18n/rue.json
languages/i18n/sa.json
languages/i18n/sah.json
languages/i18n/scn.json
languages/i18n/sco.json
languages/i18n/sdc.json
languages/i18n/sgs.json
languages/i18n/sh.json
languages/i18n/si.json
languages/i18n/sk.json
languages/i18n/sl.json
languages/i18n/so.json
languages/i18n/sq.json
languages/i18n/sr-ec.json
languages/i18n/sr-el.json
languages/i18n/stq.json
languages/i18n/su.json
languages/i18n/sv.json
languages/i18n/sw.json
languages/i18n/szl.json
languages/i18n/ta.json
languages/i18n/te.json
languages/i18n/tg-cyrl.json
languages/i18n/th.json
languages/i18n/tk.json
languages/i18n/tl.json
languages/i18n/tr.json
languages/i18n/tt-cyrl.json
languages/i18n/tt-latn.json
languages/i18n/ug-arab.json
languages/i18n/uk.json
languages/i18n/uz.json
languages/i18n/vec.json
languages/i18n/vep.json
languages/i18n/vi.json
languages/i18n/vo.json
languages/i18n/vro.json
languages/i18n/wa.json
languages/i18n/yi.json
languages/i18n/yo.json
languages/i18n/yue.json
languages/i18n/zh-hans.json
languages/i18n/zh-hant.json
maintenance/Maintenance.php
maintenance/compareParserCache.php [new file with mode: 0644]
maintenance/generateJsonI18n.php
maintenance/install.php
maintenance/jsduck/categories.json
maintenance/language/languages.inc
maintenance/language/messageTypes.inc [deleted file]
maintenance/language/messages.inc [deleted file]
maintenance/language/rebuildLanguage.php [deleted file]
maintenance/language/writeMessagesArray.inc [deleted file]
maintenance/oracle/archives/patch-page_links_updated.sql [new file with mode: 0644]
maintenance/oracle/archives/patch-rc_source.sql [new file with mode: 0644]
maintenance/oracle/archives/patch-user_password_expire.sql
maintenance/oracle/tables.sql
maintenance/pageExists.php [new file with mode: 0644]
maintenance/runJobs.php
maintenance/update.php [changed mode: 0644->0755]
resources/Resources.php
resources/lib/jquery/jquery.js
resources/lib/jquery/jquery.migrate.js [new file with mode: 0644]
resources/lib/oojs-ui/i18n/de.json
resources/lib/oojs-ui/i18n/en.json
resources/lib/oojs-ui/i18n/fa.json
resources/lib/oojs-ui/i18n/krc.json
resources/lib/oojs-ui/i18n/qqq.json
resources/lib/oojs-ui/i18n/sr-el.json [new file with mode: 0644]
resources/lib/oojs-ui/oojs-ui.js
resources/lib/oojs-ui/oojs-ui.svg.css
resources/src/jquery/jquery.accessKeyLabel.js
resources/src/jquery/jquery.suggestions.js
resources/src/mediawiki.api/mediawiki.api.js
resources/src/mediawiki.api/mediawiki.api.watch.js
resources/src/mediawiki.page/mediawiki.page.watch.ajax.js
resources/src/mediawiki.special/mediawiki.special.css
resources/src/mediawiki/mediawiki.cookie.js [new file with mode: 0644]
resources/src/mediawiki/mediawiki.util.js
skins/common/commonPrint.css
skins/common/config.css
skins/common/shared.css
skins/common/wikibits.js
tests/parser/parserTest.inc
tests/phpunit/includes/MWNamespaceTest.php
tests/phpunit/includes/content/ContentHandlerTest.php
tests/phpunit/includes/content/CssContentTest.php
tests/phpunit/includes/content/TextContentTest.php
tests/phpunit/includes/parser/NewParserTest.php
tests/phpunit/includes/parser/ParserMethodsTest.php
tests/phpunit/install-phpunit.sh
tests/qunit/QUnitTestResources.php
tests/qunit/suites/resources/jquery/jquery.accessKeyLabel.test.js
tests/qunit/suites/resources/jquery/jquery.tablesorter.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.Title.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.cookie.test.js [new file with mode: 0644]
tests/qunit/suites/resources/mediawiki/mediawiki.jqueryMsg.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.user.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.util.test.js
thumb.php

diff --git a/.gitattributes b/.gitattributes
new file mode 100644 (file)
index 0000000..50ca329
--- /dev/null
@@ -0,0 +1 @@
+*.sh eol=lf
index 37e304d..d010358 100644 (file)
@@ -39,9 +39,12 @@ production.
 * $wgPasswordSenderName has been removed and is no longer functional. To set a
   custom mailer name, the system message 'emailsender' should be modified
   (default: "{{SITENAME}}").
-* If you customized [[MediaWiki:Enotif body]] (the text of email notifications),
+* (bug 63269) Email notifications were not correctly handling the
+  [[MediaWiki:Helppage]] message being set to a full URL (the default).
+  If you customized [[MediaWiki:Enotif body]] (the text of email notifications),
   you'll need to edit it locally to include the URL via the new variable
-  $HELPPAGE instead of the parser functions fullurl and canonicalurl.
+  $HELPPAGE instead of the parser functions fullurl and canonicalurl; otherwise
+  you don't have to do anything.
 * $wgDBAhandler was removed as the only class using it was also removed
 * The 'max threads' setting was removed from $wgDBservers.
 * Support for AdminSettings.php has been completely removed. All configuration
@@ -205,6 +208,8 @@ production.
   no longer applies in such cases.
 * (bug 60960) Avoid doing file_exist() checks on data: URIs, as they cause
   warnings to be printed on Windows due to large path length.
+* (bug 48084) Fixed a bug in the installer that could cause $wgLogo to hold
+  the wrong path to the placeholder logo (skins/common/images/wiki.png).
 
 === Web API changes in 1.23 ===
 * (bug 54884) action=parse&prop=categories now indicates hidden and missing
@@ -513,7 +518,7 @@ Don't forget to always back up your database before upgrading!
 
 See the file UPGRADE for more detailed upgrade instructions.
 
-For notes on 1.21.x and older releases, see HISTORY.
+For notes on 1.22.x and older releases, see HISTORY.
 
 == Online documentation ==
 
index 189c5f1..a666610 100644 (file)
@@ -9,16 +9,27 @@ MediaWiki 1.24 is an alpha-quality branch and is not recommended for use in
 production.
 
 === Configuration changes in 1.24 ===
+* The server's canonical hostname is available as $wgServerName, which is
+  exposed in both mw.config and ApiQuerySiteInfo.
 
 === New features in 1.24 ===
 * Added a new hook, "WhatLinksHereProps", to allow extensions to annotate
   WhatLinksHere entries.
+* Added a new hook, "ContentGetParserOutput", to customize parser output for
+  a given content object.
+* Deprecated the hook "ShowRawCssJs", use "ContentGetParserOutput" instead.
 * HTMLForm's HTMLTextField now supports the 'url' type.
 * HTMLForm fields may now be dynamically hidden based on the values of other
   fields in the form.
 * HTMLForm now supports multiple copies of an input field or set of input
   fields, e.g. the form may request "one or more usernames" without having to
   have the user enter delimited list of names into a text field.
+* Added a new hook, "SidebarBeforeOutput", to allow to edit the structure of
+  the sidebar just before its display.
+* (bug 49156) Added the mediawiki.cookie ResourceLoader module, which wraps
+  jQuery.cookie so that getting/setting a cookie is syntactically and functionally
+  similar to using the WebRequest#getCookie/WebResponse#setcookie methods.
+* (bug 44740) jQuery upgraded from 1.8.3 to 1.11.1.
 
 === Bug fixes in 1.24 ===
 * (bug 62258) A bug was fixed in File::getUnscaledThumb when a height
@@ -30,6 +41,7 @@ production.
   which used to collapse some sidebar elements by default.
 * (bug 890) Links in Special:RecentChanges and Special:Watchlist no longer
   follow redirects to their target pages.
+* Parser now dies early if called recursively, instead of producing subtle bugs.
 
 === Web API changes in 1.24 ===
 * action=parse API now supports prop=modules, which provides the list of
@@ -56,6 +68,40 @@ changes to languages because of Bugzilla reports.
 * CLDRPluralRuleConverter_Operator to CLDRPluralRuleConverterOperator
 * CLDRPluralRuleEvaluator_Range to CLDRPluralRuleEvaluatorRange
 * CSSJanus_Tokenizer to CSSJanusTokenizer
+* MediaWiki_I18N to MediaWikiI18N
+* RevDel_ArchiveItem to RevDelArchiveItem
+* RevDel_ArchiveList to RevDelArchiveList
+* RevDel_ArchivedFileItem to RevDelArchivedFileItem
+* RevDel_ArchivedFileList to RevDelArchivedFileList
+* RevDel_ArchivedRevisionItem to RevDelArchivedRevisionItem
+* RevDel_FileItem to RevDelFileItem
+* RevDel_FileList to RevDelFileList
+* RevDel_Item to RevDelItem
+* RevDel_List to RevDelList
+* RevDel_LogItem to RevDelLogItem
+* RevDel_LogList to RevDelLogList
+* RevDel_RevisionItem to RevDelRevisionItem
+* RevDel_RevisionList to RevDelRevisionList
+* WebInstaller_Complete to WebInstallerComplete
+* WebInstaller_Copying to WebInstallerCopying
+* WebInstaller_DBConnect to WebInstallerDBConnect
+* WebInstaller_DBSettings to WebInstallerDBSettings
+* WebInstaller_Document to WebInstallerDocument
+* WebInstaller_ExistingWiki to WebInstallerExistingWiki
+* WebInstaller_Install to WebInstallerInstall
+* WebInstaller_Language to WebInstallerLanguage
+* WebInstaller_Name to WebInstallerName
+* WebInstaller_Options to WebInstallerOptions
+* WebInstaller_Readme to WebInstallerReadme
+* WebInstaller_ReleaseNotes to WebInstallerReleaseNotes
+* WebInstaller_Restart to WebInstallerRestart
+* WebInstaller_Upgrade to WebInstallerUpgrade
+* WebInstaller_UpgradeDoc to WebInstallerUpgradeDoc
+* WebInstaller_Welcome to WebInstallerWelcome
+
+==== Removed classes ====
+* IPBlockForm - Use SpecialBlock directly
+* WatchlistEditor - Use SpecialEditWatchlist directly
 
 == Compatibility ==
 
@@ -75,7 +121,7 @@ The supported versions are:
 
 == Upgrading ==
 
-1.24 has several database changes since 1.22, and will not work without schema
+1.24 has several database changes since 1.23, and will not work without schema
 updates. Note that due to changes to some very large tables like the revision
 table, the schema update may take quite long (minutes on a medium sized site,
 many hours on a large site).
@@ -95,7 +141,7 @@ Don't forget to always back up your database before upgrading!
 
 See the file UPGRADE for more detailed upgrade instructions.
 
-For notes on 1.21.x and older releases, see HISTORY.
+For notes on 1.22.x and older releases, see HISTORY.
 
 == Online documentation ==
 
diff --git a/composer-example.json b/composer-example.json
deleted file mode 100644 (file)
index 85304c1..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
-{
-       "require": {
-               "php": ">=5.3.2"
-       },
-       "suggest": {
-               "ext-fileinfo": "More accurate file type detection for uploaded files",
-               "ext-mbstring": "Faster unicode handling",
-               "ext-wikidiff2": "Faster diff generation",
-               "ext-apc": "Speed up MediaWiki with opcode caching (before PHP 5.5)"
-       },
-       "autoload": {
-               "psr-0": {
-                       "ComposerHookHandler": "includes/composer"
-               }
-       },
-       "scripts": {
-               "pre-update-cmd": "ComposerHookHandler::onPreUpdate",
-               "pre-install-cmd": "ComposerHookHandler::onPreInstall"
-       }
-}
diff --git a/composer.json b/composer.json
new file mode 100644 (file)
index 0000000..ded3365
--- /dev/null
@@ -0,0 +1,30 @@
+{
+       "name": "mediawiki/core",
+       "description": "Free software wiki application developed by the Wikimedia Foundation and others",
+       "keywords": ["mediawiki", "wiki"],
+       "homepage": "https://www.mediawiki.org/",
+       "authors": [
+               {
+                       "name": "MediaWiki Community",
+                       "homepage": "https://www.mediawiki.org/wiki/Special:Version/Credits"
+               }
+       ],
+       "license": "GPL-2.0",
+       "support": {
+               "issues": "https://bugzilla.wikimedia.org/",
+               "irc": "irc://irc.freenode.net/mediawiki",
+               "wiki": "https://www.mediawiki.org/"
+       },
+       "require": {
+               "php": ">=5.3.2"
+       },
+       "require-dev": {
+               "phpunit/phpunit": "*"
+       },
+       "suggest": {
+               "ext-fileinfo": "*",
+               "ext-mbstring": "*",
+               "ext-wikidiff2": "*",
+               "ext-apc": "*"
+       }
+}
index 688e0cd..d1507a2 100644 (file)
@@ -250,6 +250,7 @@ $block: The block from which the autoblock is coming.
 'AbortEmailNotification': Can be used to cancel email notifications for an edit.
 $editor: The User who made the change.
 $title: The Title of the page that was edited.
+$rc: The current RecentChange object.
 
 'AbortLogin': Return false to cancel account login.
 $user: the User object being authenticated against
@@ -280,7 +281,7 @@ $title: the page title
 'SendWatchlistEmailNotification': Return true to send watchlist email notification
 $targetUser: the user whom to send watchlist email notification
 $title: the page title
-$this: EmailNotification object
+$enotif: EmailNotification object
 
 'AbortChangePassword': Return false to cancel password change.
 $user: the User object to which the password change is occuring
@@ -887,6 +888,19 @@ $title: the Title in question.
 Handler functions that modify $ok should generally return false to prevent further
 hooks from further modifying $ok.
 
+'ContentGetParserOutput': Customize parser output for a given content object,
+called by AbstractContent::getParserOutput. May be used to override the normal
+model-specific rendering of page content.
+$content: The Content to render
+$title: Title of the page, as context
+$revId: The revision ID, as context
+$options: ParserOptions for rendering. To avoid confusing the parser cache,
+the output can only depend on parameters provided to this hook function, not on global state.
+$generateHtml: boolean, indicating whether full HTML should be generated. If false,
+generation of HTML may be skipped, but other information should still be present in the
+ParserOutput object.
+&$output: ParserOutput, to manipulate or replace
+
 'ConvertContent': Called by AbstractContent::convert when a conversion to another
 content model is requested.
 $content: The Content object to be converted.
@@ -1623,6 +1637,11 @@ localisation checks.
 &$blacklist: array of checks to blacklist. See the bottom of
   maintenance/language/checkLanguage.inc for the format of this variable.
 
+'LocalisationIgnoredOptionalMessages': When fetching the list of ignored and
+optional localisation messages
+&$ignored Array of ignored message keys
+&$optional Array of optional message keys
+
 'LogEventsListShowLogExtract': Called before the string is added to OutputPage.
 Returning false will prevent the string from being added to the OutputPage.
 &$s: html string to show for the log extract
@@ -2171,7 +2190,7 @@ $title : Current Title object being displayed in search results.
 $article: The article object corresponding to the page
 
 'ShowRawCssJs': Customise the output of raw CSS and JavaScript in page views.
-DEPRECATED, use the ContentHandler facility to handle CSS and JavaScript!
+DEPRECATED, use the ContentGetParserOutput hook instead!
 $text: Text being shown
 $title: Title of the custom script/stylesheet page
 $output: Current OutputPage object
@@ -2226,6 +2245,12 @@ $skin: Skin object
 &$bar: Sidebar contents
 Modify $bar to add or modify sidebar portlets.
 
+'SidebarBeforeOutput': Allows to edit sidebar just before its output by skins.
+$skin Skin object
+&$bar: Sidebar content
+Modify $bar to add or modify sidebar portlets.
+Warning: This hook is run on each display. You should consider to use 'SkinBuildSidebar' that is aggressively cached.
+
 'SkinCopyrightFooter': Allow for site and per-namespace customization of
 copyright notice.
 $title: displayed page title
@@ -2596,7 +2621,7 @@ $user: Current user object
 &$whitelisted: Boolean value of whether this title is whitelisted
 
 'TitleSquidURLs': Called to determine which URLs to purge from HTTP caches.
-$this: Title object to purge
+$title: Title object to purge
 &$urls: An array of URLs to purge from the caches, to be manipulated.
 
 'UndeleteForm::showHistory': Called in UndeleteForm::showHistory, after a
index a3485df..6f449c6 100644 (file)
@@ -106,14 +106,15 @@ function wfImageAuthMain() {
 
        // Get the local file repository
        $repo = RepoGroup::singleton()->getRepo( 'local' );
+       $zone = strstr( ltrim( $path, '/' ), '/', true );
 
        // Get the full file storage path and extract the source file name.
        // (e.g. 120px-Foo.png => Foo.png or page2-120px-Foo.png => Foo.png).
-       // This only applies to thumbnails, and all thumbnails should
+       // This only applies to thumbnails/transcoded, and each of them should
        // be under a folder that has the source file name.
-       if ( strpos( $path, '/thumb/' ) === 0 ) {
-               $name = wfBaseName( dirname( $path ) ); // file is a thumbnail
-               $filename = $repo->getZonePath( 'thumb' ) . substr( $path, 6 ); // strip "/thumb"
+       if ( $zone === 'thumb' || $zone === 'transcoded' ) {
+               $name = wfBaseName( dirname( $path ) );
+               $filename = $repo->getZonePath( $zone ) . substr( $path, strlen( "/".$zone ) );
                // Check to see if the file exists
                if ( !$repo->fileExists( $filename ) ) {
                        wfForbidden( 'img-auth-accessdenied', 'img-auth-nofile', $filename );
index 0a4b5ee..3bb1563 100644 (file)
@@ -832,8 +832,9 @@ class Article implements Page {
         * Show a page view for a page formatted as CSS or JavaScript. To be called by
         * Article::view() only.
         *
-        * This is hooked by SyntaxHighlight_GeSHi to do syntax highlighting of these
-        * page views.
+        * This exists mostly to serve the deprecated ShowRawCssJs hook (used to customize these views).
+        * It has been replaced by the ContentGetParserOutput hook, which lets you do the same but with
+        * more flexibility.
         *
         * @param bool $showCacheHint Whether to show a message telling the user
         *   to clear the browser cache (default: true).
index bfee420..515386c 100644 (file)
@@ -135,7 +135,7 @@ $wgAutoloadLocalClasses = array(
        'MagicWordArray' => 'includes/MagicWord.php',
        'MailAddress' => 'includes/UserMailer.php',
        'MediaWiki' => 'includes/Wiki.php',
-       'MediaWiki_I18N' => 'includes/SkinTemplate.php',
+       'MediaWikiI18N' => 'includes/SkinTemplate.php',
        'MediaWikiVersionFetcher' => 'includes/MediaWikiVersionFetcher.php',
        'Message' => 'includes/Message.php',
        'MessageBlobStore' => 'includes/MessageBlobStore.php',
@@ -622,22 +622,22 @@ $wgAutoloadLocalClasses = array(
        'SqliteInstaller' => 'includes/installer/SqliteInstaller.php',
        'SqliteUpdater' => 'includes/installer/SqliteUpdater.php',
        'WebInstaller' => 'includes/installer/WebInstaller.php',
-       'WebInstaller_Complete' => 'includes/installer/WebInstallerPage.php',
-       'WebInstaller_Copying' => 'includes/installer/WebInstallerPage.php',
-       'WebInstaller_DBConnect' => 'includes/installer/WebInstallerPage.php',
-       'WebInstaller_DBSettings' => 'includes/installer/WebInstallerPage.php',
-       'WebInstaller_Document' => 'includes/installer/WebInstallerPage.php',
-       'WebInstaller_ExistingWiki' => 'includes/installer/WebInstallerPage.php',
-       'WebInstaller_Install' => 'includes/installer/WebInstallerPage.php',
-       'WebInstaller_Language' => 'includes/installer/WebInstallerPage.php',
-       'WebInstaller_Name' => 'includes/installer/WebInstallerPage.php',
-       'WebInstaller_Options' => 'includes/installer/WebInstallerPage.php',
-       'WebInstaller_Readme' => 'includes/installer/WebInstallerPage.php',
-       'WebInstaller_ReleaseNotes' => 'includes/installer/WebInstallerPage.php',
-       'WebInstaller_Restart' => 'includes/installer/WebInstallerPage.php',
-       'WebInstaller_Upgrade' => 'includes/installer/WebInstallerPage.php',
-       'WebInstaller_UpgradeDoc' => 'includes/installer/WebInstallerPage.php',
-       'WebInstaller_Welcome' => 'includes/installer/WebInstallerPage.php',
+       'WebInstallerComplete' => 'includes/installer/WebInstallerPage.php',
+       'WebInstallerCopying' => 'includes/installer/WebInstallerPage.php',
+       'WebInstallerDBConnect' => 'includes/installer/WebInstallerPage.php',
+       'WebInstallerDBSettings' => 'includes/installer/WebInstallerPage.php',
+       'WebInstallerDocument' => 'includes/installer/WebInstallerPage.php',
+       'WebInstallerExistingWiki' => 'includes/installer/WebInstallerPage.php',
+       'WebInstallerInstall' => 'includes/installer/WebInstallerPage.php',
+       'WebInstallerLanguage' => 'includes/installer/WebInstallerPage.php',
+       'WebInstallerName' => 'includes/installer/WebInstallerPage.php',
+       'WebInstallerOptions' => 'includes/installer/WebInstallerPage.php',
+       'WebInstallerReadme' => 'includes/installer/WebInstallerPage.php',
+       'WebInstallerReleaseNotes' => 'includes/installer/WebInstallerPage.php',
+       'WebInstallerRestart' => 'includes/installer/WebInstallerPage.php',
+       'WebInstallerUpgrade' => 'includes/installer/WebInstallerPage.php',
+       'WebInstallerUpgradeDoc' => 'includes/installer/WebInstallerPage.php',
+       'WebInstallerWelcome' => 'includes/installer/WebInstallerPage.php',
        'WebInstallerOutput' => 'includes/installer/WebInstallerOutput.php',
        'WebInstallerPage' => 'includes/installer/WebInstallerPage.php',
 
@@ -876,19 +876,19 @@ $wgAutoloadLocalClasses = array(
        'ResourceLoaderWikiModule' => 'includes/resourceloader/ResourceLoaderWikiModule.php',
 
        # includes/revisiondelete
-       'RevDel_ArchivedFileItem' => 'includes/revisiondelete/RevisionDelete.php',
-       'RevDel_ArchivedFileList' => 'includes/revisiondelete/RevisionDelete.php',
-       'RevDel_ArchivedRevisionItem' => 'includes/revisiondelete/RevisionDelete.php',
-       'RevDel_ArchiveItem' => 'includes/revisiondelete/RevisionDelete.php',
-       'RevDel_ArchiveList' => 'includes/revisiondelete/RevisionDelete.php',
-       'RevDel_FileItem' => 'includes/revisiondelete/RevisionDelete.php',
-       'RevDel_FileList' => 'includes/revisiondelete/RevisionDelete.php',
-       'RevDel_Item' => 'includes/revisiondelete/RevisionDeleteAbstracts.php',
-       'RevDel_List' => 'includes/revisiondelete/RevisionDeleteAbstracts.php',
-       'RevDel_LogItem' => 'includes/revisiondelete/RevisionDelete.php',
-       'RevDel_LogList' => 'includes/revisiondelete/RevisionDelete.php',
-       'RevDel_RevisionItem' => 'includes/revisiondelete/RevisionDelete.php',
-       'RevDel_RevisionList' => 'includes/revisiondelete/RevisionDelete.php',
+       'RevDelArchivedFileItem' => 'includes/revisiondelete/RevisionDelete.php',
+       'RevDelArchivedFileList' => 'includes/revisiondelete/RevisionDelete.php',
+       'RevDelArchivedRevisionItem' => 'includes/revisiondelete/RevisionDelete.php',
+       'RevDelArchiveItem' => 'includes/revisiondelete/RevisionDelete.php',
+       'RevDelArchiveList' => 'includes/revisiondelete/RevisionDelete.php',
+       'RevDelFileItem' => 'includes/revisiondelete/RevisionDelete.php',
+       'RevDelFileList' => 'includes/revisiondelete/RevisionDelete.php',
+       'RevDelItem' => 'includes/revisiondelete/RevisionDeleteAbstracts.php',
+       'RevDelList' => 'includes/revisiondelete/RevisionDeleteAbstracts.php',
+       'RevDelLogItem' => 'includes/revisiondelete/RevisionDelete.php',
+       'RevDelLogList' => 'includes/revisiondelete/RevisionDelete.php',
+       'RevDelRevisionItem' => 'includes/revisiondelete/RevisionDelete.php',
+       'RevDelRevisionList' => 'includes/revisiondelete/RevisionDelete.php',
        'RevisionDeleter' => 'includes/revisiondelete/RevisionDeleter.php',
        'RevisionDeleteUser' => 'includes/revisiondelete/RevisionDeleteUser.php',
 
@@ -952,7 +952,6 @@ $wgAutoloadLocalClasses = array(
        'HTMLBlockedUsersItemSelect' => 'includes/specials/SpecialBlockList.php',
        'ImageListPager' => 'includes/specials/SpecialListfiles.php',
        'ImportReporter' => 'includes/specials/SpecialImport.php',
-       'IPBlockForm' => 'includes/specials/SpecialBlock.php',
        'LinkSearchPage' => 'includes/specials/SpecialLinkSearch.php',
        'ListredirectsPage' => 'includes/specials/SpecialListredirects.php',
        'ListDuplicatedFilesPage' => 'includes/specials/SpecialListDuplicatedFiles.php',
@@ -1063,7 +1062,6 @@ $wgAutoloadLocalClasses = array(
        'WantedFilesPage' => 'includes/specials/SpecialWantedfiles.php',
        'WantedPagesPage' => 'includes/specials/SpecialWantedpages.php',
        'WantedTemplatesPage' => 'includes/specials/SpecialWantedtemplates.php',
-       'WatchlistEditor' => 'includes/specials/SpecialEditWatchlist.php',
        'WithoutInterwikiPage' => 'includes/specials/SpecialWithoutinterwiki.php',
 
        # includes/templates
@@ -1107,9 +1105,6 @@ $wgAutoloadLocalClasses = array(
        'CdbWriter' => 'includes/utils/Cdb.php',
        'CdbWriterDBA' => 'includes/utils/CdbDBA.php',
        'CdbWriterPHP' => 'includes/utils/CdbPHP.php',
-       'ConfEditor' => 'includes/utils/ConfEditor.php',
-       'ConfEditorParseError' => 'includes/utils/ConfEditor.php',
-       'ConfEditorToken' => 'includes/utils/ConfEditor.php',
        'DoubleReplacer' => 'includes/utils/StringUtils.php',
        'ExplodeIterator' => 'includes/utils/StringUtils.php',
        'HashtableReplacer' => 'includes/utils/StringUtils.php',
@@ -1168,7 +1163,6 @@ $wgAutoloadLocalClasses = array(
        'CsvStatsOutput' => 'maintenance/language/StatOutputs.php',
        'ExtensionLanguages' => 'maintenance/language/languages.inc',
        'Languages' => 'maintenance/language/languages.inc',
-       'MessageWriter' => 'maintenance/language/writeMessagesArray.inc',
        'StatsOutput' => 'maintenance/language/StatOutputs.php',
        'TextStatsOutput' => 'maintenance/language/StatOutputs.php',
        'WikiStatsOutput' => 'maintenance/language/StatOutputs.php',
index d9fa54d..b6976b0 100644 (file)
  * @file
  */
 class Block {
-       /* public*/ var $mReason, $mTimestamp, $mAuto, $mExpiry, $mHideName;
+       /** @var string */
+       public $mReason;
 
-       protected
-               $mId,
-               $mFromMaster,
+       /** @var bool|string */
+       public $mTimestamp;
 
-               $mBlockEmail,
-               $mDisableUsertalk,
-               $mCreateAccount,
-               $mParentBlockId;
+       /** @var int */
+       public $mAuto;
+
+       /** @var bool|string */
+       public $mExpiry;
+
+       public $mHideName;
+
+       /** @var int */
+       public $mParentBlockId;
+
+       /** @var int */
+       protected $mId;
+
+       /** @var bool */
+       protected $mFromMaster;
+
+       /** @var bool */
+       protected $mBlockEmail;
+
+       /** @var bool */
+       protected $mDisableUsertalk;
+
+       /** @var bool */
+       protected $mCreateAccount;
 
        /** @var User|string */
        protected $target;
@@ -57,9 +78,8 @@ class Block {
        const TYPE_ID = 5;
 
        /**
-        * Constructor
-        * @todo FIXME: Don't know what the best format to have for this constructor is, but fourteen
-        * optional parameters certainly isn't it.
+        * @todo FIXME: Don't know what the best format to have for this constructor
+        *   is, but fourteen optional parameters certainly isn't it.
         */
        function __construct( $address = '', $user = 0, $by = 0, $reason = '',
                $timestamp = 0, $auto = 0, $expiry = '', $anonOnly = 0, $createAccount = 0, $enableAutoblock = 0,
index 720f6f8..b9cbc9a 100644 (file)
  *
  */
 class Categoryfinder {
-       var $articles = array(); # The original article IDs passed to the seed function
-       var $deadend = array(); # Array of DBKEY category names for categories that don't have a page
-       var $parents = array(); # Array of [ID => array()]
-       var $next = array(); # Array of article/category IDs
-       var $targets = array(); # Array of DBKEY category names
-       var $name2id = array();
-       var $mode; # "AND" or "OR"
+       /** @var int[] The original article IDs passed to the seed function */
+       protected $articles = array();
 
-       /**
-        * @var DatabaseBase
-        */
-       var $dbr; # Read-DB slave
+       /** @var array Array of DBKEY category names for categories that don't have a page */
+       protected $deadend = array();
+
+       /** @var array Array of [ID => array()] */
+       protected $parents = array();
+
+       /** @var array Array of article/category IDs */
+       protected $next = array();
+
+       /** @var array Array of DBKEY category names */
+       protected $targets = array();
+
+       /** @var array */
+       protected $name2id = array();
+
+       /** @var  "AND" or "OR" */
+       protected $mode;
+
+       /** @var DatabaseBase Read-DB slave */
+       protected $dbr;
 
-       /**
-        * Constructor (currently empty).
-        */
        function __construct() {
        }
 
index 071a278..4e0c6a4 100644 (file)
@@ -21,7 +21,7 @@
  */
 
 abstract class Collation {
-       static $instance;
+       private static $instance;
 
        /**
         * @return Collation
@@ -108,7 +108,8 @@ abstract class Collation {
 }
 
 class UppercaseCollation extends Collation {
-       var $lang;
+       private $lang;
+
        function __construct() {
                // Get a language object so that we can use the generic UTF-8 uppercase
                // function there
@@ -153,8 +154,20 @@ class IdentityCollation extends Collation {
 class IcuCollation extends Collation {
        const FIRST_LETTER_VERSION = 2;
 
-       var $primaryCollator, $mainCollator, $locale, $digitTransformLanguage;
-       var $firstLetterData;
+       /** @var Collator */
+       private $primaryCollator;
+
+       /** @var Collator */
+       private $mainCollator;
+
+       /** @var  */
+       private $locale;
+
+       /** @var Language */
+       protected $digitTransformLanguage;
+
+       /** @var array */
+       private $firstLetterData;
 
        /**
         * Unified CJK blocks.
@@ -165,7 +178,7 @@ class IcuCollation extends Collation {
         * is pretty useless for sorting Chinese text anyway. Japanese and Korean
         * blocks are not included here, because they are smaller and more useful.
         */
-       static $cjkBlocks = array(
+       private static $cjkBlocks = array(
                array( 0x2E80, 0x2EFF ), // CJK Radicals Supplement
                array( 0x2F00, 0x2FDF ), // Kangxi Radicals
                array( 0x2FF0, 0x2FFF ), // Ideographic Description Characters
@@ -204,14 +217,19 @@ class IcuCollation extends Collation {
         * Empty arrays are intended; this signifies that the data for the language is
         * available and that there are, in fact, no additional letters to consider.
         */
-       static $tailoringFirstLetters = array(
+       private static $tailoringFirstLetters = array(
                // Verified by native speakers
                'be' => array( "Ё" ),
                'be-tarask' => array( "Ё" ),
+               'cy' => array( "Ch", "Dd", "Ff", "Ng", "Ll", "Ph", "Rh", "Th" ),
                'en' => array(),
+               'fa' => array( "آ", "ء", "ه" ),
                'fi' => array( "Å", "Ä", "Ö" ),
+               'fr' => array(),
                'hu' => array( "Cs", "Dz", "Dzs", "Gy", "Ly", "Ny", "Ö", "Sz", "Ty", "Ü", "Zs" ),
+               'is' => array( "Á", "Ð", "É", "Í", "Ó", "Ú", "Ý", "Þ", "Æ", "Ö", "Å" ),
                'it' => array(),
+               'lv' => array( "Č", "Ģ", "Ķ", "Ļ", "Ņ", "Š", "Ž" ),
                'pl' => array( "Ą", "Ć", "Ę", "Ł", "Ń", "Ó", "Ś", "Ź", "Ż" ),
                'pt' => array(),
                'ru' => array(),
@@ -229,7 +247,6 @@ class IcuCollation extends Collation {
                'ca' => array(),
                'co' => array(),
                'cs' => array( "Č", "Ch", "Ř", "Š", "Ž" ),
-               'cy' => array( "Ch", "Dd", "Ff", "Ng", "Ll", "Ph", "Rh", "Th" ),
                'da' => array( "Æ", "Ø", "Å" ),
                'de' => array(),
                'dsb' => array( "Č", "Ć", "Dź", "Ě", "Ch", "Ł", "Ń", "Ŕ", "Š", "Ś", "Ž", "Ź" ),
@@ -238,9 +255,7 @@ class IcuCollation extends Collation {
                'es' => array( "Ñ" ),
                'et' => array( "Š", "Ž", "Õ", "Ä", "Ö", "Ü" ),
                'eu' => array( "Ñ" ),
-               'fa' => array( "آ", "ء", "ه" ),
                'fo' => array( "Á", "Ð", "Í", "Ó", "Ú", "Ý", "Æ", "Ø", "Å" ),
-               'fr' => array(),
                'fur' => array( "À", "Á", "Â", "È", "Ì", "Ò", "Ù" ),
                'fy' => array(),
                'ga' => array(),
@@ -248,7 +263,6 @@ class IcuCollation extends Collation {
                'gl' => array( "Ch", "Ll", "Ñ" ),
                'hr' => array( "Č", "Ć", "Dž", "Đ", "Lj", "Nj", "Š", "Ž" ),
                'hsb' => array( "Č", "Dź", "Ě", "Ch", "Ł", "Ń", "Ř", "Š", "Ć", "Ž" ),
-               'is' => array( "Á", "Ð", "É", "Í", "Ó", "Ú", "Ý", "Þ", "Æ", "Ö", "Å" ),
                'kk' => array( "Ү", "І" ),
                'kl' => array( "Æ", "Ø", "Å" ),
                'ku' => array( "Ç", "Ê", "Î", "Ş", "Û" ),
@@ -256,7 +270,6 @@ class IcuCollation extends Collation {
                'la' => array(),
                'lb' => array(),
                'lt' => array( "Č", "Š", "Ž" ),
-               'lv' => array( "Č", "Ģ", "Ķ", "Ļ", "Ņ", "Š", "Ž" ),
                'mk' => array(),
                'mo' => array( "Ă", "Â", "Î", "Ş", "Ţ" ),
                'mt' => array( "Ċ", "Ġ", "Għ", "Ħ", "Ż" ),
index c281893..e011d4a 100644 (file)
@@ -104,6 +104,13 @@ $wgServer = WebRequest::detectServer();
  */
 $wgCanonicalServer = false;
 
+/**
+ * Server name. This is automatically computed by parsing the bare
+ * hostname out of $wgCanonicalServer. It should not be customized.
+ * @since 1.24
+ */
+$wgServerName = false;
+
 /************************************************************************//**
  * @name   Script path settings
  * @{
@@ -1304,21 +1311,22 @@ $wgDjvuOutputExtension = 'jpg';
  * @{
  */
 
-$serverName = substr( $wgServer, strrpos( $wgServer, '/' ) + 1 );
 
 /**
  * Site admin email address.
+ *
+ * Defaults to "wikiadmin@{$wgServerName}".
  */
-$wgEmergencyContact = 'wikiadmin@' . $serverName;
+$wgEmergencyContact = false;
 
 /**
  * Password reminder email address.
  *
  * The address we should use as sender when a user is requesting his password.
+ *
+ * Defaults to "apache@{$wgServerName}".
  */
-$wgPasswordSender = 'apache@' . $serverName;
-
-unset( $serverName ); # Don't leak local variables to global scope
+$wgPasswordSender = false;
 
 /**
  * Password reminder name
@@ -2885,11 +2893,6 @@ $wgShowIPinHeader = true;
  */
 $wgSiteNotice = '';
 
-/**
- * A subtitle to add to the tagline, for skins that have it/
- */
-$wgExtraSubtitle = '';
-
 /**
  * If this is set, a "donate" link will appear in the sidebar. Set it to a URL.
  */
@@ -3605,6 +3608,9 @@ $wgNamespacesWithSubpages = array(
  * Tracking categories allow pages with certain characteristics to be tracked.
  * It works by adding any such page to a category automatically.
  *
+ * A message with the suffix '-desc' should be added as a description message
+ * to have extra information on Special:TrackingCategories.
+ *
  * @since 1.23
  */
 $wgTrackingCategories = array(
@@ -3615,6 +3621,8 @@ $wgTrackingCategories = array(
        'post-expand-template-inclusion-category',
        'hidden-category-category',
        'broken-file-category',
+       'node-count-exceeded-category',
+       'expansion-depth-exceeded-category',
 );
 
 /**
@@ -4252,6 +4260,7 @@ $wgGroupPermissions['*']['editmyoptions'] = true;
 $wgGroupPermissions['user']['move'] = true;
 $wgGroupPermissions['user']['move-subpages'] = true;
 $wgGroupPermissions['user']['move-rootuserpages'] = true; // can move root userpages
+$wgGroupPermissions['user']['move-categorypages'] = true;
 $wgGroupPermissions['user']['movefile'] = true;
 $wgGroupPermissions['user']['read'] = true;
 $wgGroupPermissions['user']['edit'] = true;
@@ -4299,6 +4308,7 @@ $wgGroupPermissions['sysop']['importupload'] = true;
 $wgGroupPermissions['sysop']['move'] = true;
 $wgGroupPermissions['sysop']['move-subpages'] = true;
 $wgGroupPermissions['sysop']['move-rootuserpages'] = true;
+$wgGroupPermissions['sysop']['move-categorypages'] = true;
 $wgGroupPermissions['sysop']['patrol'] = true;
 $wgGroupPermissions['sysop']['autopatrol'] = true;
 $wgGroupPermissions['sysop']['protect'] = true;
@@ -6176,6 +6186,7 @@ $wgJobTypesExcludedFromDefaultQueue = array( 'AssembleUploadChunks', 'PublishSta
  * may have a variable number of work items, as is the case with batch jobs.
  * This is used by runJobs.php and not jobs run via $wgJobRunRate.
  * These settings should be global to all wikis.
+ * @var float[]
  */
 $wgJobBackoffThrottling = array();
 
index d407a0e..83ce755 100644 (file)
@@ -102,7 +102,9 @@ class FeedUtils {
         * @param string $actiontext Text of the action; in case of log event
         * @return string
         */
-       public static function formatDiffRow( $title, $oldid, $newid, $timestamp, $comment, $actiontext = '' ) {
+       public static function formatDiffRow( $title, $oldid, $newid, $timestamp,
+               $comment, $actiontext = ''
+       ) {
                global $wgFeedDiffCutoff, $wgLang;
                wfProfileIn( __METHOD__ );
 
@@ -245,9 +247,15 @@ class FeedUtils {
                        'diff'             => 'background-color: white; color:black;',
                        'diff-otitle'      => 'background-color: white; color:black; text-align: center;',
                        'diff-ntitle'      => 'background-color: white; color:black; text-align: center;',
-                       'diff-addedline'   => 'color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;',
-                       'diff-deletedline' => 'color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;',
-                       'diff-context'     => 'background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;',
+                       'diff-addedline'   => 'color:black; font-size: 88%; border-style: solid; '
+                               . 'border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; '
+                               . 'vertical-align: top; white-space: pre-wrap;',
+                       'diff-deletedline' => 'color:black; font-size: 88%; border-style: solid; '
+                               . 'border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; '
+                               . 'vertical-align: top; white-space: pre-wrap;',
+                       'diff-context'     => 'background-color: #f9f9f9; color: #333333; font-size: 88%; '
+                               . 'border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; '
+                               . 'border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;',
                        'diffchange'       => 'font-weight: bold; text-decoration: none;',
                );
 
index 642c49e..b4e2458 100644 (file)
@@ -83,7 +83,10 @@ class FileDeleteForm {
                $suppress = $wgRequest->getVal( 'wpSuppress' ) && $wgUser->isAllowed( 'suppressrevision' );
 
                if ( $this->oldimage ) {
-                       $this->oldfile = RepoGroup::singleton()->getLocalRepo()->newFromArchiveName( $this->title, $this->oldimage );
+                       $this->oldfile = RepoGroup::singleton()->getLocalRepo()->newFromArchiveName(
+                               $this->title,
+                               $this->oldimage
+                       );
                }
 
                if ( !self::haveDeletableFile( $this->file, $this->oldfile, $this->oldimage ) ) {
@@ -107,11 +110,20 @@ class FileDeleteForm {
                                $reason = $deleteReasonList;
                        }
 
-                       $status = self::doDelete( $this->title, $this->file, $this->oldimage, $reason, $suppress, $wgUser );
+                       $status = self::doDelete(
+                               $this->title,
+                               $this->file,
+                               $this->oldimage,
+                               $reason,
+                               $suppress,
+                               $wgUser
+                       );
 
                        if ( !$status->isGood() ) {
                                $wgOut->addHTML( '<h2>' . $this->prepareMessage( 'filedeleteerror-short' ) . "</h2>\n" );
-                               $wgOut->addWikiText( '<div class="error">' . $status->getWikiText( 'filedeleteerror-short', 'filedeleteerror-long' ) . '</div>' );
+                               $wgOut->addWikiText( '<div class="error">' .
+                                       $status->getWikiText( 'filedeleteerror-short', 'filedeleteerror-long' )
+                                       . '</div>' );
                        }
                        if ( $status->ok ) {
                                $wgOut->setPageTitle( wfMessage( 'actioncomplete' ) );
@@ -141,7 +153,9 @@ class FileDeleteForm {
         * @throws MWException
         * @return bool|Status
         */
-       public static function doDelete( &$title, &$file, &$oldimage, $reason, $suppress, User $user = null ) {
+       public static function doDelete( &$title, &$file, &$oldimage, $reason,
+               $suppress, User $user = null
+       ) {
                if ( $user === null ) {
                        global $wgUser;
                        $user = $wgUser;
@@ -188,7 +202,8 @@ class FileDeleteForm {
                                        }
                                }
                        } catch ( MWException $e ) {
-                               // rollback before returning to prevent UI from displaying incorrect "View or restore N deleted edits?"
+                               // Rollback before returning to prevent UI from displaying
+                               // incorrect "View or restore N deleted edits?"
                                $dbw->rollback( __METHOD__ );
                                throw $e;
                        }
@@ -266,8 +281,14 @@ class FileDeleteForm {
                        <tr>
                                <td></td>
                                <td class='mw-submit'>" .
-                                       Xml::submitButton( wfMessage( 'filedelete-submit' )->text(),
-                                               array( 'name' => 'mw-filedelete-submit', 'id' => 'mw-filedelete-submit', 'tabindex' => '4' ) ) .
+                                       Xml::submitButton(
+                                               wfMessage( 'filedelete-submit' )->text(),
+                                               array(
+                                                       'name' => 'mw-filedelete-submit',
+                                                       'id' => 'mw-filedelete-submit',
+                                                       'tabindex' => '4'
+                                               )
+                                       ) .
                                "</td>
                        </tr>" .
                        Xml::closeElement( 'table' ) .
@@ -309,8 +330,10 @@ class FileDeleteForm {
        private function prepareMessage( $message ) {
                global $wgLang;
                if ( $this->oldimage ) {
+                       # Message keys used:
+                       # 'filedelete-intro-old', 'filedelete-nofile-old', 'filedelete-success-old'
                        return wfMessage(
-                               "{$message}-old", # To ensure grep will find them: 'filedelete-intro-old', 'filedelete-nofile-old', 'filedelete-success-old'
+                               "{$message}-old",
                                wfEscapeWikiText( $this->title->getText() ),
                                $wgLang->date( $this->getTimestamp(), true ),
                                $wgLang->time( $this->getTimestamp(), true ),
index d94d2f1..ed99aa9 100644 (file)
@@ -2922,8 +2922,10 @@ function wfShellExec( $cmd, &$retval = null, $environ = array(),
                $readyPipes = $pipes;
 
                // Clear last error
+               // @codingStandardsIgnoreStart Generic.PHP.NoSilencedErrors.Discouraged
                @trigger_error( '' );
                if ( @stream_select( $readyPipes, $emptyArray, $emptyArray, null ) === false ) {
+                       // @codingStandardsIgnoreEnd
                        $error = error_get_last();
                        if ( strncmp( $error['message'], $eintrMessage, strlen( $eintrMessage ) ) == 0 ) {
                                continue;
@@ -3407,9 +3409,11 @@ function wfBaseConvert( $input, $sourceBase, $destBase, $pad = 1,
                        $decimal = bcadd( $decimal, $baseChars[$char] );
                }
 
+               // @codingStandardsIgnoreStart Generic.CodeAnalysis.ForLoopWithTestFunctionCall.NotAllowed
                for ( $result = ''; bccomp( $decimal, 0 ); $decimal = bcdiv( $decimal, $destBase, 0 ) ) {
                        $result .= $baseChars[bcmod( $decimal, $destBase )];
                }
+               // @codingStandardsIgnoreEnd
 
                $result = strrev( $result );
        } else {
index 785e717..89457e8 100644 (file)
@@ -27,7 +27,8 @@
 /**
  * @since 1.18
  */
-class MWHookException extends MWException {}
+class MWHookException extends MWException {
+}
 
 /**
  * Hooks class.
@@ -37,7 +38,6 @@ class MWHookException extends MWException {}
  * @since 1.18
  */
 class Hooks {
-
        /**
         * Array of events mapped to an array of callbacks to be run
         * when that event is triggered.
index 2a8c9b1..5262ffe 100644 (file)
@@ -695,16 +695,20 @@ class Html {
         *
         * @param array $params Params to set.
         * - selected: [optional] Id of namespace which should be pre-selected
-        * - all: [optional] Value of item for "all namespaces". If null or unset, no "<option>" is generated to select all namespaces
-        * - label: text for label to add before the field
-        * - exclude: [optional] Array of namespace ids to exclude
-        * - disable: [optional] Array of namespace ids for which the option should be disabled in the selector
+        * - all: [optional] Value of item for "all namespaces". If null or unset,
+        *   no "<option>" is generated to select all namespaces.
+        * - label: text for label to add before the field.
+        * - exclude: [optional] Array of namespace ids to exclude.
+        * - disable: [optional] Array of namespace ids for which the option should
+        *   be disabled in the selector.
         * @param array $selectAttribs HTML attributes for the generated select element.
-        * - id:   [optional], default: 'namespace'
-        * - name: [optional], default: 'namespace'
+        * - id:   [optional], default: 'namespace'.
+        * - name: [optional], default: 'namespace'.
         * @return string HTML code to select a namespace.
         */
-       public static function namespaceSelector( array $params = array(), array $selectAttribs = array() ) {
+       public static function namespaceSelector( array $params = array(),
+               array $selectAttribs = array()
+       ) {
                global $wgContLang;
 
                ksort( $selectAttribs );
index 987a683..b2209c3 100644 (file)
@@ -259,7 +259,8 @@ class HtmlFormatter {
         * specify the $element in the method it'll change the underlying dom and you won't be able to get
         * it back.
         *
-        * @param DOMElement|string|null $element ID of element to get HTML from or false to get it from the whole tree
+        * @param DOMElement|string|null $element ID of element to get HTML from or
+        *   false to get it from the whole tree
         * @return string Processed HTML
         */
        public function getText( $element = null ) {
index 8444223..a38b195 100644 (file)
  * @ingroup Media
  */
 class ImagePage extends Article {
-
-       /**
-        * @var File
-        */
+       /** @var File */
        private $displayImg;
-       /**
-        * @var FileRepo
-        */
+
+       /** @var FileRepo */
        private $repo;
+
+       /** @var bool */
        private $fileLoaded;
 
-       var $mExtraDescription = false;
+       /** @var bool */
+       protected $mExtraDescription = false;
 
        /**
         * @param Title $title
@@ -106,7 +105,10 @@ class ImagePage extends Article {
                $out = $this->getContext()->getOutput();
                $request = $this->getContext()->getRequest();
                $diff = $request->getVal( 'diff' );
-               $diffOnly = $request->getBool( 'diffonly', $this->getContext()->getUser()->getOption( 'diffonly' ) );
+               $diffOnly = $request->getBool(
+                       'diffonly',
+                       $this->getContext()->getUser()->getOption( 'diffonly' )
+               );
 
                if ( $this->getTitle()->getNamespace() != NS_FILE || ( $diff !== null && $diffOnly ) ) {
                        parent::view();
@@ -126,8 +128,11 @@ class ImagePage extends Article {
                                // mTitle is not the same as the redirect target so it is
                                // probably the redirect page itself. Fake the redirect symbol
                                $out->setPageTitle( $this->getTitle()->getPrefixedText() );
-                               $out->addHTML( $this->viewRedirect( Title::makeTitle( NS_FILE, $this->mPage->getFile()->getName() ),
-                                       /* $appendSubtitle */ true, /* $forceKnown */ true ) );
+                               $out->addHTML( $this->viewRedirect(
+                                       Title::makeTitle( NS_FILE, $this->mPage->getFile()->getName() ),
+                                       /* $appendSubtitle */ true,
+                                       /* $forceKnown */ true )
+                               );
                                $this->mPage->doViewUpdates( $this->getContext()->getUser(), $this->getOldID() );
                                return;
                        }
@@ -338,18 +343,23 @@ class ImagePage extends Article {
                                # image
 
                                # "Download high res version" link below the image
-                               # $msgsize = wfMessage( 'file-info-size', $width_orig, $height_orig, Linker::formatSize( $this->displayImg->getSize() ), $mime )->escaped();
+                               # $msgsize = wfMessage( 'file-info-size', $width_orig, $height_orig,
+                               #   Linker::formatSize( $this->displayImg->getSize() ), $mime )->escaped();
                                # We'll show a thumbnail of this image
                                if ( $width > $maxWidth || $height > $maxHeight ) {
                                        # Calculate the thumbnail size.
                                        # First case, the limiting factor is the width, not the height.
-                                       if ( $width / $height >= $maxWidth / $maxHeight ) { // FIXME: Possible division by 0. bug 36911
-                                               $height = round( $height * $maxWidth / $width ); // FIXME: Possible division by 0. bug 36911
+                                       /** @todo // FIXME: Possible division by 0. bug 36911 */
+                                       if ( $width / $height >= $maxWidth / $maxHeight ) {
+                                               /** @todo // FIXME: Possible division by 0. bug 36911 */
+                                               $height = round( $height * $maxWidth / $width );
                                                $width = $maxWidth;
                                                # Note that $height <= $maxHeight now.
                                        } else {
-                                               $newwidth = floor( $width * $maxHeight / $height ); // FIXME: Possible division by 0. bug 36911
-                                               $height = round( $height * $newwidth / $width ); // FIXME: Possible division by 0. bug 36911
+                                               /** @todo // FIXME: Possible division by 0. bug 36911 */
+                                               $newwidth = floor( $width * $maxHeight / $height );
+                                               /** @todo // FIXME: Possible division by 0. bug 36911 */
+                                               $height = round( $height * $newwidth / $width );
                                                $width = $newwidth;
                                                # Note that $height <= $maxHeight now, but might not be identical
                                                # because of rounding.
@@ -424,7 +434,11 @@ class ImagePage extends Article {
                                $thumbnail = $this->displayImg->transform( $params );
                                Linker::processResponsiveImages( $this->displayImg, $thumbnail, $params );
 
-                               $anchorclose = Html::rawElement( 'div', array( 'class' => 'mw-filepage-resolutioninfo' ), $msgsmall );
+                               $anchorclose = Html::rawElement(
+                                       'div',
+                                       array( 'class' => 'mw-filepage-resolutioninfo' ),
+                                       $msgsmall
+                               );
 
                                $isMulti = $this->displayImg->isMultipage() && $this->displayImg->pageCount() > 1;
                                if ( $isMulti ) {
@@ -453,8 +467,14 @@ class ImagePage extends Article {
                                                        array(),
                                                        array( 'page' => $page - 1 )
                                                );
-                                               $thumb1 = Linker::makeThumbLinkObj( $this->getTitle(), $this->displayImg, $link, $label, 'none',
-                                                       array( 'page' => $page - 1 ) );
+                                               $thumb1 = Linker::makeThumbLinkObj(
+                                                       $this->getTitle(),
+                                                       $this->displayImg,
+                                                       $link,
+                                                       $label,
+                                                       'none',
+                                                       array( 'page' => $page - 1 )
+                                               );
                                        } else {
                                                $thumb1 = '';
                                        }
@@ -467,8 +487,14 @@ class ImagePage extends Article {
                                                        array(),
                                                        array( 'page' => $page + 1 )
                                                );
-                                               $thumb2 = Linker::makeThumbLinkObj( $this->getTitle(), $this->displayImg, $link, $label, 'none',
-                                                       array( 'page' => $page + 1 ) );
+                                               $thumb2 = Linker::makeThumbLinkObj(
+                                                       $this->getTitle(),
+                                                       $this->displayImg,
+                                                       $link,
+                                                       $label,
+                                                       'none',
+                                                       array( 'page' => $page + 1 )
+                                               );
                                        } else {
                                                $thumb2 = '';
                                        }
@@ -519,11 +545,13 @@ class ImagePage extends Article {
                                // The dirmark, however, must not be immediately adjacent
                                // to the filename, because it can get copied with it.
                                // See bug 25277.
+                               // @codingStandardsIgnoreStart Ignore long line
                                $out->addWikiText( <<<EOT
 <div class="fullMedia"><span class="dangerousLink">{$medialink}</span> $dirmark<span class="fileInfo">$longDesc</span></div>
 <div class="mediaWarning">$warning</div>
 EOT
-                                       );
+                               );
+                               // @codingStandardsIgnoreEnd
                        } else {
                                $out->addWikiText( <<<EOT
 <div class="fullMedia">{$medialink} {$dirmark}<span class="fileInfo">$longDesc</span>
@@ -690,17 +718,29 @@ EOT
 
                # "Upload a new version of this file" link
                $canUpload = $this->getTitle()->userCan( 'upload', $this->getContext()->getUser() );
-               if ( $canUpload && UploadBase::userCanReUpload( $this->getContext()->getUser(), $this->mPage->getFile()->name ) ) {
-                       $ulink = Linker::makeExternalLink( $this->getUploadUrl(), wfMessage( 'uploadnewversion-linktext' )->text() );
-                       $out->addHTML( "<li id=\"mw-imagepage-reupload-link\"><div class=\"plainlinks\">{$ulink}</div></li>\n" );
+               if ( $canUpload && UploadBase::userCanReUpload(
+                               $this->getContext()->getUser(),
+                               $this->mPage->getFile()->name )
+               ) {
+                       $ulink = Linker::makeExternalLink(
+                               $this->getUploadUrl(),
+                               wfMessage( 'uploadnewversion-linktext' )->text()
+                       );
+                       $out->addHTML( "<li id=\"mw-imagepage-reupload-link\">"
+                               . "<div class=\"plainlinks\">{$ulink}</div></li>\n" );
                } else {
-                       $out->addHTML( "<li id=\"mw-imagepage-upload-disallowed\">" . $this->getContext()->msg( 'upload-disallowed-here' )->escaped() . "</li>\n" );
+                       $out->addHTML( "<li id=\"mw-imagepage-upload-disallowed\">"
+                               . $this->getContext()->msg( 'upload-disallowed-here' )->escaped() . "</li>\n" );
                }
 
                $out->addHTML( "</ul>\n" );
        }
 
-       protected function closeShowImage() { } # For overloading
+       /**
+        * For overloading
+        */
+       protected function closeShowImage() {
+       }
 
        /**
         * If the page we've just displayed is in the "Image" namespace,
@@ -1013,7 +1053,11 @@ EOT
                if ( !$haveDefaultLang ) {
                        // Its hard to know if the content is really in the default language, or
                        // if its just unmarked content that could be in any language.
-                       $opts = Xml::option( wfMessage( 'img-lang-default' )->text(), $defaultLang, $defaultLang === $curLang ) . $opts;
+                       $opts = Xml::option(
+                               wfMessage( 'img-lang-default' )->text(),
+                               $defaultLang,
+                               $defaultLang === $curLang
+                       ) . $opts;
                }
                if ( !$haveCurrentLang && $defaultLang !== $curLang ) {
                        $name = Language::fetchLanguageName( $curLang, $this->getContext()->getLanguage()->getCode() );
@@ -1025,7 +1069,11 @@ EOT
                        $opts = Xml::option( $display, $curLang, true ) . $opts;
                }
 
-               $select = Html::rawElement( 'select', array( 'id' => 'mw-imglangselector', 'name' => 'lang' ), $opts );
+               $select = Html::rawElement(
+                       'select',
+                       array( 'id' => 'mw-imglangselector', 'name' => 'lang' ),
+                       $opts
+               );
                $submit = Xml::submitButton( wfMessage( 'img-lang-go' )->text() );
 
                $formContents = wfMessage( 'img-lang-info' )->rawParams( $select, $submit )->parse()
@@ -1100,13 +1148,15 @@ class ImageHistoryList extends ContextSource {
         * @return string
         */
        public function beginImageHistoryList( $navLinks = '' ) {
-               return Xml::element( 'h2', array( 'id' => 'filehistory' ), $this->msg( 'filehist' )->text() ) . "\n"
+               return Xml::element( 'h2', array( 'id' => 'filehistory' ), $this->msg( 'filehist' )->text() )
+                       . "\n"
                        . "<div id=\"mw-imagepage-section-filehistory\">\n"
                        . $this->msg( 'filehist-help' )->parseAsBlock()
                        . $navLinks . "\n"
                        . Xml::openElement( 'table', array( 'class' => 'wikitable filehistory' ) ) . "\n"
                        . '<tr><td></td>'
-                       . ( $this->current->isLocal() && ( $this->getUser()->isAllowedAny( 'delete', 'deletedhistory' ) ) ? '<td></td>' : '' )
+                       . ( $this->current->isLocal()
+                               && ( $this->getUser()->isAllowedAny( 'delete', 'deletedhistory' ) ) ? '<td></td>' : '' )
                        . '<th>' . $this->msg( 'filehist-datetime' )->escaped() . '</th>'
                        . ( $this->showThumb ? '<th>' . $this->msg( 'filehist-thumb' )->escaped() . '</th>' : '' )
                        . '<th>' . $this->msg( 'filehist-dimensions' )->escaped() . '</th>'
@@ -1212,7 +1262,8 @@ class ImageHistoryList extends ContextSource {
                $row .= "<td $selected style='white-space: nowrap;'>";
                if ( !$file->userCan( File::DELETED_FILE, $user ) ) {
                        # Don't link to unviewable files
-                       $row .= '<span class="history-deleted">' . $lang->userTimeAndDate( $timestamp, $user ) . '</span>';
+                       $row .= '<span class="history-deleted">'
+                               . $lang->userTimeAndDate( $timestamp, $user ) . '</span>';
                } elseif ( $file->isDeleted( File::DELETED_FILE ) ) {
                        if ( $local ) {
                                $this->preventClickjacking();
@@ -1234,7 +1285,11 @@ class ImageHistoryList extends ContextSource {
                        $row .= '<span class="history-deleted">' . $url . '</span>';
                } else {
                        $url = $iscur ? $this->current->getUrl() : $this->current->getArchiveUrl( $img );
-                       $row .= Xml::element( 'a', array( 'href' => $url ), $lang->userTimeAndDate( $timestamp, $user ) );
+                       $row .= Xml::element(
+                               'a',
+                               array( 'href' => $url ),
+                               $lang->userTimeAndDate( $timestamp, $user )
+                       );
                }
                $row .= "</td>";
 
@@ -1256,7 +1311,8 @@ class ImageHistoryList extends ContextSource {
                $row .= '<td>';
                // Hide deleted usernames
                if ( $file->isDeleted( File::DELETED_USER ) ) {
-                       $row .= '<span class="history-deleted">' . $this->msg( 'rev-deleted-user' )->escaped() . '</span>';
+                       $row .= '<span class="history-deleted">'
+                               . $this->msg( 'rev-deleted-user' )->escaped() . '</span>';
                } else {
                        if ( $local ) {
                                $row .= Linker::userLink( $userId, $userText );
@@ -1272,9 +1328,11 @@ class ImageHistoryList extends ContextSource {
 
                // Don't show deleted descriptions
                if ( $file->isDeleted( File::DELETED_COMMENT ) ) {
-                       $row .= '<td><span class="history-deleted">' . $this->msg( 'rev-deleted-comment' )->escaped() . '</span></td>';
+                       $row .= '<td><span class="history-deleted">' .
+                               $this->msg( 'rev-deleted-comment' )->escaped() . '</span></td>';
                } else {
-                       $row .= '<td dir="' . $wgContLang->getDir() . '">' . Linker::formatComment( $description, $this->title ) . '</td>';
+                       $row .= '<td dir="' . $wgContLang->getDir() . '">' .
+                               Linker::formatComment( $description, $this->title ) . '</td>';
                }
 
                $rowClass = null;
index 75f7ba6..b0266cb 100644 (file)
@@ -47,12 +47,17 @@ abstract class ImageQueryPage extends QueryPage {
 
                        # $res might contain the whole 1,000 rows, so we read up to
                        # $num [should update this to use a Pager]
-                       for ( $i = 0; $i < $num && $row = $dbr->fetchObject( $res ); $i++ ) {
+                       $i = 0;
+                       foreach ( $res as $row ) {
+                               $i++;
                                $namespace = isset( $row->namespace ) ? $row->namespace : NS_FILE;
                                $title = Title::makeTitleSafe( $namespace, $row->title );
                                if ( $title instanceof Title && $title->getNamespace() == NS_FILE ) {
                                        $gallery->add( $title, $this->getCellHtml( $row ) );
                                }
+                               if ( $i === $num ) {
+                                       break;
+                               }
                        }
 
                        $out->addHTML( $gallery->toHtml() );
@@ -60,7 +65,8 @@ abstract class ImageQueryPage extends QueryPage {
        }
 
        // Gotta override this since it's abstract
-       function formatResult( $skin, $result ) { }
+       function formatResult( $skin, $result ) {
+       }
 
        /**
         * Get additional HTML to be shown in a results' cell
index f6e9032..59fa583 100644 (file)
@@ -60,22 +60,29 @@ class WikiImporter {
                $this->setPageOutCallback( array( $this, 'finishImportPage' ) );
        }
 
-       private function throwXmlError( $err ) {
+       /**
+        * @return null|XMLReader
+        */
+       public function getReader() {
+               return $this->reader;
+       }
+
+       public function throwXmlError( $err ) {
                $this->debug( "FAILURE: $err" );
                wfDebug( "WikiImporter XML error: $err\n" );
        }
 
-       private function debug( $data ) {
+       public function debug( $data ) {
                if ( $this->mDebug ) {
                        wfDebug( "IMPORT: $data\n" );
                }
        }
 
-       private function warn( $data ) {
+       public function warn( $data ) {
                wfDebug( "IMPORT: $data\n" );
        }
 
-       private function notice( $msg /*, $param, ...*/ ) {
+       public function notice( $msg /*, $param, ...*/ ) {
                $params = func_get_args();
                array_shift( $params );
 
@@ -387,7 +394,7 @@ class WikiImporter {
         * @return string
         * @access private
         */
-       private function nodeContents() {
+       public function nodeContents() {
                if ( $this->reader->isEmptyElement ) {
                        return "";
                }
index 5b1dc83..d9aeb7b 100644 (file)
@@ -31,7 +31,7 @@
  * deprecated.
  */
 class MWInit {
-       static $compilerVersion;
+       private static $compilerVersion;
 
        /**
         * @deprecated since 1.22
index e3db5b4..54b779e 100644 (file)
  * A License class for use on Special:Upload
  */
 class Licenses extends HTMLFormField {
-       /**
-        * @var string
-        */
+       /** @var string */
        protected $msg;
 
-       /**
-        * @var array
-        */
+       /** @var array */
        protected $licenses = array();
 
-       /**
-        * @var string
-        */
+       /** @var string */
        protected $html;
        /**#@-*/
 
        /**
-        * Constructor
-        *
         * @param array $params
         */
        public function __construct( $params ) {
                parent::__construct( $params );
 
-               $this->msg = empty( $params['licenses'] ) ? wfMessage( 'licenses' )->inContentLanguage()->plain() : $params['licenses'];
+               $this->msg = empty( $params['licenses'] )
+                       ? wfMessage( 'licenses' )->inContentLanguage()->plain()
+                       : $params['licenses'];
                $this->selected = null;
 
                $this->makeLicenses();
@@ -198,19 +192,13 @@ class Licenses extends HTMLFormField {
  * A License class for use on Special:Upload (represents a single type of license).
  */
 class License {
-       /**
-        * @var string
-        */
-       var $template;
+       /** @var string */
+       public $template;
 
-       /**
-        * @var string
-        */
-       var $text;
+       /** @var string */
+       public $text;
 
        /**
-        * Constructor
-        *
         * @param string $str license name??
         */
        function __construct( $str ) {
index 6433d19..894c97d 100644 (file)
@@ -530,7 +530,7 @@ class Linker {
         *
         * @param array $handlerParams Associative array of media handler parameters, to be passed
         *       to transform(). Typical keys are "width" and "page".
-        * @param string $time Timestamp of the file, set as false for current
+        * @param string|bool $time Timestamp of the file, set as false for current
         * @param string $query Query params for desc url
         * @param int|null $widthOption Used by the parser to remember the user preference thumbnailsize
         * @since 1.20
@@ -2114,11 +2114,12 @@ class Linker {
                if ( $options == 'withaccess' ) {
                        $accesskey = self::accesskey( $name );
                        if ( $accesskey !== false ) {
+                               // Should be build the same as in jquery.accessKeyLabel.js
                                if ( $tooltip === false || $tooltip === '' ) {
-                                       $tooltip = wfMessage( 'brackets', $accesskey )->escaped();
+                                       $tooltip = wfMessage( 'brackets', $accesskey )->text();
                                } else {
-                                       $tooltip .= wfMessage( 'word-separator' )->escaped();
-                                       $tooltip .= wfMessage( 'brackets', $accesskey )->escaped();
+                                       $tooltip .= wfMessage( 'word-separator' )->text();
+                                       $tooltip .= wfMessage( 'brackets', $accesskey )->text();
                                }
                        }
                }
index c745164..447dde3 100644 (file)
@@ -77,7 +77,8 @@ class MWTimestamp {
                $da = array();
                $strtime = '';
 
-               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.
+               // 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" ) {
                        $uts = time();
                        $strtime = "@$uts";
                } elseif ( preg_match( '/^(\d{4})\-(\d\d)\-(\d\d) (\d\d):(\d\d):(\d\d)$/D', $ts, $da ) ) {
@@ -93,18 +94,41 @@ class MWTimestamp {
                        # TS_ORACLE // session altered to DD-MM-YYYY HH24:MI:SS.FF6
                        $strtime = preg_replace( '/(\d\d)\.(\d\d)\.(\d\d)(\.(\d+))?/', "$1:$2:$3",
                                        str_replace( '+00:00', 'UTC', $ts ) );
-               } elseif ( preg_match( '/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})(?:\.*\d*)?Z?$/', $ts, $da ) ) {
+               } elseif ( preg_match(
+                       '/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})(?:\.*\d*)?Z?$/',
+                       $ts,
+                       $da
+               ) ) {
                        # TS_ISO_8601
-               } elseif ( preg_match( '/^(\d{4})(\d{2})(\d{2})T(\d{2})(\d{2})(\d{2})(?:\.*\d*)?Z?$/', $ts, $da ) ) {
+               } elseif ( preg_match(
+                       '/^(\d{4})(\d{2})(\d{2})T(\d{2})(\d{2})(\d{2})(?:\.*\d*)?Z?$/',
+                       $ts,
+                       $da
+               ) ) {
                        #TS_ISO_8601_BASIC
-               } elseif ( preg_match( '/^(\d{4})\-(\d\d)\-(\d\d) (\d\d):(\d\d):(\d\d)\.*\d*[\+\- ](\d\d)$/', $ts, $da ) ) {
+               } elseif ( preg_match(
+                       '/^(\d{4})\-(\d\d)\-(\d\d) (\d\d):(\d\d):(\d\d)\.*\d*[\+\- ](\d\d)$/',
+                       $ts,
+                       $da
+               ) ) {
                        # TS_POSTGRES
-               } elseif ( preg_match( '/^(\d{4})\-(\d\d)\-(\d\d) (\d\d):(\d\d):(\d\d)\.*\d* GMT$/', $ts, $da ) ) {
+               } elseif ( preg_match(
+                       '/^(\d{4})\-(\d\d)\-(\d\d) (\d\d):(\d\d):(\d\d)\.*\d* GMT$/',
+                       $ts,
+                       $da
+               ) ) {
                        # TS_POSTGRES
-               } elseif ( preg_match( '/^[ \t\r\n]*([A-Z][a-z]{2},[ \t\r\n]*)?' . # Day of week
-                                                               '\d\d?[ \t\r\n]*[A-Z][a-z]{2}[ \t\r\n]*\d{2}(?:\d{2})?' .  # dd Mon yyyy
-                                                               '[ \t\r\n]*\d\d[ \t\r\n]*:[ \t\r\n]*\d\d[ \t\r\n]*:[ \t\r\n]*\d\d/S', $ts ) ) { # hh:mm:ss
-                       # TS_RFC2822, accepting a trailing comment. See http://www.squid-cache.org/mail-archive/squid-users/200307/0122.html / r77171
+               } elseif ( preg_match(
+                       # Day of week
+                       '/^[ \t\r\n]*([A-Z][a-z]{2},[ \t\r\n]*)?' .
+                       # dd Mon yyyy
+                       '\d\d?[ \t\r\n]*[A-Z][a-z]{2}[ \t\r\n]*\d{2}(?:\d{2})?' .
+                       # hh:mm:ss
+                       '[ \t\r\n]*\d\d[ \t\r\n]*:[ \t\r\n]*\d\d[ \t\r\n]*:[ \t\r\n]*\d\d/S',
+                       $ts
+               ) ) {
+                       # TS_RFC2822, accepting a trailing comment.
+                       # See http://www.squid-cache.org/mail-archive/squid-users/200307/0122.html / r77171
                        # The regex is a superset of rfc2822 for readability
                        $strtime = strtok( $ts, ';' );
                } elseif ( preg_match( '/^[A-Z][a-z]{5,8}, \d\d-[A-Z][a-z]{2}-\d{2} \d\d:\d\d:\d\d/', $ts ) ) {
@@ -171,12 +195,17 @@ class MWTimestamp {
         * @since 1.20
         * @since 1.22 Uses Language::getHumanTimestamp to produce the timestamp
         *
-        * @param MWTimestamp|null $relativeTo The base timestamp to compare to (defaults to now)
-        * @param User|null $user User the timestamp is being generated for (or null to use main context's user)
-        * @param Language|null $lang Language to use to make the human timestamp (or null to use main context's language)
+        * @param MWTimestamp|null $relativeTo The base timestamp to compare to
+        *   (defaults to now).
+        * @param User|null $user User the timestamp is being generated for (or null
+        *   to use main context's user).
+        * @param Language|null $lang Language to use to make the human timestamp
+        *   (or null to use main context's language).
         * @return string Formatted timestamp
         */
-       public function getHumanTimestamp( MWTimestamp $relativeTo = null, User $user = null, Language $lang = null ) {
+       public function getHumanTimestamp( MWTimestamp $relativeTo = null,
+               User $user = null, Language $lang = null
+       ) {
                if ( $relativeTo === null ) {
                        $relativeTo = new self();
                }
@@ -298,11 +327,13 @@ class MWTimestamp {
 
                $ts = '';
                $diff = $this->diff( $relativeTo );
-               if ( wfRunHooks( 'GetRelativeTimestamp', array( &$ts, &$diff, $this, $relativeTo, $user, $lang ) ) ) {
+               if ( wfRunHooks(
+                       'GetRelativeTimestamp',
+                       array( &$ts, &$diff, $this, $relativeTo, $user, $lang )
+               ) ) {
                        $seconds = ( ( ( $diff->days * 24 + $diff->h ) * 60 + $diff->i ) * 60 + $diff->s );
                        $ts = wfMessage( 'ago', $lang->formatDuration( $seconds, $chosenIntervals ) )
-                               ->inLanguage( $lang )
-                               ->text();
+                               ->inLanguage( $lang )->text();
                }
 
                return $ts;
@@ -322,7 +353,8 @@ class MWTimestamp {
         *
         * @since 1.22
         * @param MWTimestamp $relativeTo Base time to calculate difference from
-        * @return DateInterval|bool The DateInterval object representing the difference between the two dates or false on failure
+        * @return DateInterval|bool The DateInterval object representing the
+        *   difference between the two dates or false on failure
         */
        public function diff( MWTimestamp $relativeTo ) {
                return $this->timestamp->diff( $relativeTo->timestamp );
index 56786f1..cd75f0b 100644 (file)
  * @ingroup Parser
  */
 class MagicWord {
-       /**#@+
-        * @private
-        */
-       var $mId, $mSynonyms, $mCaseSensitive;
-       var $mRegex = '';
-       var $mRegexStart = '';
-       var $mRegexStartToEnd = '';
-       var $mBaseRegex = '';
-       var $mVariableRegex = '';
-       var $mVariableStartToEndRegex = '';
-       var $mModified = false;
-       var $mFound = false;
+       /**#@-*/
+
+       /** @var int */
+       public $mId;
+
+       /** @var array */
+       public $mSynonyms;
+
+       /** @var bool */
+       public $mCaseSensitive;
+
+       /** @var string */
+       private $mRegex = '';
+
+       /** @var string */
+       private $mRegexStart = '';
+
+       /** @var string */
+       private $mRegexStartToEnd = '';
+
+       /** @var string */
+       private $mBaseRegex = '';
+
+       /** @var string */
+       private $mVariableRegex = '';
+
+       /** @var string */
+       private $mVariableStartToEndRegex = '';
+
+       /** @var bool */
+       private $mModified = false;
+
+       /** @var bool */
+       private $mFound = false;
 
        static public $mVariableIDsInitialised = false;
        static public $mVariableIDs = array(
@@ -270,7 +292,7 @@ class MagicWord {
         * Allow external reads of TTL array
         *
         * @param int $id
-        * @return array
+        * @return int
         */
        static function getCacheTTL( $id ) {
                if ( array_key_exists( $id, self::$mCacheTTLs ) ) {
@@ -507,7 +529,12 @@ class MagicWord {
         */
        function matchAndRemove( &$text ) {
                $this->mFound = false;
-               $text = preg_replace_callback( $this->getRegex(), array( &$this, 'pregRemoveAndRecord' ), $text );
+               $text = preg_replace_callback(
+                       $this->getRegex(),
+                       array( &$this, 'pregRemoveAndRecord' ),
+                       $text
+               );
+
                return $this->mFound;
        }
 
@@ -517,7 +544,12 @@ class MagicWord {
         */
        function matchStartAndRemove( &$text ) {
                $this->mFound = false;
-               $text = preg_replace_callback( $this->getRegexStart(), array( &$this, 'pregRemoveAndRecord' ), $text );
+               $text = preg_replace_callback(
+                       $this->getRegexStart(),
+                       array( &$this, 'pregRemoveAndRecord' ),
+                       $text
+               );
+
                return $this->mFound;
        }
 
@@ -541,7 +573,12 @@ class MagicWord {
         * @return string
         */
        function replace( $replacement, $subject, $limit = -1 ) {
-               $res = preg_replace( $this->getRegex(), StringUtils::escapeRegexReplacement( $replacement ), $subject, $limit );
+               $res = preg_replace(
+                       $this->getRegex(),
+                       StringUtils::escapeRegexReplacement( $replacement ),
+                       $subject,
+                       $limit
+               );
                $this->mModified = $res !== $subject;
                return $res;
        }
@@ -674,10 +711,18 @@ class MagicWord {
  * @ingroup Parser
  */
 class MagicWordArray {
-       var $names = array();
-       var $hash;
-       var $baseRegex, $regex;
-       var $matches;
+       /** @var array */
+       public $names = array();
+
+       /** @var array */
+       private $hash;
+
+       private $baseRegex;
+
+       private $regex;
+
+       /** @todo Unused? */
+       private $matches;
 
        /**
         * @param array $names
index 31fbb07..8d4058e 100644 (file)
@@ -960,7 +960,14 @@ class Message {
         * @return string Wikitext parsed into HTML.
         */
        protected function parseText( $string ) {
-               $out = MessageCache::singleton()->parse( $string, $this->title, /*linestart*/true, $this->interface, $this->language );
+               $out = MessageCache::singleton()->parse(
+                       $string,
+                       $this->title,
+                       /*linestart*/true,
+                       $this->interface,
+                       $this->language
+               );
+
                return $out instanceof ParserOutput ? $out->getText() : $out;
        }
 
@@ -974,7 +981,12 @@ class Message {
         * @return string Wikitext with {{-constructs replaced with their values.
         */
        protected function transformText( $string ) {
-               return MessageCache::singleton()->transform( $string, $this->interface, $this->language, $this->title );
+               return MessageCache::singleton()->transform(
+                       $string,
+                       $this->interface,
+                       $this->language,
+                       $this->title
+               );
        }
 
        /**
index f5b346c..5725898 100644 (file)
@@ -32,7 +32,6 @@
  * constituent messages or the resource itself is changed.
  */
 class MessageBlobStore {
-
        /**
         * Get the message blobs for a set of modules
         *
@@ -128,7 +127,8 @@ class MessageBlobStore {
         * @param string $name Module name
         * @param ResourceLoaderModule $module
         * @param string $lang Language code
-        * @return string Regenerated message blob, or null if there was no blob for the given module/language pair
+        * @return string Regenerated message blob, or null if there was no blob for
+        *   the given module/language pair.
         */
        public static function updateModule( $name, ResourceLoaderModule $module, $lang ) {
                $dbw = wfGetDB( DB_MASTER );
@@ -331,6 +331,7 @@ class MessageBlobStore {
         */
        private static function getFromDB( ResourceLoader $resourceLoader, $modules, $lang ) {
                global $wgCacheEpoch;
+
                $retval = array();
                $dbr = wfGetDB( DB_SLAVE );
                $res = $dbr->select( 'msg_resource',
@@ -345,10 +346,14 @@ class MessageBlobStore {
                                // This shouldn't be possible
                                throw new MWException( __METHOD__ . ' passed an invalid module name' );
                        }
+
                        // Update the module's blobs if the set of messages changed or if the blob is
                        // older than $wgCacheEpoch
-                       if ( array_keys( FormatJson::decode( $row->mr_blob, true ) ) !== array_values( array_unique( $module->getMessages() ) ) ||
-                                       wfTimestamp( TS_MW, $row->mr_timestamp ) <= $wgCacheEpoch ) {
+                       $keys = array_keys( FormatJson::decode( $row->mr_blob, true ) );
+                       $values = array_values( array_unique( $module->getMessages() ) );
+                       if ( $keys !== $values
+                               || wfTimestamp( TS_MW, $row->mr_timestamp ) <= $wgCacheEpoch
+                       ) {
                                $retval[$row->mr_resource] = self::updateModule( $row->mr_resource, $module, $lang );
                        } else {
                                $retval[$row->mr_resource] = $row->mr_blob;
index 3448c6a..582ba60 100644 (file)
@@ -142,30 +142,29 @@ END_STRING
  * of MimeMagic. Please use MimeMagic::singleton() to get that instance.
  */
 class MimeMagic {
-
        /**
-        * Mapping of media types to arrays of mime types.
+        * @var array Mapping of media types to arrays of mime types.
         * This is used by findMediaType and getMediaType, respectively
         */
-       var $mMediaTypes = null;
+       protected $mMediaTypes = null;
 
-       /** Map of mime type aliases
+       /** @var array Map of mime type aliases
         */
-       var $mMimeTypeAliases = null;
+       protected $mMimeTypeAliases = null;
 
-       /** map of mime types to file extensions (as a space separated list)
+       /** @var array Map of mime types to file extensions (as a space separated list)
         */
-       var $mMimeToExt = null;
+       protected $mMimeToExt = null;
 
-       /** map of file extensions types to mime types (as a space separated list)
+       /** @var array Map of file extensions types to mime types (as a space separated list)
         */
-       var $mExtToMime = null;
+       public $mExtToMime = null;
 
-       /** IEContentAnalyzer instance
+       /** @var IEContentAnalyzer
         */
-       var $mIEAnalyzer;
+       protected $mIEAnalyzer;
 
-       /** The singleton instance
+       /** @var MimeMagic The singleton instance
         */
        private static $instance = null;
 
@@ -323,13 +322,13 @@ class MimeMagic {
 
                        if ( count( $m ) > 1 ) {
                                $main = $m[0];
-                               for ( $i = 1; $i < count( $m ); $i += 1 ) {
+                               $mCount = count( $m );
+                               for ( $i = 1; $i < $mCount; $i += 1 ) {
                                        $mime = $m[$i];
                                        $this->mMimeTypeAliases[$mime] = $main;
                                }
                        }
                }
-
        }
 
        /**
@@ -861,8 +860,10 @@ class MimeMagic {
        private function detectMimeType( $file, $ext = true ) {
                global $wgMimeDetectorCommand;
 
-               if ( $ext ) { # TODO:  make $ext default to false. Or better, remove it.
-                       wfDebug( __METHOD__ . ": WARNING: use of the \$ext parameter is deprecated. Use improveTypeFromExtension(\$mime, \$ext) instead.\n" );
+               /** @todo Make $ext default to false. Or better, remove it. */
+               if ( $ext ) {
+                       wfDebug( __METHOD__ . ": WARNING: use of the \$ext parameter is deprecated. "
+                               . "Use improveTypeFromExtension(\$mime, \$ext) instead.\n" );
                }
 
                $m = null;
@@ -892,13 +893,16 @@ class MimeMagic {
                } elseif ( function_exists( "mime_content_type" ) ) {
 
                        # NOTE: this function is available since PHP 4.3.0, but only if
-                       # PHP was compiled with --with-mime-magic or, before 4.3.2, with --enable-mime-magic.
+                       # PHP was compiled with --with-mime-magic or, before 4.3.2, with
+                       # --enable-mime-magic.
                        #
-                       # On Windows, you must set mime_magic.magicfile in php.ini to point to the mime.magic file bundled with PHP;
-                       # sometimes, this may even be needed under linus/unix.
+                       # On Windows, you must set mime_magic.magicfile in php.ini to point
+                       # to the mime.magic file bundled with PHP; sometimes, this may even
+                       # be needed under *nix.
                        #
-                       # Also note that this has been DEPRECATED in favor of the fileinfo extension by PECL, see above.
-                       # see http://www.php.net/manual/en/ref.mime-magic.php for details.
+                       # Also note that this has been DEPRECATED in favor of the fileinfo
+                       # extension by PECL, see above.
+                       # See http://www.php.net/manual/en/ref.mime-magic.php for details.
 
                        $m = mime_content_type( $file );
                } else {
@@ -926,7 +930,8 @@ class MimeMagic {
                }
                if ( $ext ) {
                        if ( $this->isRecognizableExtension( $ext ) ) {
-                               wfDebug( __METHOD__ . ": refusing to guess mime type for .$ext file, we should have recognized it\n" );
+                               wfDebug( __METHOD__ . ": refusing to guess mime type for .$ext file, "
+                                       . "we should have recognized it\n" );
                        } else {
                                $m = $this->guessTypesForExtension( $ext );
                                if ( $m ) {
index 45c2da9..4edddbc 100644 (file)
@@ -67,7 +67,7 @@ class MWNamespace {
        public static function isMovable( $index ) {
                global $wgAllowImageMoving;
 
-               $result = !( $index < NS_MAIN || ( $index == NS_FILE && !$wgAllowImageMoving ) || $index == NS_CATEGORY );
+               $result = !( $index < NS_MAIN || ( $index == NS_FILE && !$wgAllowImageMoving ) );
 
                /**
                 * @since 1.20
index c783fd3..b3b3b88 100644 (file)
@@ -164,7 +164,10 @@ function wfMangleFlashPolicy( $s ) {
  * @param int $length
  */
 function wfDoContentLength( $length ) {
-       if ( !headers_sent() && isset( $_SERVER['SERVER_PROTOCOL'] ) && $_SERVER['SERVER_PROTOCOL'] == 'HTTP/1.0' ) {
+       if ( !headers_sent()
+               && isset( $_SERVER['SERVER_PROTOCOL'] )
+               && $_SERVER['SERVER_PROTOCOL'] == 'HTTP/1.0'
+       ) {
                header( "Content-Length: $length" );
        }
 }
index 76f0aab..16e070c 100644 (file)
  * @todo document
  */
 class OutputPage extends ContextSource {
-       /// Should be private. Used with addMeta() which adds "<meta>"
-       var $mMetatags = array();
+       /** @var array Should be private. Used with addMeta() which adds "<meta>" */
+       protected $mMetatags = array();
 
-       var $mLinktags = array();
-       var $mCanonicalUrl = false;
+       /** @var array */
+       protected $mLinktags = array();
 
-       /// Additional stylesheets. Looks like this is for extensions. Might be replaced by resource loader.
-       var $mExtStyles = array();
+       /** @var bool */
+       protected $mCanonicalUrl = false;
 
-       /// Should be private - has getter and setter. Contains the HTML title
-       var $mPagetitle = '';
+       /**
+        * @var array Additional stylesheets. Looks like this is for extensions.
+        *   Might be replaced by resource loader.
+        */
+       protected $mExtStyles = array();
+
+       /**
+        * @var string Should be private - has getter and setter. Contains
+        *   the HTML title */
+       public $mPagetitle = '';
 
-       /// Contains all of the "<body>" content. Should be private we got set/get accessors and the append() method.
-       var $mBodytext = '';
+       /**
+        * @var string Contains all of the "<body>" content. Should be private we
+        *   got set/get accessors and the append() method.
+        */
+       public $mBodytext = '';
 
        /**
         * Holds the debug lines that will be output as comments in page source if
@@ -58,43 +69,43 @@ class OutputPage extends ContextSource {
         */
        public $mDebugtext = '';
 
-       /// Should be private. Stores contents of "<title>" tag
-       var $mHTMLtitle = '';
-
-       /// Should be private. Is the displayed content related to the source of the corresponding wiki article.
-       var $mIsarticle = false;
+       /** @var string Stores contents of "<title>" tag */
+       private $mHTMLtitle = '';
 
        /**
-        * Should be private. Has get/set methods properly documented.
-        * Stores "article flag" toggle.
+        * @var bool Is the displayed content related to the source of the
+        *   corresponding wiki article.
         */
-       var $mIsArticleRelated = true;
+       private $mIsarticle = false;
+
+       /** @var bool Stores "article flag" toggle. */
+       private $mIsArticleRelated = true;
 
        /**
-        * Should be private. We have to set isPrintable(). Some pages should
+        * @var bool We have to set isPrintable(). Some pages should
         * never be printed (ex: redirections).
         */
-       var $mPrintable = false;
+       private $mPrintable = false;
 
        /**
-        * Should be private. We have set/get/append methods.
-        *
-        * Contains the page subtitle. Special pages usually have some links here.
-        * Don't confuse with site subtitle added by skins.
+        * @var array Contains the page subtitle. Special pages usually have some
+        *   links here. Don't confuse with site subtitle added by skins.
         */
        private $mSubtitle = array();
 
-       var $mRedirect = '';
-       var $mStatusCode;
+       /** @var string */
+       public $mRedirect = '';
+
+       /** @var int */
+       protected $mStatusCode;
 
        /**
-        * mLastModified and mEtag are used for sending cache control.
-        * The whole caching system should probably be moved into its own class.
+        * @ var string mLastModified and mEtag are used for sending cache control.
+        *   The whole caching system should probably be moved into its own class.
         */
-       var $mLastModified = '';
+       protected $mLastModified = '';
 
        /**
-        * Should be private. No getter but used in sendCacheControl();
         * Contains an HTTP Entity Tags (see RFC 2616 section 3.13) which is used
         * as a unique identifier for the content. It is later used by the client
         * to compare its cached version with the server version. Client sends
@@ -103,70 +114,93 @@ class OutputPage extends ContextSource {
         * To get more information, you will have to look at HTTP/1.1 protocol which
         * is properly described in RFC 2616 : http://tools.ietf.org/html/rfc2616
         */
-       var $mETag = false;
+       private $mETag = false;
+
+       /** @var array */
+       protected $mCategoryLinks = array();
 
-       var $mCategoryLinks = array();
-       var $mCategories = array();
+       /** @var array */
+       protected $mCategories = array();
 
-       /// Should be private. Array of Interwiki Prefixed (non DB key) Titles (e.g. 'fr:Test page')
-       var $mLanguageLinks = array();
+       /** @var array Array of Interwiki Prefixed (non DB key) Titles (e.g. 'fr:Test page') */
+       private $mLanguageLinks = array();
 
        /**
-        * Should be private. Used for JavaScript (pre resource loader)
-        * We should split js / css.
+        * Used for JavaScript (pre resource loader)
+        * @todo We should split JS / CSS.
         * mScripts content is inserted as is in "<head>" by Skin. This might
-        * contains either a link to a stylesheet or inline css.
+        * contain either a link to a stylesheet or inline CSS.
         */
-       var $mScripts = '';
+       private $mScripts = '';
 
-       /**
-        * Inline CSS styles. Use addInlineStyle() sparingly
-        */
-       var $mInlineStyles = '';
+       /** @var string Inline CSS styles. Use addInlineStyle() sparingly */
+       protected $mInlineStyles = '';
 
-       //
-       var $mLinkColours;
+       /** @todo Unused? */
+       private $mLinkColours;
 
        /**
-        * Used by skin template.
+        * @var string Used by skin template.
         * Example: $tpl->set( 'displaytitle', $out->mPageLinkTitle );
         */
-       var $mPageLinkTitle = '';
+       public $mPageLinkTitle = '';
+
+       /** @var array Array of elements in "<head>". Parser might add its own headers! */
+       protected $mHeadItems = array();
+
+       // @todo FIXME: Next 5 variables probably come from the resource loader
+
+       /** @var array */
+       protected $mModules = array();
+
+       /** @var array */
+       protected $mModuleScripts = array();
+
+       /** @var array */
+       protected $mModuleStyles = array();
 
-       /// Array of elements in "<head>". Parser might add its own headers!
-       var $mHeadItems = array();
+       /** @var array */
+       protected $mModuleMessages = array();
 
-       // @todo FIXME: Next variables probably comes from the resource loader
-       var $mModules = array(), $mModuleScripts = array(), $mModuleStyles = array(), $mModuleMessages = array();
-       var $mResourceLoader;
-       var $mJsConfigVars = array();
+       /** @var ResourceLoader */
+       protected $mResourceLoader;
 
-       /** @todo FIXME: Is this still used ?*/
-       var $mInlineMsg = array();
+       /** @var array */
+       protected $mJsConfigVars = array();
 
-       var $mTemplateIds = array();
-       var $mImageTimeKeys = array();
+       /** @var array */
+       protected $mTemplateIds = array();
 
-       var $mRedirectCode = '';
+       /** @var array */
+       protected $mImageTimeKeys = array();
 
-       var $mFeedLinksAppendQuery = null;
+       /** @var string */
+       public $mRedirectCode = '';
 
-       # What level of 'untrustworthiness' is allowed in CSS/JS modules loaded on this page?
-       # @see ResourceLoaderModule::$origin
-       # ResourceLoaderModule::ORIGIN_ALL is assumed unless overridden;
+       protected $mFeedLinksAppendQuery = null;
+
+       /** @var array
+        * What level of 'untrustworthiness' is allowed in CSS/JS modules loaded on this page?
+        * @see ResourceLoaderModule::$origin
+        * ResourceLoaderModule::ORIGIN_ALL is assumed unless overridden;
+        */
        protected $mAllowedModules = array(
                ResourceLoaderModule::TYPE_COMBINED => ResourceLoaderModule::ORIGIN_ALL,
        );
 
+       /** @var bool Whether output is disabled.  If this is true, the 'output' method will do nothing. */
+       protected $mDoNothing = false;
+
+       // Parser related.
+
        /**
-        * Whether output is disabled.  If this is true, the 'output' method will do nothing.
-        *
-        * @var bool $mDoNothing
+        * @var int
+        * @todo Unused?
         */
-       var $mDoNothing = false;
+       private $mContainsOldMagic = 0;
 
-       // Parser related.
-       var $mContainsOldMagic = 0, $mContainsNewMagic = 0;
+       /** @var int */
+       protected $mContainsNewMagic = 0;
 
        /**
         * lazy initialised, use parserOptions()
@@ -175,57 +209,64 @@ class OutputPage extends ContextSource {
        protected $mParserOptions = null;
 
        /**
-        * Handles the atom / rss links.
-        * We probably only support atom in 2011.
-        * Looks like a private variable.
+        * Handles the Atom / RSS links.
+        * We probably only support Atom in 2011.
         * @see $wgAdvertisedFeedTypes
         */
-       var $mFeedLinks = array();
+       private $mFeedLinks = array();
 
        // Gwicke work on squid caching? Roughly from 2003.
-       var $mEnableClientCache = true;
+       protected $mEnableClientCache = true;
 
-       /**
-        * Flag if output should only contain the body of the article.
-        * Should be private.
-        */
-       var $mArticleBodyOnly = false;
+       /** @var bool Flag if output should only contain the body of the article. */
+       private $mArticleBodyOnly = false;
+
+       /** @var bool */
+       protected $mNewSectionLink = false;
 
-       var $mNewSectionLink = false;
-       var $mHideNewSectionLink = false;
+       /** @var bool */
+       protected $mHideNewSectionLink = false;
 
        /**
-        * Comes from the parser. This was probably made to load CSS/JS only
-        * if we had "<gallery>". Used directly in CategoryPage.php
+        * @var bool Comes from the parser. This was probably made to load CSS/JS
+        * only if we had "<gallery>". Used directly in CategoryPage.php.
         * Looks like resource loader can replace this.
         */
-       var $mNoGallery = false;
+       public $mNoGallery = false;
+
+       /** @var string */
+       private $mPageTitleActionText = '';
 
-       // should be private.
-       var $mPageTitleActionText = '';
-       var $mParseWarnings = array();
+       /** @var array */
+       private $mParseWarnings = array();
 
-       // Cache stuff. Looks like mEnableClientCache
-       var $mSquidMaxage = 0;
+       /** @var int Cache stuff. Looks like mEnableClientCache */
+       protected $mSquidMaxage = 0;
 
-       // @todo document
-       var $mPreventClickjacking = true;
+       /**
+        * @var bool
+        * @todo Document
+        */
+       protected $mPreventClickjacking = true;
+
+       /** @var int To include the variable {{REVISIONID}} */
+       private $mRevisionId = null;
 
-       /// should be private. To include the variable {{REVISIONID}}
-       var $mRevisionId = null;
+       /** @var string */
        private $mRevisionTimestamp = null;
 
-       var $mFileVersion = null;
+       /** @var array */
+       protected $mFileVersion = null;
 
        /**
-        * An array of stylesheet filenames (relative from skins path), with options
-        * for CSS media, IE conditions, and RTL/LTR direction.
+        * @var array An array of stylesheet filenames (relative from skins path),
+        * with options for CSS media, IE conditions, and RTL/LTR direction.
         * For internal use; add settings in the skin via $this->addStyle()
         *
         * Style again! This seems like a code duplication since we already have
-        * mStyles. This is what makes OpenSource amazing.
+        * mStyles. This is what makes Open Source amazing.
         */
-       var $styles = array();
+       protected $styles = array();
 
        /**
         * Whether jQuery is already handled.
@@ -445,7 +486,9 @@ class OutputPage extends ContextSource {
         * @param string $type
         * @return array
         */
-       protected function filterModules( $modules, $position = null, $type = ResourceLoaderModule::TYPE_COMBINED ) {
+       protected function filterModules( $modules, $position = null,
+               $type = ResourceLoaderModule::TYPE_COMBINED
+       ) {
                $resourceLoader = $this->getResourceLoader();
                $filteredModules = array();
                foreach ( $modules as $val ) {
@@ -724,7 +767,8 @@ class OutputPage extends ContextSource {
                $clientHeaderTime = strtotime( $clientHeader );
                wfRestoreWarnings();
                if ( !$clientHeaderTime ) {
-                       wfDebug( __METHOD__ . ": unable to parse the client's If-Modified-Since header: $clientHeader\n" );
+                       wfDebug( __METHOD__
+                               . ": unable to parse the client's If-Modified-Since header: $clientHeader\n" );
                        return false;
                }
                $clientHeaderTime = wfTimestamp( TS_MW, $clientHeaderTime );
@@ -875,10 +919,12 @@ class OutputPage extends ContextSource {
        }
 
        /**
-        * "Page title" means the contents of \<h1\>. It is stored as a valid HTML fragment.
-        * This function allows good tags like \<sup\> in the \<h1\> tag, but not bad tags like \<script\>.
-        * This function automatically sets \<title\> to the same content as \<h1\> but with all tags removed.
-        * Bad tags that were escaped in \<h1\> will still be escaped in \<title\>, and good tags like \<i\> will be dropped entirely.
+        * "Page title" means the contents of \<h1\>. It is stored as a valid HTML
+        * fragment. This function allows good tags like \<sup\> in the \<h1\> tag,
+        * but not bad tags like \<script\>. This function automatically sets
+        * \<title\> to the same content as \<h1\> but with all tags removed. Bad
+        * tags that were escaped in \<h1\> will still be escaped in \<title\>, and
+        * good tags like \<i\> will be dropped entirely.
         *
         * @param string|Message $name
         */
@@ -960,7 +1006,8 @@ class OutputPage extends ContextSource {
                if ( $title->isRedirect() ) {
                        $query['redirect'] = 'no';
                }
-               $this->addSubtitle( $this->msg( 'backlinksubtitle' )->rawParams( Linker::link( $title, null, array(), $query ) ) );
+               $this->addSubtitle( $this->msg( 'backlinksubtitle' )
+                       ->rawParams( Linker::link( $title, null, array(), $query ) ) );
        }
 
        /**
@@ -1203,11 +1250,15 @@ class OutputPage extends ContextSource {
                # Fetch existence plus the hiddencat property
                $dbr = wfGetDB( DB_SLAVE );
                $res = $dbr->select( array( 'page', 'page_props' ),
-                       array( 'page_id', 'page_namespace', 'page_title', 'page_len', 'page_is_redirect', 'page_latest', 'pp_value' ),
+                       array( 'page_id', 'page_namespace', 'page_title', 'page_len',
+                               'page_is_redirect', 'page_latest', 'pp_value' ),
                        $lb->constructSet( 'page', $dbr ),
                        __METHOD__,
                        array(),
-                       array( 'page_props' => array( 'LEFT JOIN', array( 'pp_propname' => 'hiddencat', 'pp_page = page_id' ) ) )
+                       array( 'page_props' => array( 'LEFT JOIN', array(
+                               'pp_propname' => 'hiddencat',
+                               'pp_page = page_id'
+                       ) ) )
                );
 
                # Add the results to the link cache
@@ -1227,7 +1278,10 @@ class OutputPage extends ContextSource {
                }
 
                # Add the remaining categories to the skin
-               if ( wfRunHooks( 'OutputPageMakeCategoryLinks', array( &$this, $categories, &$this->mCategoryLinks ) ) ) {
+               if ( wfRunHooks(
+                       'OutputPageMakeCategoryLinks',
+                       array( &$this, $categories, &$this->mCategoryLinks ) )
+               ) {
                        foreach ( $categories as $category => $type ) {
                                $origcategory = $category;
                                $title = Title::makeTitleSafe( NS_CATEGORY, $category );
@@ -1294,7 +1348,8 @@ class OutputPage extends ContextSource {
         */
        public function isUserJsAllowed() {
                wfDeprecated( __METHOD__, '1.18' );
-               return $this->getAllowedModules( ResourceLoaderModule::TYPE_SCRIPTS ) >= ResourceLoaderModule::ORIGIN_USER_INDIVIDUAL;
+               return $this->getAllowedModules( ResourceLoaderModule::TYPE_SCRIPTS ) >=
+                       ResourceLoaderModule::ORIGIN_USER_INDIVIDUAL;
        }
 
        /**
@@ -1537,7 +1592,9 @@ class OutputPage extends ContextSource {
         * @param bool $interface Whether it is an interface message
         *   (for example disables conversion)
         */
-       public function addWikiTextTitle( $text, Title $title, $linestart, $tidy = false, $interface = false ) {
+       public function addWikiTextTitle( $text, Title $title, $linestart,
+               $tidy = false, $interface = false
+       ) {
                global $wgParser;
 
                wfProfileIn( __METHOD__ );
@@ -1931,7 +1988,8 @@ class OutputPage extends ContextSource {
                                        wfDebug( __METHOD__ . ": proxy caching with ESI; {$this->mLastModified} **\n", 'log' );
                                        # start with a shorter timeout for initial testing
                                        # header( 'Surrogate-Control: max-age=2678400+2678400, content="ESI/1.0"');
-                                       $response->header( 'Surrogate-Control: max-age=' . $wgSquidMaxage . '+' . $this->mSquidMaxage . ', content="ESI/1.0"' );
+                                       $response->header( 'Surrogate-Control: max-age=' . $wgSquidMaxage
+                                               . '+' . $this->mSquidMaxage . ', content="ESI/1.0"' );
                                        $response->header( 'Cache-Control: s-maxage=0, must-revalidate, max-age=0' );
                                } else {
                                        # We'll purge the proxy cache for anons explicitly, but require end user agents
@@ -1941,7 +1999,8 @@ class OutputPage extends ContextSource {
                                        wfDebug( __METHOD__ . ": local proxy caching; {$this->mLastModified} **\n", 'log' );
                                        # start with a shorter timeout for initial testing
                                        # header( "Cache-Control: s-maxage=2678400, must-revalidate, max-age=0" );
-                                       $response->header( 'Cache-Control: s-maxage=' . $this->mSquidMaxage . ', must-revalidate, max-age=0' );
+                                       $response->header( 'Cache-Control: s-maxage=' . $this->mSquidMaxage
+                                               . ', must-revalidate, max-age=0' );
                                }
                        } else {
                                # We do want clients to cache if they can, but they *must* check for updates
@@ -2161,7 +2220,9 @@ class OutputPage extends ContextSource {
 
                if ( $msg instanceof Message ) {
                        if ( $params !== array() ) {
-                               trigger_error( 'Argument ignored: $params. The message parameters argument is discarded when the $msg argument is a Message object instead of a string.', E_USER_NOTICE );
+                               trigger_error( 'Argument ignored: $params. The message parameters argument '
+                                       . 'is discarded when the $msg argument is a Message object instead of '
+                                       . 'a string.', E_USER_NOTICE );
                        }
                        $this->addHTML( $msg->parseAsBlock() );
                } else {
@@ -2329,11 +2390,14 @@ class OutputPage extends ContextSource {
         *
         * @param string $source Source code to show (or null).
         * @param bool $protected Is this a permissions error?
-        * @param array $reasons List of reasons for this error, as returned by Title::getUserPermissionsErrors().
+        * @param array $reasons List of reasons for this error, as returned by
+        *   Title::getUserPermissionsErrors().
         * @param string $action Action that was denied or null if unknown
         * @throws ReadOnlyError
         */
-       public function readOnlyPage( $source = null, $protected = false, $reasons = array(), $action = null ) {
+       public function readOnlyPage( $source = null, $protected = false,
+               $reasons = array(), $action = null
+       ) {
                $this->setRobotPolicy( 'noindex,nofollow' );
                $this->setArticleRelated( false );
 
@@ -2556,7 +2620,8 @@ $templates
 
                $bodyClasses[] = $sk->getPageClasses( $this->getTitle() );
                $bodyClasses[] = 'skin-' . Sanitizer::escapeClass( $sk->getSkinName() );
-               $bodyClasses[] = 'action-' . Sanitizer::escapeClass( Action::getActionName( $this->getContext() ) );
+               $bodyClasses[] =
+                       'action-' . Sanitizer::escapeClass( Action::getActionName( $this->getContext() ) );
 
                $bodyAttrs = array();
                // While the implode() is not strictly needed, it's used for backwards compatibility
@@ -2585,15 +2650,19 @@ $templates
        }
 
        /**
-        * TODO: Document
+        * @todo Document
         * @param array|string $modules One or more module names
         * @param string $only ResourceLoaderModule TYPE_ class constant
         * @param bool $useESI
-        * @param array $extraQuery Array with extra query parameters to add to each request. array( param => value )
-        * @param bool $loadCall If true, output an (asynchronous) mw.loader.load() call rather than a "<script src='...'>" tag
+        * @param array $extraQuery Array with extra query parameters to add to each
+        *   request. array( param => value ).
+        * @param bool $loadCall If true, output an (asynchronous) mw.loader.load()
+        *   call rather than a "<script src='...'>" tag.
         * @return string The html "<script>", "<link>" and "<style>" tags
         */
-       protected function makeResourceLoaderLink( $modules, $only, $useESI = false, array $extraQuery = array(), $loadCall = false ) {
+       protected function makeResourceLoaderLink( $modules, $only, $useESI = false,
+               array $extraQuery = array(), $loadCall = false
+       ) {
                global $wgResourceLoaderUseESI;
 
                $modules = (array)$modules;
@@ -2607,7 +2676,6 @@ $templates
                        return $links;
                }
 
-
                if ( count( $modules ) > 1 ) {
                        // Remove duplicate module requests
                        $modules = array_unique( $modules );
@@ -2837,8 +2905,14 @@ $templates
 
                // Scripts and messages "only" requests marked for top inclusion
                // Messages should go first
-               $links[] = $this->makeResourceLoaderLink( $this->getModuleMessages( true, 'top' ), ResourceLoaderModule::TYPE_MESSAGES );
-               $links[] = $this->makeResourceLoaderLink( $this->getModuleScripts( true, 'top' ), ResourceLoaderModule::TYPE_SCRIPTS );
+               $links[] = $this->makeResourceLoaderLink(
+                       $this->getModuleMessages( true, 'top' ),
+                       ResourceLoaderModule::TYPE_MESSAGES
+               );
+               $links[] = $this->makeResourceLoaderLink(
+                       $this->getModuleScripts( true, 'top' ),
+                       ResourceLoaderModule::TYPE_SCRIPTS
+               );
 
                // Modules requests - let the client calculate dependencies and batch requests as it likes
                // Only load modules that have marked themselves for loading at the top
@@ -2859,12 +2933,14 @@ $templates
        }
 
        /**
-        * JS stuff to put at the 'bottom', which can either be the bottom of the "<body>"
-        * or the bottom of the "<head>" depending on $wgResourceLoaderExperimentalAsyncLoading:
-        * modules marked with position 'bottom', legacy scripts ($this->mScripts),
-        * user preferences, site JS and user JS.
+        * JS stuff to put at the 'bottom', which can either be the bottom of the
+        * "<body>" or the bottom of the "<head>" depending on
+        * $wgResourceLoaderExperimentalAsyncLoading: modules marked with position
+        * 'bottom', legacy scripts ($this->mScripts), user preferences, site JS
+        * and user JS.
         *
-        * @param bool $inHead If true, this HTML goes into the "<head>", if false it goes into the "<body>"
+        * @param bool $inHead If true, this HTML goes into the "<head>",
+        *   if false it goes into the "<body>".
         * @return string
         */
        function getScriptsForBottomQueue( $inHead ) {
@@ -2903,7 +2979,12 @@ $templates
                );
 
                // Add user JS if enabled
-               if ( $wgAllowUserJs && $this->getUser()->isLoggedIn() && $this->getTitle() && $this->getTitle()->isJsSubpage() && $this->userCanPreview() ) {
+               if ( $wgAllowUserJs
+                       && $this->getUser()->isLoggedIn()
+                       && $this->getTitle()
+                       && $this->getTitle()->isJsSubpage()
+                       && $this->userCanPreview()
+               ) {
                        # XXX: additional security check/prompt?
                        // We're on a preview of a JS subpage
                        // Exclude this page from the user module in case it's in there (bug 26283)
@@ -2911,7 +2992,8 @@ $templates
                                array( 'excludepage' => $this->getTitle()->getPrefixedDBkey() ), $inHead
                        );
                        // Load the previewed JS
-                       $links[] = Html::inlineScript( "\n" . $this->getRequest()->getText( 'wpTextbox1' ) . "\n" ) . "\n";
+                       $links[] = Html::inlineScript( "\n"
+                                       . $this->getRequest()->getText( 'wpTextbox1' ) . "\n" ) . "\n";
 
                        // FIXME: If the user is previewing, say, ./vector.js, his ./common.js will be loaded
                        // asynchronously and may arrive *after* the inline script here. So the previewed code
@@ -2999,7 +3081,9 @@ $templates
 
                $title = $this->getTitle();
                $ns = $title->getNamespace();
-               $canonicalNamespace = MWNamespace::exists( $ns ) ? MWNamespace::getCanonicalName( $ns ) : $title->getNsText();
+               $canonicalNamespace = MWNamespace::exists( $ns )
+                       ? MWNamespace::getCanonicalName( $ns )
+                       : $title->getNsText();
 
                $sk = $this->getSkin();
                // Get the relevant title so that AJAX features can use the correct page name
@@ -3008,7 +3092,8 @@ $templates
                $relevantUser = $sk->getRelevantUser();
 
                if ( $ns == NS_SPECIAL ) {
-                       list( $canonicalSpecialPageName, /*...*/ ) = SpecialPageFactory::resolveAlias( $title->getDBkey() );
+                       list( $canonicalSpecialPageName, /*...*/ ) =
+                               SpecialPageFactory::resolveAlias( $title->getDBkey() );
                } elseif ( $this->canUseWikiPage() ) {
                        $wikiPage = $this->getWikiPage();
                        $curRevisionId = $wikiPage->getLatest();
@@ -3058,6 +3143,7 @@ $templates
                        'wgMonthNamesShort' => $lang->getMonthAbbreviationsArray(),
                        'wgRelevantPageName' => $relevantTitle->getPrefixedDBkey(),
                );
+
                if ( $user->isLoggedIn() ) {
                        $vars['wgUserId'] = $user->getId();
                        $vars['wgUserEditCount'] = $user->getEditCount();
@@ -3068,20 +3154,26 @@ $templates
                        // the client side.
                        $vars['wgUserNewMsgRevisionId'] = $user->getNewMessageRevisionId();
                }
+
                if ( $wgContLang->hasVariants() ) {
                        $vars['wgUserVariant'] = $wgContLang->getPreferredVariant();
                }
                // Same test as SkinTemplate
-               $vars['wgIsProbablyEditable'] = $title->quickUserCan( 'edit', $user ) && ( $title->exists() || $title->quickUserCan( 'create', $user ) );
+               $vars['wgIsProbablyEditable'] = $title->quickUserCan( 'edit', $user )
+                       && ( $title->exists() || $title->quickUserCan( 'create', $user ) );
+
                foreach ( $title->getRestrictionTypes() as $type ) {
                        $vars['wgRestriction' . ucfirst( $type )] = $title->getRestrictions( $type );
                }
+
                if ( $title->isMainPage() ) {
                        $vars['wgIsMainPage'] = true;
                }
+
                if ( $this->mRedirectedFrom ) {
                        $vars['wgRedirectedFrom'] = $this->mRedirectedFrom->getPrefixedDBkey();
                }
+
                if ( $relevantUser ) {
                        $vars['wgRelevantUserName'] = $relevantUser->getName();
                }
@@ -3199,11 +3291,17 @@ $templates
                # uses whichever one appears later in the HTML source. Make sure
                # apple-touch-icon is specified first to avoid this.
                if ( $wgAppleTouchIcon !== false ) {
-                       $tags['apple-touch-icon'] = Html::element( 'link', array( 'rel' => 'apple-touch-icon', 'href' => $wgAppleTouchIcon ) );
+                       $tags['apple-touch-icon'] = Html::element( 'link', array(
+                               'rel' => 'apple-touch-icon',
+                               'href' => $wgAppleTouchIcon
+                       ) );
                }
 
                if ( $wgFavicon !== false ) {
-                       $tags['favicon'] = Html::element( 'link', array( 'rel' => 'shortcut icon', 'href' => $wgFavicon ) );
+                       $tags['favicon'] = Html::element( 'link', array(
+                               'rel' => 'shortcut icon',
+                               'href' => $wgFavicon
+                       ) );
                }
 
                # OpenSearch description link
@@ -3224,7 +3322,11 @@ $templates
                                'type' => 'application/rsd+xml',
                                // Output a protocol-relative URL here if $wgServer is protocol-relative
                                // Whether RSD accepts relative or protocol-relative URLs is completely undocumented, though
-                               'href' => wfExpandUrl( wfAppendQuery( wfScript( 'api' ), array( 'action' => 'rsd' ) ), PROTO_RELATIVE ),
+                               'href' => wfExpandUrl( wfAppendQuery(
+                                       wfScript( 'api' ),
+                                       array( 'action' => 'rsd' ) ),
+                                       PROTO_RELATIVE
+                               ),
                        ) );
                }
 
@@ -3309,7 +3411,8 @@ $templates
                                        $tags[] = $this->feedLink(
                                                $format,
                                                $rctitle->getLocalURL( array( 'feed' => $format ) ),
-                                               $this->msg( "site-{$format}-feed", $wgSitename )->text() # For grep: 'site-rss-feed', 'site-atom-feed'.
+                                               # For grep: 'site-rss-feed', 'site-atom-feed'
+                                               $this->msg( "site-{$format}-feed", $wgSitename )->text()
                                        );
                                }
                        }
@@ -3410,7 +3513,13 @@ $templates
 
                // Add ResourceLoader styles
                // Split the styles into these groups
-               $styles = array( 'other' => array(), 'user' => array(), 'site' => array(), 'private' => array(), 'noscript' => array() );
+               $styles = array(
+                       'other' => array(),
+                       'user' => array(),
+                       'site' => array(),
+                       'private' => array(),
+                       'noscript' => array()
+               );
                $links = array();
                $otherTags = ''; // Tags to append after the normal <link> tags
                $resourceLoader = $this->getResourceLoader();
@@ -3458,16 +3567,20 @@ $templates
                        $styles[ isset( $styles[$group] ) ? $group : 'other' ][] = $name;
                }
 
-               // We want site, private and user styles to override dynamically added styles from modules, but we want
-               // dynamically added styles to override statically added styles from other modules. So the order
-               // has to be other, dynamic, site, private, user
-               // Add statically added styles for other modules
+               // We want site, private and user styles to override dynamically added
+               // styles from modules, but we want dynamically added styles to override
+               // statically added styles from other modules. So the order has to be
+               // other, dynamic, site, private, user. Add statically added styles for
+               // other modules
                $links[] = $this->makeResourceLoaderLink( $styles['other'], ResourceLoaderModule::TYPE_STYLES );
                // Add normal styles added through addStyle()/addInlineStyle() here
                $links[] = implode( "\n", $this->buildCssLinksArray() ) . $this->mInlineStyles;
                // Add marker tag to mark the place where the client-side loader should inject dynamic styles
                // We use a <meta> tag with a made-up name for this because that's valid HTML
-               $links[] = Html::element( 'meta', array( 'name' => 'ResourceLoaderDynamicStyles', 'content' => '' ) ) . "\n";
+               $links[] = Html::element(
+                       'meta',
+                       array( 'name' => 'ResourceLoaderDynamicStyles', 'content' => '' )
+               ) . "\n";
 
                // Add site, private and user styles
                // 'private' at present only contains user.options, so put that before 'user'
@@ -3569,8 +3682,10 @@ $templates
                                } elseif ( preg_match( $screenMediaQueryRegex, $media ) === 1 ) {
                                        // This regex will not attempt to understand a comma-separated media_query_list
                                        //
-                                       // Example supported values for $media: 'screen', 'only screen', 'screen and (min-width: 982px)' ),
-                                       // Example NOT supported value for $media: '3d-glasses, screen, print and resolution > 90dpi'
+                                       // Example supported values for $media:
+                                       // 'screen', 'only screen', 'screen and (min-width: 982px)' ),
+                                       // Example NOT supported value for $media:
+                                       // '3d-glasses, screen, print and resolution > 90dpi'
                                        //
                                        // If it's a print request, we never want any kind of screen stylesheets
                                        // If it's a handheld request (currently the only other choice with a switch),
@@ -3628,7 +3743,8 @@ $templates
         *
         * Is equivalent to:
         *
-        *    $wgOut->addWikiText( "<div class='error'>\n" . wfMessage( 'some-error' )->plain() . "\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.
         *
index 9b5373b..0fb3952 100644 (file)
@@ -43,10 +43,13 @@ function wfPHPVersionError( $type ) {
 
        $phpVersion = phpversion();
        $protocol = isset( $_SERVER['SERVER_PROTOCOL'] ) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0';
-       $message = "MediaWiki $mwVersion requires at least PHP version $minimumVersionPHP, you are using PHP $phpVersion.";
+       $message = "MediaWiki $mwVersion requires at least "
+               . "PHP version $minimumVersionPHP, you are using PHP $phpVersion.";
+
        if ( $type == 'cli' ) {
-               $finalOutput = "You are using PHP version $phpVersion but MediaWiki $mwVersion needs PHP $minimumVersionPHP or higher. ABORTING.\n" .
-               "Check if you have a newer php executable with a different name, such as php5.\n";
+               $finalOutput = "You are using PHP version $phpVersion "
+                       . "but MediaWiki $mwVersion needs PHP $minimumVersionPHP or higher. ABORTING.\n"
+                       . "Check if you have a newer php executable with a different name, such as php5.\n";
        } elseif ( $type == 'index.php' ) {
                $pathinfo = pathinfo( $_SERVER['SCRIPT_NAME'] );
                $encLogo = htmlspecialchars(
index 33bf067..5f05460 100644 (file)
@@ -365,7 +365,9 @@ abstract class IndexPager extends ContextSource implements Pager {
         * @return ResultWrapper
         */
        public function reallyDoQuery( $offset, $limit, $descending ) {
-               list( $tables, $fields, $conds, $fname, $options, $join_conds ) = $this->buildQueryInfo( $offset, $limit, $descending );
+               list( $tables, $fields, $conds, $fname, $options, $join_conds ) =
+                       $this->buildQueryInfo( $offset, $limit, $descending );
+
                return $this->mDb->select( $tables, $fields, $conds, $fname, $options, $join_conds );
        }
 
@@ -409,7 +411,8 @@ abstract class IndexPager extends ContextSource implements Pager {
         *
         * @param ResultWrapper $result
         */
-       protected function preprocessResults( $result ) {}
+       protected function preprocessResults( $result ) {
+       }
 
        /**
         * Get the formatted result list. Calls getStartBody(), formatRow() and
@@ -491,7 +494,8 @@ abstract class IndexPager extends ContextSource implements Pager {
         *
         * @return void
         */
-       protected function doBatchLookups() {}
+       protected function doBatchLookups() {
+       }
 
        /**
         * Hook into getBody(), allows text to be inserted at the start. This
@@ -924,8 +928,9 @@ abstract class ReverseChronologicalPager extends IndexPager {
  * @ingroup Pager
  */
 abstract class TablePager extends IndexPager {
-       var $mSort;
-       var $mCurrentRow;
+       protected $mSort;
+
+       protected $mCurrentRow;
 
        public function __construct( IContextSource $context = null ) {
                if ( $context ) {
@@ -995,7 +1000,10 @@ abstract class TablePager extends IndexPager {
                }
 
                $tableClass = $this->getTableClass();
-               $ret = Html::openElement( 'table', array( 'style' => 'border:1px;', 'class' => "mw-datatable $tableClass" ) );
+               $ret = Html::openElement( 'table', array(
+                       'style' => 'border:1px;',
+                       'class' => "mw-datatable $tableClass" )
+               );
                $ret .= Html::rawElement( 'thead', array(), Html::rawElement( 'tr', array(), "\n" . $s . "\n" ) );
                $ret .= Html::openElement( 'tbody' ) . "\n";
 
index 493626a..1f1b7dd 100644 (file)
  * over to the tryUISubmit static method of this class.
  */
 class Preferences {
-       static $defaultPreferences = null;
-       static $saveFilters = array(
-                       'timecorrection' => array( 'Preferences', 'filterTimezoneInput' ),
-                       'cols' => array( 'Preferences', 'filterIntval' ),
-                       'rows' => array( 'Preferences', 'filterIntval' ),
-                       'rclimit' => array( 'Preferences', 'filterIntval' ),
-                       'wllimit' => array( 'Preferences', 'filterIntval' ),
-                       'searchlimit' => array( 'Preferences', 'filterIntval' ),
+       /** @var array */
+       protected static $defaultPreferences = null;
+
+       /** @var array */
+       protected static $saveFilters = array(
+               'timecorrection' => array( 'Preferences', 'filterTimezoneInput' ),
+               'cols' => array( 'Preferences', 'filterIntval' ),
+               'rows' => array( 'Preferences', 'filterIntval' ),
+               'rclimit' => array( 'Preferences', 'filterIntval' ),
+               'wllimit' => array( 'Preferences', 'filterIntval' ),
+               'searchlimit' => array( 'Preferences', 'filterIntval' ),
        );
 
        // Stuff that shouldn't be saved as a preference.
@@ -210,13 +213,6 @@ class Preferences {
                        'section' => 'personal/info',
                );
 
-               $defaultPreferences['userid'] = array(
-                       'type' => 'info',
-                       'label-message' => array( 'uid', $userName ),
-                       'default' => $user->getId(),
-                       'section' => 'personal/info',
-               );
-
                # Get groups to which the user belongs
                $userEffectiveGroups = $user->getEffectiveGroups();
                $userGroups = $userMembers = array();
@@ -1401,7 +1397,10 @@ class Preferences {
 
                // Fortunately, the realname field is MUCH simpler
                // (not really "private", but still shouldn't be edited without permission)
-               if ( !in_array( 'realname', $wgHiddenPrefs ) && $user->isAllowed( 'editmyprivateinfo' ) && array_key_exists( 'realname', $formData ) ) {
+               if ( !in_array( 'realname', $wgHiddenPrefs )
+                       && $user->isAllowed( 'editmyprivateinfo' )
+                       && array_key_exists( 'realname', $formData )
+               ) {
                        $realName = $formData['realname'];
                        $user->setRealName( $realName );
                }
index c5dd698..a796d35 100644 (file)
@@ -121,7 +121,7 @@ abstract class PrefixSearch {
         * @param array $titles
         * @return array
         */
-       protected abstract function titles( array $titles );
+       abstract protected function titles( array $titles );
 
        /**
         * When implemented in a descendant class, receives an array of titles as strings and returns
@@ -131,7 +131,7 @@ abstract class PrefixSearch {
         *
         * @return array
         */
-       protected abstract function strings( array $strings );
+       abstract protected function strings( array $strings );
 
        /**
         * Do a prefix search of titles and return a list of matching page names.
@@ -296,7 +296,9 @@ class TitlePrefixSearch extends PrefixSearch {
 class StringPrefixSearch extends PrefixSearch {
 
        protected function titles( array $titles ) {
-               return array_map( function( Title $t ) { return $t->getPrefixedText(); }, $titles );
+               return array_map( function ( Title $t ) {
+                       return $t->getPrefixedText();
+               }, $titles );
        }
 
        protected function strings( array $strings ) {
index ea359aa..d34ee03 100644 (file)
  * Handles the page protection UI and backend
  */
 class ProtectionForm {
-       /** A map of action to restriction level, from request or default */
-       var $mRestrictions = array();
+       /** @var array A map of action to restriction level, from request or default */
+       protected $mRestrictions = array();
 
-       /** The custom/additional protection reason */
-       var $mReason = '';
+       /** @var string The custom/additional protection reason */
+       protected $mReason = '';
 
-       /** The reason selected from the list, blank for other/additional */
-       var $mReasonSelection = '';
+       /** @var string The reason selected from the list, blank for other/additional */
+       protected $mReasonSelection = '';
 
-       /** True if the restrictions are cascading, from request or existing protection */
-       var $mCascade = false;
+       /** @var bool True if the restrictions are cascading, from request or existing protection */
+       protected $mCascade = false;
 
-       /** Map of action to "other" expiry time. Used in preference to mExpirySelection. */
-       var $mExpiry = array();
+       /** @var array Map of action to "other" expiry time. Used in preference to mExpirySelection. */
+       protected $mExpiry = array();
 
        /**
-        * Map of action to value selected in expiry drop-down list.
+        * @var array Map of action to value selected in expiry drop-down list.
         * Will be set to 'othertime' whenever mExpiry is set.
         */
-       var $mExpirySelection = array();
+       protected $mExpirySelection = array();
 
-       /** Permissions errors for the protect action */
-       var $mPermErrors = array();
+       /** @var array Permissions errors for the protect action */
+       protected $mPermErrors = array();
 
-       /** Types (i.e. actions) for which levels can be selected */
-       var $mApplicableTypes = array();
+       /** @var array Types (i.e. actions) for which levels can be selected */
+       protected $mApplicableTypes = array();
 
-       /** Map of action to the expiry time of the existing protection */
-       var $mExistingExpiry = array();
+       /** @var array Map of action to the expiry time of the existing protection */
+       protected $mExistingExpiry = array();
 
        function __construct( Page $article ) {
                global $wgUser;
@@ -209,7 +209,10 @@ class ProtectionForm {
                if ( $this->mTitle->getRestrictionTypes() === array() ) {
                        // No restriction types available for the current title
                        // this might happen if an extension alters the available types
-                       $wgOut->setPageTitle( wfMessage( 'protect-norestrictiontypes-title', $this->mTitle->getPrefixedText() ) );
+                       $wgOut->setPageTitle( wfMessage(
+                               'protect-norestrictiontypes-title',
+                               $this->mTitle->getPrefixedText()
+                       ) );
                        $wgOut->addWikiText( wfMessage( 'protect-norestrictiontypes-text' )->text() );
 
                        // Show the log in case protection was possible once
@@ -226,13 +229,20 @@ class ProtectionForm {
                                $titles .= '* [[:' . $title->getPrefixedText() . "]]\n";
                        }
 
-                       $wgOut->wrapWikiMsg( "<div id=\"mw-protect-cascadeon\">\n$1\n" . $titles . "</div>", array( 'protect-cascadeon', count( $cascadeSources ) ) );
+                       /** @todo FIXME: i18n issue, should use formatted number. */
+                       $wgOut->wrapWikiMsg(
+                               "<div id=\"mw-protect-cascadeon\">\n$1\n" . $titles . "</div>",
+                               array( 'protect-cascadeon', count( $cascadeSources ) )
+                       );
                }
 
                # Show an appropriate message if the user isn't allowed or able to change
                # the protection settings at this time
                if ( $this->disabled ) {
-                       $wgOut->setPageTitle( wfMessage( 'protect-title-notallowed', $this->mTitle->getPrefixedText() ) );
+                       $wgOut->setPageTitle(
+                               wfMessage( 'protect-title-notallowed',
+                                       $this->mTitle->getPrefixedText() )
+                       );
                        $wgOut->addWikiText( $wgOut->formatPermissionsErrorMessage( $this->mPermErrors, 'protect' ) );
                } else {
                        $wgOut->setPageTitle( wfMessage( 'protect-title', $this->mTitle->getPrefixedText() ) );
@@ -290,7 +300,13 @@ class ProtectionForm {
 
                $this->mCascade = $wgRequest->getBool( 'mwProtect-cascade' );
 
-               $status = $this->mArticle->doUpdateRestrictions( $this->mRestrictions, $expiry, $this->mCascade, $reasonstr, $wgUser );
+               $status = $this->mArticle->doUpdateRestrictions(
+                       $this->mRestrictions,
+                       $expiry,
+                       $this->mCascade,
+                       $reasonstr,
+                       $wgUser
+               );
 
                if ( !$status->isOK() ) {
                        $this->show( $wgOut->parseInline( $status->getWikiText() ) );
@@ -403,7 +419,11 @@ class ProtectionForm {
                                }
                                $show = htmlspecialchars( $show );
                                $value = htmlspecialchars( $value );
-                               $expiryFormOptions .= Xml::option( $show, $value, $this->mExpirySelection[$action] === $value ) . "\n";
+                               $expiryFormOptions .= Xml::option(
+                                       $show,
+                                       $value,
+                                       $this->mExpirySelection[$action] === $value
+                               ) . "\n";
                        }
                        # Add expiry dropdown
                        if ( $showProtectOptions && !$this->disabled ) {
@@ -526,7 +546,10 @@ class ProtectionForm {
                }
 
                if ( !$this->disabled ) {
-                       $out .= Html::hidden( 'wpEditToken', $wgUser->getEditToken( array( 'protect', $this->mTitle->getPrefixedDBkey() ) ) );
+                       $out .= Html::hidden(
+                               'wpEditToken',
+                               $wgUser->getEditToken( array( 'protect', $this->mTitle->getPrefixedDBkey() ) )
+                       );
                        $out .= Xml::closeElement( 'form' );
                        $wgOut->addScript( $this->buildCleanupScript() );
                }
index cf0a644..82dea0d 100644 (file)
  * @ingroup SpecialPage
  */
 abstract class QueryPage extends SpecialPage {
-       /**
-        * Whether or not we want plain listoutput rather than an ordered list
-        *
-        * @var bool
-        */
-       var $listoutput = false;
+       /** @var bool Whether or not we want plain listoutput rather than an ordered list */
+       protected $listoutput = false;
 
-       /**
-        * The offset and limit in use, as passed to the query() function
-        *
-        * @var int
-        */
-       var $offset = 0;
-       var $limit = 0;
+       /** @var int The offset and limit in use, as passed to the query() function */
+       protected $offset = 0;
+
+       /** @var int */
+       protected $limit = 0;
 
        /**
         * The number of rows returned by the query. Reading this variable
@@ -503,7 +497,7 @@ abstract class QueryPage extends SpecialPage {
                        list( $this->limit, $this->offset ) = $this->getRequest()->getLimitOffset();
                }
 
-               // TODO: Use doQuery()
+               // @todo Use doQuery()
                if ( !$this->isCached() ) {
                        # select one extra row for navigation
                        $res = $this->reallyDoQuery( $this->limit + 1, $this->offset );
@@ -595,7 +589,7 @@ abstract class QueryPage extends SpecialPage {
         * @param OutputPage $out OutputPage to print to
         * @param Skin $skin User skin to use
         * @param DatabaseBase $dbr Database (read) connection to use
-        * @param int $res Result pointer
+        * @param ResultWrapper $res Result pointer
         * @param int $num Number of available result rows
         * @param int $offset Paging offset
         */
@@ -610,7 +604,9 @@ abstract class QueryPage extends SpecialPage {
 
                        # $res might contain the whole 1,000 rows, so we read up to
                        # $num [should update this to use a Pager]
+                       // @codingStandardsIgnoreStart Generic.CodeAnalysis.ForLoopWithTestFunctionCall.NotAllowed
                        for ( $i = 0; $i < $num && $row = $res->fetchObject(); $i++ ) {
+                               // @codingStandardsIgnoreEnd
                                $line = $this->formatResult( $skin, $row );
                                if ( $line ) {
                                        $attr = ( isset( $row->usepatrol ) && $row->usepatrol && $row->patrolled == 0 )
@@ -668,7 +664,8 @@ abstract class QueryPage extends SpecialPage {
         * @param DatabaseBase $db
         * @param ResultWrapper $res
         */
-       function preprocessResults( $db, $res ) {}
+       function preprocessResults( $db, $res ) {
+       }
 
        /**
         * Similar to above, but packaging in a syndicated feed instead of a web page
@@ -687,6 +684,7 @@ abstract class QueryPage extends SpecialPage {
                $limit = min( $limit, $wgFeedLimit );
 
                if ( isset( $wgFeedClasses[$class] ) ) {
+                       /** @var RSSFeed|AtomFeed $feed */
                        $feed = new $wgFeedClasses[$class](
                                $this->feedTitle(),
                                $this->feedDesc(),
index 506ac4c..d10b541 100644 (file)
  * List for revision table items for a single page
  */
 abstract class RevisionListBase extends ContextSource {
-       /**
-        * @var Title
-        */
-       var $title;
+       /** @var Title */
+       public $title;
+
+       /** @var array */
+       protected $ids;
 
-       var $ids, $res, $current;
+       protected $res;
+
+       /** @var bool|object */
+       protected $current;
 
        /**
         * Construct a revision list for a given title
@@ -131,11 +135,11 @@ abstract class RevisionListBase extends ContextSource {
  * Abstract base class for revision items
  */
 abstract class RevisionItemBase {
-       /** The parent RevisionListBase */
-       var $list;
+       /** @var RevisionListBase The parent */
+       protected $list;
 
-       /** The DB result row */
-       var $row;
+       /** The database result row */
+       protected $row;
 
        /**
         * @param RevisionListBase $list
@@ -288,7 +292,11 @@ class RevisionList extends RevisionListBase {
  * Item class for a live revision table row
  */
 class RevisionItem extends RevisionItemBase {
-       var $revision, $context;
+       /** @var Revision */
+       protected $revision;
+
+       /** @var RequestContext */
+       protected $context;
 
        public function __construct( $list, $row ) {
                parent::__construct( $list, $row );
@@ -326,7 +334,7 @@ class RevisionItem extends RevisionItemBase {
 
        /**
         * Get the HTML link to the revision text.
-        * Overridden by RevDel_ArchiveItem.
+        * Overridden by RevDelArchiveItem.
         * @return string
         */
        protected function getRevisionLink() {
@@ -347,7 +355,7 @@ class RevisionItem extends RevisionItemBase {
 
        /**
         * Get the HTML link to the diff.
-        * Overridden by RevDel_ArchiveItem
+        * Overridden by RevDelArchiveItem
         * @return string
         */
        protected function getDiffLink() {
index 59ac046..1ea6523 100644 (file)
@@ -358,7 +358,7 @@ class Sanitizer {
         * @param string $text
         * @param callable $processCallback Callback to do any variable or parameter
         *   replacements in HTML attribute values
-        * @param array $args Arguments for the processing callback
+        * @param array|bool $args Arguments for the processing callback
         * @param array $extratags For any extra tags to include
         * @param array $removetags For any tags (default or extra) to exclude
         * @return string
@@ -459,7 +459,10 @@ class Sanitizer {
                                                $badtag = true;
                                        } elseif ( $slash ) {
                                                # Closing a tag... is it the one we just opened?
-                                               $ot = @array_pop( $tagstack );
+                                               wfSuppressWarnings();
+                                               $ot = array_pop( $tagstack );
+                                               wfRestoreWarnings();
+
                                                if ( $ot != $t ) {
                                                        if ( isset( $htmlsingleallowed[$ot] ) ) {
                                                                # Pop all elements with an optional close tag
@@ -489,7 +492,10 @@ class Sanitizer {
                                                                        }
                                                                }
                                                        } else {
-                                                               @array_push( $tagstack, $ot );
+                                                               wfSuppressWarnings();
+                                                               array_push( $tagstack, $ot );
+                                                               wfRestoreWarnings();
+
                                                                # <li> can be nested in <ul> or <ol>, skip those cases:
                                                                if ( !isset( $htmllist[$ot] ) || !isset( $listtags[$t] ) ) {
                                                                        $badtag = true;
@@ -567,9 +573,16 @@ class Sanitizer {
                } else {
                        # this might be possible using tidy itself
                        foreach ( $bits as $x ) {
-                               preg_match( '/^(\\/?)(\\w+)([^>]*?)(\\/{0,1}>)([^<]*)$/',
-                               $x, $regs );
-                               @list( /* $qbar */, $slash, $t, $params, $brace, $rest ) = $regs;
+                               preg_match(
+                                       '/^(\\/?)(\\w+)([^>]*?)(\\/{0,1}>)([^<]*)$/',
+                                       $x,
+                                       $regs
+                               );
+
+                               wfSuppressWarnings();
+                               list( /* $qbar */, $slash, $t, $params, $brace, $rest ) = $regs;
+                               wfRestoreWarnings();
+
                                $badtag = false;
                                if ( isset( $htmlelements[$t = strtolower( $t )] ) ) {
                                        if ( is_callable( $processCallback ) ) {
index b155f90..a1bca22 100644 (file)
@@ -43,6 +43,7 @@ if ( !isset( $wgVersion ) ) {
 }
 
 // Set various default paths sensibly...
+
 if ( $wgScript === false ) {
        $wgScript = "$wgScriptPath/index$wgScriptExtension";
 }
@@ -122,7 +123,8 @@ if ( isset( $wgFooterIcons['poweredby'] )
        && isset( $wgFooterIcons['poweredby']['mediawiki'] )
        && $wgFooterIcons['poweredby']['mediawiki']['src'] === null
 ) {
-       $wgFooterIcons['poweredby']['mediawiki']['src'] = "$wgStylePath/common/images/poweredby_mediawiki_88x31.png";
+       $wgFooterIcons['poweredby']['mediawiki']['src'] =
+               "$wgStylePath/common/images/poweredby_mediawiki_88x31.png";
 }
 
 /**
@@ -251,7 +253,10 @@ if ( $wgRCFilterByAge ) {
        // as determined by $wgRCMaxAge.
        // Note that we allow 1 link higher than the max for things like 56 days but a 60 day link.
        sort( $wgRCLinkDays );
+
+       // @codingStandardsIgnoreStart Generic.CodeAnalysis.ForLoopWithTestFunctionCall.NotAllowed
        for ( $i = 0; $i < count( $wgRCLinkDays ); $i++ ) {
+               // @codingStandardsIgnoreEnd
                if ( $wgRCLinkDays[$i] >= $wgRCMaxAge / ( 3600 * 24 ) ) {
                        $wgRCLinkDays = array_slice( $wgRCLinkDays, 0, $i + 1, false );
                        break;
@@ -366,7 +371,9 @@ if ( $wgArticleCountMethod === null ) {
 }
 
 if ( $wgInvalidateCacheOnLocalSettingsChange ) {
+       // @codingStandardsIgnoreStart Generic.PHP.NoSilencedErrors.Discouraged - No GlobalFunction here yet.
        $wgCacheEpoch = max( $wgCacheEpoch, gmdate( 'YmdHis', @filemtime( "$IP/LocalSettings.php" ) ) );
+       // @codingStandardsIgnoreEnd
 }
 
 if ( $wgNewUserLog ) {
@@ -420,9 +427,34 @@ require_once "$IP/includes/normal/UtfNormalDefines.php";
 wfProfileOut( $fname . '-includes' );
 
 wfProfileIn( $fname . '-defaults2' );
+
+if ( $wgCanonicalServer === false ) {
+       $wgCanonicalServer = wfExpandUrl( $wgServer, PROTO_HTTP );
+}
+
+// Set server name
+$serverParts = wfParseUrl( $wgCanonicalServer );
+if ( $wgServerName !== false ) {
+       wfWarn( '$wgServerName should be derived from $wgCanonicalServer, '
+               . 'not customized. Overwriting $wgServerName.' );
+}
+$wgServerName = $serverParts['host'];
+unset( $serverParts );
+
+// Set defaults for configuration variables
+// that are derived from the server name by default
+if ( $wgEmergencyContact === false ) {
+       $wgEmergencyContact = 'wikiadmin@' . $wgServerName;
+}
+
+if ( $wgPasswordSender === false ) {
+       $wgPasswordSender = 'apache@' . $wgServerName;
+}
+
 if ( $wgSecureLogin && substr( $wgServer, 0, 2 ) !== '//' ) {
        $wgSecureLogin = false;
-       wfWarn( 'Secure login was enabled on a server that only supports HTTP or HTTPS. Disabling secure login.' );
+       wfWarn( 'Secure login was enabled on a server that only supports '
+               . 'HTTP or HTTPS. Disabling secure login.' );
 }
 
 // Now that GlobalFunctions is loaded, set defaults that depend
@@ -433,10 +465,6 @@ if ( $wgTmpDirectory === false ) {
        wfProfileOut( $fname . '-tempDir' );
 }
 
-if ( $wgCanonicalServer === false ) {
-       $wgCanonicalServer = wfExpandUrl( $wgServer, PROTO_HTTP );
-}
-
 // $wgHTCPMulticastRouting got renamed to $wgHTCPRouting in MediaWiki 1.22
 // ensure back compatibility.
 if ( !$wgHTCPRouting && $wgHTCPMulticastRouting ) {
@@ -531,13 +559,10 @@ if ( !wfIniGetBool( 'session.auto_start' ) ) {
        session_name( $wgSessionName ? $wgSessionName : $wgCookiePrefix . '_session' );
 }
 
-if ( !defined( 'MW_NO_SESSION' ) && !$wgCommandLineMode ) {
-       if ( $wgRequest->checkSessionCookie() || isset( $_COOKIE[$wgCookiePrefix . 'Token'] ) ) {
-               wfSetupSession();
-               $wgSessionStarted = true;
-       } else {
-               $wgSessionStarted = false;
-       }
+if ( !defined( 'MW_NO_SESSION' ) && !$wgCommandLineMode &&
+       ( $wgRequest->checkSessionCookie() || isset( $_COOKIE[$wgCookiePrefix . 'Token'] ) )
+) {
+       wfSetupSession();
 }
 
 wfProfileOut( $fname . '-session' );
index 2f28e7b..b99840f 100644 (file)
  * extract( $globals );
  * @endcode
  *
- * TODO: give examples for,
+ * @todo Give examples for,
  * suffixes:
  * $conf->suffixes = array( 'wiki' );
  * localVHosts
@@ -176,7 +176,9 @@ class SiteConfiguration {
         * @param array $wikiTags The tags assigned to the wiki.
         * @return mixed The value of the setting requested.
         */
-       public function get( $settingName, $wiki, $suffix = null, $params = array(), $wikiTags = array() ) {
+       public function get( $settingName, $wiki, $suffix = null, $params = array(),
+               $wikiTags = array()
+       ) {
                $params = $this->mergeParams( $wiki, $suffix, $params, $wikiTags );
                return $this->getSetting( $settingName, $wiki, $params );
        }
@@ -228,7 +230,9 @@ class SiteConfiguration {
                                                        $retval = $thisSetting[$suffix];
                                                }
                                                break;
-                                       } elseif ( array_key_exists( "+$suffix", $thisSetting ) && is_array( $thisSetting["+$suffix"] ) ) {
+                                       } elseif ( array_key_exists( "+$suffix", $thisSetting )
+                                               && is_array( $thisSetting["+$suffix"] )
+                                       ) {
                                                if ( !isset( $retval ) ) {
                                                        $retval = array();
                                                }
@@ -338,7 +342,9 @@ class SiteConfiguration {
         * @param array $params List of parameters. $.'key' is replaced by $value in all returned data.
         * @param array $wikiTags The tags assigned to the wiki.
         */
-       public function extractVar( $setting, $wiki, $suffix, &$var, $params = array(), $wikiTags = array() ) {
+       public function extractVar( $setting, $wiki, $suffix, &$var,
+               $params = array(), $wikiTags = array()
+       ) {
                $value = $this->get( $setting, $wiki, $suffix, $params, $wikiTags );
                if ( !is_null( $value ) ) {
                        $var = $value;
@@ -353,7 +359,9 @@ class SiteConfiguration {
         * @param array $params List of parameters. $.'key' is replaced by $value in all returned data.
         * @param array $wikiTags The tags assigned to the wiki.
         */
-       public function extractGlobal( $setting, $wiki, $suffix = null, $params = array(), $wikiTags = array() ) {
+       public function extractGlobal( $setting, $wiki, $suffix = null,
+               $params = array(), $wikiTags = array()
+       ) {
                $params = $this->mergeParams( $wiki, $suffix, $params, $wikiTags );
                $this->extractGlobalSetting( $setting, $wiki, $params );
        }
@@ -386,7 +394,9 @@ class SiteConfiguration {
         * @param array $params List of parameters. $.'key' is replaced by $value in all returned data.
         * @param array $wikiTags The tags assigned to the wiki.
         */
-       public function extractAllGlobals( $wiki, $suffix = null, $params = array(), $wikiTags = array() ) {
+       public function extractAllGlobals( $wiki, $suffix = null, $params = array(),
+               $wikiTags = array()
+       ) {
                $params = $this->mergeParams( $wiki, $suffix, $params, $wikiTags );
                foreach ( $this->settings as $varName => $setting ) {
                        $this->extractGlobalSetting( $varName, $wiki, $params );
@@ -574,12 +584,14 @@ class SiteConfiguration {
         */
        static function arrayMerge( $array1/* ... */ ) {
                $out = $array1;
-               for ( $i = 1; $i < func_num_args(); $i++ ) {
+               $argsCount = func_num_args();
+               for ( $i = 1; $i < $argsCount; $i++ ) {
                        foreach ( func_get_arg( $i ) as $key => $value ) {
                                if ( isset( $out[$key] ) && is_array( $out[$key] ) && is_array( $value ) ) {
                                        $out[$key] = self::arrayMerge( $out[$key], $value );
                                } elseif ( !isset( $out[$key] ) || !$out[$key] && !is_numeric( $key ) ) {
-                                       // Values that evaluate to true given precedence, for the primary purpose of merging permissions arrays.
+                                       // Values that evaluate to true given precedence, for the
+                                       // primary purpose of merging permissions arrays.
                                        $out[$key] = $value;
                                } elseif ( is_numeric( $key ) ) {
                                        $out[] = $value;
index 4685c3e..4e737d1 100644 (file)
  * Static accessor class for site_stats and related things
  */
 class SiteStats {
-       static $row, $loaded = false;
-       static $jobs;
-       static $pageCount = array();
-       static $groupMemberCounts = array();
+       /** @var bool|ResultWrapper */
+       private static $row;
+
+       /** @var bool */
+       private static $loaded = false;
+
+       /** @var int */
+       private static $jobs;
+
+       /** @var int[] */
+       private static $pageCount = array();
+
+       /** @var int[] */
+       private static $groupMemberCounts = array();
 
        static function recache() {
                self::load( true );
@@ -190,7 +200,10 @@ class SiteStats {
                if ( !isset( self::$jobs ) ) {
                        $dbr = wfGetDB( DB_SLAVE );
                        self::$jobs = array_sum( JobQueueGroup::singleton()->getQueueSizes() );
-                       /* Zero rows still do single row read for row that doesn't exist, but people are annoyed by that */
+                       /**
+                        * Zero rows still do single row read for row that doesn't exist,
+                        * but people are annoyed by that
+                        */
                        if ( self::$jobs == 1 ) {
                                self::$jobs = 0;
                        }
index 8300da7..9d1034b 100644 (file)
@@ -678,12 +678,15 @@ abstract class Skin extends ContextSource {
        function printSource() {
                $oldid = $this->getRevisionId();
                if ( $oldid ) {
-                       $url = htmlspecialchars( wfExpandIRI( $this->getTitle()->getCanonicalURL( 'oldid=' . $oldid ) ) );
+                       $canonicalUrl = $this->getTitle()->getCanonicalURL( 'oldid=' . $oldid );
+                       $url = htmlspecialchars( wfExpandIRI( $canonicalUrl ) );
                } else {
                        // oldid not available for non existing pages
                        $url = htmlspecialchars( wfExpandIRI( $this->getTitle()->getCanonicalURL() ) );
                }
-               return $this->msg( 'retrievedfrom', '<a dir="ltr" href="' . $url . '">' . $url . '</a>' )->text();
+
+               return $this->msg( 'retrievedfrom', '<a dir="ltr" href="' . $url
+                       . '">' . $url . '</a>' )->text();
        }
 
        /**
@@ -799,7 +802,9 @@ abstract class Skin extends ContextSource {
                global $wgRightsPage, $wgRightsUrl, $wgRightsText, $wgContLang;
 
                if ( $type == 'detect' ) {
-                       if ( !$this->isRevisionCurrent() && !$this->msg( 'history_copyright' )->inContentLanguage()->isDisabled() ) {
+                       if ( !$this->isRevisionCurrent()
+                               && !$this->msg( 'history_copyright' )->inContentLanguage()->isDisabled()
+                       ) {
                                $type = 'history';
                        } else {
                                $type = 'normal';
@@ -827,14 +832,21 @@ abstract class Skin extends ContextSource {
                // Allow for site and per-namespace customization of copyright notice.
                $forContent = true;
 
-               wfRunHooks( 'SkinCopyrightFooter', array( $this->getTitle(), $type, &$msg, &$link, &$forContent ) );
+               wfRunHooks(
+                       'SkinCopyrightFooter',
+                       array( $this->getTitle(), $type, &$msg, &$link, &$forContent )
+               );
 
                $msgObj = $this->msg( $msg )->rawParams( $link );
                if ( $forContent ) {
                        $msg = $msgObj->inContentLanguage()->text();
                        if ( $this->getLanguage()->getCode() !== $wgContLang->getCode() ) {
-                               $msg = Html::rawElement( 'span', array( 'lang' => $wgContLang->getHtmlCode(), 'dir' => $wgContLang->getDir() ), $msg );
+                               $msg = Html::rawElement( 'span', array(
+                                       'lang' => $wgContLang->getHtmlCode(),
+                                       'dir' => $wgContLang->getDir()
+                               ), $msg );
                        }
+
                        return $msg;
                } else {
                        return $msgObj->text();
@@ -878,7 +890,8 @@ abstract class Skin extends ContextSource {
                global $wgStylePath;
 
                $url = htmlspecialchars( "$wgStylePath/common/images/poweredby_mediawiki_88x31.png" );
-               $text = '<a href="//www.mediawiki.org/"><img src="' . $url . '" height="31" width="88" alt="Powered by MediaWiki" /></a>';
+               $text = '<a href="//www.mediawiki.org/"><img src="' . $url
+                       . '" height="31" width="88" alt="Powered by MediaWiki" /></a>';
                wfRunHooks( 'SkinGetPoweredBy', array( &$text, $this ) );
                return $text;
        }
@@ -934,8 +947,10 @@ abstract class Skin extends ContextSource {
 
        /**
         * Renders a $wgFooterIcons icon according to the method's arguments
-        * @param array $icon The icon to build the html for, see $wgFooterIcons for the format of this array
-        * @param bool|string $withImage Whether to use the icon's image or output a text-only footericon
+        * @param array $icon The icon to build the html for, see $wgFooterIcons
+        *   for the format of this array.
+        * @param bool|string $withImage Whether to use the icon's image or output
+        *   a text-only footericon.
         * @return string HTML
         */
        function makeFooterIcon( $icon, $withImage = 'withImage' ) {
@@ -945,7 +960,8 @@ abstract class Skin extends ContextSource {
                        $url = isset( $icon["url"] ) ? $icon["url"] : null;
                        unset( $icon["url"] );
                        if ( isset( $icon["src"] ) && $withImage === 'withImage' ) {
-                               $html = Html::element( 'img', $icon ); // do this the lazy way, just pass icon data as an attribute array
+                               // do this the lazy way, just pass icon data as an attribute array
+                               $html = Html::element( 'img', $icon );
                        } else {
                                $html = htmlspecialchars( $icon["alt"] );
                        }
@@ -1044,8 +1060,11 @@ abstract class Skin extends ContextSource {
                } else {
                        $targetUser = User::newFromId( $id );
                }
-               return $this->getUser()->canSendEmail() && # the sending user must have a confirmed email address
-                       $targetUser->canReceiveEmail(); # the target user must have a confirmed email address and allow emails from users
+
+               # The sending user must have a confirmed email address and the target
+               # user must have a confirmed email address and allow emails from users.
+               return $this->getUser()->canSendEmail() &&
+                       $targetUser->canReceiveEmail();
        }
 
        /**
@@ -1244,6 +1263,8 @@ abstract class Skin extends ContextSource {
                if ( $wgEnableSidebarCache ) {
                        $cachedsidebar = $wgMemc->get( $key );
                        if ( $cachedsidebar ) {
+                               wfRunHooks( 'SidebarBeforeOutput', array( $this, &$cachedsidebar ) );
+
                                wfProfileOut( __METHOD__ );
                                return $cachedsidebar;
                        }
@@ -1257,6 +1278,8 @@ abstract class Skin extends ContextSource {
                        $wgMemc->set( $key, $bar, $wgSidebarCacheExpiry );
                }
 
+               wfRunHooks( 'SidebarBeforeOutput', array( $this, &$bar ) );
+
                wfProfileOut( __METHOD__ );
                return $bar;
        }
index b186447..08816ad 100644 (file)
  * @private
  * @ingroup Skins
  */
-class MediaWiki_I18N {
-       var $_context = array();
+class MediaWikiI18N {
+       private $context = array();
 
        function set( $varName, $value ) {
-               $this->_context[$varName] = $value;
+               $this->context[$varName] = $value;
        }
 
        function translate( $value ) {
@@ -46,7 +46,7 @@ class MediaWiki_I18N {
                while ( preg_match( '/\$([0-9]*?)/sm', $value, $m ) ) {
                        list( $src, $var ) = $m;
                        wfSuppressWarnings();
-                       $varValue = $this->_context[$var];
+                       $varValue = $this->context[$var];
                        wfRestoreWarnings();
                        $value = str_replace( $src, $varValue, $value );
                }
@@ -68,35 +68,29 @@ class MediaWiki_I18N {
  * @ingroup Skins
  */
 class SkinTemplate extends Skin {
-       /**#@+
-        * @private
-        */
-
        /**
-        * Name of our skin, it probably needs to be all lower case.  Child classes
-        * should override the default.
+        * @var string Name of our skin, it probably needs to be all lower case.
+        *   Child classes should override the default.
         */
-       var $skinname = 'monobook';
+       public $skinname = 'monobook';
 
        /**
-        * Stylesheets set to use.  Subdirectory in skins/ where various stylesheets
-        * are located.  Child classes should override the default.
+        * @var string Stylesheets set to use. Subdirectory in skins/ where various
+        *   stylesheets are located.  Child classes should override the default.
         */
-       var $stylename = 'monobook';
+       public $stylename = 'monobook';
 
        /**
-        * For QuickTemplate, the name of the subclass which will actually fill the
-        * template.  Child classes should override the default.
+        * @var string For QuickTemplate, the name of the subclass which will
+        *   actually fill the template.  Child classes should override the default.
         */
-       var $template = 'QuickTemplate';
+       public $template = 'QuickTemplate';
 
        /**
-        * Whether this skin use OutputPage::headElement() to generate the "<head>"
-        * tag
+        * @var bool Whether this skin use OutputPage::headElement() to generate
+        *   the "<head>" tag.
         */
-       var $useHeadElement = false;
-
-       /**#@-*/
+       public $useHeadElement = false;
 
        /**
         * Add specific styles for this skin
@@ -117,8 +111,8 @@ class SkinTemplate extends Skin {
         * roughly equivalent to PHPTAL 0.7.
         *
         * @param string $classname
-        * @param string $repository Subdirectory where we keep template files
-        * @param string $cache_dir
+        * @param bool|string $repository Subdirectory where we keep template files
+        * @param bool|string $cache_dir
         * @return QuickTemplate
         * @private
         */
@@ -187,7 +181,10 @@ class SkinTemplate extends Skin {
                                        'lang' => $ilInterwikiCodeBCP47,
                                        'hreflang' => $ilInterwikiCodeBCP47,
                                );
-                               wfRunHooks( 'SkinTemplateGetLanguageLink', array( &$languageLink, $languageLinkTitle, $this->getTitle() ) );
+                               wfRunHooks(
+                                       'SkinTemplateGetLanguageLink',
+                                       array( &$languageLink, $languageLinkTitle, $this->getTitle() )
+                               );
                                $languageLinks[] = $languageLink;
                        }
                }
@@ -402,7 +399,8 @@ class SkinTemplate extends Skin {
                // that interface elements are in a different language.
                $tpl->set( 'userlangattributes', '' );
                $tpl->set( 'specialpageattributes', '' ); # obsolete
-               // Used by VectorBeta to insert HTML before content but after the heading for the page title. Defaults to empty string.
+               // Used by VectorBeta to insert HTML before content but after the
+               // heading for the page title. Defaults to empty string.
                $tpl->set( 'prebodyhtml', '' );
 
                if ( $userLangCode !== $wgContLang->getHtmlCode() || $userLangDir !== $wgContLang->getDir() ) {
@@ -561,9 +559,14 @@ class SkinTemplate extends Skin {
                // and output printfooter and debughtml separately
                $tpl->set( 'bodycontent', $tpl->data['bodytext'] );
 
-               // Append printfooter and debughtml onto bodytext so that skins that were already
-               // using bodytext before they were split out don't suddenly start not outputting information
-               $tpl->data['bodytext'] .= Html::rawElement( 'div', array( 'class' => 'printfooter' ), "\n{$tpl->data['printfooter']}" ) . "\n";
+               // Append printfooter and debughtml onto bodytext so that skins that
+               // were already using bodytext before they were split out don't suddenly
+               // start not outputting information.
+               $tpl->data['bodytext'] .= Html::rawElement(
+                       'div',
+                       array( 'class' => 'printfooter' ),
+                       "\n{$tpl->data['printfooter']}"
+               ) . "\n";
                $tpl->data['bodytext'] .= $tpl->data['debughtml'];
 
                // allow extensions adding stuff after the page content.
@@ -733,7 +736,8 @@ class SkinTemplate extends Skin {
                        $login_url = array(
                                'text' => $this->msg( $loginlink )->text(),
                                'href' => self::makeSpecialUrl( 'Userlogin', $returnto ),
-                               'active' => $title->isSpecial( 'Userlogin' ) && ( $loginlink == 'nav-login-createaccount' || !$is_signup ),
+                               'active' => $title->isSpecial( 'Userlogin' )
+                                       && ( $loginlink == 'nav-login-createaccount' || !$is_signup ),
                        );
                        $createaccount_url = array(
                                'text' => $this->msg( 'pt-createaccount' )->text(),
@@ -875,9 +879,10 @@ class SkinTemplate extends Skin {
         * links, however these are usually automatically generated by SkinTemplate
         * itself and are not necessary when using a hook. The only things these may
         * matter to are people modifying content_navigation after it's initial creation:
-        * - id: A "preferred" id, most skins are best off outputting this preferred id for best compatibility
+        * - id: A "preferred" id, most skins are best off outputting this preferred
+        *   id for best compatibility.
         * - tooltiponly: This is set to true for some tabs in cases where the system
-        *                believes that the accesskey should not be added to the tab.
+        *   believes that the accesskey should not be added to the tab.
         *
         * @return array
         */
@@ -974,7 +979,9 @@ class SkinTemplate extends Skin {
                                wfProfileIn( __METHOD__ . '-edit' );
 
                                // Checks if user can edit the current page if it exists or create it otherwise
-                               if ( $title->quickUserCan( 'edit', $user ) && ( $title->exists() || $title->quickUserCan( 'create', $user ) ) ) {
+                               if ( $title->quickUserCan( 'edit', $user )
+                                       && ( $title->exists() || $title->quickUserCan( 'create', $user ) )
+                               ) {
                                        // Builds CSS class for talk page links
                                        $isTalkClass = $isTalk ? ' istalk' : '';
                                        // Whether the user is editing the page
@@ -985,14 +992,22 @@ class SkinTemplate extends Skin {
                                                && ( ( $isTalk && $this->isRevisionCurrent() ) || $out->showNewSectionLink() );
                                        $section = $request->getVal( 'section' );
 
-                                       if ( $title->exists() || ( $title->getNamespace() == NS_MEDIAWIKI && $title->getDefaultMessageText() !== false ) ) {
+                                       if ( $title->exists()
+                                               || ( $title->getNamespace() == NS_MEDIAWIKI
+                                                       && $title->getDefaultMessageText() !== false
+                                               )
+                                       ) {
                                                $msgKey = $isForeignFile ? 'edit-local' : 'edit';
                                        } else {
                                                $msgKey = $isForeignFile ? 'create-local' : 'create';
                                        }
                                        $content_navigation['views']['edit'] = array(
-                                               'class' => ( $isEditing && ( $section !== 'new' || !$showNewSection ) ? 'selected' : '' ) . $isTalkClass,
-                                               'text' => wfMessageFallback( "$skname-view-$msgKey", $msgKey )->setContext( $this->getContext() )->text(),
+                                               'class' => ( $isEditing && ( $section !== 'new' || !$showNewSection )
+                                                       ? 'selected'
+                                                       : ''
+                                               ) . $isTalkClass,
+                                               'text' => wfMessageFallback( "$skname-view-$msgKey", $msgKey )
+                                                       ->setContext( $this->getContext() )->text(),
                                                'href' => $title->getLocalURL( $this->editUrlOptions() ),
                                                'primary' => !$isForeignFile, // don't collapse this in vector
                                        );
@@ -1003,7 +1018,8 @@ class SkinTemplate extends Skin {
                                                //$content_navigation['actions']['addsection']
                                                $content_navigation['views']['addsection'] = array(
                                                        'class' => ( $isEditing && $section == 'new' ) ? 'selected' : false,
-                                                       'text' => wfMessageFallback( "$skname-action-addsection", 'addsection' )->setContext( $this->getContext() )->text(),
+                                                       'text' => wfMessageFallback( "$skname-action-addsection", 'addsection' )
+                                                               ->setContext( $this->getContext() )->text(),
                                                        'href' => $title->getLocalURL( 'action=edit&section=new' )
                                                );
                                        }
@@ -1012,7 +1028,8 @@ class SkinTemplate extends Skin {
                                        // Adds view source view link
                                        $content_navigation['views']['viewsource'] = array(
                                                'class' => ( $onPage && $action == 'edit' ) ? 'selected' : false,
-                                               'text' => wfMessageFallback( "$skname-action-viewsource", 'viewsource' )->setContext( $this->getContext() )->text(),
+                                               'text' => wfMessageFallback( "$skname-action-viewsource", 'viewsource' )
+                                                       ->setContext( $this->getContext() )->text(),
                                                'href' => $title->getLocalURL( $this->editUrlOptions() ),
                                                'primary' => true, // don't collapse this in vector
                                        );
@@ -1025,7 +1042,8 @@ class SkinTemplate extends Skin {
                                        // Adds history view link
                                        $content_navigation['views']['history'] = array(
                                                'class' => ( $onPage && $action == 'history' ) ? 'selected' : false,
-                                               'text' => wfMessageFallback( "$skname-view-history", 'history_short' )->setContext( $this->getContext() )->text(),
+                                               'text' => wfMessageFallback( "$skname-view-history", 'history_short' )
+                                                       ->setContext( $this->getContext() )->text(),
                                                'href' => $title->getLocalURL( 'action=history' ),
                                                'rel' => 'archives',
                                        );
@@ -1033,7 +1051,8 @@ class SkinTemplate extends Skin {
                                        if ( $title->quickUserCan( 'delete', $user ) ) {
                                                $content_navigation['actions']['delete'] = array(
                                                        'class' => ( $onPage && $action == 'delete' ) ? 'selected' : false,
-                                                       'text' => wfMessageFallback( "$skname-action-delete", 'delete' )->setContext( $this->getContext() )->text(),
+                                                       'text' => wfMessageFallback( "$skname-action-delete", 'delete' )
+                                                               ->setContext( $this->getContext() )->text(),
                                                        'href' => $title->getLocalURL( 'action=delete' )
                                                );
                                        }
@@ -1042,7 +1061,8 @@ class SkinTemplate extends Skin {
                                                $moveTitle = SpecialPage::getTitleFor( 'Movepage', $title->getPrefixedDBkey() );
                                                $content_navigation['actions']['move'] = array(
                                                        'class' => $this->getTitle()->isSpecial( 'Movepage' ) ? 'selected' : false,
-                                                       'text' => wfMessageFallback( "$skname-action-move", 'move' )->setContext( $this->getContext() )->text(),
+                                                       'text' => wfMessageFallback( "$skname-action-move", 'move' )
+                                                               ->setContext( $this->getContext() )->text(),
                                                        'href' => $moveTitle->getLocalURL()
                                                );
                                        }
@@ -1052,7 +1072,8 @@ class SkinTemplate extends Skin {
                                                $n = $title->isDeleted();
                                                if ( $n ) {
                                                        $undelTitle = SpecialPage::getTitleFor( 'Undelete' );
-                                                       // If the user can't undelete but can view deleted history show them a "View .. deleted" tab instead
+                                                       // If the user can't undelete but can view deleted
+                                                       // history show them a "View .. deleted" tab instead.
                                                        $msgKey = $user->isAllowed( 'undelete' ) ? 'undelete' : 'viewdeleted';
                                                        $content_navigation['actions']['undelete'] = array(
                                                                'class' => $this->getTitle()->isSpecial( 'Undelete' ) ? 'selected' : false,
@@ -1070,7 +1091,8 @@ class SkinTemplate extends Skin {
                                        $mode = $title->isProtected() ? 'unprotect' : 'protect';
                                        $content_navigation['actions'][$mode] = array(
                                                'class' => ( $onPage && $action == $mode ) ? 'selected' : false,
-                                               'text' => wfMessageFallback( "$skname-action-$mode", $mode )->setContext( $this->getContext() )->text(),
+                                               'text' => wfMessageFallback( "$skname-action-$mode", $mode )
+                                                       ->setContext( $this->getContext() )->text(),
                                                'href' => $title->getLocalURL( "action=$mode" )
                                        );
                                }
@@ -1190,10 +1212,10 @@ class SkinTemplate extends Skin {
 
        /**
         * an array of edit links by default used for the tabs
+        * @param $content_navigation
         * @return array
-        * @private
         */
-       function buildContentActionUrls( $content_navigation ) {
+       private function buildContentActionUrls( $content_navigation ) {
 
                wfProfileIn( __METHOD__ );
 
@@ -1204,9 +1226,7 @@ class SkinTemplate extends Skin {
                $content_actions = array();
 
                foreach ( $content_navigation as $links ) {
-
                        foreach ( $links as $key => $value ) {
-
                                if ( isset( $value['redundant'] ) && $value['redundant'] ) {
                                        // Redundant tabs are dropped from content_actions
                                        continue;
@@ -1227,9 +1247,7 @@ class SkinTemplate extends Skin {
                                }
 
                                $content_actions[$key] = $value;
-
                        }
-
                }
 
                wfProfileOut( __METHOD__ );
@@ -1240,7 +1258,6 @@ class SkinTemplate extends Skin {
        /**
         * build array of common navigation links
         * @return array
-        * @private
         */
        protected function buildNavUrls() {
                global $wgUploadNavigationUrl;
@@ -1357,9 +1374,8 @@ class SkinTemplate extends Skin {
        /**
         * Generate strings used for xml 'id' names
         * @return string
-        * @private
         */
-       function getNameSpaceKey() {
+       protected function getNameSpaceKey() {
                return $this->getTitle()->getNamespaceKey();
        }
 }
@@ -1375,7 +1391,7 @@ abstract class QuickTemplate {
         */
        function __construct() {
                $this->data = array();
-               $this->translator = new MediaWiki_I18N();
+               $this->translator = new MediaWikiI18N();
        }
 
        /**
@@ -1411,7 +1427,7 @@ abstract class QuickTemplate {
        }
 
        /**
-        * @param MediaWiki_I18N $t
+        * @param MediaWikiI18N $t
         */
        public function setTranslator( &$t ) {
                $this->translator = &$t;
@@ -1556,11 +1572,15 @@ abstract class BaseTemplate extends QuickTemplate {
                wfProfileIn( __METHOD__ );
 
                $toolbox = array();
-               if ( isset( $this->data['nav_urls']['whatlinkshere'] ) && $this->data['nav_urls']['whatlinkshere'] ) {
+               if ( isset( $this->data['nav_urls']['whatlinkshere'] )
+                       && $this->data['nav_urls']['whatlinkshere']
+               ) {
                        $toolbox['whatlinkshere'] = $this->data['nav_urls']['whatlinkshere'];
                        $toolbox['whatlinkshere']['id'] = 't-whatlinkshere';
                }
-               if ( isset( $this->data['nav_urls']['recentchangeslinked'] ) && $this->data['nav_urls']['recentchangeslinked'] ) {
+               if ( isset( $this->data['nav_urls']['recentchangeslinked'] )
+                       && $this->data['nav_urls']['recentchangeslinked']
+               ) {
                        $toolbox['recentchangeslinked'] = $this->data['nav_urls']['recentchangeslinked'];
                        $toolbox['recentchangeslinked']['msg'] = 'recentchangeslinked-toolbox';
                        $toolbox['recentchangeslinked']['id'] = 't-recentchangeslinked';
@@ -1576,7 +1596,9 @@ abstract class BaseTemplate extends QuickTemplate {
                                $toolbox['feeds']['links'][$key]['class'] = 'feedlink';
                        }
                }
-               foreach ( array( 'contributions', 'log', 'blockip', 'emailuser', 'userrights', 'upload', 'specialpages' ) as $special ) {
+               foreach ( array( 'contributions', 'log', 'blockip', 'emailuser',
+                       'userrights', 'upload', 'specialpages' ) as $special
+               ) {
                        if ( isset( $this->data['nav_urls'][$special] ) && $this->data['nav_urls'][$special] ) {
                                $toolbox[$special] = $this->data['nav_urls'][$special];
                                $toolbox[$special]['id'] = "t-$special";
@@ -1844,7 +1866,9 @@ abstract class BaseTemplate extends QuickTemplate {
                        }
                        while ( count( $wrapper ) > 0 ) {
                                $element = array_pop( $wrapper );
-                               $html = Html::rawElement( $element['tag'], isset( $element['attributes'] ) ? $element['attributes'] : null, $html );
+                               $html = Html::rawElement( $element['tag'], isset( $element['attributes'] )
+                                       ? $element['attributes']
+                                       : null, $html );
                        }
                }
 
@@ -1880,7 +1904,9 @@ abstract class BaseTemplate extends QuickTemplate {
                                        $attrs['class'] = $options['link-class'];
                                }
                        }
-                       $html = Html::rawElement( isset( $attrs['href'] ) ? 'a' : $options['link-fallback'], $attrs, $html );
+                       $html = Html::rawElement( isset( $attrs['href'] )
+                               ? 'a'
+                               : $options['link-fallback'], $attrs, $html );
                }
 
                return $html;
@@ -1916,10 +1942,11 @@ abstract class BaseTemplate extends QuickTemplate {
         */
        function makeListItem( $key, $item, $options = array() ) {
                if ( isset( $item['links'] ) ) {
-                       $html = '';
+                       $links = array();
                        foreach ( $item['links'] as $linkKey => $link ) {
-                               $html .= $this->makeLink( $linkKey, $link, $options );
+                               $links[] = $this->makeLink( $linkKey, $link, $options );
                        }
+                       $html = implode( ' ', $links );
                } else {
                        $link = $item;
                        // These keys are used by makeListItem and shouldn't be passed on to the link
@@ -2015,6 +2042,7 @@ abstract class BaseTemplate extends QuickTemplate {
         * If you pass "flat" as an option then the returned array will be a flat array
         * of footer icons instead of a key/value array of footerlinks arrays broken
         * up into categories.
+        * @param string $option
         * @return array|mixed
         */
        function getFooterLinks( $option = null ) {
@@ -2054,6 +2082,7 @@ abstract class BaseTemplate extends QuickTemplate {
         * in the list of footer icons. This is mostly useful for skins which only
         * display the text from footericons instead of the images and don't want a
         * duplicate copyright statement because footerlinks already rendered one.
+        * @param string $option
         * @return string
         */
        function getFooterIcons( $option = null ) {
@@ -2096,5 +2125,4 @@ abstract class BaseTemplate extends QuickTemplate {
 <?php $this->html( 'reporttime' ) ?>
 <?php
        }
-
 }
index 6cd7828..c790bb7 100644 (file)
  * Could be replaced by curl_multi_exec() or some such.
  */
 class SquidPurgeClient {
-       var $host, $port, $ip;
+       /** @var string */
+       protected $host;
 
-       var $readState = 'idle';
-       var $writeBuffer = '';
-       var $requests = array();
-       var $currentRequestIndex;
+       /** @var int */
+       protected $port;
+
+       /** @var string|bool */
+       protected $ip;
+
+       /** @var string */
+       protected $readState = 'idle';
+
+       /** @var string */
+       protected $writeBuffer = '';
+
+       /** @var array */
+       protected $requests = array();
+
+       /** @var mixed */
+       protected $currentRequestIndex;
 
        const EINTR = 4;
        const EAGAIN = 11;
@@ -41,13 +55,16 @@ class SquidPurgeClient {
        const BUFFER_SIZE = 8192;
 
        /**
-        * The socket resource, or null for unconnected, or false for disabled due to error
+        * @var resource|null The socket resource, or null for unconnected, or false
+        *   for disabled due to error.
         */
-       var $socket;
+       protected $socket;
 
-       var $readBuffer;
+       /** @var string */
+       protected $readBuffer;
 
-       var $bodyRemaining;
+       /** @var int */
+       protected $bodyRemaining;
 
        /**
         * @param string $server
@@ -380,12 +397,11 @@ class SquidPurgeClient {
 }
 
 class SquidPurgeClientPool {
+       /** @var array of SquidPurgeClient */
+       protected $clients = array();
 
-       /**
-        * @var array of SquidPurgeClient
-        */
-       var $clients = array();
-       var $timeout = 5;
+       /** @var int */
+       protected $timeout = 5;
 
        /**
         * @param array $options
index a429c36..102fffd 100644 (file)
@@ -39,7 +39,8 @@ class StatCounter {
        /** @var array */
        protected $deltas = array(); // (key => count)
 
-       protected function __construct() {}
+       protected function __construct() {
+       }
 
        /**
         * @return StatCounter
index ef82705..2503150 100644 (file)
@@ -158,10 +158,14 @@ class StreamFile {
                # used for thumbnails (thumb.php)
                if ( $wgTrivialMimeDetection ) {
                        switch ( $ext ) {
-                               case 'gif': return 'image/gif';
-                               case 'png': return 'image/png';
-                               case 'jpg': return 'image/jpeg';
-                               case 'jpeg': return 'image/jpeg';
+                               case 'gif':
+                                       return 'image/gif';
+                               case 'png':
+                                       return 'image/png';
+                               case 'jpg':
+                                       return 'image/jpeg';
+                               case 'jpeg':
+                                       return 'image/jpeg';
                        }
 
                        return 'unknown/unknown';
index bb173e7..64df81b 100644 (file)
  * which refers to it should be kept to a minimum.
  */
 class StubObject {
-       var $mGlobal, $mClass, $mParams;
+       /** @var null|string */
+       protected $mGlobal;
+
+       /** @var null|string */
+       protected $mClass;
+
+       /** @var array */
+       protected $mParams;
 
        /**
         * Constructor.
@@ -142,9 +149,11 @@ class StubObject {
                        $caller = wfGetCaller( $level );
                        if ( ++$recursionLevel > 2 ) {
                                wfProfileOut( $fname );
-                               throw new MWException( "Unstub loop detected on call of \${$this->mGlobal}->$name from $caller\n" );
+                               throw new MWException( "Unstub loop detected on call of "
+                                       . "\${$this->mGlobal}->$name from $caller\n" );
                        }
-                       wfDebug( "Unstubbing \${$this->mGlobal} on call of \${$this->mGlobal}::$name from $caller\n" );
+                       wfDebug( "Unstubbing \${$this->mGlobal} on call of "
+                               . "\${$this->mGlobal}::$name from $caller\n" );
                        $GLOBALS[$this->mGlobal] = $this->_newObject();
                        --$recursionLevel;
                        wfProfileOut( $fname );
index 4345a73..b9c0c35 100644 (file)
@@ -3,4 +3,5 @@
 /**
  * @since 1.20
  */
-class TimestampException extends MWException {}
+class TimestampException extends MWException {
+}
index 70d2baa..67958ff 100644 (file)
@@ -56,38 +56,102 @@ class Title {
         */
        // @{
 
-       var $mTextform = '';              // /< Text form (spaces not underscores) of the main part
-       var $mUrlform = '';               // /< URL-encoded form of the main part
-       var $mDbkeyform = '';             // /< Main part with underscores
-       var $mUserCaseDBKey;              // /< DB key with the initial letter in the case specified by the user
-       var $mNamespace = NS_MAIN;        // /< Namespace index, i.e. one of the NS_xxxx constants
-       var $mInterwiki = '';             // /< Interwiki prefix
-       var $mFragment = '';              // /< Title fragment (i.e. the bit after the #)
-       var $mArticleID = -1;             // /< Article ID, fetched from the link cache on demand
-       var $mLatestID = false;           // /< ID of most recent revision
-       var $mContentModel = false;       // /< ID of the page's content model, i.e. one of the CONTENT_MODEL_XXX constants
-       private $mEstimateRevisions;      // /< Estimated number of revisions; null of not loaded
-       var $mRestrictions = array();     // /< Array of groups allowed to edit this article
-       var $mOldRestrictions = false;
-       var $mCascadeRestriction;         ///< Cascade restrictions on this page to included templates and images?
-       var $mCascadingRestrictions;      // Caching the results of getCascadeProtectionSources
-       var $mRestrictionsExpiry = array(); ///< When do the restrictions on this page expire?
-       var $mHasCascadingRestrictions;   ///< Are cascading restrictions in effect on this page?
-       var $mCascadeSources;             ///< Where are the cascading restrictions coming from on this page?
-       var $mRestrictionsLoaded = false; ///< Boolean for initialisation on demand
-       var $mPrefixedText = null;        ///< Text form including namespace/interwiki, initialised on demand
-       var $mTitleProtection;            ///< Cached value for getTitleProtection (create protection)
-       # Don't change the following default, NS_MAIN is hardcoded in several
-       # places.  See bug 696.
-       # Zero except in {{transclusion}} tags
-       var $mDefaultNamespace = NS_MAIN; // /< Namespace index when there is no namespace
-       var $mWatched = null;             // /< Is $wgUser watching this page? null if unfilled, accessed through userIsWatching()
-       var $mLength = -1;                // /< The page length, 0 for special pages
-       var $mRedirect = null;            // /< Is the article at this title a redirect?
-       var $mNotificationTimestamp = array(); // /< Associative array of user ID -> timestamp/false
-       var $mHasSubpage;                 // /< Whether a page has any subpages
-       private $mPageLanguage = false;   // /< The (string) language code of the page's language and content code.
-       private $mTitleValue = null;      // /< A corresponding TitleValue object
+       /** @var string Text form (spaces not underscores) of the main part */
+       public $mTextform = '';
+
+       /** @var string URL-encoded form of the main part */
+       public $mUrlform = '';
+
+       /** @var string Main part with underscores */
+       public $mDbkeyform = '';
+
+       /** @var string Database key with the initial letter in the case specified by the user */
+       protected $mUserCaseDBKey;
+
+       /** @var int Namespace index, i.e. one of the NS_xxxx constants */
+       public $mNamespace = NS_MAIN;
+
+       /** @var string Interwiki prefix */
+       public $mInterwiki = '';
+
+       /** @var string Title fragment (i.e. the bit after the #) */
+       public $mFragment = '';
+
+       /** @var int Article ID, fetched from the link cache on demand */
+       public $mArticleID = -1;
+
+       /** @var bool|int ID of most recent revision */
+       protected $mLatestID = false;
+
+       /**
+        * @var bool|string ID of the page's content model, i.e. one of the
+        *   CONTENT_MODEL_XXX constants
+        */
+       public $mContentModel = false;
+
+       /** @var int Estimated number of revisions; null of not loaded */
+       private $mEstimateRevisions;
+
+       /** @var array Array of groups allowed to edit this article */
+       public $mRestrictions = array();
+
+       /** @var bool  */
+       protected $mOldRestrictions = false;
+
+       /** @var bool Cascade restrictions on this page to included templates and images? */
+       public $mCascadeRestriction;
+
+       /** Caching the results of getCascadeProtectionSources */
+       public $mCascadingRestrictions;
+
+       /** @var array When do the restrictions on this page expire? */
+       protected $mRestrictionsExpiry = array();
+
+       /** @var bool Are cascading restrictions in effect on this page? */
+       protected $mHasCascadingRestrictions;
+
+       /** @var array Where are the cascading restrictions coming from on this page? */
+       public $mCascadeSources;
+
+       /** @var bool Boolean for initialisation on demand */
+       public $mRestrictionsLoaded = false;
+
+       /** @var string Text form including namespace/interwiki, initialised on demand */
+       protected $mPrefixedText = null;
+
+       /** @var mixed Cached value for getTitleProtection (create protection) */
+       public $mTitleProtection;
+
+       /**
+        * @var int Namespace index when there is no namespace. Don't change the
+        *   following default, NS_MAIN is hardcoded in several places. See bug 696.
+        *   Zero except in {{transclusion}} tags.
+        */
+       public $mDefaultNamespace = NS_MAIN;
+
+       /**
+        * @var bool Is $wgUser watching this page? null if unfilled, accessed
+        * through userIsWatching()
+        */
+       protected $mWatched = null;
+
+       /** @var int The page length, 0 for special pages */
+       protected $mLength = -1;
+
+       /** @var null Is the article at this title a redirect? */
+       public $mRedirect = null;
+
+       /** @var array Associative array of user ID -> timestamp/false */
+       private $mNotificationTimestamp = array();
+
+       /** @var bool Whether a page has any subpages */
+       private $mHasSubpages;
+
+       /** @var bool The (string) language code of the page's language and content code. */
+       private $mPageLanguage = false;
+
+       /** @var TitleValue A corresponding TitleValue object */
+       private $mTitleValue = null;
        // @}
 
        /**
@@ -115,7 +179,11 @@ class Title {
                }
 
                if ( !$titleCodec ) {
-                       $titleCodec = new MediaWikiTitleCodec( $wgContLang, GenderCache::singleton(), $wgLocalInterwikis );
+                       $titleCodec = new MediaWikiTitleCodec(
+                               $wgContLang,
+                               GenderCache::singleton(),
+                               $wgLocalInterwikis
+                       );
                        $titleCodecFingerprint = $fingerprint;
                }
 
@@ -136,10 +204,8 @@ class Title {
                return self::getTitleParser();
        }
 
-       /**
-        * Constructor
-        */
-       /*protected*/ function __construct() { }
+       function __construct() {
+       }
 
        /**
         * Create a new Title from a prefixed DB key
@@ -218,8 +284,7 @@ class Title {
                        }
                        return $t;
                } else {
-                       $ret = null;
-                       return $ret;
+                       return null;
                }
        }
 
@@ -267,8 +332,9 @@ class Title {
        }
 
        /**
-        * Returns a list of fields that are to be selected for initializing Title objects or LinkCache entries.
-        * Uses $wgContentHandlerUseDB to determine whether to include page_content_model.
+        * Returns a list of fields that are to be selected for initializing Title
+        * objects or LinkCache entries. Uses $wgContentHandlerUseDB to determine
+        * whether to include page_content_model.
         *
         * @return array
         */
@@ -1137,9 +1203,11 @@ class Title {
         * This is generally true for pages in the MediaWiki namespace having CONTENT_MODEL_CSS
         * or CONTENT_MODEL_JAVASCRIPT.
         *
-        * This method does *not* return true for per-user JS/CSS. Use isCssJsSubpage() for that!
+        * This method does *not* return true for per-user JS/CSS. Use isCssJsSubpage()
+        * for that!
         *
-        * Note that this method should not return true for pages that contain and show "inactive" CSS or JS.
+        * Note that this method should not return true for pages that contain and
+        * show "inactive" CSS or JS.
         *
         * @return bool
         */
@@ -1148,8 +1216,9 @@ class Title {
                        && ( $this->hasContentModel( CONTENT_MODEL_CSS )
                                || $this->hasContentModel( CONTENT_MODEL_JAVASCRIPT ) );
 
-               #NOTE: this hook is also called in ContentHandler::getDefaultModel. It's called here again to make sure
-               #      hook functions can force this method to return true even outside the mediawiki namespace.
+               # @note This hook is also called in ContentHandler::getDefaultModel.
+               #   It's called here again to make sure hook functions can force this
+               #   method to return true even outside the mediawiki namespace.
 
                wfRunHooks( 'TitleIsCssOrJsPage', array( $this, &$isCssOrJsPage ) );
 
@@ -1858,7 +1927,9 @@ class Title {
                        global $wgUser;
                        $user = $wgUser;
                }
-               return !count( $this->getUserPermissionsErrorsInternal( $action, $user, $doExpensiveQueries, true ) );
+
+               return !count( $this->getUserPermissionsErrorsInternal(
+                       $action, $user, $doExpensiveQueries, true ) );
        }
 
        /**
@@ -1874,7 +1945,9 @@ class Title {
         *   whose corresponding errors may be ignored.
         * @return array Array of arguments to wfMessage to explain permissions problems.
         */
-       public function getUserPermissionsErrors( $action, $user, $doExpensiveQueries = true, $ignoreErrors = array() ) {
+       public function getUserPermissionsErrors( $action, $user, $doExpensiveQueries = true,
+               $ignoreErrors = array()
+       ) {
                $errors = $this->getUserPermissionsErrorsInternal( $action, $user, $doExpensiveQueries );
 
                // Remove the errors being ignored.
@@ -1900,8 +1973,12 @@ class Title {
         *
         * @return array List of errors
         */
-       private function checkQuickPermissions( $action, $user, $errors, $doExpensiveQueries, $short ) {
-               if ( !wfRunHooks( 'TitleQuickPermissions', array( $this, $user, $action, &$errors, $doExpensiveQueries, $short ) ) ) {
+       private function checkQuickPermissions( $action, $user, $errors,
+               $doExpensiveQueries, $short
+       ) {
+               if ( !wfRunHooks( 'TitleQuickPermissions',
+                       array( $this, $user, $action, &$errors, $doExpensiveQueries, $short ) )
+               ) {
                        return $errors;
                }
 
@@ -1924,6 +2001,11 @@ class Title {
                                $errors[] = array( 'movenotallowedfile' );
                        }
 
+                       // Check if user is allowed to move category pages if it's a category page
+                       if ( $this->mNamespace == NS_CATEGORY && !$user->isAllowed( 'move-categorypages' ) ) {
+                               $errors[] = array( 'cant-move-category-page' );
+                       }
+
                        if ( !$user->isAllowed( 'move' ) ) {
                                // User can't move anything
                                $userCanMove = User::groupHasPermission( 'user', 'move' );
@@ -1943,6 +2025,10 @@ class Title {
                                        && $this->mNamespace == NS_USER && !$this->isSubpage() ) {
                                // Show user page-specific message only if the user can move other pages
                                $errors[] = array( 'cant-move-to-user-page' );
+                       } elseif ( !$user->isAllowed( 'move-categorypages' )
+                                       && $this->mNamespace == NS_CATEGORY ) {
+                               // Show category page-specific message only if the user can move other pages
+                               $errors[] = array( 'cant-move-to-category-page' );
                        }
                } elseif ( !$user->isAllowed( $action ) ) {
                        $errors[] = $this->missingPermissionError( $action, $short );
@@ -2020,7 +2106,9 @@ class Title {
         *
         * @return array List of errors
         */
-       private function checkSpecialsAndNSPermissions( $action, $user, $errors, $doExpensiveQueries, $short ) {
+       private function checkSpecialsAndNSPermissions( $action, $user, $errors,
+               $doExpensiveQueries, $short
+       ) {
                # Only 'createaccount' can be performed on special pages,
                # which don't actually exist in the DB.
                if ( NS_SPECIAL == $this->mNamespace && $action !== 'createaccount' ) {
@@ -2119,7 +2207,9 @@ class Title {
         *
         * @return array List of errors
         */
-       private function checkCascadingSourcesRestrictions( $action, $user, $errors, $doExpensiveQueries, $short ) {
+       private function checkCascadingSourcesRestrictions( $action, $user, $errors,
+               $doExpensiveQueries, $short
+       ) {
                if ( $doExpensiveQueries && !$this->isCssJsSubpage() ) {
                        # We /could/ use the protection level on the source page, but it's
                        # fairly ugly as we have to establish a precedence hierarchy for pages
@@ -2166,11 +2256,15 @@ class Title {
         *
         * @return array List of errors
         */
-       private function checkActionPermissions( $action, $user, $errors, $doExpensiveQueries, $short ) {
+       private function checkActionPermissions( $action, $user, $errors,
+               $doExpensiveQueries, $short
+       ) {
                global $wgDeleteRevisionsLimit, $wgLang;
 
                if ( $action == 'protect' ) {
-                       if ( count( $this->getUserPermissionsErrorsInternal( 'edit', $user, $doExpensiveQueries, true ) ) ) {
+                       if ( count( $this->getUserPermissionsErrorsInternal( 'edit',
+                               $user, $doExpensiveQueries, true ) )
+                       ) {
                                // If they can't edit, they shouldn't protect.
                                $errors[] = array( 'protect-cantedit' );
                        }
@@ -2186,7 +2280,11 @@ class Title {
                                if ( $title_protection['pt_create_perm'] == ''
                                        || !$user->isAllowed( $title_protection['pt_create_perm'] )
                                ) {
-                                       $errors[] = array( 'titleprotected', User::whoIs( $title_protection['pt_user'] ), $title_protection['pt_reason'] );
+                                       $errors[] = array(
+                                               'titleprotected',
+                                               User::whoIs( $title_protection['pt_user'] ),
+                                               $title_protection['pt_reason']
+                                       );
                                }
                        }
                } elseif ( $action == 'move' ) {
@@ -2367,7 +2465,9 @@ class Title {
         * @param bool $short Set this to true to stop after the first permission error.
         * @return array Array of arrays of the arguments to wfMessage to explain permissions problems.
         */
-       protected function getUserPermissionsErrorsInternal( $action, $user, $doExpensiveQueries = true, $short = false ) {
+       protected function getUserPermissionsErrorsInternal( $action, $user,
+               $doExpensiveQueries = true, $short = false
+       ) {
                wfProfileIn( __METHOD__ );
 
                # Read has special handling
@@ -3372,7 +3472,15 @@ class Title {
                $namespaceFiled = "{$prefix}_namespace";
                $titleField = "{$prefix}_title";
 
-               $fields = array( $namespaceFiled, $titleField, 'page_id', 'page_len', 'page_is_redirect', 'page_latest' );
+               $fields = array(
+                       $namespaceFiled,
+                       $titleField,
+                       'page_id',
+                       'page_len',
+                       'page_is_redirect',
+                       'page_latest'
+               );
+
                if ( $wgContentHandlerUseDB ) {
                        $fields[] = 'page_content_model';
                }
@@ -3383,7 +3491,10 @@ class Title {
                        array( "{$prefix}_from" => $id ),
                        __METHOD__,
                        $options,
-                       array( 'page' => array( 'LEFT JOIN', array( "page_namespace=$namespaceFiled", "page_title=$titleField" ) ) )
+                       array( 'page' => array(
+                               'LEFT JOIN',
+                               array( "page_namespace=$namespaceFiled", "page_title=$titleField" )
+                       ) )
                );
 
                $retVal = array();
@@ -3419,9 +3530,11 @@ class Title {
        }
 
        /**
-        * Get an array of Title objects referring to non-existent articles linked from this page
+        * Get an array of Title objects referring to non-existent articles linked
+        * from this page.
         *
-        * @todo check if needed (used only in SpecialBrokenRedirects.php, and should use redirect table in this case)
+        * @todo check if needed (used only in SpecialBrokenRedirects.php, and
+        *   should use redirect table in this case).
         * @return Title[] Array of Title the Title objects
         */
        public function getBrokenLinksFrom() {
@@ -3758,7 +3871,13 @@ class Title {
                                $comment .= wfMessage( 'colon-separator' )->inContentLanguage()->text() . $reason;
                        }
                        // @todo FIXME: $params?
-                       $logId = $log->addEntry( 'move_prot', $nt, $comment, array( $this->getPrefixedText() ), $wgUser );
+                       $logId = $log->addEntry(
+                               'move_prot',
+                               $nt,
+                               $comment,
+                               array( $this->getPrefixedText() ),
+                               $wgUser
+                       );
 
                        // reread inserted pr_ids for log relation
                        $insertedPrIds = $dbw->select(
@@ -3812,9 +3931,17 @@ class Title {
                }
 
                if ( $createRedirect ) {
-                       $contentHandler = ContentHandler::getForTitle( $this );
-                       $redirectContent = $contentHandler->makeRedirectContent( $nt,
-                               wfMessage( 'move-redirect-text' )->inContentLanguage()->plain() );
+                       if ( $this->getNamespace() == NS_CATEGORY
+                               && !wfMessage( 'category-move-redirect-override' )->isDisabled()
+                       ) {
+                               $redirectContent = new WikitextContent(
+                                       wfMessage( 'category-move-redirect-override' )
+                                               ->params( $nt->getPrefixedText() )->inContentLanguage()->plain() );
+                       } else {
+                               $contentHandler = ContentHandler::getForTitle( $this );
+                               $redirectContent = $contentHandler->makeRedirectContent( $nt,
+                                       wfMessage( 'move-redirect-text' )->inContentLanguage()->plain() );
+                       }
 
                        // NOTE: If this page's content model does not support redirects, $redirectContent will be null.
                } else {
@@ -4025,7 +4152,10 @@ class Title {
                $this->mArticleID = $row ? intval( $row->page_id ) : 0;
                $this->mRedirect = $row ? (bool)$row->page_is_redirect : false;
                $this->mLatestID = $row ? intval( $row->page_latest ) : false;
-               $this->mContentModel = $row && isset( $row->page_content_model ) ? strval( $row->page_content_model ) : false;
+               $this->mContentModel = $row && isset( $row->page_content_model )
+                       ? strval( $row->page_content_model )
+                       : false;
+
                if ( !$this->mRedirect ) {
                        return false;
                }
@@ -4554,7 +4684,9 @@ class Title {
                        // Use always content language to avoid loading hundreds of languages
                        // to get the link color.
                        global $wgContLang;
-                       list( $name, ) = MessageCache::singleton()->figureMessage( $wgContLang->lcfirst( $this->getText() ) );
+                       list( $name, ) = MessageCache::singleton()->figureMessage(
+                               $wgContLang->lcfirst( $this->getText() )
+                       );
                        $message = wfMessage( $name )->inLanguage( $wgContLang )->useDatabase( false );
                        return $message->exists();
                }
@@ -4574,7 +4706,9 @@ class Title {
                        return false;
                }
 
-               list( $name, $lang ) = MessageCache::singleton()->figureMessage( $wgContLang->lcfirst( $this->getText() ) );
+               list( $name, $lang ) = MessageCache::singleton()->figureMessage(
+                       $wgContLang->lcfirst( $this->getText() )
+               );
                $message = wfMessage( $name )->inLanguage( $lang )->useDatabase( false );
 
                if ( $message->exists() ) {
@@ -4837,9 +4971,12 @@ class Title {
                }
 
                if ( !$this->mPageLanguage || $this->mPageLanguage[1] !== $wgLanguageCode ) {
-                       // Note that this may depend on user settings, so the cache should be only per-request.
-                       // NOTE: ContentHandler::getPageLanguage() may need to load the content to determine the page language!
-                       // Checking $wgLanguageCode hasn't changed for the benefit of unit tests.
+                       // Note that this may depend on user settings, so the cache should
+                       // be only per-request.
+                       // NOTE: ContentHandler::getPageLanguage() may need to load the
+                       // content to determine the page language!
+                       // Checking $wgLanguageCode hasn't changed for the benefit of unit
+                       // tests.
                        $contentHandler = ContentHandler::getForTitle( $this );
                        $langObj = wfGetLangObj( $contentHandler->getPageLanguage( $this ) );
                        $this->mPageLanguage = array( $langObj->getCode(), $wgLanguageCode );
@@ -4872,8 +5009,9 @@ class Title {
                        return $wgLang;
                }
 
-               //NOTE: can't be cached persistently, depends on user settings
-               //NOTE: ContentHandler::getPageViewLanguage() may need to load the content to determine the page language!
+               // @note Can't be cached persistently, depends on user settings.
+               // @note ContentHandler::getPageViewLanguage() may need to load the
+               //   content to determine the page language!
                $contentHandler = ContentHandler::getForTitle( $this );
                $pageLang = $contentHandler->getPageViewLanguage( $this );
                return $pageLang;
index 4fcb2eb..668ea54 100644 (file)
  */
 
 class TitleArrayFromResult extends TitleArray implements Countable {
+       /** @var ResultWrapper */
+       public $res;
 
-       /**
-        * @var ResultWrapper
-        */
-       var $res;
-       var $key, $current;
+       public $key;
+
+       public $current;
 
        function __construct( $res ) {
                $this->res = $res;
index f5768af..6578341 100644 (file)
@@ -76,7 +76,7 @@ class User {
         * corresponding database fields must call a cache-clearing function.
         * @showinitializer
         */
-       static $mCacheVars = array(
+       protected static $mCacheVars = array(
                // user table
                'mId',
                'mName',
@@ -105,7 +105,7 @@ class User {
         * "right-$right".
         * @showinitializer
         */
-       static $mCoreRights = array(
+       protected static $mCoreRights = array(
                'apihighlimits',
                'autoconfirmed',
                'autopatrol',
@@ -143,6 +143,7 @@ class User {
                'minoredit',
                'move',
                'movefile',
+               'move-categorypages',
                'move-rootuserpages',
                'move-subpages',
                'nominornewtalk',
@@ -175,17 +176,45 @@ class User {
                'viewmywatchlist',
                'writeapi',
        );
+
        /**
         * String Cached results of getAllRights()
         */
-       static $mAllRights = false;
+       protected static $mAllRights = false;
 
        /** @name Cache variables */
        //@{
-       var $mId, $mName, $mRealName, $mPassword, $mNewpassword, $mNewpassTime,
-               $mEmail, $mTouched, $mToken, $mEmailAuthenticated,
-               $mEmailToken, $mEmailTokenExpires, $mRegistration, $mEditCount,
-               $mGroups, $mOptionOverrides;
+       public $mId;
+
+       public $mName;
+
+       public $mRealName;
+
+       public $mPassword;
+
+       public $mNewpassword;
+
+       public $mNewpassTime;
+
+       public $mEmail;
+
+       public $mTouched;
+
+       protected $mToken;
+
+       public $mEmailAuthenticated;
+
+       protected $mEmailToken;
+
+       protected $mEmailTokenExpires;
+
+       protected $mRegistration;
+
+       protected $mEditCount;
+
+       public $mGroups;
+
+       protected $mOptionOverrides;
 
        protected $mPasswordExpires;
        //@}
@@ -194,12 +223,12 @@ class User {
         * Bool Whether the cache variables have been loaded.
         */
        //@{
-       var $mOptionsLoaded;
+       public $mOptionsLoaded;
 
        /**
         * Array with already loaded items or true if all items have been loaded.
         */
-       private $mLoadedItems = array();
+       protected $mLoadedItems = array();
        //@}
 
        /**
@@ -211,41 +240,55 @@ class User {
         *
         * Use the User::newFrom*() family of functions to set this.
         */
-       var $mFrom;
+       public $mFrom;
 
        /**
         * Lazy-initialized variables, invalidated with clearInstanceCache
         */
-       var $mNewtalk, $mDatePreference, $mBlockedby, $mHash, $mRights,
-               $mBlockreason, $mEffectiveGroups, $mImplicitGroups, $mFormerGroups, $mBlockedGlobally,
-               $mLocked, $mHideName, $mOptions;
+       protected $mNewtalk;
+
+       protected $mDatePreference;
+
+       public $mBlockedby;
+
+       protected $mHash;
+
+       public $mRights;
+
+       protected $mBlockreason;
+
+       protected $mEffectiveGroups;
+
+       protected $mImplicitGroups;
+
+       protected $mFormerGroups;
+
+       protected $mBlockedGlobally;
+
+       protected $mLocked;
+
+       public $mHideName;
+
+       public $mOptions;
 
        /**
         * @var WebRequest
         */
        private $mRequest;
 
-       /**
-        * @var Block
-        */
-       var $mBlock;
+       /** @var Block */
+       public $mBlock;
 
-       /**
-        * @var bool
-        */
-       var $mAllowUsertalk;
+       /** @var bool */
+       protected $mAllowUsertalk;
 
-       /**
-        * @var Block
-        */
+       /** @var Block */
        private $mBlockedFromCreateAccount = false;
 
-       /**
-        * @var array
-        */
+       /** @var array */
        private $mWatchedItems = array();
 
-       static $idCacheByName = array();
+       public static $idCacheByName = array();
 
        /**
         * Lightweight constructor for an anonymous user.
@@ -516,7 +559,12 @@ class User {
                }
 
                $dbr = wfGetDB( DB_SLAVE );
-               $s = $dbr->selectRow( 'user', array( 'user_id' ), array( 'user_name' => $nt->getText() ), __METHOD__ );
+               $s = $dbr->selectRow(
+                       'user',
+                       array( 'user_id' ),
+                       array( 'user_name' => $nt->getText() ),
+                       __METHOD__
+               );
 
                if ( $s === false ) {
                        $result = null;
@@ -557,7 +605,8 @@ class User {
         * @return bool
         */
        public static function isIP( $name ) {
-               return preg_match( '/^\d{1,3}\.\d{1,3}\.\d{1,3}\.(?:xxx|\d{1,3})$/', $name ) || IP::isIPv6( $name );
+               return preg_match( '/^\d{1,3}\.\d{1,3}\.\d{1,3}\.(?:xxx|\d{1,3})$/', $name )
+                       || IP::isIPv6( $name );
        }
 
        /**
@@ -755,7 +804,9 @@ class User {
                        } elseif ( $wgContLang->lc( $password ) == $wgContLang->lc( $this->mName ) ) {
                                $status->error( 'password-name-match' );
                                return $status;
-                       } elseif ( isset( $blockedLogins[$this->getName()] ) && $password == $blockedLogins[$this->getName()] ) {
+                       } elseif ( isset( $blockedLogins[$this->getName()] )
+                               && $password == $blockedLogins[$this->getName()]
+                       ) {
                                $status->error( 'password-login-forbidden' );
                                return $status;
                        } else {
@@ -954,7 +1005,8 @@ class User {
         */
        public static function randomPassword() {
                global $wgMinimalPasswordLength;
-               // Decide the final password length based on our min password length, stopping at a minimum of 10 chars
+               // Decide the final password length based on our min password length,
+               // stopping at a minimum of 10 chars.
                $length = max( 10, $wgMinimalPasswordLength );
                // Multiply by 1.25 to get the number of hex characters we need
                $length = $length * 1.25;
@@ -1085,14 +1137,16 @@ class User {
                }
 
                if ( $request->getSessionData( 'wsToken' ) ) {
-                       $passwordCorrect = ( $proposedUser->getToken( false ) === $request->getSessionData( 'wsToken' ) );
+                       $passwordCorrect =
+                               ( $proposedUser->getToken( false ) === $request->getSessionData( 'wsToken' ) );
                        $from = 'session';
                } elseif ( $request->getCookie( 'Token' ) ) {
                        # Get the token from DB/cache and clean it up to remove garbage padding.
                        # This deals with historical problems with bugs and the default column value.
                        $token = rtrim( $proposedUser->getToken( false ) ); // correct token
                        // Make comparison in constant time (bug 61346)
-                       $passwordCorrect = strlen( $token ) && $this->compareSecrets( $token, $request->getCookie( 'Token' ) );
+                       $passwordCorrect = strlen( $token )
+                               && $this->compareSecrets( $token, $request->getCookie( 'Token' ) );
                        $from = 'cookie';
                } else {
                        // No session or persistent login cookie
@@ -1122,11 +1176,13 @@ class User {
                        $passwordCorrect = false;
                } else {
                        $result = 0;
-                       for ( $i = 0; $i < strlen( $answer ); $i++ ) {
+                       $answerLength = strlen( $answer );
+                       for ( $i = 0; $i < $answerLength; $i++ ) {
                                $result |= ord( $answer[$i] ) ^ ord( $test[$i] );
                        }
                        $passwordCorrect = ( $result == 0 );
                }
+
                return $passwordCorrect;
        }
 
@@ -1147,7 +1203,12 @@ class User {
                }
 
                $dbr = wfGetDB( DB_MASTER );
-               $s = $dbr->selectRow( 'user', self::selectFields(), array( 'user_id' => $this->mId ), __METHOD__ );
+               $s = $dbr->selectRow(
+                       'user',
+                       self::selectFields(),
+                       array( 'user_id' => $this->mId ),
+                       __METHOD__
+               );
 
                wfRunHooks( 'UserLoadFromDatabase', array( $this, &$s ) );
 
@@ -1698,7 +1759,8 @@ class User {
                        // Already pinged?
                        if ( $count ) {
                                if ( $count >= $max ) {
-                                       wfDebugLog( 'ratelimit', $this->getName() . " tripped! $key at $count $summary" );
+                                       wfDebugLog( 'ratelimit', "User '{$this->getName()}' " .
+                                               "(IP {$this->getRequest()->getIP()}) tripped $key at $count $summary" );
                                        $triggered = true;
                                } else {
                                        wfDebug( __METHOD__ . ": ok. $key at $count $summary\n" );
@@ -1721,10 +1783,11 @@ class User {
        /**
         * Check if user is blocked
         *
-        * @param bool $bFromSlave Whether to check the slave database instead of the master
+        * @param bool $bFromSlave Whether to check the slave database instead of
+        *   the master. Hacked from false due to horrible probs on site.
         * @return bool True if blocked, false otherwise
         */
-       public function isBlocked( $bFromSlave = true ) { // hacked from false due to horrible probs on site
+       public function isBlocked( $bFromSlave = true ) {
                return $this->getBlock( $bFromSlave ) instanceof Block && $this->getBlock()->prevents( 'edit' );
        }
 
@@ -2081,7 +2144,8 @@ class User {
        /**
         * Update the 'You have new messages!' status.
         * @param bool $val Whether the user has new messages
-        * @param Revision $curRev New, as yet unseen revision of the user talk page. Ignored if null or !$val.
+        * @param Revision $curRev New, as yet unseen revision of the user talk
+        *   page. Ignored if null or !$val.
         */
        public function setNewtalk( $val, $curRev = null ) {
                if ( wfReadOnly() ) {
@@ -2265,7 +2329,8 @@ class User {
 
        /**
         * Get the user's current token.
-        * @param bool $forceCreation Force the generation of a new token if the user doesn't have one (default=true for backwards compatibility)
+        * @param bool $forceCreation Force the generation of a new token if the
+        *   user doesn't have one (default=true for backwards compatibility).
         * @return string Token
         */
        public function getToken( $forceCreation = true ) {
@@ -2602,7 +2667,8 @@ class User {
         *
         * @see User::listOptionKinds
         * @param IContextSource $context
-        * @param array $options Assoc. array with options keys to check as keys. Defaults to $this->mOptions.
+        * @param array $options Assoc. array with options keys to check as keys.
+        *   Defaults to $this->mOptions.
         * @return array the key => kind mapping data
         */
        public function getOptionKinds( IContextSource $context, $options = null ) {
@@ -3477,17 +3543,20 @@ class User {
         * Add a user to the database, return the user object
         *
         * @param string $name Username to add
-        * @param array $params Array of Strings Non-default parameters to save to the database as user_* fields:
-        *   - password             The user's password hash. Password logins will be disabled if this is omitted.
-        *   - newpassword          Hash for a temporary password that has been mailed to the user
-        *   - email                The user's email address
-        *   - email_authenticated  The email authentication timestamp
-        *   - real_name            The user's real name
-        *   - options              An associative array of non-default options
-        *   - token                Random authentication token. Do not set.
-        *   - registration         Registration timestamp. Do not set.
-        *
-        * @return User|null User object, or null if the username already exists
+        * @param array $params Array of Strings Non-default parameters to save to
+        *   the database as user_* fields:
+        *   - password: The user's password hash. Password logins will be disabled
+        *     if this is omitted.
+        *   - newpassword: Hash for a temporary password that has been mailed to
+        *     the user.
+        *   - email: The user's email address.
+        *   - email_authenticated: The email authentication timestamp.
+        *   - real_name: The user's real name.
+        *   - options: An associative array of non-default options.
+        *   - token: Random authentication token. Do not set.
+        *   - registration: Registration timestamp. Do not set.
+        *
+        * @return User|null User object, or null if the username already exists.
         */
        public static function createNew( $name, $params = array() ) {
                $user = new User;
@@ -3658,7 +3727,8 @@ class User {
                if ( $this->mBlockedFromCreateAccount === false && !$this->isAllowed( 'ipblock-exempt' ) ) {
                        $this->mBlockedFromCreateAccount = Block::newFromTarget( null, $this->getRequest()->getIP() );
                }
-               return $this->mBlockedFromCreateAccount instanceof Block && $this->mBlockedFromCreateAccount->prevents( 'createaccount' )
+               return $this->mBlockedFromCreateAccount instanceof Block
+                       && $this->mBlockedFromCreateAccount->prevents( 'createaccount' )
                        ? $this->mBlockedFromCreateAccount
                        : false;
        }
@@ -3817,7 +3887,8 @@ class User {
         * Generate a looking random token for various uses.
         *
         * @return string The new random token
-        * @deprecated since 1.20: Use MWCryptRand for secure purposes or wfRandomString for pseudo-randomness
+        * @deprecated since 1.20: Use MWCryptRand for secure purposes or
+        *   wfRandomString for pseudo-randomness.
         */
        public static function generateToken() {
                return MWCryptRand::generateHex( 32 );
@@ -3839,6 +3910,7 @@ class User {
                if ( $val != $sessionToken ) {
                        wfDebug( "User::matchEditToken: broken session data\n" );
                }
+
                return $val == $sessionToken;
        }
 
@@ -3897,7 +3969,8 @@ class User {
         *
         * @param string $subject Message subject
         * @param string $body Message body
-        * @param string $from Optional From address; if unspecified, default $wgPasswordSender will be used
+        * @param string $from Optional From address; if unspecified, default
+        *   $wgPasswordSender will be used.
         * @param string $replyto Reply-To address
         * @return Status
         */
@@ -4283,8 +4356,11 @@ class User {
         */
        public static function getImplicitGroups() {
                global $wgImplicitGroups;
+
                $groups = $wgImplicitGroups;
-               wfRunHooks( 'UserGetImplicitGroups', array( &$groups ) );       #deprecated, use $wgImplictGroups instead
+               # Deprecated, use $wgImplictGroups instead
+               wfRunHooks( 'UserGetImplicitGroups', array( &$groups ) );
+
                return $groups;
        }
 
@@ -4358,7 +4434,13 @@ class User {
        public static function changeableByGroup( $group ) {
                global $wgAddGroups, $wgRemoveGroups, $wgGroupsAddToSelf, $wgGroupsRemoveFromSelf;
 
-               $groups = array( 'add' => array(), 'remove' => array(), 'add-self' => array(), 'remove-self' => array() );
+               $groups = array(
+                       'add' => array(),
+                       'remove' => array(),
+                       'add-self' => array(),
+                       'remove-self' => array()
+               );
+
                if ( empty( $wgAddGroups[$group] ) ) {
                        // Don't add anything to $groups
                } elseif ( $wgAddGroups[$group] === true ) {
index 0012b44..dd67acd 100644 (file)
  */
 
 class UserArrayFromResult extends UserArray implements Countable {
+       /** @var ResultWrapper */
+       public $res;
 
-       /**
-        * @var ResultWrapper
-        */
-       var $res;
-       var $key, $current;
+       /** @var int */
+       public $key;
+
+       /** @var  */
+       public $current;
 
        /**
         * @param ResultWrapper $res
index 1ec2792..d3e8cb8 100644 (file)
@@ -58,7 +58,7 @@ class MailAddress {
                if ( $this->address ) {
                        if ( $this->name != '' && !wfIsWindows() ) {
                                global $wgEnotifUseRealName;
-                               $name = ( $wgEnotifUseRealName && $this->realName ) ? $this->realName : $this->name;
+                               $name = ( $wgEnotifUseRealName && $this->realName !== '' ) ? $this->realName : $this->name;
                                $quoted = UserMailer::quotedPrintable( $name );
                                if ( strpos( $quoted, '.' ) !== false || strpos( $quoted, ',' ) !== false ) {
                                        $quoted = '"' . $quoted . '"';
@@ -81,7 +81,7 @@ class MailAddress {
  * Collection of static functions for sending mail
  */
 class UserMailer {
-       static $mErrorString;
+       private static $mErrorString;
 
        /**
         * Send mail using a PEAR mailer
@@ -160,7 +160,9 @@ class UserMailer {
         * @throws MWException
         * @return Status
         */
-       public static function send( $to, $from, $subject, $body, $replyto = null, $contentType = 'text/plain; charset=UTF-8' ) {
+       public static function send( $to, $from, $subject, $body, $replyto = null,
+               $contentType = 'text/plain; charset=UTF-8'
+       ) {
                global $wgSMTP, $wgEnotifMaxRecips, $wgAdditionalMailParams, $wgAllowHTMLEmail;
                $mime = null;
                if ( !is_array( $to ) ) {
@@ -268,7 +270,11 @@ class UserMailer {
                                        $body['text'] = str_replace( "\n", "\r\n", $body['text'] );
                                        $body['html'] = str_replace( "\n", "\r\n", $body['html'] );
                                }
-                               $mime = new Mail_mime( array( 'eol' => $endl, 'text_charset' => 'UTF-8', 'html_charset' => 'UTF-8' ) );
+                               $mime = new Mail_mime( array(
+                                       'eol' => $endl,
+                                       'text_charset' => 'UTF-8',
+                                       'html_charset' => 'UTF-8'
+                               ) );
                                $mime->setTXTBody( $body['text'] );
                                $mime->setHTMLBody( $body['html'] );
                                $body = $mime->get(); // must call get() before headers()
@@ -360,7 +366,13 @@ class UserMailer {
                                        if ( $safeMode ) {
                                                $sent = mail( $recip, self::quotedPrintable( $subject ), $body, $headers );
                                        } else {
-                                               $sent = mail( $recip, self::quotedPrintable( $subject ), $body, $headers, $wgAdditionalMailParams );
+                                               $sent = mail(
+                                                       $recip,
+                                                       self::quotedPrintable( $subject ),
+                                                       $body,
+                                                       $headers,
+                                                       $wgAdditionalMailParams
+                                               );
                                        }
                                }
                        } catch ( Exception $e ) {
@@ -501,7 +513,9 @@ class EmailNotification {
         * @param bool $oldid (default: false)
         * @param string $pageStatus (default: 'changed')
         */
-       public function notifyOnPageChange( $editor, $title, $timestamp, $summary, $minorEdit, $oldid = false, $pageStatus = 'changed' ) {
+       public function notifyOnPageChange( $editor, $title, $timestamp, $summary,
+               $minorEdit, $oldid = false, $pageStatus = 'changed'
+       ) {
                global $wgEnotifUseJobQ, $wgEnotifWatchlist, $wgShowUpdatedMarker, $wgEnotifMinorEdits,
                        $wgUsersNotifiedOnAllChanges, $wgEnotifUserTalk;
 
@@ -555,7 +569,10 @@ class EmailNotification {
                        // Only send notification for non minor edits, unless $wgEnotifMinorEdits
                        if ( !$minorEdit || ( $wgEnotifMinorEdits && !$editor->isAllowed( 'nominornewtalk' ) ) ) {
                                $isUserTalkPage = ( $title->getNamespace() == NS_USER_TALK );
-                               if ( $wgEnotifUserTalk && $isUserTalkPage && $this->canSendUserTalkEmail( $editor, $title, $minorEdit ) ) {
+                               if ( $wgEnotifUserTalk
+                                       && $isUserTalkPage
+                                       && $this->canSendUserTalkEmail( $editor, $title, $minorEdit )
+                               ) {
                                        $sendEmail = true;
                                }
                        }
@@ -564,6 +581,7 @@ class EmailNotification {
                if ( !$sendEmail ) {
                        return;
                }
+
                if ( $wgEnotifUseJobQ ) {
                        $params = array(
                                'editor' => $editor->getName(),
@@ -578,7 +596,16 @@ class EmailNotification {
                        $job = new EnotifNotifyJob( $title, $params );
                        JobQueueGroup::singleton()->push( $job );
                } else {
-                       $this->actuallyNotifyOnPageChange( $editor, $title, $timestamp, $summary, $minorEdit, $oldid, $watchers, $pageStatus );
+                       $this->actuallyNotifyOnPageChange(
+                               $editor,
+                               $title,
+                               $timestamp,
+                               $summary,
+                               $minorEdit,
+                               $oldid,
+                               $watchers,
+                               $pageStatus
+                       );
                }
        }
 
@@ -632,8 +659,10 @@ class EmailNotification {
                $userTalkId = false;
 
                if ( !$minorEdit || ( $wgEnotifMinorEdits && !$editor->isAllowed( 'nominornewtalk' ) ) ) {
-
-                       if ( $wgEnotifUserTalk && $isUserTalkPage && $this->canSendUserTalkEmail( $editor, $title, $minorEdit ) ) {
+                       if ( $wgEnotifUserTalk
+                               && $isUserTalkPage
+                               && $this->canSendUserTalkEmail( $editor, $title, $minorEdit )
+                       ) {
                                $targetUser = User::newFromName( $title->getText() );
                                $this->compose( $targetUser );
                                $userTalkId = $targetUser->getId();
@@ -761,13 +790,16 @@ class EmailNotification {
                        $keys['$PAGEEDITOR_EMAIL'] = wfMessage( 'noemailtitle' )->inContentLanguage()->text();
 
                } else {
-                       $keys['$PAGEEDITOR'] = $wgEnotifUseRealName ? $this->editor->getRealName() : $this->editor->getName();
+                       $keys['$PAGEEDITOR'] = $wgEnotifUseRealName && $this->editor->getRealName() !== ''
+                               ? $this->editor->getRealName() : $this->editor->getName();
                        $emailPage = SpecialPage::getSafeTitleFor( 'Emailuser', $this->editor->getName() );
                        $keys['$PAGEEDITOR_EMAIL'] = $emailPage->getCanonicalURL();
                }
 
                $keys['$PAGEEDITOR_WIKI'] = $this->editor->getUserPage()->getCanonicalURL();
-               $keys['$HELPPAGE'] = wfExpandUrl( Skin::makeInternalOrExternalUrl( wfMessage( 'helppage' )->inContentLanguage()->text() ) );
+               $keys['$HELPPAGE'] = wfExpandUrl(
+                       Skin::makeInternalOrExternalUrl( wfMessage( 'helppage' )->inContentLanguage()->text() )
+               );
 
                # Replace this after transforming the message, bug 35019
                $postTransformKeys['$PAGESUMMARY'] = $this->summary == '' ? ' - ' : $this->summary;
@@ -857,8 +889,9 @@ class EmailNotification {
        function sendPersonalised( $watchingUser ) {
                global $wgContLang, $wgEnotifUseRealName;
                // From the PHP manual:
-               //     Note:  The to parameter cannot be an address in the form of "Something <someone@example.com>".
-               //     The mail command will not parse this properly while talking with the MTA.
+               //   Note: The to parameter cannot be an address in the form of
+               //   "Something <someone@example.com>". The mail command will not parse
+               //   this properly while talking with the MTA.
                $to = new MailAddress( $watchingUser );
 
                # $PAGEEDITDATE is the time and date of the page change
@@ -868,7 +901,8 @@ class EmailNotification {
                        array( '$WATCHINGUSERNAME',
                                '$PAGEEDITDATE',
                                '$PAGEEDITTIME' ),
-                       array( $wgEnotifUseRealName ? $watchingUser->getRealName() : $watchingUser->getName(),
+                       array( $wgEnotifUseRealName && $watchingUser->getRealName() !== ''
+                                       ? $watchingUser->getRealName() : $watchingUser->getName(),
                                $wgContLang->userDate( $this->timestamp, $watchingUser ),
                                $wgContLang->userTime( $this->timestamp, $watchingUser ) ),
                        $this->body );
index 9f2b498..f69fe63 100644 (file)
@@ -41,8 +41,23 @@ class WatchedItem {
         */
        const CHECK_USER_RIGHTS = 1;
 
-       var $mTitle, $mUser, $mCheckRights;
-       private $loaded = false, $watched, $timestamp;
+       /** @var Title */
+       public $mTitle;
+
+       /** @var User */
+       public $mUser;
+
+       /** @var int */
+       public $mCheckRights;
+
+       /** @var bool */
+       private $loaded = false;
+
+       /** @var bool */
+       private $watched;
+
+       /** @var string */
+       private $timestamp;
 
        /**
         * Create a WatchedItem object with the given user and title
@@ -53,7 +68,9 @@ class WatchedItem {
         *     Pass either WatchedItem::IGNORE_USER_RIGHTS or WatchedItem::CHECK_USER_RIGHTS.
         * @return WatchedItem
         */
-       public static function fromUserTitle( $user, $title, $checkRights = WatchedItem::CHECK_USER_RIGHTS ) {
+       public static function fromUserTitle( $user, $title,
+               $checkRights = WatchedItem::CHECK_USER_RIGHTS
+       ) {
                $wl = new WatchedItem;
                $wl->mUser = $user;
                $wl->mTitle = $title;
@@ -389,7 +406,13 @@ class WatchedItem {
                # Perform replace
                # Note that multi-row replace is very efficient for MySQL but may be inefficient for
                # some other DBMSes, mostly due to poor simulation by us
-               $dbw->replace( 'watchlist', array( array( 'wl_user', 'wl_namespace', 'wl_title' ) ), $values, __METHOD__ );
+               $dbw->replace(
+                       'watchlist',
+                       array( array( 'wl_user', 'wl_namespace', 'wl_title' ) ),
+                       $values,
+                       __METHOD__
+               );
+
                return true;
        }
 }
index 12cf0d9..ac8e159 100644 (file)
@@ -696,7 +696,9 @@ class WebRequest {
        public function getRequestURL() {
                if ( isset( $_SERVER['REQUEST_URI'] ) && strlen( $_SERVER['REQUEST_URI'] ) ) {
                        $base = $_SERVER['REQUEST_URI'];
-               } elseif ( isset( $_SERVER['HTTP_X_ORIGINAL_URL'] ) && strlen( $_SERVER['HTTP_X_ORIGINAL_URL'] ) ) {
+               } elseif ( isset( $_SERVER['HTTP_X_ORIGINAL_URL'] )
+                       && strlen( $_SERVER['HTTP_X_ORIGINAL_URL'] )
+               ) {
                        // Probably IIS; doesn't set REQUEST_URI
                        $base = $_SERVER['HTTP_X_ORIGINAL_URL'];
                } elseif ( isset( $_SERVER['SCRIPT_NAME'] ) ) {
@@ -1010,9 +1012,9 @@ class WebRequest {
 We can't serve non-HTML content from the URL you have requested, because
 Internet Explorer would interpret it as an incorrect and potentially dangerous
 content type.</p>
-<p>Instead, please use <a href="$encUrl">this URL</a>, which is the same as the URL you have requested, except that
-"&amp;*" is appended. This prevents Internet Explorer from seeing a bogus file
-extension.
+<p>Instead, please use <a href="$encUrl">this URL</a>, which is the same as the
+URL you have requested, except that "&amp;*" is appended. This prevents Internet
+Explorer from seeing a bogus file extension.
 </p>
 </body>
 </html>
@@ -1023,14 +1025,16 @@ HTML;
 
        /**
         * Parse the Accept-Language header sent by the client into an array
-        * @return array array( languageCode => q-value ) sorted by q-value in descending order then
-        *                                                appearing time in the header in ascending order.
+        *
+        * @return array array( languageCode => q-value ) sorted by q-value in
+        *   descending order then appearing time in the header in ascending order.
         * May contain the "language" '*', which applies to languages other than those explicitly listed.
         * This is aligned with rfc2616 section 14.4
         * Preference for earlier languages appears in rfc3282 as an extension to HTTP/1.1.
         */
        public function getAcceptLang() {
-               // Modified version of code found at http://www.thefutureoftheweb.com/blog/use-accept-language-header
+               // Modified version of code found at
+               // http://www.thefutureoftheweb.com/blog/use-accept-language-header
                $acceptLang = $this->getHeader( 'Accept-Language' );
                if ( !$acceptLang ) {
                        return array();
@@ -1041,8 +1045,11 @@ HTML;
 
                // Break up string into pieces (languages and q factors)
                $lang_parse = null;
-               preg_match_all( '/([a-z]{1,8}(-[a-z]{1,8})*|\*)\s*(;\s*q\s*=\s*(1(\.0{0,3})?|0(\.[0-9]{0,3})?)?)?/',
-                       $acceptLang, $lang_parse );
+               preg_match_all(
+                       '/([a-z]{1,8}(-[a-z]{1,8})*|\*)\s*(;\s*q\s*=\s*(1(\.0{0,3})?|0(\.[0-9]{0,3})?)?)?/',
+                       $acceptLang,
+                       $lang_parse
+               );
 
                if ( !count( $lang_parse[1] ) ) {
                        return array();
@@ -1084,7 +1091,8 @@ HTML;
                }
 
                if ( is_array( $_SERVER['REMOTE_ADDR'] ) || strpos( $_SERVER['REMOTE_ADDR'], ',' ) !== false ) {
-                       throw new MWException( __METHOD__ . " : Could not determine the remote IP address due to multiple values." );
+                       throw new MWException( __METHOD__
+                               . " : Could not determine the remote IP address due to multiple values." );
                } else {
                        $ipchain = $_SERVER['REMOTE_ADDR'];
                }
@@ -1303,7 +1311,9 @@ class FauxRequest extends WebRequest {
         * @param string $protocol 'http' or 'https'
         * @throws MWException
         */
-       public function __construct( $data = array(), $wasPosted = false, $session = null, $protocol = 'http' ) {
+       public function __construct( $data = array(), $wasPosted = false,
+               $session = null, $protocol = 'http'
+       ) {
                if ( is_array( $data ) ) {
                        $this->data = $data;
                } else {
index 766b3bf..09f01c0 100644 (file)
 # This must be done before any globals are set by the code
 if ( ini_get( 'register_globals' ) ) {
        if ( isset( $_REQUEST['GLOBALS'] ) || isset( $_FILES['GLOBALS'] ) ) {
-               die( '<a href="http://www.hardened-php.net/globals-problem">$GLOBALS overwrite vulnerability</a>' );
+               die( '<a href="http://www.hardened-php.net/globals-problem">'
+                       . '$GLOBALS overwrite vulnerability</a>' );
        }
+
        $verboten = array(
                'GLOBALS',
                '_SERVER',
@@ -50,6 +52,7 @@ if ( ini_get( 'register_globals' ) ) {
                '_SESSION',
                'HTTP_SESSION_VARS'
        );
+
        foreach ( $_REQUEST as $name => $value ) {
                if ( in_array( $name, $verboten ) ) {
                        header( "HTTP/1.1 500 Internal Server Error" );
index aed1f65..eff251f 100644 (file)
@@ -26,9 +26,8 @@
  * @internal documentation reviewed 15 Mar 2010
  */
 class MediaWiki {
-
        /**
-        * TODO: fold $output, etc, into this
+        * @todo Fold $output, etc, into this
         * @var IContextSource
         */
        private $context;
@@ -117,7 +116,11 @@ class MediaWiki {
                }
 
                // Use the main page as default title if nothing else has been provided
-               if ( $ret === null && strval( $title ) === '' && !$request->getCheck( 'curid' ) && $action !== 'delete' ) {
+               if ( $ret === null
+                       && strval( $title ) === ''
+                       && !$request->getCheck( 'curid' )
+                       && $action !== 'delete'
+               ) {
                        $ret = Title::newMainPage();
                }
 
index 44f0599..34f15c3 100644 (file)
@@ -180,7 +180,8 @@ class WikiFilePage extends WikiPage {
                        $this->mFile->upgradeRow();
                        $this->mFile->purgeCache( array( 'forThumbRefresh' => true ) );
                } else {
-                       wfDebug( 'ImagePage::doPurge no image for ' . $this->mFile->getName() . "; limiting purge to cache only\n" );
+                       wfDebug( 'ImagePage::doPurge no image for '
+                               . $this->mFile->getName() . "; limiting purge to cache only\n" );
                        // even if the file supposedly doesn't exist, force any cached information
                        // to be updated (in case the cached information is wrong)
                        $this->mFile->purgeCache( array( 'forThumbRefresh' => true ) );
index d53acd0..9a26c15 100644 (file)
@@ -352,10 +352,11 @@ class WikiPage implements Page, IDBAccessObject {
         * some source.
         *
         * @param object|string|int $from One of the following:
-        *        - A DB query result object
-        *        - "fromdb" or WikiPage::READ_NORMAL to get from a slave DB
-        *        - "fromdbmaster" or WikiPage::READ_LATEST to get from the master DB
-        *        - "forupdate"  or WikiPage::READ_LOCKING to get from the master DB using SELECT FOR UPDATE
+        *   - A DB query result object.
+        *   - "fromdb" or WikiPage::READ_NORMAL to get from a slave DB.
+        *   - "fromdbmaster" or WikiPage::READ_LATEST to get from the master DB.
+        *   - "forupdate"  or WikiPage::READ_LOCKING to get from the master DB
+        *     using SELECT FOR UPDATE.
         *
         * @return void
         */
@@ -688,7 +689,7 @@ class WikiPage implements Page, IDBAccessObject {
         * @return string|bool The text of the current revision
         * @deprecated since 1.21, getContent() should be used instead.
         */
-       public function getText( $audience = Revision::FOR_PUBLIC, User $user = null ) { // @todo deprecated, replace usage!
+       public function getText( $audience = Revision::FOR_PUBLIC, User $user = null ) {
                ContentHandler::deprecated( __METHOD__, '1.21' );
 
                $this->loadLastEdit();
@@ -1291,9 +1292,10 @@ class WikiPage implements Page, IDBAccessObject {
         * @param bool $lastRevIsRedirect If given, will optimize adding and
         *   removing rows in redirect table.
         * @return bool true on success, false on failure
-        * @private
         */
-       public function updateRevisionOn( $dbw, $revision, $lastRevision = null, $lastRevIsRedirect = null ) {
+       public function updateRevisionOn( $dbw, $revision, $lastRevision = null,
+               $lastRevIsRedirect = null
+       ) {
                global $wgContentHandlerUseDB;
 
                wfProfileIn( __METHOD__ );
@@ -1477,10 +1479,13 @@ class WikiPage implements Page, IDBAccessObject {
         *
         * @deprecated since 1.21, use replaceSectionContent() instead
         */
-       public function replaceSection( $section, $text, $sectionTitle = '', $edittime = null ) {
+       public function replaceSection( $section, $text, $sectionTitle = '',
+               $edittime = null
+       ) {
                ContentHandler::deprecated( __METHOD__, '1.21' );
 
-               if ( strval( $section ) == '' ) { //NOTE: keep condition in sync with condition in replaceSectionContent!
+               //NOTE: keep condition in sync with condition in replaceSectionContent!
+               if ( strval( $section ) == '' ) {
                        // Whole-page edit; let the whole text through
                        return $text;
                }
@@ -1504,8 +1509,10 @@ class WikiPage implements Page, IDBAccessObject {
         *
         * @return bool
         *
-        * @todo The skin should check this and not offer section functionality if sections are not supported.
-        * @todo The EditPage should check this and not offer section functionality if sections are not supported.
+        * @todo The skin should check this and not offer section functionality if
+        *   sections are not supported.
+        * @todo The EditPage should check this and not offer section functionality
+        *   if sections are not supported.
         */
        public function supportsSections() {
                return $this->getContentHandler()->supportsSections();
@@ -1606,10 +1613,11 @@ class WikiPage implements Page, IDBAccessObject {
         *      EDIT_AUTOSUMMARY
         *          Fill in blank summaries with generated text where possible
         *
-        * If neither EDIT_NEW nor EDIT_UPDATE is specified, the status of the article will be detected.
-        * If EDIT_UPDATE is specified and the article doesn't exist, the function will return an
-        * edit-gone-missing error. If EDIT_NEW is specified and the article does exist, an
-        * edit-already-exists error will be returned. These two conditions are also possible with
+        * If neither EDIT_NEW nor EDIT_UPDATE is specified, the status of the
+        * article will be detected. If EDIT_UPDATE is specified and the article
+        * doesn't exist, the function will return an edit-gone-missing error. If
+        * EDIT_NEW is specified and the article does exist, an edit-already-exists
+        * error will be returned. These two conditions are also possible with
         * auto-detection due to MediaWiki's performance-optimised locking strategy.
         *
         * @param bool|int $baseRevId The revision ID this edit was based off, if any
@@ -1617,19 +1625,21 @@ class WikiPage implements Page, IDBAccessObject {
         *
         * @throws MWException
         * @return Status object. Possible errors:
-        *     edit-hook-aborted:       The ArticleSave hook aborted the edit but didn't set the fatal flag of $status
-        *     edit-gone-missing:       In update mode, but the article didn't exist
-        *     edit-conflict:           In update mode, the article changed unexpectedly
-        *     edit-no-change:          Warning that the text was the same as before
-        *     edit-already-exists:     In creation mode, but the article already exists
+        *   edit-hook-aborted: The ArticleSave hook aborted the edit but didn't
+        *     set the fatal flag of $status
+        *   edit-gone-missing: In update mode, but the article didn't exist.
+        *   edit-conflict: In update mode, the article changed unexpectedly.
+        *   edit-no-change: Warning that the text was the same as before.
+        *   edit-already-exists: In creation mode, but the article already exists.
         *
-        *  Extensions may define additional errors.
+        * Extensions may define additional errors.
         *
-        *  $return->value will contain an associative array with members as follows:
-        *     new:                     Boolean indicating if the function attempted to create a new article
-        *     revision:                The revision object for the inserted revision, or null
+        * $return->value will contain an associative array with members as follows:
+        *     new: Boolean indicating if the function attempted to create a new article.
+        *     revision: The revision object for the inserted revision, or null.
         *
-        *  Compatibility note: this function previously returned a boolean value indicating success/failure
+        * Compatibility note: this function previously returned a boolean value
+        * indicating success/failure
         *
         * @deprecated since 1.21: use doEditContent() instead.
         */
@@ -1663,29 +1673,32 @@ class WikiPage implements Page, IDBAccessObject {
         *      EDIT_AUTOSUMMARY
         *          Fill in blank summaries with generated text where possible
         *
-        * If neither EDIT_NEW nor EDIT_UPDATE is specified, the status of the article will be detected.
-        * If EDIT_UPDATE is specified and the article doesn't exist, the function will return an
-        * edit-gone-missing error. If EDIT_NEW is specified and the article does exist, an
-        * edit-already-exists error will be returned. These two conditions are also possible with
+        * If neither EDIT_NEW nor EDIT_UPDATE is specified, the status of the
+        * article will be detected. If EDIT_UPDATE is specified and the article
+        * doesn't exist, the function will return an edit-gone-missing error. If
+        * EDIT_NEW is specified and the article does exist, an edit-already-exists
+        * error will be returned. These two conditions are also possible with
         * auto-detection due to MediaWiki's performance-optimised locking strategy.
         *
         * @param bool|int $baseRevId The revision ID this edit was based off, if any
         * @param User $user The user doing the edit
-        * @param string $serialisation_format Format for storing the content in the database
+        * @param string $serialisation_format Format for storing the content in the
+        *   database.
         *
         * @throws MWException
         * @return Status object. Possible errors:
-        *     edit-hook-aborted:       The ArticleSave hook aborted the edit but didn't set the fatal flag of $status
-        *     edit-gone-missing:       In update mode, but the article didn't exist
-        *     edit-conflict:           In update mode, the article changed unexpectedly
-        *     edit-no-change:          Warning that the text was the same as before
-        *     edit-already-exists:     In creation mode, but the article already exists
+        *     edit-hook-aborted: The ArticleSave hook aborted the edit but didn't
+        *       set the fatal flag of $status.
+        *     edit-gone-missing: In update mode, but the article didn't exist.
+        *     edit-conflict: In update mode, the article changed unexpectedly.
+        *     edit-no-change: Warning that the text was the same as before.
+        *     edit-already-exists: In creation mode, but the article already exists.
         *
         *  Extensions may define additional errors.
         *
         *  $return->value will contain an associative array with members as follows:
-        *     new:                     Boolean indicating if the function attempted to create a new article
-        *     revision:                The revision object for the inserted revision, or null
+        *     new: Boolean indicating if the function attempted to create a new article.
+        *     revision: The revision object for the inserted revision, or null.
         *
         * @since 1.21
         */
@@ -2020,7 +2033,8 @@ class WikiPage implements Page, IDBAccessObject {
                $options = $this->getContentHandler()->makeParserOptions( $context );
 
                if ( $this->getTitle()->isConversionTable() ) {
-                       // @todo ConversionTable should become a separate content model, so we don't need special cases like this one.
+                       // @todo ConversionTable should become a separate content model, so
+                       // we don't need special cases like this one.
                        $options->disableContentConversion();
                }
 
@@ -2087,7 +2101,9 @@ class WikiPage implements Page, IDBAccessObject {
 
                $edit->format = $serialization_format;
                $edit->popts = $this->makeParserOptions( 'canonical' );
-               $edit->output = $edit->pstContent ? $edit->pstContent->getParserOutput( $this->mTitle, $revid, $edit->popts ) : null;
+               $edit->output = $edit->pstContent
+                       ? $edit->pstContent->getParserOutput( $this->mTitle, $revid, $edit->popts )
+                       : null;
 
                $edit->newContent = $content;
                $edit->oldContent = $this->getContent( Revision::RAW );
@@ -2298,7 +2314,9 @@ class WikiPage implements Page, IDBAccessObject {
         * @param User $user The user updating the restrictions
         * @return Status
         */
-       public function doUpdateRestrictions( array $limit, array $expiry, &$cascade, $reason, User $user ) {
+       public function doUpdateRestrictions( array $limit, array $expiry,
+               &$cascade, $reason, User $user
+       ) {
                global $wgCascadingRestrictionLevels, $wgContLang;
 
                if ( wfReadOnly() ) {
@@ -2384,7 +2402,9 @@ class WikiPage implements Page, IDBAccessObject {
                        }
 
                        // Only certain restrictions can cascade...
-                       $editrestriction = isset( $limit['edit'] ) ? array( $limit['edit'] ) : $this->mTitle->getRestrictions( 'edit' );
+                       $editrestriction = isset( $limit['edit'] )
+                               ? array( $limit['edit'] )
+                               : $this->mTitle->getRestrictions( 'edit' );
                        foreach ( array_keys( $editrestriction, 'sysop' ) as $key ) {
                                $editrestriction[$key] = 'editprotected'; // backwards compatibility
                        }
@@ -2407,7 +2427,15 @@ class WikiPage implements Page, IDBAccessObject {
 
                        // insert null revision to identify the page protection change as edit summary
                        $latest = $this->getLatest();
-                       $nullRevision = $this->insertProtectNullRevision( $revCommentMsg, $limit, $expiry, $cascade, $reason, $user );
+                       $nullRevision = $this->insertProtectNullRevision(
+                               $revCommentMsg,
+                               $limit,
+                               $expiry,
+                               $cascade,
+                               $reason,
+                               $user
+                       );
+
                        if ( $nullRevision === null ) {
                                return Status::newFatal( 'no-null-revision', $this->mTitle->getPrefixedText() );
                        }
@@ -2509,7 +2537,9 @@ class WikiPage implements Page, IDBAccessObject {
         * @param User|null $user
         * @return Revision|null Null on error
         */
-       public function insertProtectNullRevision( $revCommentMsg, array $limit, array $expiry, $cascade, $reason, $user = null ) {
+       public function insertProtectNullRevision( $revCommentMsg, array $limit,
+               array $expiry, $cascade, $reason, $user = null
+       ) {
                global $wgContLang;
                $dbw = wfGetDB( DB_MASTER );
 
@@ -2526,7 +2556,8 @@ class WikiPage implements Page, IDBAccessObject {
                $protectDescription = $this->protectDescription( $limit, $expiry );
                if ( $protectDescription ) {
                        $editComment .= wfMessage( 'word-separator' )->inContentLanguage()->text();
-                       $editComment .= wfMessage( 'parentheses' )->params( $protectDescription )->inContentLanguage()->text();
+                       $editComment .= wfMessage( 'parentheses' )->params( $protectDescription )
+                               ->inContentLanguage()->text();
                }
                if ( $cascade ) {
                        $editComment .= wfMessage( 'word-separator' )->inContentLanguage()->text();
@@ -2825,8 +2856,9 @@ class WikiPage implements Page, IDBAccessObject {
         * Do some database updates after deletion
         *
         * @param int $id page_id value of the page being deleted
-        * @param Content $content Optional page content to be used when determining the required updates.
-        *   This may be needed because $this->getContent() may already return null when the page proper was deleted.
+        * @param Content $content Optional page content to be used when determining
+        *   the required updates. This may be needed because $this->getContent()
+        *   may already return null when the page proper was deleted.
         */
        public function doDeleteUpdates( $id, Content $content = null ) {
                // update site status
@@ -2963,7 +2995,9 @@ class WikiPage implements Page, IDBAccessObject {
                if ( $s === false ) {
                        // No one else ever edited this page
                        return array( array( 'cantrollback' ) );
-               } elseif ( $s->rev_deleted & Revision::DELETED_TEXT || $s->rev_deleted & Revision::DELETED_USER ) {
+               } elseif ( $s->rev_deleted & Revision::DELETED_TEXT
+                       || $s->rev_deleted & Revision::DELETED_USER
+               ) {
                        // Only admins can see this text
                        return array( array( 'notvisiblerev' ) );
                }
@@ -3031,7 +3065,13 @@ class WikiPage implements Page, IDBAccessObject {
                }
 
                // Actually store the edit
-               $status = $this->doEditContent( $target->getContent(), $summary, $flags, $target->getId(), $guser );
+               $status = $this->doEditContent(
+                       $target->getContent(),
+                       $summary,
+                       $flags,
+                       $target->getId(),
+                       $guser
+               );
 
                if ( !$status->isOK() ) {
                        return $status->getErrorsArray();
@@ -3138,7 +3178,8 @@ class WikiPage implements Page, IDBAccessObject {
         * Purge caches on page update etc
         *
         * @param Title $title
-        * @todo Verify that $title is always a Title object (and never false or null), add Title hint to parameter $title
+        * @todo Verify that $title is always a Title object (and never false or
+        *   null), add Title hint to parameter $title.
         */
        public static function onArticleEdit( $title ) {
                // Invalidate caches of articles which include this page
@@ -3220,7 +3261,8 @@ class WikiPage implements Page, IDBAccessObject {
         * @deprecated since 1.21, use ContentHandler::getAutosummary() instead
         */
        public static function getAutosummary( $oldtext, $newtext, $flags ) {
-               // NOTE: stub for backwards-compatibility. assumes the given text is wikitext. will break horribly if it isn't.
+               // NOTE: stub for backwards-compatibility. assumes the given text is
+               // wikitext. will break horribly if it isn't.
 
                ContentHandler::deprecated( __METHOD__, '1.21' );
 
@@ -3370,7 +3412,8 @@ class WikiPage implements Page, IDBAccessObject {
 
                if ( count( $links_diff ) > 0 ) {
                        // Whee, link updates time.
-                       // Note: we are only interested in links here. We don't need to get other DataUpdate items from the parser output.
+                       // Note: we are only interested in links here. We don't need to get
+                       // other DataUpdate items from the parser output.
                        $u = new LinksUpdate( $this->mTitle, $parserOutput, false );
                        $u->doUpdate();
                }
@@ -3457,10 +3500,12 @@ class WikiPage implements Page, IDBAccessObject {
        }
 
        /**
-        * Returns a list of updates to be performed when this page is deleted. The updates should remove any information
-        * about this page from secondary data stores such as links tables.
+        * Returns a list of updates to be performed when this page is deleted. The
+        * updates should remove any information about this page from secondary data
+        * stores such as links tables.
         *
-        * @param Content|null $content Optional Content object for determining the necessary updates
+        * @param Content|null $content Optional Content object for determining the
+        *   necessary updates.
         * @return array An array of DataUpdates objects
         */
        public function getDeletionUpdates( Content $content = null ) {
@@ -3483,57 +3528,42 @@ class WikiPage implements Page, IDBAccessObject {
 }
 
 class PoolWorkArticleView extends PoolCounterWork {
-
-       /**
-        * @var Page
-        */
+       /** @var Page */
        private $page;
 
-       /**
-        * @var string
-        */
+       /** @var string */
        private $cacheKey;
 
-       /**
-        * @var int
-        */
+       /** @var int */
        private $revid;
 
-       /**
-        * @var ParserOptions
-        */
+       /** @var ParserOptions */
        private $parserOptions;
 
-       /**
-        * @var Content|null
-        */
+       /** @var Content|null */
        private $content = null;
 
-       /**
-        * @var ParserOutput|bool
-        */
+       /** @var ParserOutput|bool */
        private $parserOutput = false;
 
-       /**
-        * @var bool
-        */
+       /** @var bool */
        private $isDirty = false;
 
-       /**
-        * @var Status|bool
-        */
+       /** @var Status|bool */
        private $error = false;
 
        /**
-        * Constructor
-        *
         * @param Page $page
-        * @param int $revid ID of the revision being parsed
-        * @param bool $useParserCache Whether to use the parser cache
-        * @param ParserOptions $parserOptions ParserOptions to use for the parse operation
-        * @param Content|string $content Content to parse or null to load it; may also be given as a wikitext string, for BC
-        */
-       public function __construct( Page $page, ParserOptions $parserOptions, $revid, $useParserCache, $content = null ) {
+        * @param int $revid ID of the revision being parsed.
+        * @param bool $useParserCache Whether to use the parser cache.
+        * @param ParserOptions $parserOptions ParserOptions to use for the parse
+        *   operation.
+        * @param Content|string $content Content to parse or null to load it; may
+        *   also be given as a wikitext string, for BC.
+        */
+       public function __construct( Page $page, ParserOptions $parserOptions,
+               $revid, $useParserCache, $content = null
+       ) {
                if ( is_string( $content ) ) { // BC: old style call
                        $modelId = $page->getRevision()->getContentModel();
                        $format = $page->getRevision()->getContentFormat();
@@ -3611,7 +3641,11 @@ class PoolWorkArticleView extends PoolCounterWork {
                $cacheTime = wfTimestampNow();
 
                $time = - microtime( true );
-               $this->parserOutput = $content->getParserOutput( $this->page->getTitle(), $this->revid, $this->parserOptions );
+               $this->parserOutput = $content->getParserOutput(
+                       $this->page->getTitle(),
+                       $this->revid,
+                       $this->parserOptions
+               );
                $time += microtime( true );
 
                // Timing hack
index 6510eae..6fb5380 100644 (file)
@@ -36,7 +36,9 @@ class Xml {
         * @param bool $allowShortTag Whether '' in $contents will result in a contentless closed tag
         * @return string
         */
-       public static function element( $element, $attribs = null, $contents = '', $allowShortTag = true ) {
+       public static function element( $element, $attribs = null, $contents = '',
+               $allowShortTag = true
+       ) {
                $out = '<' . $element;
                if ( !is_null( $attribs ) ) {
                        $out .= self::expandAttributes( $attribs );
@@ -142,7 +144,9 @@ class Xml {
         * @return string
         * @deprecated since 1.19
         */
-       public static function namespaceSelector( $selected = '', $all = null, $element_name = 'namespace', $label = null ) {
+       public static function namespaceSelector( $selected = '', $all = null,
+               $element_name = 'namespace', $label = null
+       ) {
                wfDeprecated( __METHOD__, '1.19' );
                return Html::namespaceSelector( array(
                        'selected' => $selected,
@@ -158,8 +162,9 @@ class Xml {
        /**
         * Create a date selector
         *
-        * @param string $selected The month which should be selected, default ''
-        * @param string $allmonths Value of a special item denoting all month. Null to not include (default)
+        * @param string $selected The month which should be selected, default ''.
+        * @param string $allmonths Value of a special item denoting all month.
+        *   Null to not include (default).
         * @param string $id Element identifier
         * @return string Html string containing the month selector
         */
@@ -170,12 +175,20 @@ class Xml {
                        $selected = '';
                }
                if ( !is_null( $allmonths ) ) {
-                       $options[] = self::option( wfMessage( 'monthsall' )->text(), $allmonths, $selected === $allmonths );
+                       $options[] = self::option(
+                               wfMessage( 'monthsall' )->text(),
+                               $allmonths,
+                               $selected === $allmonths
+                       );
                }
                for ( $i = 1; $i < 13; $i++ ) {
                        $options[] = self::option( $wgLang->getMonthName( $i ), $i, $selected === $i );
                }
-               return self::openElement( 'select', array( 'id' => $id, 'name' => 'month', 'class' => 'mw-month-selector' ) )
+               return self::openElement( 'select', array(
+                       'id' => $id,
+                       'name' => 'month',
+                       'class' => 'mw-month-selector'
+               ) )
                        . implode( "\n", $options )
                        . self::closeElement( 'select' );
        }
@@ -222,7 +235,9 @@ class Xml {
         * @param Message|null $msg Label message key (since 1.20)
         * @return array containing 2 items: label HTML and select list HTML
         */
-       public static function languageSelector( $selected, $customisedOnly = true, $inLanguage = null, $overrideAttrs = array(), Message $msg = null ) {
+       public static function languageSelector( $selected, $customisedOnly = true,
+               $inLanguage = null, $overrideAttrs = array(), Message $msg = null
+       ) {
                global $wgLanguageCode;
 
                $include = $customisedOnly ? 'mwfile' : 'mw';
@@ -313,8 +328,11 @@ class Xml {
         * @param array $attribs Other attributes
         * @return string HTML
         */
-       public static function password( $name, $size = false, $value = false, $attribs = array() ) {
-               return self::input( $name, $size, $value, array_merge( $attribs, array( 'type' => 'password' ) ) );
+       public static function password( $name, $size = false, $value = false,
+               $attribs = array()
+       ) {
+               return self::input( $name, $size, $value,
+                       array_merge( $attribs, array( 'type' => 'password' ) ) );
        }
 
        /**
@@ -395,7 +413,9 @@ class Xml {
         * @param array $attribs Other attributes
         * @return string HTML
         */
-       public static function inputLabel( $label, $name, $id, $size = false, $value = false, $attribs = array() ) {
+       public static function inputLabel( $label, $name, $id, $size = false,
+               $value = false, $attribs = array()
+       ) {
                list( $label, $input ) = self::inputLabelSep( $label, $name, $id, $size, $value, $attribs );
                return $label . '&#160;' . $input;
        }
@@ -412,7 +432,9 @@ class Xml {
         *
         * @return array
         */
-       public static function inputLabelSep( $label, $name, $id, $size = false, $value = false, $attribs = array() ) {
+       public static function inputLabelSep( $label, $name, $id, $size = false,
+               $value = false, $attribs = array()
+       ) {
                return array(
                        Xml::label( $label, $id, $attribs ),
                        self::input( $name, $size, $value, array( 'id' => $id ) + $attribs )
@@ -448,7 +470,9 @@ class Xml {
         *
         * @return string HTML
         */
-       public static function radioLabel( $label, $name, $value, $id, $checked = false, $attribs = array() ) {
+       public static function radioLabel( $label, $name, $value, $id,
+               $checked = false, $attribs = array()
+       ) {
                return self::radio( $name, $value, $checked, array( 'id' => $id ) + $attribs ) .
                        '&#160;' .
                        self::label( $label, $id, $attribs );
@@ -487,14 +511,17 @@ class Xml {
         * Build a drop-down box from a textual list.
         *
         * @param string $name Name and id for the drop-down
-        * @param string $list Correctly formatted text (newline delimited) to be used to generate the options
+        * @param string $list Correctly formatted text (newline delimited) to be
+        *   used to generate the options.
         * @param string $other Text for the "Other reasons" option
         * @param string $selected Option which should be pre-selected
         * @param string $class CSS classes for the drop-down
         * @param int $tabindex Value of the tabindex attribute
         * @return string
         */
-       public static function listDropDown( $name = '', $list = '', $other = '', $selected = '', $class = '', $tabindex = null ) {
+       public static function listDropDown( $name = '', $list = '', $other = '',
+               $selected = '', $class = '', $tabindex = null
+       ) {
                $optgroup = false;
 
                $options = self::option( $other, 'other', $selected === 'other' );
@@ -554,8 +581,10 @@ class Xml {
        /**
         * Shortcut for creating fieldsets.
         *
-        * @param string|bool $legend Legend of the fieldset. If evaluates to false, legend is not added.
-        * @param string $content Pre-escaped content for the fieldset. If false, only open fieldset is returned.
+        * @param string|bool $legend Legend of the fieldset. If evaluates to false,
+        *   legend is not added.
+        * @param string $content Pre-escaped content for the fieldset. If false,
+        *   only open fieldset is returned.
         * @param array $attribs Any attributes to fieldset-element.
         *
         * @return string
@@ -740,8 +769,11 @@ class Xml {
        /**
         * Generate a form (without the opening form element).
         * Output optionally includes a submit button.
-        * @param array $fields Associative array, key is the name of a message that contains a description for the field, value is an HTML string containing the appropriate input.
-        * @param string $submitLabel The name of a message containing a label for the submit button.
+        * @param array $fields Associative array, key is the name of a message that
+        *   contains a description for the field, value is an HTML string
+        *   containing the appropriate input.
+        * @param string $submitLabel The name of a message containing a label for
+        *   the submit button.
         * @param array $submitAttribs The attributes to add to the submit button
         * @return string HTML form.
         */
@@ -758,14 +790,17 @@ class Xml {
                        // the input somehow.
 
                        $form .= Xml::tags( 'td', array( 'class' => 'mw-label' ), wfMessage( $labelmsg )->parse() );
-                       $form .= Xml::openElement( 'td', array( 'class' => 'mw-input' ) ) . $input . Xml::closeElement( 'td' );
+                       $form .= Xml::openElement( 'td', array( 'class' => 'mw-input' ) )
+                               . $input . Xml::closeElement( 'td' );
                        $form .= Xml::closeElement( 'tr' );
                }
 
                if ( $submitLabel ) {
                        $form .= Xml::openElement( 'tr' );
                        $form .= Xml::tags( 'td', array(), '' );
-                       $form .= Xml::openElement( 'td', array( 'class' => 'mw-submit' ) ) . Xml::submitButton( wfMessage( $submitLabel )->text(), $submitAttribs ) . Xml::closeElement( 'td' );
+                       $form .= Xml::openElement( 'td', array( 'class' => 'mw-submit' ) )
+                               . Xml::submitButton( wfMessage( $submitLabel )->text(), $submitAttribs )
+                               . Xml::closeElement( 'td' );
                        $form .= Xml::closeElement( 'tr' );
                }
 
index e451f2a..a1e02ef 100644 (file)
@@ -720,9 +720,10 @@ abstract class ApiBase extends ContextSource {
 
        /**
         * Die if none or more than one of a certain set of parameters is set and not false.
-        * @param array $params Array of parameter names
+        * @param array $params User provided set of parameters, as from $this->extractRequestParams()
+        * @param string $required,... Names of parameters of which exactly one must be set
         */
-       public function requireOnlyOneParameter( $params ) {
+       public function requireOnlyOneParameter( $params, $required /*...*/ ) {
                $required = func_get_args();
                array_shift( $required );
                $p = $this->getModulePrefix();
@@ -766,10 +767,10 @@ abstract class ApiBase extends ContextSource {
 
        /**
         * Die if more than one of a certain set of parameters is set and not false.
-        *
-        * @param array $params
+        * @param array $params User provided set of parameters, as from $this->extractRequestParams()
+        * @param string $required,... Names of parameters of which at most one must be set
         */
-       public function requireMaxOneParameter( $params ) {
+       public function requireMaxOneParameter( $params, $required /*...*/ ) {
                $required = func_get_args();
                array_shift( $required );
                $p = $this->getModulePrefix();
@@ -807,10 +808,10 @@ abstract class ApiBase extends ContextSource {
         * Die if none of a certain set of parameters is set and not false.
         *
         * @since 1.23
-        * @param array $params User provided set of parameters
-        * @param string ... List of parameter names to check
+        * @param array $params User provided set of parameters, as from $this->extractRequestParams()
+        * @param string $required,... Names of parameters of which at least one must be set
         */
-       public function requireAtLeastOneParameter( $params ) {
+       public function requireAtLeastOneParameter( $params, $required /*...*/ ) {
                $required = func_get_args();
                array_shift( $required );
                $p = $this->getModulePrefix();
index 6f7121b..afd5a13 100644 (file)
@@ -112,7 +112,7 @@ class ApiFeedContributions extends ApiBase {
                        return new FeedItem(
                                $title->getPrefixedText(),
                                $this->feedItemDesc( $revision ),
-                               $title->getFullURL(),
+                               $title->getFullURL( array( 'diff' => $revision->getId() ) ),
                                $date,
                                $this->feedItemAuthor( $revision ),
                                $comments
index 545b94d..64c3eec 100644 (file)
@@ -34,7 +34,6 @@
 class ApiFeedWatchlist extends ApiBase {
 
        private $watchlistModule = null;
-       private $linkToDiffs = false;
        private $linkToSections = false;
 
        /**
@@ -73,7 +72,7 @@ class ApiFeedWatchlist extends ApiBase {
                                'meta' => 'siteinfo',
                                'siprop' => 'general',
                                'list' => 'watchlist',
-                               'wlprop' => 'title|user|comment|timestamp',
+                               'wlprop' => 'title|user|comment|timestamp|ids',
                                'wldir' => 'older', // reverse order - from newest to oldest
                                'wlend' => $endTime, // stop at this time
                                'wllimit' => min( 50, $wgFeedLimit )
@@ -95,12 +94,6 @@ class ApiFeedWatchlist extends ApiBase {
                                $fauxReqArr['wltype'] = $params['wltype'];
                        }
 
-                       // Support linking to diffs instead of article
-                       if ( $params['linktodiffs'] ) {
-                               $this->linkToDiffs = true;
-                               $fauxReqArr['wlprop'] .= '|ids';
-                       }
-
                        // Support linking directly to sections when possible
                        // (possible only if section name is present in comment)
                        if ( $params['linktosections'] ) {
@@ -173,7 +166,7 @@ class ApiFeedWatchlist extends ApiBase {
        private function createFeedItem( $info ) {
                $titleStr = $info['title'];
                $title = Title::newFromText( $titleStr );
-               if ( $this->linkToDiffs && isset( $info['revid'] ) ) {
+               if ( isset( $info['revid'] ) ) {
                        $titleUrl = $title->getFullURL( array( 'diff' => $info['revid'] ) );
                } else {
                        $titleUrl = $title->getFullURL();
@@ -225,7 +218,6 @@ class ApiFeedWatchlist extends ApiBase {
                                ApiBase::PARAM_MIN => 1,
                                ApiBase::PARAM_MAX => 72,
                        ),
-                       'linktodiffs' => false,
                        'linktosections' => false,
                );
                if ( $flags ) {
@@ -254,7 +246,6 @@ class ApiFeedWatchlist extends ApiBase {
                return array(
                        'feedformat' => 'The format of the feed',
                        'hours' => 'List pages modified within this many hours from now',
-                       'linktodiffs' => 'Link to change differences instead of article pages',
                        'linktosections' => 'Link directly to changed sections if possible',
                        'allrev' => $wldescr['allrev'],
                        'wlowner' => $wldescr['owner'],
@@ -279,7 +270,7 @@ class ApiFeedWatchlist extends ApiBase {
        public function getExamples() {
                return array(
                        'api.php?action=feedwatchlist',
-                       'api.php?action=feedwatchlist&allrev=&linktodiffs=&hours=6'
+                       'api.php?action=feedwatchlist&allrev=&hours=6'
                );
        }
 
index 554bfa6..ccf91dd 100644 (file)
@@ -1234,7 +1234,8 @@ class ApiMain extends ApiBase {
                        '    Victor Vasiliev',
                        '    Bryan Tong Minh',
                        '    Sam Reed',
-                       '    Yuri Astrakhan (creator, lead developer Sep 2006-Sep 2007, 2012-present)',
+                       '    Yuri Astrakhan (creator, lead developer Sep 2006-Sep 2007, 2012-2013)',
+                       '    Brad Jorsch (lead developer 2013-now)',
                        '',
                        'Please send your comments, suggestions and questions to mediawiki-api@lists.wikimedia.org',
                        'or file a bug report at https://bugzilla.wikimedia.org/'
index 636d798..2124dc3 100644 (file)
@@ -241,6 +241,7 @@ class ApiQuerySiteinfo extends ApiQueryBase {
                $data['script'] = $GLOBALS['wgScript'];
                $data['variantarticlepath'] = $GLOBALS['wgVariantArticlePath'];
                $data['server'] = $GLOBALS['wgServer'];
+               $data['servername'] = $GLOBALS['wgServerName'];
                $data['wikiid'] = wfWikiID();
                $data['time'] = wfTimestamp( TS_ISO_8601, time() );
 
index 70a2fec..fbe87d2 100644 (file)
@@ -43,12 +43,12 @@ class ApiRollback extends ApiBase {
                $params = $this->extractRequestParams();
 
                // User and title already validated in call to getTokenSalt from Main
-               $titleObj = $this->getRbTitle();
+               $titleObj = $this->getRbTitle( $params );
                $pageObj = WikiPage::factory( $titleObj );
                $summary = $params['summary'];
                $details = array();
                $retval = $pageObj->doRollback(
-                       $this->getRbUser(),
+                       $this->getRbUser( $params ),
                        $summary,
                        $params['token'],
                        $params['markbot'],
@@ -85,9 +85,9 @@ class ApiRollback extends ApiBase {
 
        public function getAllowedParams() {
                return array(
-                       'title' => array(
-                               ApiBase::PARAM_TYPE => 'string',
-                               ApiBase::PARAM_REQUIRED => true
+                       'title' => null,
+                       'pageid' => array(
+                               ApiBase::PARAM_TYPE => 'integer'
                        ),
                        'user' => array(
                                ApiBase::PARAM_TYPE => 'string',
@@ -112,8 +112,11 @@ class ApiRollback extends ApiBase {
        }
 
        public function getParamDescription() {
+               $p = $this->getModulePrefix();
+
                return array(
-                       'title' => 'Title of the page you want to rollback.',
+                       'title' => "Title of the page you want to delete. Cannot be used together with {$p}pageid",
+                       'pageid' => "Page ID of the page you want to delete. Cannot be used together with {$p}title",
                        'user' => 'Name of the user whose edits are to be rolled back. If ' .
                                'set incorrectly, you\'ll get a badtoken error.',
                        'token' => 'A rollback token previously retrieved through ' .
@@ -149,6 +152,7 @@ class ApiRollback extends ApiBase {
                return array_merge( parent::getPossibleErrors(), array(
                        array( 'invalidtitle', 'title' ),
                        array( 'notanarticle' ),
+                       array( 'nosuchpageid', 'pageid' ),
                        array( 'invaliduser', 'user' ),
                ) );
        }
@@ -158,16 +162,24 @@ class ApiRollback extends ApiBase {
        }
 
        public function getTokenSalt() {
-               return array( $this->getRbTitle()->getPrefixedText(), $this->getRbUser() );
+               $params = $this->extractRequestParams();
+
+               return array(
+                       $this->getRbTitle( $params )->getPrefixedText(),
+                       $this->getRbUser( $params )
+               );
        }
 
-       private function getRbUser() {
+       /**
+        * @param array $params
+        *
+        * @return string
+        */
+       private function getRbUser( array $params ) {
                if ( $this->mUser !== null ) {
                        return $this->mUser;
                }
 
-               $params = $this->extractRequestParams();
-
                // We need to be able to revert IPs, but getCanonicalName rejects them
                $this->mUser = User::isIP( $params['user'] )
                        ? $params['user']
@@ -180,20 +192,29 @@ class ApiRollback extends ApiBase {
        }
 
        /**
+        * @param array $params
+        *
         * @return Title
         */
-       private function getRbTitle() {
+       private function getRbTitle( array $params ) {
                if ( $this->mTitleObj !== null ) {
                        return $this->mTitleObj;
                }
 
-               $params = $this->extractRequestParams();
-
-               $this->mTitleObj = Title::newFromText( $params['title'] );
-
-               if ( !$this->mTitleObj || $this->mTitleObj->isExternal() ) {
-                       $this->dieUsageMsg( array( 'invalidtitle', $params['title'] ) );
+               $this->requireOnlyOneParameter( $params, 'title', 'pageid' );
+
+               if ( isset( $params['title'] ) ) {
+                       $this->mTitleObj = Title::newFromText( $params['title'] );
+                       if ( !$this->mTitleObj || $this->mTitleObj->isExternal() ) {
+                               $this->dieUsageMsg( array( 'invalidtitle', $params['title'] ) );
+                       }
+               } elseif ( isset( $params['pageid'] ) ) {
+                       $this->mTitleObj = Title::newFromID( $params['pageid'] );
+                       if ( !$this->mTitleObj ) {
+                               $this->dieUsageMsg( array( 'nosuchpageid', $params['pageid'] ) );
+                       }
                }
+
                if ( !$this->mTitleObj->exists() ) {
                        $this->dieUsageMsg( 'notanarticle' );
                }
@@ -204,6 +225,7 @@ class ApiRollback extends ApiBase {
        public function getExamples() {
                return array(
                        'api.php?action=rollback&title=Main%20Page&user=Catrope&token=123ABC',
+                       'api.php?action=rollback&pageid=122&user=Catrope&token=123ABC',
                        'api.php?action=rollback&title=Main%20Page&user=217.121.114.116&' .
                                'token=123ABC&summary=Reverting%20vandalism&markbot=1'
                );
index 95b15b8..e80dfb3 100644 (file)
@@ -87,7 +87,7 @@ class LinkCache {
 
        /**
         * @param string $title
-        * @return array|int
+        * @return int
         */
        public function getGoodLinkID( $title ) {
                if ( array_key_exists( $title, $this->mGoodLinks ) ) {
index bbf4ab6..f7beb0c 100644 (file)
@@ -279,7 +279,7 @@ class RecentChange {
                        $editor = $this->getPerformer();
                        $title = $this->getTitle();
 
-                       if ( wfRunHooks( 'AbortEmailNotification', array( $editor, $title ) ) ) {
+                       if ( wfRunHooks( 'AbortEmailNotification', array( $editor, $title, $this ) ) ) {
                                # @todo FIXME: This would be better as an extension hook
                                $enotif = new EmailNotification();
                                $enotif->notifyOnPageChange( $editor, $title,
index 77d3542..8ba43f6 100644 (file)
@@ -450,4 +450,69 @@ abstract class AbstractContent implements Content {
 
                return $result;
        }
+
+       /**
+        * Returns a ParserOutput object containing information derived from this content.
+        * Most importantly, unless $generateHtml was false, the return value contains an
+        * HTML representation of the content.
+        *
+        * Subclasses that want to control the parser output may override this, but it is
+        * preferred to override fillParserOutput() instead.
+        *
+        * Subclasses that override getParserOutput() itself should take care to call the
+        * ContentGetParserOutput hook.
+        *
+        * @since 1.24
+        *
+        * @param Title $title Context title for parsing
+        * @param int|null $revId Revision ID (for {{REVISIONID}})
+        * @param ParserOptions|null $options Parser options
+        * @param bool $generateHtml Whether or not to generate HTML
+        *
+        * @return ParserOutput Containing information derived from this content.
+        */
+       public function getParserOutput( Title $title, $revId = null,
+               ParserOptions $options = null, $generateHtml = true
+       ) {
+               if ( $options === null ) {
+                       $options = $this->getContentHandler()->makeParserOptions( 'canonical' );
+               }
+
+               $po = new ParserOutput();
+
+               if ( wfRunHooks( 'ContentGetParserOutput',
+                       array( $this, $title, $revId, $options, $generateHtml, &$po ) ) ) {
+
+                       $this->fillParserOutput( $title, $revId, $options, $generateHtml, $po );
+               }
+
+               return $po;
+       }
+
+       /**
+        * Fills the provided ParserOutput with information derived from the content.
+        * Unless $generateHtml was false, this includes an HTML representation of the content.
+        *
+        * This is called by getParserOutput() after consulting the ContentGetParserOutput hook.
+        * Subclasses are expected to override this method (or getParserOutput(), if need be).
+        * Subclasses of TextContent should generally override getHtml() instead.
+        *
+        * This placeholder implementation always throws an exception.
+        *
+        * @since 1.24
+        *
+        * @param Title $title Context title for parsing
+        * @param int|null $revId Revision ID (for {{REVISIONID}})
+        * @param ParserOptions|null $options Parser options
+        * @param bool $generateHtml Whether or not to generate HTML
+        * @param ParserOutput &$output The output object to fill (reference).
+        *
+        * @throws MWException
+        */
+       protected function fillParserOutput( Title $title, $revId,
+               ParserOptions $options, $generateHtml, ParserOutput &$output
+       ) {
+               // Don't make abstract, so subclasses that override getParserOutput() directly don't fail.
+               throw new MWException( 'Subclasses of AbstractContent must override fillParserOutput!' );
+       }
 }
index defa7da..dd7e27d 100644 (file)
@@ -454,7 +454,7 @@ abstract class ContentHandler {
 
        /**
         * Creates a new Content object that acts as a redirect to the given page,
-        * or null of redirects are not supported by this content model.
+        * or null if redirects are not supported by this content model.
         *
         * This default implementation always returns null. Subclasses supporting redirects
         * must override this method.
index 5fc2c9f..2673084 100644 (file)
@@ -67,7 +67,7 @@ class CssContent extends TextContent {
        protected function getHtml() {
                $html = "";
                $html .= "<pre class=\"mw-code mw-css\" dir=\"ltr\">\n";
-               $html .= $this->getHighlightHtml();
+               $html .= htmlspecialchars( $this->getNativeData() );
                $html .= "\n</pre>\n";
 
                return $html;
index 11a470e..442b705 100644 (file)
@@ -66,7 +66,7 @@ class JavaScriptContent extends TextContent {
        protected function getHtml() {
                $html = "";
                $html .= "<pre class=\"mw-code mw-js\" dir=\"ltr\">\n";
-               $html .= $this->getHighlightHtml();
+               $html .= htmlspecialchars( $this->getNativeData() );
                $html .= "\n</pre>\n";
 
                return $html;
index 0c6b06f..b772f17 100644 (file)
@@ -201,30 +201,30 @@ class TextContent extends AbstractContent {
        }
 
        /**
-        * Returns a generic ParserOutput object, wrapping the HTML returned by
-        * getHtml().
+        * Fills the provided ParserOutput object with information derived from the content.
+        * Unless $generateHtml was false, this includes an HTML representation of the content
+        * provided by getHtml().
+        *
+        * For content models listed in $wgTextModelsToParse, this method will call the MediaWiki
+        * wikitext parser on the text to extract any (wikitext) links, magic words, etc.
+        *
+        * Subclasses may override this to provide custom content processing.
+        * For custom HTML generation alone, it is sufficient to override getHtml().
         *
         * @param Title $title Context title for parsing
         * @param int $revId Revision ID (for {{REVISIONID}})
         * @param ParserOptions $options Parser options
         * @param bool $generateHtml Whether or not to generate HTML
-        *
-        * @return ParserOutput Representing the HTML form of the text.
+        * @param ParserOutput $output The output object to fill (reference).
         */
-       public function getParserOutput( Title $title, $revId = null,
-               ParserOptions $options = null, $generateHtml = true ) {
+       protected function fillParserOutput( Title $title, $revId,
+               ParserOptions $options, $generateHtml, ParserOutput &$output
+       ) {
                global $wgParser, $wgTextModelsToParse;
 
-               if ( !$options ) {
-                       //NOTE: use canonical options per default to produce cacheable output
-                       $options = $this->getContentHandler()->makeParserOptions( 'canonical' );
-               }
-
                if ( in_array( $this->getModel(), $wgTextModelsToParse ) ) {
-                       // parse just to get links etc into the database
-                       $po = $wgParser->parse( $this->getNativeData(), $title, $options, true, true, $revId );
-               } else {
-                       $po = new ParserOutput();
+                       // parse just to get links etc into the database, HTML is replaced below.
+                       $output = $wgParser->parse( $this->getNativeData(), $title, $options, true, true, $revId );
                }
 
                if ( $generateHtml ) {
@@ -233,19 +233,19 @@ class TextContent extends AbstractContent {
                        $html = '';
                }
 
-               $po->setText( $html );
-
-               return $po;
+               $output->setText( $html );
        }
 
        /**
         * Generates an HTML version of the content, for display. Used by
-        * getParserOutput() to construct a ParserOutput object.
+        * fillParserOutput() to provide HTML for the ParserOutput object.
+        *
+        * Subclasses may override this to provide a custom HTML rendering.
+        * If further information is to be derived from the content (such as
+        * categories), the fillParserOutput() method can be overridden instead.
         *
-        * This default implementation just calls getHighlightHtml(). Content
-        * models that have another mapping to HTML (as is the case for markup
-        * languages like wikitext) should override this method to generate the
-        * appropriate HTML.
+        * For backwards-compatibility, this default implementation just calls
+        * getHighlightHtml().
         *
         * @return string An HTML representation of the content
         */
@@ -254,13 +254,22 @@ class TextContent extends AbstractContent {
        }
 
        /**
-        * Generates a syntax-highlighted version of the content, as HTML.
-        * Used by the default implementation of getHtml().
+        * Generates an HTML version of the content, for display.
+        *
+        * This default implementation returns an HTML-escaped version
+        * of the raw text content.
         *
-        * @return string A HTML representation of the content's markup
+        * @note: The functionality of this method should really be implemented
+        * in getHtml(), and subclasses should override getHtml() if needed.
+        * getHighlightHtml() is kept around for backward compatibility with
+        * extensions that already override it.
+        *
+        * @deprecated since 1.24. Use getHtml() instead. In particular, subclasses overriding
+        *     getHighlightHtml() should override getHtml() instead.
+        *
+        * @return string An HTML representation of the content
         */
        protected function getHighlightHtml() {
-               # TODO: make Highlighter interface, use highlighter here, if available
                return htmlspecialchars( $this->getNativeData() );
        }
 
index dba0205..ccea916 100644 (file)
@@ -311,41 +311,33 @@ class WikitextContent extends TextContent {
         * Returns a ParserOutput object resulting from parsing the content's text
         * using $wgParser.
         *
-        * @since 1.21
-        *
         * @param Title $title
         * @param int $revId Revision to pass to the parser (default: null)
         * @param ParserOptions $options (default: null)
         * @param bool $generateHtml (default: true)
-        *
-        * @return ParserOutput Representing the HTML form of the text
+        * @param &$output ParserOutput representing the HTML form of the text,
+        *           may be manipulated or replaced.
         */
-       public function getParserOutput( Title $title, $revId = null,
-               ParserOptions $options = null, $generateHtml = true ) {
+       protected function fillParserOutput( Title $title, $revId,
+                       ParserOptions $options, $generateHtml, ParserOutput &$output
+       ) {
                global $wgParser;
 
-               if ( !$options ) {
-                       //NOTE: use canonical options per default to produce cacheable output
-                       $options = $this->getContentHandler()->makeParserOptions( 'canonical' );
-               }
-
                list( $redir, $text ) = $this->getRedirectTargetAndText();
-               $po = $wgParser->parse( $text, $title, $options, true, true, $revId );
+               $output = $wgParser->parse( $text, $title, $options, true, true, $revId );
 
                // Add redirect indicator at the top
                if ( $redir ) {
                        // Make sure to include the redirect link in pagelinks
-                       $po->addLink( $redir );
+                       $output->addLink( $redir );
                        if ( $generateHtml ) {
                                $chain = $this->getRedirectChain();
-                               $po->setText(
+                               $output->setText(
                                        Article::getRedirectHeaderHtml( $title->getPageLanguage(), $chain, false ) .
-                                       $po->getText()
+                                       $output->getText()
                                );
                        }
                }
-
-               return $po;
        }
 
        /**
index f7fe980..286f8b0 100644 (file)
@@ -806,7 +806,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         * database. Example uses in core:
         * @see LoadBalancer::reallyOpenConnection()
         * @see ForeignDBRepo::getMasterDB()
-        * @see WebInstaller_DBConnect::execute()
+        * @see WebInstallerDBConnect::execute()
         *
         * @since 1.18
         *
index 82303b9..58b07f5 100644 (file)
@@ -177,31 +177,6 @@ class MWException extends Exception {
                return $this->msg( 'internalerror', 'Internal error' );
        }
 
-       /**
-        * Get a the ID for this error.
-        *
-        * @since 1.20
-        * @deprecated since 1.22 Use MWExceptionHandler::getLogId instead.
-        * @return string
-        */
-       public function getLogId() {
-               wfDeprecated( __METHOD__, '1.22' );
-               return MWExceptionHandler::getLogId( $this );
-       }
-
-       /**
-        * Return the requested URL and point to file and line number from which the
-        * exception occurred
-        *
-        * @since 1.8
-        * @deprecated since 1.22 Use MWExceptionHandler::getLogMessage instead.
-        * @return string
-        */
-       public function getLogMessage() {
-               wfDeprecated( __METHOD__, '1.22' );
-               return MWExceptionHandler::getLogMessage( $this );
-       }
-
        /**
         * Output the exception report using HTML.
         */
@@ -219,7 +194,7 @@ class MWException extends Exception {
 
                        $wgOut->output();
                } else {
-                       header( 'Content-Type: text/html; charset=utf-8' );
+                       self::header( 'Content-Type: text/html; charset=utf-8' );
                        echo "<!DOCTYPE html>\n" .
                                '<html><head>' .
                                // Mimick OutputPage::setPageTitle behaviour
@@ -251,14 +226,14 @@ class MWException extends Exception {
 
                if ( defined( 'MW_API' ) ) {
                        // Unhandled API exception, we can't be sure that format printer is alive
-                       header( 'MediaWiki-API-Error: internal_api_error_' . get_class( $this ) );
+                       self::header( 'MediaWiki-API-Error: internal_api_error_' . get_class( $this ) );
                        wfHttpError( 500, 'Internal Server Error', $this->getText() );
                } elseif ( self::isCommandLine() ) {
                        MWExceptionHandler::printError( $this->getText() );
                } else {
-                       header( 'HTTP/1.1 500 MediaWiki exception' );
-                       header( 'Status: 500 MediaWiki exception', true );
-                       header( "Content-Type: $wgMimeType; charset=utf-8", true );
+                       self::header( 'HTTP/1.1 500 MediaWiki exception' );
+                       self::header( 'Status: 500 MediaWiki exception' );
+                       self::header( "Content-Type: $wgMimeType; charset=utf-8" );
 
                        $this->reportHTML();
                }
@@ -273,4 +248,14 @@ class MWException extends Exception {
        public static function isCommandLine() {
                return !empty( $GLOBALS['wgCommandLineMode'] );
        }
+
+       /**
+        * Send a header, if we haven't already sent them. We shouldn't,
+        * but sometimes we might in a weird case like Export
+        */
+       private static function header( $header ) {
+               if ( !headers_sent() ) {
+                       header( $header );
+               }
+       }
 }
index 2b18443..9586657 100644 (file)
@@ -90,6 +90,10 @@ class FSFileBackend extends FileBackendStore {
                }
        }
 
+       public function getFeatures() {
+               return !wfIsWindows() ? FileBackend::ATTR_UNICODE_PATHS : 0;
+       }
+
        protected function resolveContainerPath( $container, $relStoragePath ) {
                // Check that container has a root directory
                if ( isset( $this->containerPaths[$container] ) || isset( $this->basePath ) ) {
index f99da6d..a9e312d 100644 (file)
@@ -104,9 +104,10 @@ abstract class FileBackend {
        /** @var FileJournal */
        protected $fileJournal;
 
-       /** Flags for supported features */
-       const ATTR_HEADERS = 1;
-       const ATTR_METADATA = 2;
+       /** Bitfield flags for supported features */
+       const ATTR_HEADERS = 1; // files can be tagged with standard HTTP headers
+       const ATTR_METADATA = 2; // files can be stored with metadata key/values
+       const ATTR_UNICODE_PATHS = 4; // files can have Unicode paths (not just ASCII)
 
        /**
         * Create a new backend instance from configuration.
@@ -211,7 +212,7 @@ abstract class FileBackend {
         * @since 1.23
         */
        public function getFeatures() {
-               return 0;
+               return self::ATTR_UNICODE_PATHS;
        }
 
        /**
index 2f4be9e..9249a09 100644 (file)
@@ -146,7 +146,8 @@ class SwiftFileBackend extends FileBackendStore {
        }
 
        public function getFeatures() {
-               return ( FileBackend::ATTR_HEADERS | FileBackend::ATTR_METADATA );
+               return ( FileBackend::ATTR_UNICODE_PATHS |
+                       FileBackend::ATTR_HEADERS | FileBackend::ATTR_METADATA );
        }
 
        protected function resolveContainerPath( $container, $relStoragePath ) {
index 7a30ccc..4c250ba 100644 (file)
@@ -295,6 +295,13 @@ class FileRepo {
                }
        }
 
+       /**
+        * @return bool Whether non-ASCII path characters are allowed
+        */
+       public function backendSupportsUnicodePaths() {
+               return ( $this->getBackend()->getFeatures() & FileBackend::ATTR_UNICODE_PATHS );
+       }
+
        /**
         * Get the backend storage path corresponding to a virtual URL.
         * Use this function wisely.
index a9af1e8..5895dda 100644 (file)
@@ -1652,11 +1652,12 @@ abstract class File {
         *
         * @param string $reason
         * @param bool $suppress Hide content from sysops?
+        * @param User|null $user
         * @return bool Boolean on success, false on some kind of failure
         * STUB
         * Overridden by LocalFile
         */
-       function delete( $reason, $suppress = false ) {
+       function delete( $reason, $suppress = false, $user = null ) {
                $this->readOnlyError();
        }
 
index c5ff4a7..561ead7 100644 (file)
@@ -94,10 +94,11 @@ class ForeignDBFile extends LocalFile {
        /**
         * @param string $reason
         * @param bool $suppress
+        * @param User|null $user
         * @return FileRepoStatus
         * @throws MWException
         */
-       function delete( $reason, $suppress = false ) {
+       function delete( $reason, $suppress = false, $user = null ) {
                $this->readOnlyError();
        }
 
index 7fb85b9..a8fa8bd 100644 (file)
@@ -1249,7 +1249,18 @@ class LocalFile extends File {
                }
 
                if ( $timestamp === false ) {
-                       $timestamp = $dbw->timestamp();
+                       // Use FOR UPDATE in case lock()/unlock() did not start the transaction
+                       $ltimestamp = $dbw->selectField( 'image', 'img_timestamp',
+                               array( 'img_name' => $this->getName() ), __METHOD__, array( 'FOR UPDATE' ) );
+                       $ltime = $ltimestamp ? wfTimestamp( TS_UNIX, $ltimestamp ) : false;
+                       $ctime = time();
+                       // Avoid a timestamp that is not newer than the last version
+                       if ( $ctime > $ltime ) {
+                               $timestamp = $dbw->timestamp( $ctime );
+                       } else {
+                               sleep( 1 ); // fast enough uploads will go in to the future otherwise
+                               $timestamp = $dbw->timestamp( $ltime + 1 );
+                       }
                }
 
                $props['description'] = $comment;
@@ -2126,7 +2137,11 @@ class LocalFileDeleteBatch {
                        $dbw->insertSelect( 'filearchive', 'image',
                                array(
                                        'fa_storage_group' => $encGroup,
-                                       'fa_storage_key' => $dbw->conditional( array( 'img_sha1' => '' ), $dbw->addQuotes( '' ), $concat ),
+                                       'fa_storage_key' => $dbw->conditional(
+                                               array( 'img_sha1' => '' ),
+                                               $dbw->addQuotes( '' ),
+                                               $concat
+                                       ),
                                        'fa_deleted_user' => $encUserId,
                                        'fa_deleted_timestamp' => $encTimestamp,
                                        'fa_deleted_reason' => $encReason,
@@ -2158,7 +2173,11 @@ class LocalFileDeleteBatch {
                        $dbw->insertSelect( 'filearchive', 'oldimage',
                                array(
                                        'fa_storage_group' => $encGroup,
-                                       'fa_storage_key' => $dbw->conditional( array( 'oi_sha1' => '' ), $dbw->addQuotes( '' ), $concat ),
+                                       'fa_storage_key' => $dbw->conditional(
+                                               array( 'oi_sha1' => '' ),
+                                               $dbw->addQuotes( '' ),
+                                               $concat
+                                       ),
                                        'fa_deleted_user' => $encUserId,
                                        'fa_deleted_timestamp' => $encTimestamp,
                                        'fa_deleted_reason' => $encReason,
index befab15..39da597 100644 (file)
  * @ingroup Media
  */
 abstract class ImageGalleryBase extends ContextSource {
-       /** @var array Gallery images */
+       /**
+        * @var array Gallery images
+        * @deprecated in 1.23 (was declared "var") and will be removed in 1.24
+        */
        public $mImages;
 
-       /** @var bool Whether to show the filesize in bytes in categories */
+       /**
+        * @var bool Whether to show the filesize in bytes in categories
+        * @deprecated in 1.23 (was declared "var") and will be removed in 1.24
+        */
        public $mShowBytes;
 
-       /** @var bool Whether to show the filename. Default: true */
+       /**
+        * @var bool Whether to show the filename. Default: true
+        * @deprecated in 1.23 (was declared "var") and will be removed in 1.24
+        */
        public $mShowFilename;
 
-       /** @var string Gallery mode. Default: traditional */
+       /**
+        * @var string Gallery mode. Default: traditional
+        * @deprecated in 1.23 (was declared "var") and will be removed in 1.24
+        */
        public $mMode;
 
-       /** @var bool|string Gallery caption. Default: false */
+       /**
+        * @var bool|string Gallery caption. Default: false
+        * @deprecated in 1.23 (was declared "var") and will be removed in 1.24
+        */
        public $mCaption = false;
 
        /**
         * @var bool Hide blacklisted images?
+        * @deprecated in 1.23 (was declared "var") and will be removed in 1.24
         */
        public $mHideBadImages;
 
index 003ccfe..6ea95ed 100644 (file)
@@ -5,7 +5,7 @@ class HTMLHiddenField extends HTMLFormField {
                parent::__construct( $params );
 
                # Per HTML5 spec, hidden fields cannot be 'required'
-               # http://dev.w3.org/html5/spec/states-of-the-type-attribute.html#hidden-state
+               # http://www.w3.org/TR/html5/forms.html#hidden-state-%28type=hidden%29
                unset( $this->mParams['required'] );
        }
 
index 372091a..17c5ab2 100644 (file)
@@ -170,7 +170,6 @@ abstract class Installer {
                'wgMetaNamespace',
                'wgDeletedDirectory',
                'wgEnableUploads',
-               'wgLogo',
                'wgShellLocale',
                'wgSecretKey',
                'wgUseInstantCommons',
@@ -200,7 +199,7 @@ abstract class Installer {
                '_NamespaceType' => 'site-name',
                '_AdminName' => '', // will be set later, when the user selects language
                '_AdminPassword' => '',
-               '_AdminPassword2' => '',
+               '_AdminPasswordConfirm' => '',
                '_AdminEmail' => '',
                '_Subscribe' => false,
                '_SkipOptional' => 'continue',
@@ -211,6 +210,10 @@ abstract class Installer {
                '_MemCachedServers' => '',
                '_UpgradeKeySupplied' => false,
                '_ExistingDBSettings' => false,
+
+               // $wgLogo is probably wrong (bug 48084); set something that will work.
+               // Single quotes work fine here, as LocalSettingsGenerator outputs this unescaped.
+               'wgLogo' => '$wgStylePath/common/images/wiki.png',
        );
 
        /**
index 68a5519..0ef41fa 100644 (file)
@@ -97,6 +97,8 @@ class OracleUpdater extends DatabaseUpdater {
                        array( 'addIndex', 'logging', 'i06', 'patch-logging_user_text_type_time_index.sql' ),
                        array( 'addIndex', 'logging', 'i07', 'patch-logging_user_text_time_index.sql' ),
                        array( 'addField', 'user', 'user_password_expires', 'patch-user_password_expire.sql' ),
+                       array( 'addField', 'page', 'page_links_updated', 'patch-page_links_updated.sql' ),
+                       array( 'addField', 'recentchanges', 'rc_source', 'patch-rc_source.sql' ),
 
                        //1.24
 
index e7aab8a..8c81080 100644 (file)
@@ -406,7 +406,8 @@ class PostgresUpdater extends DatabaseUpdater {
                        array( 'addPgField', 'recentchanges', 'rc_source', "TEXT NOT NULL DEFAULT ''" ),
                        array( 'addPgField', 'page', 'page_links_updated', "TIMESTAMPTZ NULL" ),
                        array( 'addPgField', 'mwuser', 'user_password_expires', 'TIMESTAMPTZ NULL' ),
-                       array( 'changeFieldPurgeTable', 'l10n_cache', 'lc_value', 'bytea', "replace(lc_value,'\','\\\\')::bytea" ),
+                       array( 'changeFieldPurgeTable', 'l10n_cache', 'lc_value', 'bytea',
+                               "replace(lc_value,'\','\\\\')::bytea" ),
 
                        // 1.24
                        array( 'addPgField', 'page_props', 'pp_sortkey', 'float NULL' ),
index d897507..085404b 100644 (file)
@@ -61,7 +61,7 @@ class WebInstaller extends Installer {
         * To add a new installer page:
         *    * Add it to this WebInstaller::$pageSequence property
         *    * Add a "config-page-<name>" message
-        *    * Add a "WebInstaller_<name>" class
+        *    * Add a "WebInstaller<name>" class
         *
         * @var string[]
         */
@@ -462,7 +462,7 @@ class WebInstaller extends Installer {
         * @return WebInstallerPage
         */
        public function getPageByName( $pageName ) {
-               $pageClass = 'WebInstaller_' . $pageName;
+               $pageClass = 'WebInstaller' . $pageName;
 
                return new $pageClass( $this );
        }
@@ -702,8 +702,8 @@ class WebInstaller extends Installer {
                $html = $this->parse( $text, true );
 
                return "<div class=\"mw-help-field-container\">\n" .
-                       "<span class=\"mw-help-field-hint\">" . wfMessage( 'config-help' )->escaped() .
-                       "</span>\n" .
+                       "<span class=\"mw-help-field-hint\" title=\"" .  wfMessage( 'config-help-tooltip' )->escaped() . "\">" .
+                       wfMessage( 'config-help' )->escaped() . "</span>\n" .
                        "<span class=\"mw-help-field-data\">" . $html . "</span>\n" .
                        "</div>\n";
        }
@@ -1117,14 +1117,10 @@ class WebInstaller extends Installer {
         * @return string Html for download link
         */
        public function downloadLinkHook( $text, $attribs, $parser ) {
-               $img = Html::element( 'img', array(
-                       'src' => '../skins/common/images/download-32.png',
-                       'width' => '32',
-                       'height' => '32',
-               ) );
                $anchor = Html::rawElement( 'a',
                        array( 'href' => $this->getURL( array( 'localsettings' => 1 ) ) ),
-                       $img . ' ' . wfMessage( 'config-download-localsettings' )->parse() );
+                       wfMessage( 'config-download-localsettings' )->parse()
+               );
 
                return Html::rawElement( 'div', array( 'class' => 'config-download-link' ), $anchor );
        }
index 3b3473b..06b561b 100644 (file)
@@ -133,7 +133,7 @@ abstract class WebInstallerPage {
         * @return string
         */
        public function getName() {
-               return str_replace( 'WebInstaller_', '', get_class( $this ) );
+               return str_replace( 'WebInstaller', '', get_class( $this ) );
        }
 
        /**
@@ -205,7 +205,7 @@ abstract class WebInstallerPage {
 
 }
 
-class WebInstaller_Language extends WebInstallerPage {
+class WebInstallerLanguage extends WebInstallerPage {
 
        /**
         * @return string|null
@@ -306,7 +306,7 @@ class WebInstaller_Language extends WebInstallerPage {
 
 }
 
-class WebInstaller_ExistingWiki extends WebInstallerPage {
+class WebInstallerExistingWiki extends WebInstallerPage {
 
        /**
         * @return string
@@ -470,7 +470,7 @@ class WebInstaller_ExistingWiki extends WebInstallerPage {
 
 }
 
-class WebInstaller_Welcome extends WebInstallerPage {
+class WebInstallerWelcome extends WebInstallerPage {
 
        /**
         * @return string
@@ -499,7 +499,7 @@ class WebInstaller_Welcome extends WebInstallerPage {
 
 }
 
-class WebInstaller_DBConnect extends WebInstallerPage {
+class WebInstallerDBConnect extends WebInstallerPage {
 
        /**
         * @return string|null When string, "skip" or "continue"
@@ -600,7 +600,7 @@ class WebInstaller_DBConnect extends WebInstallerPage {
 
 }
 
-class WebInstaller_Upgrade extends WebInstallerPage {
+class WebInstallerUpgrade extends WebInstallerPage {
 
        /**
         * @return bool Always true.
@@ -691,7 +691,7 @@ class WebInstaller_Upgrade extends WebInstallerPage {
 
 }
 
-class WebInstaller_DBSettings extends WebInstallerPage {
+class WebInstallerDBSettings extends WebInstallerPage {
 
        /**
         * @return string|null
@@ -725,7 +725,7 @@ class WebInstaller_DBSettings extends WebInstallerPage {
 
 }
 
-class WebInstaller_Name extends WebInstallerPage {
+class WebInstallerName extends WebInstallerPage {
 
        /**
         * @return string
@@ -790,7 +790,7 @@ class WebInstaller_Name extends WebInstallerPage {
                                'label' => 'config-admin-password',
                        ) ) .
                        $this->parent->getPasswordBox( array(
-                               'var' => '_AdminPassword2',
+                               'var' => '_AdminPasswordConfirm',
                                'label' => 'config-admin-password-confirm'
                        ) ) .
                        $this->parent->getTextBox( array(
@@ -829,7 +829,7 @@ class WebInstaller_Name extends WebInstallerPage {
        public function submit() {
                $retVal = true;
                $this->parent->setVarsFromRequest( array( 'wgSitename', '_NamespaceType',
-                       '_AdminName', '_AdminPassword', '_AdminPassword2', '_AdminEmail',
+                       '_AdminName', '_AdminPassword', '_AdminPasswordConfirm', '_AdminEmail',
                        '_Subscribe', '_SkipOptional', 'wgMetaNamespace' ) );
 
                // Validate site name
@@ -911,7 +911,7 @@ class WebInstaller_Name extends WebInstallerPage {
                        # $user->getPasswordValidity just checks for $wgMinimalPasswordLength.
                        # This message is more specific and helpful.
                        $msg = 'config-admin-password-blank';
-               } elseif ( $pwd !== $this->getVar( '_AdminPassword2' ) ) {
+               } elseif ( $pwd !== $this->getVar( '_AdminPasswordConfirm' ) ) {
                        $msg = 'config-admin-password-mismatch';
                } elseif ( $valid !== true ) {
                        $msg = $valid;
@@ -919,7 +919,7 @@ class WebInstaller_Name extends WebInstallerPage {
                if ( $msg !== false ) {
                        call_user_func_array( array( $this->parent, 'showError' ), (array)$msg );
                        $this->setVar( '_AdminPassword', '' );
-                       $this->setVar( '_AdminPassword2', '' );
+                       $this->setVar( '_AdminPasswordConfirm', '' );
                        $retVal = false;
                }
 
@@ -941,7 +941,7 @@ class WebInstaller_Name extends WebInstallerPage {
 
 }
 
-class WebInstaller_Options extends WebInstallerPage {
+class WebInstallerOptions extends WebInstallerPage {
 
        /**
         * @return string|null
@@ -1049,10 +1049,6 @@ class WebInstaller_Options extends WebInstallerPage {
                                $this->getVar( 'wgDeletedDirectory' )
                        )
                );
-               // If we're using the default, let the user set it relative to $wgScriptPath
-               $curLogo = $this->getVar( 'wgLogo' );
-               $logoString = ( $curLogo == "/wiki/skins/common/images/wiki.png" ) ?
-                       '$wgStylePath/common/images/wiki.png' : $curLogo;
 
                $uploadwrapperStyle = $this->getVar( 'wgEnableUploads' ) ? '' : 'display: none';
                $this->addHTML(
@@ -1074,7 +1070,6 @@ class WebInstaller_Options extends WebInstallerPage {
                        '</div>' .
                        $this->parent->getTextBox( array(
                                'var' => 'wgLogo',
-                               'value' => $logoString,
                                'label' => 'config-logo',
                                'attribs' => array( 'dir' => 'ltr' ),
                                'help' => $this->parent->getHelpBox( 'config-logo-help' )
@@ -1310,7 +1305,7 @@ class WebInstaller_Options extends WebInstallerPage {
 
 }
 
-class WebInstaller_Install extends WebInstallerPage {
+class WebInstallerInstall extends WebInstallerPage {
 
        /**
         * @return bool Always true.
@@ -1385,7 +1380,7 @@ class WebInstaller_Install extends WebInstallerPage {
 
 }
 
-class WebInstaller_Complete extends WebInstallerPage {
+class WebInstallerComplete extends WebInstallerPage {
 
        public function execute() {
                // Pop up a dialog box, to make it difficult for the user to forget
@@ -1423,7 +1418,7 @@ class WebInstaller_Complete extends WebInstallerPage {
 
 }
 
-class WebInstaller_Restart extends WebInstallerPage {
+class WebInstallerRestart extends WebInstallerPage {
 
        /**
         * @return string|null
@@ -1449,7 +1444,7 @@ class WebInstaller_Restart extends WebInstallerPage {
 
 }
 
-abstract class WebInstaller_Document extends WebInstallerPage {
+abstract class WebInstallerDocument extends WebInstallerPage {
 
        /**
         * @return string
@@ -1478,7 +1473,7 @@ abstract class WebInstaller_Document extends WebInstallerPage {
 
 }
 
-class WebInstaller_Readme extends WebInstaller_Document {
+class WebInstallerReadme extends WebInstallerDocument {
 
        /**
         * @return string
@@ -1489,7 +1484,7 @@ class WebInstaller_Readme extends WebInstaller_Document {
 
 }
 
-class WebInstaller_ReleaseNotes extends WebInstaller_Document {
+class WebInstallerReleaseNotes extends WebInstallerDocument {
 
        /**
         * @throws MWException
@@ -1507,7 +1502,7 @@ class WebInstaller_ReleaseNotes extends WebInstaller_Document {
 
 }
 
-class WebInstaller_UpgradeDoc extends WebInstaller_Document {
+class WebInstallerUpgradeDoc extends WebInstallerDocument {
 
        /**
         * @return string
@@ -1518,7 +1513,7 @@ class WebInstaller_UpgradeDoc extends WebInstaller_Document {
 
 }
 
-class WebInstaller_Copying extends WebInstaller_Document {
+class WebInstallerCopying extends WebInstallerDocument {
 
        /**
         * @return string
index b61f3d2..1710f0b 100644 (file)
@@ -5,7 +5,8 @@
                        "Mido",
                        "OsamaK",
                        "روخو",
-                       "Claw eg"
+                       "Claw eg",
+                       "Kuwaity26"
                ]
        },
        "config-desc": "مثبت لميدياويكي",
@@ -46,6 +47,8 @@
        "config-restart": "نعم، إعادة التشغيل",
        "config-env-php": "بي إتش بي $1 مثبت.",
        "config-env-php-toolow": "بي إتش بي $1 مثبت.\nومع ذلك، يتطلب ميدياويكي بي إتش بي $2 أو أعلى.",
+       "config-db-type": "نوع قاعدة البيانات:",
+       "config-db-wiki-settings": "حدِّد هذا الويكي",
        "config-db-username": "اسم مستخدم قاعدة البيانات:",
        "config-db-password": "كلمة سر قاعدة البيانات:",
        "config-db-port": "منفذ قاعدة البيانات:",
        "config-type-postgres": "بوستجر إس كيو إل",
        "config-type-sqlite": "إس كيو لايت",
        "config-type-oracle": "أوراكل",
+       "config-site-name": "اسم الويكي:",
+       "config-admin-password": "كلمة السر:",
        "config-admin-email": "عنوان البريد الإلكتروني:",
+       "config-profile-wiki": "افتح ويكي",
+       "config-profile-private": "ويكي خاص",
+       "config-license-pd": "ملكية عامة",
+       "config-email-settings": "إعدادات البريد الإلكتروني",
+       "config-email-watchlist": "تمكين إشعارات قائمة المراقبة",
+       "config-upload-enable": "تمكين تحميل الملفات",
+       "config-cc-again": "اختر مجددًا",
+       "config-extensions": "امتدادات",
+       "config-install-step-done": "نفذ",
+       "config-install-step-failed": "فشل",
+       "config-help": "مساعدة",
        "mainpagetext": "'''تم تثبيت ميدياويكي بنجاح.'''",
        "mainpagedocfooter": "استشر [//meta.wikimedia.org/wiki/Help:Contents دليل المستخدم] لمعلومات حول استخدام برنامج الويكي.\n\n== البداية ==\n\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings قائمة إعدادات الضبط]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ أسئلة متكررة حول ميدياويكي]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce القائمة البريدية الخاصة بإصدار ميدياويكي]"
 }
index 35a1ed4..376a227 100644 (file)
        "config-install-done": "'''Віншуем!'''\nВы пасьпяхова ўсталявалі MediaWiki.\n\nПраграма ўсталяваньня стварыла файл <code>LocalSettings.php</code>.\nЁн утрымлівае ўсе Вашыя налады.\n\nВам неабходна загрузіць яго і захаваць у карэнную дырэкторыю Вашай вікі (у тую ж самую дырэкторыю, дзе знаходзіцца index.php). Загрузка павінна пачацца аўтаматычна.\n\nКалі загрузка не пачалася, ці Вы яе адмянілі, Вы можаце перазапусьціць яе націснуўшы на спасылку ніжэй:\n\n$3\n\n'''Заўвага''': калі Вы гэтага ня зробіце зараз, то створаны файл ня будзе даступны Вам потым, калі Вы выйдзеце з праграмы ўсталяваньня  без яго загрузкі.\n\nКалі Вы гэта зробіце, Вы можаце '''[$2 ўвайсьці ў Вашую вікі]'''.",
        "config-download-localsettings": "Загрузіць <code>LocalSettings.php</code>",
        "config-help": "дапамога",
+       "config-help-tooltip": "націсьніце, каб разгарнуць",
        "config-nofile": "Файл «$1» ня знойдзены. Ці быў ён выдалены?",
        "config-extension-link": "Ці ведаеце вы, што вашая вікі падтрымлівае [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions пашырэньні]?\n\nВы можаце праглядзець [//www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category пашырэньні паводле катэгорыяў].",
        "mainpagetext": "'''MediaWiki пасьпяхова ўсталяваная.'''",
index 86013ff..8d678e0 100644 (file)
@@ -16,7 +16,7 @@
        "config-localsettings-badkey": "La clau que heu proporcionat no és correcta.",
        "config-upgrade-key-missing": "S'ha detectat una instal·lació ja existent del MediaWiki.\nPer actualitzar-la, poseu la línia següent al final de <code>LocalSettings.php</code>:\n\n$1",
        "config-localsettings-incomplete": "El <code>LocalSettings.php</code> que hi ha sembla incomplet.\nLa variable $1 no està definida.\nCanvieu <code>LocalSettings.php</code> perquè la variable estigui definida i feu clic a «{{int:Config-continue}}».",
-       "config-localsettings-connection-error": "S'ha trobat un error en connectar-se amb la base de dades fent servir els paràmetres especificats a <code>LocalSettings.php</code> o <code>AdminSettings.php</code>. Corregiu aquests paràmetres i torneu-ho a provar.\n\n$1",
+       "config-localsettings-connection-error": "S'ha trobat un error en connectar-se amb la base de dades fent servir els paràmetres especificats a <code>LocalSettings.php</code>. Corregiu aquests paràmetres i torneu-ho a provar.\n\n$1",
        "config-session-error": "Error en iniciar la sessió: $1",
        "config-your-language": "La vostra llengua:",
        "config-your-language-help": "Seleccioneu la llengua que s'utilitzarà durant el procés d'instal·lació.",
@@ -46,6 +46,8 @@
        "config-env-bad": "S'ha comprovat l'entorn.\nNo podeu instal·lar el MediaWiki.",
        "config-env-php": "El PHP $1 està instal·lat.",
        "config-env-php-toolow": "El PHP $1 està instal·lat.\nMalauradament, el MediaWiki necessita el PHP $2 o superior.",
+       "config-memory-raised": "El <code>memory_limit</code> del PHP és $1 i s'ha aixecat a $2.",
+       "config-memory-bad": "<strong>Avís:</strong> El <code>memory_limit</code> del PHP és $1.\nAixò és probablement massa baix.\nLa instal·lació pot fallar!",
        "config-diff3-bad": "No s'ha trobat el GNU diff3.",
        "config-git": "S'ha trobat el programari de control de versions Git: <code>$1</code>.",
        "config-git-bad": "No s'ha trobat el programari de control de versions Git.",
        "config-install-user": "S'està creant l'usuari de la base de dades",
        "config-install-user-alreadyexists": "L'usuari «$1» ja existeix",
        "config-install-user-create-failed": "La creació de l'usuari «$1» ha fallat: $2",
+       "config-install-user-grant-failed": "Ha fallat la concessió de permisos a l'usuari «$1»: $2",
        "config-install-user-missing": "L'usuari «$1» especificat no existeix.",
        "config-install-user-missing-create": "L'usuari «$1» especificat no existeix.\nFeu clic a la casella «Crea un compte» a continuació si voleu crear-lo.",
        "config-install-tables": "S'estan creant les taules",
        "config-install-keys": "S'estan generant les claus secretes",
        "config-install-sysop": "S'està creant un compte d'usuari d'administrador",
        "config-install-subscribe-fail": "No s'ha pogut subscriure a mediawiki-announce: $1",
+       "config-install-subscribe-notpossible": "El cURL no està instal·lat i <code>allow_url_fopen</code> no està disponible.",
        "config-install-mainpage": "S'està creant la pàgina principal amb el contingut per defecte",
        "config-install-extension-tables": "S'estan creant taules de les extensions habilitades",
        "config-install-mainpage-failed": "No s'ha pogut inserir la pàgina principal: $1",
index 15233be..f1cf32a 100644 (file)
        "config-install-done": "'''Gratulujeme!'''\nÚspěšně jste nainstalovali MediaWiki.\n\nInstalátor vytvořil soubor <code>LocalSettings.php</code>.\nTen obsahuje veškerou vaši konfiguraci.\n\nBudete si ho muset stáhnout a uložit do základního adresáře vaší instalace wiki (do stejného adresáře jako soubor index.php). Stažení souboru se mělo spustit automaticky.\n\nPokud se vám stažení nenabídlo nebo jste ho zrušili, můžete ho spustit znovu kliknutím na následující odkaz:\n\n$3\n\n'''Poznámka''': Pokud to neuděláte hned, tento vygenerovaný konfigurační soubor nebude později dostupný, pokud instalaci opustíte, aniž byste si ho stáhli.\n\nAž to dokončíte, můžete '''[$2 vstoupit do své wiki]'''.",
        "config-download-localsettings": "Stáhnout <code>LocalSettings.php</code>",
        "config-help": "nápověda",
+       "config-help-tooltip": "rozbalíte kliknutím",
        "config-nofile": "Soubor „$1“ nelze nalézt. Byl smazán?",
        "config-extension-link": "Věděli jste, že vaše wiki podporuje [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions rozšíření]?\n\nMůžete si prohlédnout [//www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category seznam rozšíření po kategoriích].",
        "mainpagetext": "'''MediaWiki byla úspěšně nainstalována.'''",
index 2c257f3..837cc0f 100644 (file)
        "config-install-done": "'''Herzlichen Glückwunsch!'''\nMediaWiki wurde erfolgreich installiert.\n\nDas Installationsprogramm hat die Datei <code>LocalSettings.php</code> erzeugt.\nSie enthält alle vorgenommenen Konfigurationseinstellungen.\n\nDiese Datei muss nun heruntergeladen und anschließend in das Stammverzeichnis der MediaWiki-Installation hochgeladen werden. Dies ist dasselbe Verzeichnis, in dem sich auch die Datei <code>index.php</code> befindet. Das Herunterladen sollte inzwischen automatisch gestartet worden sein.\n\nSofern dies nicht der Fall war, oder das Herunterladen unterbrochen wurde, kann der Vorgang durch einen Klick auf den folgenden Link erneut gestartet werden:\n\n$3\n\n'''Hinweis:''' Die Konfigurationsdatei sollte jetzt unbedingt heruntergeladen werden. Sie wird nach Beenden des Installationsprogramms, nicht mehr zur Verfügung stehen.\n\nSobald alles erledigt wurde, kann auf das '''[$2 Wiki zugegriffen werden]'''. Wir wünschen viel Spaß und Erfolg mit dem Wiki.",
        "config-download-localsettings": "<code>LocalSettings.php</code> herunterladen",
        "config-help": "Hilfe",
+       "config-help-tooltip": "Zum Expandieren klicken",
        "config-nofile": "Die Datei „$1“ konnte nicht gefunden werden. Wurde sie gelöscht?",
        "config-extension-link": "Wusstest du, dass dein Wiki die Nutzung von [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions Erweiterungen] unterstützt?\n\nDu kannst [//www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category Erweiterungen nach Kategorie] durchsuchen.",
        "mainpagetext": "'''MediaWiki wurde erfolgreich installiert.'''",
index 8cd06ed..b19bdc0 100644 (file)
        "config-db-schema-help": "This schema will usually be fine.\nOnly change it if you know you need to.",
        "config-pg-test-error": "Cannot connect to database <strong>$1</strong>: $2",
        "config-sqlite-dir": "SQLite data directory:",
-       "config-sqlite-dir-help": "SQLite stores all data in a single file.\n\nThe directory you provide must be writable by the webserver during installation.\n\nIt should <strong>not</strong> be accessible via the web, this is why we're not putting it where your PHP files are.\n\nThe installer will write a <code>.htaccess</code> file along with it, but if that fails someone can gain access to your raw database.\nThat includes raw user data (email addresses, hashed passwords) as well as deleted revisions and other restricted data on the wiki.\n\nConsider putting the database somewhere else altogether, for example in <code>/var/lib/mediawiki/yourwiki</code>.",
+       "config-sqlite-dir-help": "SQLite stores all data in a single file.\n\nThe directory you provide must be writable by the webserver during installation.\n\nIt should <strong>not</strong> be accessible via the web; this is why we're not putting it where your PHP files are.\n\nThe installer will write a <code>.htaccess</code> file along with it, but if that fails someone can gain access to your raw database.\nThat includes raw user data (email addresses, hashed passwords) as well as deleted revisions and other restricted data on the wiki.\n\nConsider putting the database somewhere else altogether, for example in <code>/var/lib/mediawiki/yourwiki</code>.",
        "config-oracle-def-ts": "Default tablespace:",
        "config-oracle-temp-ts": "Temporary tablespace:",
        "config-type-mysql": "MySQL (or compatible)",
        "config-install-done": "<strong>Congratulations!</strong>\nYou have successfully installed MediaWiki.\n\nThe installer has generated a <code>LocalSettings.php</code> file.\nIt contains all your configuration.\n\nYou will need to download it and put it in the base of your wiki installation (the same directory as index.php). The download should have started automatically.\n\nIf the download was not offered, or if you cancelled it, you can restart the download by clicking the link below:\n\n$3\n\n<strong>Note:</strong> If you do not do this now, this generated configuration file will not be available to you later if you exit the installation without downloading it.\n\nWhen that has been done, you can <strong>[$2 enter your wiki]</strong>.",
        "config-download-localsettings": "Download <code>LocalSettings.php</code>",
        "config-help": "help",
+       "config-help-tooltip": "click to expand",
        "config-nofile": "File \"$1\" could not be found. Has it been deleted?",
        "config-extension-link": "Did you know that your wiki supports [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions extensions]?\n\nYou can browse [//www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category extensions by category] or the [//www.mediawiki.org/wiki/Extension_Matrix Extension Matrix] to see the full list of extensions.",
        "mainpagetext": "<strong>MediaWiki has been successfully installed.</strong>",
index 518f7aa..034987b 100644 (file)
        "config-download-localsettings": "Descargar archivo <code>LocalSettings.php</code>",
        "config-help": "Ayuda",
        "config-nofile": "El archivo \"$1\" no se pudo encontrar. ¿Se ha eliminado?",
-       "config-extension-link": "¿Sabías que tu wiki admite [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions extensiones]?\n\nPuedes navegar por las [//www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category categorías] o visitar la [//www.mediawiki.org/wiki/Extension_Matrix matriz de extensiones] para ver una lista completa.",
+       "config-extension-link": "¿Sabías que tu wiki admite [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions extensiones]?\n\nPuedes navegar por las [//www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category categorías] o visitar el [//www.mediawiki.org/wiki/Extension_Matrix centro de extensiones] para ver una lista completa.",
        "mainpagetext": "'''MediaWiki ha sido instalado con éxito.'''",
        "mainpagedocfooter": "Consulta la [//meta.wikimedia.org/wiki/Ayuda:Guía del usuario de contenidos] para obtener información sobre el uso del software wiki.\n\n== Empezando ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Lista de ajustes de configuración]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ/es FAQ de MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista de correo de anuncios de distribución de MediaWiki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Regionalizar MediaWiki para tu idioma]"
 }
index a2e7e42..23fe457 100644 (file)
        "config-install-done": "'''تبریک!'''\nبا موفقیت مدیاویکی را نصب کردید.\nبرنامه نصب‌کننده پرونده <code>LocalSettings.php</code> را درست کرد.\nکه شامل تمام تنظیمات می‌باشد.\n\nشما نیاز به دریافت آن دارید و آن را در پایهٔ نصب ویکی قرار دهید (همان پوشهٔ index.php). دریافت باید به صورت خودکار شروع شده‌باشد.\n\nاگر دریافت شروع نشد یا اگر آن را لغو کردید با کلیک روی پیوند زیر می‌توانید آن را دریافت کنید:\n\n$3\n\n'''توجه داشته باشید:''' اگر این را الآن انجام ندهید، این پرونده تولیدشده در صورتی که نصب را بدون دریافت آن تمام کردید بعداً در اختیار شما قرار نخواهد گرفت.\n\nوقتی انجام شد شما می‌توانید '''[$2 وارد ویکی شوید]'''.",
        "config-download-localsettings": "دریافت <code>LocalSettings.php</code>",
        "config-help": "راهنما",
+       "config-help-tooltip": "برای گسترش کلیک کنید",
        "config-nofile": "پروندهٔ «$1» یافت نشد. آیا حذف شده‌است؟",
        "config-extension-link": "آیا می‌دانستید که ویکی شما [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions extensions] را پشتیبانی می‌کند؟\nشما می‌توانید [//www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category extensions by category]",
        "mainpagetext": "'''نرم‌افزار ویکی با موفقیت نصب شد.'''",
index 044e125..11ab0ae 100644 (file)
        "config-install-done": "'''Félicitations!'''\nVous avez réussi à installer MediaWiki.\n\nLe programme d'installation a généré un fichier <code>LocalSettings.php</code>. Il contient tous les paramètres de votre configuration.\n\nVous devrez le télécharger et le mettre à la racine de votre installation wiki (dans le même répertoire que index.php). Le téléchargement démarre automatiquement.\n\nSi le téléchargement n'a pas été offert, ou que vous l'avez annulé, vous pouvez démarrer à nouveau le téléchargement en cliquant ce lien :\n\n$3\n\n'''Note''': Si vous ne le faites pas maintenant, ce fichier de configuration généré ne sera pas disponible plus tard si vous quittez l'installation sans le télécharger.\n\nLorsque c'est fait, vous pouvez '''[$2 accéder à votre wiki]'''.",
        "config-download-localsettings": "Télécharger <code>LocalSettings.php</code>",
        "config-help": "aide",
+       "config-help-tooltip": "cliquer pour agrandir",
        "config-nofile": "Le fichier « $1 » est introuvable. A-t-il été supprimé ?",
        "config-extension-link": "Saviez-vous que votre wiki supporte [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions des extensions] ?\n\nVous pouvez consulter les [//www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category extensions par catégorie].",
        "mainpagetext": "<strong>MediaWiki a été installé avec succès.</strong>",
index 9f251ce..5d4ba21 100644 (file)
        "config-install-done": "'''מזל טוב!'''\nהתקנתם בהצלחה את מדיה־ויקי.\n\nתוכנת ההתקנה יצרה את הקובץ <code>LocalSettings.php</code>.\nהוא מכיל את כל ההגדרות שלכם.\n\nתצטרכו להוריד אותו ולשים אותו בבסיס ההתקנה של הוויקי שלכם (אותה התיקייה שבה נמצא הקובץ index.php). ההורדה הייתה אמורה להתחיל באופן אוטומטי.\n\nאם ההורדה לא התחילה, או אם ביטלתם אותה, אפשר להתחיל אותה מחדש בלחיצה על הקישור הבא:\n\n$3\n\n'''שימו לב''': אם לא תעשו זאת עכשיו, קובץ ההגדרות המחוּלל לא יהיה זמין לכם שוב.\n\nאחרי שתעשו את זה, תוכלו '''[$2 להיכנס לוויקי שלכם]'''.",
        "config-download-localsettings": "הורדת <code>LocalSettings.php</code>",
        "config-help": "עזרה",
+       "config-help-tooltip": "להרחיב",
        "config-nofile": "הקובץ \"$1\" לא נמצא. האם הוא נמחק?",
        "config-extension-link": "הידעת שמדיה־ויקי תומכת ב־[//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions הרחבות]?\n\nבאפשרותך לעיין ב־[//www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category הרחבות לפי קטגוריה].",
        "mainpagetext": "'''תוכנת מדיה־ויקי הותקנה בהצלחה.'''",
index c9ed5e6..ee0773b 100644 (file)
@@ -83,7 +83,7 @@
        "config-suhosin-max-value-length": "Suhosin terpasang dan membatasi parameter GET <code>length</code> sebesar $1 bita. Komponen ResourceLoader MediaWiki akan berjalan dalam batasan ini, tetapi penanganannya akan menurunkan kinerja. Jika memungkinkan, Anda sebaiknya menetapkan nilai <code>suhosin.get.max_value_length</code> menjadi 1024 atau lebih tinggi dalam <code>php.ini</code> dan menyetel <code>$wgResourceLoaderMaxQueryLength</code> dengan nilai yang sama dalam <code>LocalSettings.php</code>.",
        "config-db-type": "Jenis basis data:",
        "config-db-host": "Inang basis data:",
-       "config-db-host-help": "Jika server basis data Anda berada di server yang berbeda, masukkan nama inang atau alamat IP di sini.\n\nJika Anda menggunakan inang web bersama, penyedia inang Anda harus memberikan nama inang yang benar di dokumentasi mereka.\n\nJika Anda menginstal pada server Windows dan menggunakan MySQL, \"localhost\" mungkin tidak dapat digunakan sebagai nama server. Jika demikian, coba \"127.0.0.1\" untuk alamat IP lokal.",
+       "config-db-host-help": "Jika server basis data Anda berada di server yang berbeda, masukkan nama inang atau alamat IP di sini.\n\nJika Anda menggunakan inang web bersama, penyedia inang Anda harus memberikan nama inang yang benar di dokumentasi mereka.\n\nJika Anda menginstal pada server Windows dan menggunakan MySQL, \"localhost\" mungkin tidak dapat digunakan sebagai nama server. Jika demikian, coba \"127.0.0.1\" untuk alamat IP lokal.\n\nJika Anda menggunakan PostgreSQL, biarkan field ini kosong untuk menghubungkan lewat soket Unix.",
        "config-db-host-oracle": "TNS basis data:",
        "config-db-host-oracle-help": "Masukkan [http://download.oracle.com/docs/cd/B28359_01/network.111/b28317/tnsnames.htm Local Connect Name] yang sah; berkas tnsnames.ora harus dapat diakses oleh instalasi ini.<br />Jika Anda menggunakan pustaka klien 10g atau lebih baru, Anda juga dapat menggunakan metode penamaan [http://download.oracle.com/docs/cd/E11882_01/network.112/e10836/naming.htm Easy Connect].",
        "config-db-wiki-settings": "Identifikasi wiki ini",
index 10f1431..02ff624 100644 (file)
        "config-install-done": "<strong>おめでとうございます!</strong>\nMediaWikiのインストールに成功しました。\n\n<code>LocalSettings.php</code>ファイルが生成されました。\nこのファイルはすべての設定を含んでいます。\n\nこれをダウンロードして、ウィキをインストールした基準ディレクトリ (index.phpと同じディレクトリ) に設置する必要があります。ダウンロードは自動的に開始されるはずです。\n\nダウンロードが開始されていない場合、またはダウンロードをキャンセルした場合は、下記のリンクをクリックしてダウンロードを再開できます:\n\n$3\n\n<strong>注意:</strong> この生成された設定ファイルをダウンロードせずにインストールを終了すると、このファイルは利用できなくなります。\n\n上記の作業が完了すると、<strong>[$2 ウィキに入る]</strong>ことができます。",
        "config-download-localsettings": "<code>LocalSettings.php</code> をダウンロード",
        "config-help": "ヘルプ",
+       "config-help-tooltip": "クリックで展開",
        "config-nofile": "ファイル「$1」が見つかりませんでした。削除された可能性があります。",
        "mainpagetext": "<strong>MediaWiki のインストールに成功しました。</strong>",
        "mainpagedocfooter": "ウィキソフトウェアの使い方に関する情報は[//meta.wikimedia.org/wiki/Help:Contents 利用者案内]を参照してください。\n\n== はじめましょう ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings/ja 設定の一覧]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ/ja MediaWiki よくある質問と回答]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki リリース情報メーリングリスト]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation/ja MediaWiki のあなたの言語へのローカライズ]"
index 4f45d97..261f750 100644 (file)
        "config-mysql-charset-help": "Beim Schpeishere em <strong>binäre Fomaat</strong> deiht MediaWiki Täxt, dä em UTF-8 Fommaat kütt, en dä Daatebangk en binär kodeerte Daatefälder faßhallde.\nDat es flöcker un spaasaamer wi et UTF-8 Fommaat vum <i lang=\"en\">MySQL</i> un määd et müjjelesch, all un jeedes <i lang=\"en\">Unicode</i>-Zeische met faßzehallde.\n\nBeim Schpeishere em <strong>UTF-8 Fomaat<strong> deiht et <i lang=\"en\">MySQL</i> der Zeischesaz un de Kodeerung vun dä Daate känne, un kann se akeraat aanzeije un ömwandelle,\nallerdengs künne kein Zeische ußerhalv vum [//de.wikipedia.org/wiki/Basic_Multilingual_Plane#Gliederung_in_Ebenen_und_Bl.C3.B6cke jrundlääje Knubbel för vill Schprooche (<i lang=\"en\">Basic Multilingual Plane — BMP</i>)] afjeschpeischert wääde.",
        "config-mssql-auth": "De Zoot Aanmäldong:",
        "config-mssql-install-auth": "Söhk us, wi dat Aanmälde aan dä Daatebangk vor sesch jonn sull för de Enschtallazjuhn.\nWann De <em>{{int:Config-mssql-windowsauth}}</em> nemms, weed jenumme, met wat emmer dä Wäbßööver aam loufe es.",
-       "config-mssql-web-auth": "Söhk us, wi dat Aanmälde aan dä Daatebangk vor sesch jonn sull för de nommaale Ärbeid vum Wiki.\nWann De <em>{{int:Config-mssql-windowsauth}}</em> nemms, weed jenumme, met wat emmer dä Wäbßööver aam loufe es.",
+       "config-mssql-web-auth": "Söhk us, wi dat Aanmälde aan dä Daatebangk vor sesch jonn sull för de nommaale Ärbeid vum Wiki.\nWann De <em>{{int:Config-mssql-windowsauth}}</em> nemms, weed dat jenumme, wohmet dä Wäbßööver aam loufe es.",
        "config-mssql-sqlauth": "De Aanmäldong bemm <i lang=\"en\" xml:lang=\"en\">SQL</i>-ẞööver vun <i lang=\"en\" xml:lang=\"en\">Microsoft</i>",
        "config-mssql-windowsauth": "De Annmäldong bemm <i lang=\"en\" xml:lang=\"en\">Windows</i>",
        "config-site-name": "Däm Wiki singe Name:",
index 5af7644..08526f4 100644 (file)
        "config-install-mainpage-failed": "D'Haaptsäit konnt net dragesat ginn: $1",
        "config-download-localsettings": "<code>LocalSettings.php</code> eroflueden",
        "config-help": "Hëllef",
+       "config-help-tooltip": "klickt fir opzeklappen",
        "config-nofile": "De Fichier \"$1\" gouf net fonnt. Gouf e geläscht?",
        "mainpagetext": "<strong>MediaWiki gouf installéiert.</strong>",
        "mainpagedocfooter": "Kuckt w.e.g. [//meta.wikimedia.org/wiki/Help:Contents d'Benotzerhandbuch] fir Informatiounen iwwer de Gebruach vun der Wiki Software.\n\n== Fir  unzefänken ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Hëllef bei der Konfiguratioun]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki-FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailinglëscht vun neie MediaWiki-Versiounen]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Lokaliséiert MediaWiki fir Är Sprooch]"
index 6891c7f..e236af5 100644 (file)
@@ -15,9 +15,9 @@
        "config-upgrade-key-missing": "Востановена е постоечка воспоставка на МедијаВики.\nЗа да ја надградите, вметнете го следниов ред на дното од вашата страница <code>LocalSettings.php</code>:\n\n$1",
        "config-localsettings-incomplete": "Постоечката страница <code>LocalSettings.php</code> е нецелосна.\nНе е поставена променливата $1.\nИзменете ја страницата <code>LocalSettings.php</code> така што ќе ѝ зададете вредност на променливата, па стиснете на „{{int:Config-continue}}“.",
        "config-localsettings-connection-error": "Се појави грешка при поврзувањето со базата користејќи ги поставките назначени во <code>LocalSettings.php</code>. Исправете ги овие поставки и обидете се повторно.\n\n$1",
-       "config-session-error": "Грешка при започнување на сесијата: $1",
-       "config-session-expired": "Вашите сесиски податоци истекоа.\nПоставките на сесиите траат $1.\nНивниот рок можете да го зголемите со задавање на <code>session.gc_maxlifetime</code> во php.ini.\nПочнете ја воспоставката одново.",
-       "config-no-session": "Ð\92аÑ\88иÑ\82е Ñ\81еÑ\81иÑ\81ки Ð¿Ð¾Ð´Ð°Ñ\82оÑ\86и се изгубени!\nПогледајте во php.ini дали <code>session.save_path</code> е поставен во правилна папка.",
+       "config-session-error": "Грешка при започнување на седницата: $1",
+       "config-session-expired": "Вашите податоци од седницата истекоа.\nПоставките на седниците траат $1.\nНивниот рок можете да го зголемите со задавање на <code>session.gc_maxlifetime</code> во php.ini.\nПочнете ја воспоставката одново.",
+       "config-no-session": "Ð\9fодаÑ\82оÑ\86иÑ\82е Ð¾Ð´ Ñ\81едниÑ\86аÑ\82а се изгубени!\nПогледајте во php.ini дали <code>session.save_path</code> е поставен во правилна папка.",
        "config-your-language": "Вашиот јазик:",
        "config-your-language-help": "Одберете на кој јазик да се одвива воспоставката.",
        "config-wiki-language": "Јазик на викито:",
        "config-install-done": "'''Честитаме!'''\nУспешно го воспоставивте МедијаВики.\n\nВоспоставувачот создаде податотека <code>LocalSettings.php</code>.\nТаму се содржат сите ваши нагодувања.\n\nЌе треба да ја преземете и да ја ставите во основата на воспоставката (истата папка во која се наоѓа index.php). Преземањето треба да е започнато автоматски.\n\nАко не ви е понудено преземање, или пак ако сте го откажале, можете да го почнете одново стискајќи на следнава врска:\n\n$3\n\n'''Напомена''': Ако ова не го направите сега, податотеката со поставки повеќе нема да биде на достапна.\n\nОткога ќе завршите со тоа, можете да '''[$2 влезете на вашето вики]'''.",
        "config-download-localsettings": "Преземи го <code>LocalSettings.php</code>",
        "config-help": "помош",
+       "config-help-tooltip": "стиснете да расклопите",
        "config-nofile": "Податотеката „$1“ не е пронајдена. Да не е избришана?",
        "config-extension-link": "Дали сте знаеле дека вашето вики поддржува [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions додатоци]?\n\nМожете да ги прелистате [//www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category по категории]",
        "mainpagetext": "'''МедијаВики е успешно воспоставен.'''",
index b8a5ac7..33817c2 100644 (file)
@@ -44,7 +44,7 @@
        "config-help-restart": "Adakah anda ingin untuk membersihkan semua data yang disimpan yang anda telah masukkan dan memulakan semula proses pemasangan?",
        "config-restart": "Ya, mula semula",
        "config-welcome": "=== Pemeriksaan persekitaran ===\nPemeriksaan asas kini boleh dilakukan untuk melihat jika persekitaran ini adalah sesuai untuk pemasangan MediaWiki.\nIngat untuk memasukkan maklumat ini jika anda mahukan sokongan tentang bagaimana untuk menyelesaikan pemasangan.",
-       "config-copyright": "=== Hakcipta dan terma ===\n\n$1\n\nProgram ini merupakan perisian bebas; anda boleh mengedarkannya semula dan/atau mengubahsuainya di bawah syarat-syarat Lesen Awam GNU seperti yang diterbitkan oleh Yayasan Perisian Bebas; sama ada versi 2 Lesen ini atau (mengikut pilihan anda) mana-mana versi selepas ini.\n\nProgram ini diedarkan dengan harapan bahawa ia akan menjadi berguna, tetapi '''tanpa sebarang waranti'''; tanpa jaminan yang tersirat '''kebolehdagangan''' atau '''kesesuaian untuk tujuan tertentu'''.\nLihat Lesen Awam GNU untuk maklumat lanjut.\n\nAnda perlu terima <doclink href=Copying> satu salinan Lesen Awam GNU </doclink> bersama-sama dengan program ini, jika tidak, menulis surat kepada Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA, atau [http://www.gnu.org/copyleft/gpl.html membacanya dalam talian].",
+       "config-copyright": "=== Hakcipta dan Syarat-Syarat ===\n\n$1\n\nProgram ini merupakan perisian bebas; anda boleh mengedarkannya semula dan/atau mengubahsuainya di bawah syarat-syarat Lesen Awam GNU seperti yang diterbitkan oleh Yayasan Perisian Bebas; sama ada versi 2 Lesen ini atau (mengikut pilihan anda) mana-mana versi selepas ini.\n\nProgram ini diedarkan dengan harapan bahawa ia akan menjadi berguna, tetapi '''tanpa sebarang waranti'''; tanpa jaminan yang tersirat '''kebolehdagangan''' atau '''kesesuaian untuk tujuan tertentu'''.\nLihat Lesen Awam GNU untuk maklumat lanjut.\n\nAnda sepatutnya telah menerima <doclink href=Copying> satu salinan Lesen Awam GNU </doclink> bersama-sama dengan program ini, jika tidak, menulis surat kepada Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA, atau [http://www.gnu.org/copyleft/gpl.html membacanya dalam talian].",
        "config-sidebar": "* [//www.mediawiki.org Laman utama MediaWiki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents Panduan Pengguna]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents Panduan Pentadbir]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Soalan lazim]\n----\n* <doclink href=Readme>Baca saya</doclink>\n* <doclink href=ReleaseNotes>Nota keluaran</doclink>\n* <doclink href=Copying>Menyalin</doclink>\n* <doclink href=UpgradeDoc>Menaik taraf</doclink>",
        "config-env-good": "Persekitaran telah diperiksa.\nAnda boleh memasang MediaWiki.",
        "config-env-bad": "Persekitaran telah diperiksa. \nAnda tidak boleh memasang MediaWiki.",
index 4b2bdbe..b875181 100644 (file)
        "config-mysql-charset-help": "W '''trybie binarnym''', MediaWiki zapisuje tekst UTF-8 do bazy danych w polach binarnych.\nJest on bardziej wydajny niż tryb UTF-8 w MySQL i pozwala na używanie znaków pełnego zakresu Unicode.\n\nW '''trybie UTF-8''', MySQL będzie znać zestaw znaków w jakim zakodowano dane, można też przedstawić i przekonwertuj je odpowiednio, ale nie pozwoli Ci przechowywać znaków spoza [//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes podstawowej płaszczyzny wielojęzyczności].",
        "config-mssql-auth": "Typ uwierzytelniania:",
        "config-mssql-install-auth": "Wybierz typ uwierzytelniania, który będzie używany do łączenia się z bazą danych w trakcie procesu instalacji.\nJeśli wybierzesz „{{int:config-mssql-windowsauth}}”, będą wykorzystywane dane konta użytkownika, pod którym działa serwer www.",
+       "config-mssql-web-auth": "Wybierz typ uwierzytelniania, który będzie używany przez serwer www do łączenia się z bazą danych podczas normalnego funkcjonowania wiki.\nJeśli wybierzesz „{{int:config-mssql-windowsauth}}”, użyte zostaną dane konta użytkownika, pod którym działa serwer www.",
        "config-mssql-sqlauth": "Uwierzytelnianie serwera SQL",
        "config-mssql-windowsauth": "Autoryzacja Windows",
        "config-site-name": "Nazwa wiki:",
index 905e5ad..a547edc 100644 (file)
                        "Fúlvio",
                        "Giro720",
                        "Imperadeiro98",
-                       "Cainamarques"
+                       "Cainamarques",
+                       "Vitorvicentevalente"
                ]
        },
        "config-desc": "O instalador do MediaWiki",
-       "config-title": "Instalação do MediaWiki $1",
+       "config-title": "Instalação da MediaWiki $1",
        "config-information": "Informação",
        "config-localsettings-upgrade": "Foi detectado um ficheiro <code>LocalSettings.php</code>.\nPara atualizar esta instalação, por favor introduza o valor de <code>$wgUpgradeKey</code> na caixa abaixo.\nEncontra este valor em <code>LocalSettings.php</code>.",
        "config-localsettings-cli-upgrade": "Foi detectado um ficheiro <code>LocalSettings.php</code>.\nPara atualizar esta instalação, execute o <code>update.php</code>, por favor",
        "config-localsettings-key": "Chave de atualização:",
        "config-localsettings-badkey": "A chave que forneceu está incorreta.",
        "config-upgrade-key-missing": "Foi detectada uma instalação existente do MediaWiki.\nPara atualizar esta instalação, por favor coloque a seguinte linha no final do seu <code>LocalSettings.php</code>:\n\n$1",
-       "config-localsettings-incomplete": "O ficheiro <code>LocalSettings.php</code> existente parece estar incompleto.\nA variável $1 não está definida.\nPor favor defina esta variável no <code>LocalSettings.php</code> e clique \"{{int:Config-continue}}\".",
+       "config-localsettings-incomplete": "O ficheiro <code>LocalSettings.php</code> existente parece estar incompleto.\nA variável $1 não está definida.\nPor favor, defina esta variável no <code>LocalSettings.php</code> e clique \"{{int:Config-continue}}\".",
        "config-localsettings-connection-error": "Ocorreu um erro ao ligar à base de dados usando as configurações especificadas no <code>LocalSettings.php</code>. Por favor corrija essas configurações e tente novamente.\n\n$1",
        "config-session-error": "Erro ao iniciar a sessão: $1",
        "config-session-expired": "Os seus dados de sessão parecem ter expirado.\nAs sessões estão configuradas para uma duração de $1.\nPode aumentar esta duração configurando <code>session.gc_maxlifetime</code> no php.ini.\nReinicie o processo de instalação.",
        "config-no-session": "Os seus dados de sessão foram perdidos!\nVerifique o seu php.ini e certifique-se de que em <code>session.save_path</code> está definido um diretório apropriado.",
        "config-your-language": "O seu idioma:",
-       "config-your-language-help": "Selecione a língua que será usada durante o processo de instalação.",
-       "config-wiki-language": "Língua da wiki:",
-       "config-wiki-language-help": "Selecione a língua que será predominante na wiki.",
+       "config-your-language-help": "Selecione o idioma que será usado durante o processo de instalação.",
+       "config-wiki-language": "Idioma da wiki:",
+       "config-wiki-language-help": "Selecione o idioma que será predominante na wiki.",
        "config-back": "← Voltar",
        "config-continue": "Continuar →",
-       "config-page-language": "Língua",
+       "config-page-language": "Idioma",
        "config-page-welcome": "Bem-vindo(a) ao MediaWiki!",
        "config-page-dbconnect": "Ligar à base de dados",
        "config-page-upgrade": "Atualizar a instalação existente",
@@ -48,7 +49,7 @@
        "config-page-readme": "Leia-me",
        "config-page-releasenotes": "Notas de lançamento",
        "config-page-copying": "A copiar",
-       "config-page-upgradedoc": "Atualizando",
+       "config-page-upgradedoc": "A atualizar",
        "config-page-existingwiki": "Wiki existente",
        "config-help-restart": "Deseja limpar todos os dados gravados que introduziu e reiniciar o processo de instalação?",
        "config-restart": "Sim, reiniciar",
        "config-outdated-sqlite": "'''Aviso''': Tem a versão $1 do SQLite, que é anterior à versão mínima necessária, a $2. O SQLite não estará disponível.",
        "config-no-fts3": "'''Aviso''': O SQLite foi compilado sem o módulo [//sqlite.org/fts3.html FTS3]; as funcionalidades de pesquisa não estarão disponíveis nesta instalação.",
        "config-register-globals": "'''Aviso: A opção <code>[http://php.net/register_globals register_globals]</code> do PHP está ativada.'''\n'''Desative-a, se puder.'''\nO MediaWiki funciona mesmo assim, mas o seu servidor está exposto a potenciais vulnerabilidades de segurança.",
-       "config-magic-quotes-runtime": "'''Fatal: A opção [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_runtime] está ativada!'''\nEsta opção causa corrupção dos dados de entrada, de uma forma imprevisível.\nNão pode instalar ou usar o MediaWiki a menos que esta opção seja desativada.",
-       "config-magic-quotes-sybase": "'''Fatal: A opção [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-sybase magic_quotes_sybase] está ativada!'''\nEsta opção causa corrupção dos dados de entrada, de uma forma imprevisível.\nNão pode instalar ou usar o MediaWiki a menos que esta opção seja desativada.",
-       "config-mbstring": "'''Fatal: A opção [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] está ativada!'''\nEsta opção causa erros e pode corromper os dados de uma forma imprevisível.\nNão pode instalar ou usar o MediaWiki a menos que esta opção seja desativada.",
+       "config-magic-quotes-runtime": "'''Erro fatal: A opção [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_runtime] está ativa!'''\nEsta opção causa corrupção dos dados de entrada, de uma forma imprevisível.\nNão pode instalar ou usar o MediaWiki a menos que esta opção seja desativada.",
+       "config-magic-quotes-sybase": "'''Erro fatal: A opção [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-sybase magic_quotes_sybase] está ativa!'''\nEsta opção causa corrupção dos dados de entrada, de uma forma imprevisível.\nNão pode instalar ou usar o MediaWiki a menos que esta opção seja desativada.",
+       "config-mbstring": "'''Erro fatal: A opção [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] está ativa!'''\nEsta opção causa erros e pode corromper os dados de uma forma imprevisível.\nNão pode instalar ou usar o MediaWiki a menos que esta opção seja desativada.",
        "config-safe-mode": "'''Aviso:''' O [http://www.php.net/features.safe-mode safe mode] do PHP está ativo.\nEste modo pode causar problemas, especialmente no upload de ficheiros e no suporte a <code>math</code>.",
        "config-xml-bad": "Falta o módulo XML do PHP.\nO MediaWiki necessita de funções deste módulo e não funcionará com esta configuração.\nSe está a executar o Mandrake, instale o pacote php-xml.",
-       "config-pcre-old": "<strong>Fatal:</strong> É necessário o PCRE $1 ou versão posterior.\nO <i>link</i> do seu binário PHP foi feito com o PCRE $2.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE Mais informações].",
-       "config-pcre-no-utf8": "'''Fatal''': O módulo PCRE do PHP parece ter sido compilado sem suporte PCRE_UTF8.\nO MediaWiki necessita do suporte UTF-8 para funcionar corretamente.",
+       "config-pcre-old": "<strong>Erro fatal:</strong> É necessário o PCRE $1 ou versão posterior.\nO <i>link</i> do seu binário PHP foi feito com o PCRE $2.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE Mais informações].",
+       "config-pcre-no-utf8": "'''Erro fatal''': O módulo PCRE do PHP parece ter sido compilado sem suporte PCRE_UTF8.\nO MediaWiki necessita do suporte UTF-8 para funcionar corretamente.",
        "config-memory-raised": "A configuração <code>memory_limit</code> do PHP era $1; foi aumentada para $2.",
        "config-memory-bad": "'''Aviso:''' A configuração <code>memory_limit</code> do PHP é $1.\nIsto é provavelmente demasiado baixo.\nA instalação poderá falhar!",
-       "config-ctype": "'''Fatal''': O PHP tem de ser compilado com suporte para a [http://www.php.net/manual/en/ctype.installation.php extensão Ctype].",
-       "config-json": "<strong>Fatal:</strong> O PHP foi compilado sem suporte de JSON.\nTem de instalar a extensão JSON do PHP (incluída no PHP 5.2 ou posterior) ou a extensão [http://pecl.php.net/package/jsonc PECL jsonc] antes de instalar o MediaWiki.\n* A extensão JSON do PHP está incluída nas distribuções 5 e 6 do Red Hat Enterprise Linux (CentOS), mas tem de ser ativada nos ficheiros <code>/etc/php.ini</code> ou <code>/etc/php.d/json.ini</code>.\n* Algumas distribuições do Linux posteriores a maio de 2013 omitem a extensão JSON do PHP e substituem-na pela extensão PECL chamando-lhe <code>php5-json</code> ou <code>php-pecl-jsonc</code>.",
+       "config-ctype": "'''Erro fatal''': O PHP tem de ser compilado com suporte para a [http://www.php.net/manual/en/ctype.installation.php extensão Ctype].",
+       "config-json": "<strong>Erro fatal:</strong> O PHP foi compilado sem suporte de JSON.\nTem de instalar a extensão JSON do PHP (incluída no PHP 5.2 ou posterior) ou a extensão [http://pecl.php.net/package/jsonc PECL jsonc] antes de instalar o MediaWiki.\n* A extensão JSON do PHP está incluída nas distribuções 5 e 6 do Red Hat Enterprise Linux (CentOS), mas tem de estar ativa nos ficheiros <code>/etc/php.ini</code> ou <code>/etc/php.d/json.ini</code>.\n* Algumas distribuições do Linux posteriores a maio de 2013 omitem a extensão JSON do PHP e substituem-na pela extensão PECL chamando-lhe <code>php5-json</code> ou <code>php-pecl-jsonc</code>.",
        "config-xcache": "[http://xcache.lighttpd.net/ XCache] instalada",
        "config-apc": "[http://www.php.net/apc APC] instalada",
        "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] instalada",
@@ -93,8 +94,8 @@
        "config-no-cli-uri": "'''Aviso''':  Não foi especificado um <code>--scriptpath</code>; por omissão, será usado: <code>$1</code>.",
        "config-using-server": "Será usado o nome do servidor \"<nowiki>$1</nowiki>\".",
        "config-using-uri": "Será usada a URL do servidor \"<nowiki>$1$2</nowiki>\".",
-       "config-uploads-not-safe": "'''Aviso:''' O diretório por omissão para uploads <code>$1</code>, está vulnerável à execução arbitrária de scripts.\nEmbora o MediaWiki verifique a existência de ameaças de segurança em todos os ficheiros enviados, é altamente recomendado que [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security#Upload_security vede esta vulnerabilidade de segurança] antes de possibilitar uploads.",
-       "config-no-cli-uploads-check": "'''Aviso:''' O diretório por omissão para uploads, <code>$1</code>, não é verificado para determinar se é vulnerável à execução de código arbitrário durante a instalação por CLI (\"Command-line Interface\").",
+       "config-uploads-not-safe": "'''Aviso:''' O diretório por omissão para carregamentos <code>$1</code>, está vulnerável à execução arbitrária de scripts.\nEmbora o MediaWiki verifique a existência de ameaças de segurança em todos os ficheiros enviados, é altamente recomendado que [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security#Upload_security vede esta vulnerabilidade de segurança] antes de possibilitar uploads.",
+       "config-no-cli-uploads-check": "'''Aviso:''' O diretório por omissão para carregamentos, <code>$1</code>, não é verificado para determinar se é vulnerável à execução de código arbitrário durante a instalação por CLI (\"Command-line Interface\").",
        "config-brokenlibxml": "O seu sistema tem uma combinação de versões do PHP e do libxml2 conhecida por ser problemática, podendo causar corrupção de dados no MediaWiki e noutras aplicações da internet.\nAtualize para a versão 2.7.3 ou posterior do libxml2 ([https://bugs.php.net/bug.php?id=45996 incidência reportada no PHP]).\nInstalação cancelada.",
        "config-suhosin-max-value-length": "O Suhosin está instalado e limita o parâmetro GET <code>length</code> a $1 bytes.\nO componente ResourceLoader do MediaWiki consegue exceder este limite, mas prejudicando o desempenho.\nSe lhe for possível, deve atribuir ao parâmetro <code>suhosin.get.max_value_length</code> o valor 1024 ou maior no ficheiro <code>php.ini</code>, e definir o mesmo valor para <code>$wgResourceLoaderMaxQueryLength</code> no ficheiro LocalSettings.php.",
        "config-db-type": "Tipo da base de dados:",
        "config-mysql-only-myisam-dep": "<strong>Aviso:</strong> O único motor de armazenamento para MySQL nesta máquina é o MyISAM e o seu uso com o MediaWiki não é recomendado porque:\n* praticamente não suporta acessos simultâneos, porque bloqueia tabelas\n* o MyISAM é mais suscetível a perdas da integridade dos dados do que outros motores\n* o código do MediaWiki não trabalha devidamente com o MyISAM\n\nA sua instalação MySQL não suporta InnoDB, talvez seja uma boa altura para atualizá-la para a versão mais recente.",
        "config-mysql-engine-help": "<strong>InnoDB</strong> é quase sempre a melhor opção, porque suporta bem acessos simultâneos <i>(concurrency)</i>.\n\n<strong>MyISAM</strong> pode ser mais rápido no modo de utilizador único ou em instalações somente para leitura.\nAs bases de dados MyISAM tendem a perder integridade de dados com mais frequência do que as bases de dados InnoDB.",
        "config-mysql-charset": "Conjunto de caracteres da base de dados:",
-       "config-mysql-binary": "Binary",
+       "config-mysql-binary": "Binário",
        "config-mysql-utf8": "UTF-8",
        "config-mysql-charset-help": "No modo '''binary''' (\"binário\"), o MediaWiki armazena o texto UTF-8 na base de dados em campos binários.\nIsto é mais eficiente do que o modo UTF-8 do MySQL e permite que sejam usados todos os caracteres Unicode.\n\nNo modo '''UTF-8''', o MySQL saberá em que conjunto de caracteres os seus dados estão e pode apresentá-los e convertê-los da forma mais adequada,\nmas não lhe permitirá armazenar caracteres acima do [//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes Plano Multilingue Básico].",
        "config-mssql-auth": "Tipo de autenticação:",
        "config-mssql-sqlauth": "Autenticação do SQL Server",
        "config-mssql-windowsauth": "Autenticação do Windows",
        "config-site-name": "Nome da wiki:",
-       "config-site-name-help": "Este nome aparecerá no título da janela do seu browser e em vários outros sítios.",
-       "config-site-name-blank": "Introduza o nome do site.",
+       "config-site-name-help": "Este nome aparecerá no título da janela do seu navegador e em vários outros sítios.",
+       "config-site-name-blank": "Introduza o nome do sítio.",
        "config-project-namespace": "Espaço nominal do projeto:",
        "config-ns-generic": "Projeto",
        "config-ns-site-name": "O mesmo que o nome da wiki: $1",
        "config-email-auth-help": "Se esta opção for ativada, os utilizadores têm de confirmar o seu endereço de correio eletrónico usando um link que lhes é enviado sempre que o definirem ou alterarem.\nSó os endereços de correio eletrónico autenticados podem receber mensagens eletrónicas dos outros utilizadores ou alterar as mensagens de notificação.\nÉ '''recomendado''' que esta opção seja ativada nas wikis de acesso público para impedir o uso abusivo das funcionalidades de correio eletrónico.",
        "config-email-sender": "Endereço de correio electrónico de retorno:",
        "config-email-sender-help": "Introduza o endereço de correio electrónico que será usado como endereço de retorno nas mensagens electrónicas de saída.\nÉ para este endereço que serão enviadas as mensagens que não podem ser entregues.\nMuitos servidores de correio electrónico exigem que pelo menos a parte do nome do domínio seja válida. \\",
-       "config-upload-settings": "Upload de imagens e ficheiros",
-       "config-upload-enable": "Possibilitar o upload de ficheiros",
-       "config-upload-help": "O upload de ficheiros expõe o seu servidor a riscos de segurança.\nPara mais informações, leia a [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security seção sobre segurança] do Manual Técnico.\n\nPara permitir o upload de ficheiros, altere as permissões do subdiretório <code>images</code> no diretório de raiz do MediaWiki para que o servidor de internet possa escrever nele.\nDepois ative esta opção.",
+       "config-upload-settings": "Carregamento de imagens e ficheiros",
+       "config-upload-enable": "Possibilitar o carregamento de ficheiros",
+       "config-upload-help": "O carregamento de ficheiros expõe o seu servidor a riscos de segurança.\nPara mais informações, leia a [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security seção sobre segurança] do Manual Técnico.\n\nPara permitir o carregamento de ficheiros, altere as permissões do subdiretório <code>images</code> no diretório de raiz do MediaWiki para que o servidor de internet possa escrever nele.\nDepois ative esta opção.",
        "config-upload-deleted": "Diretório para os ficheiros apagados:",
        "config-upload-deleted-help": "Escolha um diretório onde serão arquivados os ficheiros apagados.\nO ideal é que este diretório não possa ser diretamente acedido a partir da internet.",
        "config-logo": "URL do logótipo:",
        "config-install-tables": "A criar as tabelas",
        "config-install-tables-exist": "'''Aviso''': As tabelas do MediaWiki parecem já existir.\nA criação das tabelas será saltada.",
        "config-install-tables-failed": "'''Erro''': A criação das tabelas falhou com o seguinte erro: $1",
-       "config-install-interwiki": "A preencher a tabela padrão de interwikis",
+       "config-install-interwiki": "A preencher a tabela padrão de interlínguas",
        "config-install-interwiki-list": "Não foi possível encontrar o ficheiro <code>interwiki.list</code>.",
        "config-install-interwiki-exists": "'''Aviso''': A tabela de interwikis parece já conter entradas.\nO preenchimento padrão desta tabela será saltado.",
        "config-install-stats": "A inicializar as estatísticas",
        "config-install-keys": "A gerar as chaves secretas",
-       "config-insecure-keys": "'''Warning:''' {{PLURAL:$2|A chave segura|As chaves seguras}} ($1) {{PLURAL:$2|gerada durante a instalação não é completamente segura|geradas durante a instalação não são completamente seguras}}. Considere a possibilidade de {{PLURAL:$2|alterá-la|alterá-las}} manualmente.",
+       "config-insecure-keys": "'''Aviso:''' {{PLURAL:$2|A chave segura|As chaves seguras}} ($1) {{PLURAL:$2|gerada durante a instalação não é completamente segura|geradas durante a instalação não são completamente seguras}}. Considere a possibilidade de {{PLURAL:$2|alterá-la|alterá-las}} manualmente.",
        "config-install-sysop": "A criar a conta de administrador",
        "config-install-subscribe-fail": "Não foi possível subscrever a lista mediawiki-announce: $1",
        "config-install-subscribe-notpossible": "cURL não está instalado e <code>allow_url_fopen</code> não está disponível.",
        "config-install-extension-tables": "A criar as tabelas das extensões ativadas",
        "config-install-mainpage-failed": "Não foi possível inserir a página principal: $1",
        "config-install-done": "'''Parabéns!'''\nTerminou a instalação do MediaWiki.\n\nO instalador gerou um ficheiro <code>LocalSettings.php</code>.\nEste ficheiro contém todas as configurações.\n\nPrecisa de fazer o download do ficheiro e colocá-lo no diretório de raiz da sua instalação (o mesmo diretório onde está o ficheiro index.php). Este download deverá ter sido iniciado automaticamente.\n\nSe o download não foi iniciado, ou se o cancelou, pode recomeçá-lo clicando o link abaixo:\n\n$3\n\n'''Nota''': Se não fizer isto agora, o ficheiro que foi gerado deixará de estar disponível quando sair do processo de instalação.\n\nDepois de terminar o passo anterior, pode '''[$2 entrar na wiki]'''.",
-       "config-download-localsettings": "Download do <code>LocalSettings.php</code>",
+       "config-download-localsettings": "Descarga do <code>LocalSettings.php</code>",
        "config-help": "ajuda",
+       "config-help-tooltip": "clique para expandir",
        "config-nofile": "Não foi possível encontrar o ficheiro \"$1\". Terá sido apagado?",
        "config-extension-link": "Sabia que a sua wiki suporta [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions extensões]?\n\nPode procurar [//www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category extensões por categoria].",
        "mainpagetext": "'''MediaWiki instalado com sucesso.'''",
index 67bc5af..3a16079 100644 (file)
        "config-install-done": "Parameters:\n* $1 is the URL to LocalSettings download\n* $2 is a link to the wiki.\n* $3 is a download link with attached download icon. The config-download-localsettings message will be used as the link text.",
        "config-download-localsettings": "The link text used in the download link in config-install-done.",
        "config-help": "This is used in help boxes.\n{{Identical|Help}}",
+       "config-help-tooltip": "Tooltip for the 'help' links ({{msg-mw|config-help}}), to make it clear they'll expand in place rather than open a new page",
        "config-nofile": "Used as failure message. Parameters:\n* $1 - filename",
        "config-extension-link": "Shown on last page of installation to inform about possible extensions.",
        "mainpagetext": "Along with {{msg-mw|mainpagedocfooter}}, the text you will see on the Main Page when your wiki is installed.",
index beb96c9..2fcf9a5 100644 (file)
        "config-information": "Informații",
        "config-localsettings-key": "Cheie de actualizare:",
        "config-localsettings-badkey": "Cheia furnizată este incorectă.",
+       "config-upgrade-key-missing": "S-a detectat o instalare existentă de MediaWiki.\nPentru a efectua un upgrade în cazul acestei instalări, vă rugăm să introduceți următorul rând în partea de jos a fișierului <code>LocalSettings.php</code>:\n\n$1",
+       "config-localsettings-incomplete": "Fișierul <code>LocalSettings.php</code> deja existent pare a fi incomplet.\nVariabila $1 nu este definită.\nModificați fișierul <code>LocalSettings.php</code> astfel încât această variabilă să fie definită, după care apăsați pe „{{int:Config-continue}}”.",
+       "config-localsettings-connection-error": "A apărut o eroare în timpul conectării la baza de date utilizând setările specificate în <code>LocalSettings.php</code>. Vă rugăm să ajustați aceste setări și încercați din nou.\n\n$1",
        "config-session-error": "Eroare la pornirea sesiunii: $1",
+       "config-session-expired": "Este posibil ca datele sesiunii dumnevoastră să fi expirat.\nSesiunile sunt configurate pentru o durată de viață de $1.\nO puteți mări configurând parametrul <code>session.gc_maxlifetime</code> din fișierul php.ini.\nReporniți procesul de instalare.",
+       "config-no-session": "Datele sesiunii dumneavoastră s-au pierdut!\nVerificați-vă fișierul php.ini și asigurați-vă că <code>session.save_path</code> conține calea către un director corespunzător.",
        "config-your-language": "Limba ta:",
        "config-your-language-help": "Alege o limbă pentru a o utiliza în timpul procesului de instalare.",
        "config-wiki-language": "Limbă wiki:",
index 28c49bc..6339aac 100644 (file)
        "config-install-done": "'''Поздравляем!'''\nВы успешно установили MediaWiki.\n\nВо время установки был создан файл <code>LocalSettings.php</code>.\nОн содержит всю конфигурации вики.\n\nВам необходимо скачать его и положить в корневую директорию вашей вики (ту же директорию, где находится файл index.php). Его загрузка должна начаться автоматически.\n\nЕсли автоматическая загрузка не началась или вы её отменили, вы можете скачать по ссылке ниже:\n\n$3\n\n'''Примечание''': Если вы не сделаете этого сейчас, то сгенерированный файл конфигурации не будет доступен вам в дальнейшем, если вы выйдете из установки, не скачивая его.\n\nПо окончании действий, описанных выше, вы сможете '''[$2 войти в вашу вики]'''.",
        "config-download-localsettings": "Загрузить <code>LocalSettings.php</code>",
        "config-help": "справка",
+       "config-help-tooltip": "нажмите, чтобы развернуть",
        "config-nofile": "Файл \"$1\" не удается найти. Он был удален?",
        "config-extension-link": "Знаете ли вы, что ваш вики-проект поддерживает [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions расширения]?\n\nВы можете просмотреть [//www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category расширения по категориям] или [//www.mediawiki.org/wiki/Extension_Matrix матрицу расширений], чтобы увидеть их полный список.",
        "mainpagetext": "'''Вики-движок «MediaWiki» успешно установлен.'''",
index 63ed324..9f609ee 100644 (file)
@@ -50,7 +50,7 @@
        "config-env-php-toolow": "PHP $1 is instâlled.\nHoue'er, MediaWiki requires PHP $2 or heier.",
        "config-unicode-using-utf8": "Uising Brion Vibber's utf8_normalize.so fer Unicode normalization.",
        "config-unicode-using-intl": "Uising the [http://pecl.php.net/intl intl PECL extension] fer Unicode normalization.",
-       "config-unicode-pure-php-warning": "<strong>Warnishment:</strong> The [http://pecl.php.net/intl intl PECL extension] isna available tae handle Unicode normalization, fawin back tae slow pure-PHP implementation.\nGif ye rin ae high-traffic site, ye shid read ae wee bit oan [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations Unicode normalization].",
+       "config-unicode-pure-php-warning": "<strong>Warnishment:</strong> The [http://pecl.php.net/intl intl PECL extension] is no available tae haunle Unicode normalisation, fawin back tae slaw pure-PHP implementation.\nGif ye rin ae hei-traffic steid, ye shid read ae wee bit oan [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations Unicode normalization].",
        "config-unicode-update-warning": "<strong>Warnishment:</strong> The instawed version o the Unicode normalization wrapper uises aen aulder version o [http://site.icu-project.org/ the ICU project's] librie.\nYe shid [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations upgrade] gif ye'r concerned aneat uisin Unicode.",
        "config-no-db": "Coudna fynd ae suitable database driver! Ye need tae instaw ae database driver fer PHP.\nThe follaein database types ar supported: $1.\n\nGif ye compiled PHP yersel, reconfeegure it wi ae database client enabled, fer example, uising <code>./confeegure --wi-mysqli</code>.\nGif ye installed PHP fae ae Debian or Ubuntu package, than ye need tae instaw forby, fer example, the <code>php5-mysql</code> package.",
        "config-outdated-sqlite": "<strong>Warnishment:</strong> ye have SQLite $1, this is lower than minimum required version $2. SQLite will be onavailable.",
        "config-profile-no-anon": "Please mak aen accoont",
        "config-profile-fishbowl": "Permited eiditors yinly",
        "config-profile-private": "Private wiki",
-       "config-profile-help": "Wikis wark best whan ye lat aes monie fawk eedit thaim aes possible.\nIn MediaWiki, it's easie tae luik ower the recent chynges, n tae revert onie damage that's dun bi naeeve or maleecioos uisers.\n\nHouever, monie hae foond MediaWiki tae be uissful in ae wide varietie o roles, n sometimes it isna easie tae conveence awbodie o the beneefits o the wiki wa.\nSae ye hae the choice.\n\nThe <strong>{{int:config-profile-wiki}}</strong> model permits oniebdie tae eedit, wioot even loggin in.\nAe wiki wi <strong>{{int:config-profile-no-anon}}</strong> provides eextra accoontabeelitie, but micht deter casual contreebuters.\n\nThe <strong>{{int:config-profile-fishbowl}}</strong> scenario permits appruived uisers tae eedit, but the publeec can see the pages, incluidin histerie.\nA <strong>{{int:config-profile-private}}</strong> yinlie permits appruived uisers tae see pages, wi the same groop permited tae eedit.\n\nMair complex uiser richts confeegurations ar available efter instawation, see the [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:User_rights relevant manual entrie].",
+       "config-profile-help": "Wikis wark best whan ye lat aes monie fawk eedit thaim aes possible.\nIn MediaWiki, it's easie tae luik ower the recent chynges, n tae revert onie damage that's dun bi naeeve or maleecioos uisers.\n\nHouever, monie hae foond MediaWiki tae be uissful in ae wide varietie o roles, n sometimes it's na easie tae conveence awbodie o the beneefits o the wiki wa.\nSae ye hae the choice.\n\nThe <strong>{{int:config-profile-wiki}}</strong> model allous oniebdie tae eedit, wioot even loggin in.\nAe wiki wi <strong>{{int:config-profile-no-anon}}</strong> provides eextra accoontabeelitie, but micht deter casual contreebuters.\n\nThe <strong>{{int:config-profile-fishbowl}}</strong> scenario allous appruived uisers tae eedit, but the publeec can see the pages, incluidin histerie.\nA <strong>{{int:config-profile-private}}</strong> yinlie permits appruived uisers tae see pages, wi the same groop permited tae eedit.\n\nMair complex uiser richts confeegurations ar available efter instawation, see the [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:User_rights relevant manual entrie].",
        "config-license": "Copiericht n license:",
        "config-license-none": "Nae license fiter",
        "config-license-cc-by-sa": "Creative Commyns Attribution Share Alike",
        "config-logo": "Logo URL:",
        "config-logo-help": "MediaWiki's defaut skin inclædes space fer ae 135x160 pixel logo abuin the sidebaur menu.\nUplaid aen eemage o the appropriate size, n enter the URL here.\n\nYe can uise <code>$wgStylePath</code> or <code>$wgScriptPath</code> gif yer logo is relative til thae paths.\n\nGif ye dinna want ae logo, lea this kist blank.",
        "config-instantcommons": "Enable Instant Commyns",
-       "config-instantcommons-help": "[//www.mediawiki.org/wiki/InstantCommons Instant Commyns] is ae featur that permits wikis tae uise eemages, soonds n ither media foond oan the [//commons.wikimedia.org/ Wikimedia Commyns] site.\nIn order tae dae this, MediaWiki needs access til the Internet.\n\nFer mair information oan this featur, incluidin instructions oan hou tae set it up fer wikis ither than the Wikimedia Commyns, consult [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgForeignFileRepos the manual].",
+       "config-instantcommons-help": "[//www.mediawiki.org/wiki/InstantCommons Instant Commyns] is ae featur that allous wikis tae uise eemages, soonds n ither media foond oan the [//commons.wikimedia.org/ Wikimedia Commons] steid.\nIn order tae dae this, MediaWiki needs access til the Internet.\n\nFer mair information oan this featur, incluidin instructions oan hou tae set it up fer wikis ither than the Wikimedia Commons, consult [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgForeignFileRepos the manual].",
        "config-cc-error": "The Creative Commyns license chuiser gae naw result.\nEnter the license name manually.",
        "config-cc-again": "Pick again...",
        "config-cc-not-chosen": "Chuise whit Creative Commyns license ye want an clap oan \"proceed\".",
        "config-nofile": "File \"$1\" coudna be foond. Haes it been delytit?",
        "config-extension-link": "Did ye ken that yer wiki supports [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions extensions]?\n\nYe can brouse [//www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category extensions bi categorie] or the [//www.mediawiki.org/wiki/Extension_Matrix Extension Matrix] tae see the full leet o extensions.",
        "mainpagetext": "<strong>MediaWiki haes been installit wi speed.</strong>",
-       "mainpagedocfooter": "Consult the [//meta.wikimedia.org/wiki/Help:Contents Uiser's Guide] fer informâtion oan uising the wiki saffware.\n\n== Gettin stairted ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Confeegurâtion settins leet]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailin leet]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Localise MediaWiki fer yer leid]"
+       "mainpagedocfooter": "Consult the [//meta.wikimedia.org/wiki/Help:Contents Uiser's Guide] fer information oan uisin the wiki saffware.\n\n== Gettin stairtit ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Confeeguration settins leet]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailin leet]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Localise MediaWiki fer yer leid]"
 }
index c6d9b4c..ad6bca7 100644 (file)
@@ -34,6 +34,8 @@
        "config-page-existingwiki": "Existujúca wiki",
        "config-help-restart": "Chcete vymazať všetky uložené dáta, ktoré ste zadali a reštartovať proces inštalácie?",
        "config-restart": "Áno, reštartovať",
+       "config-env-good": "Prostredie bolo skontrolované.\nMôžete nainštalovať MediaWiki.",
+       "config-env-bad": "Prostredie bolo skontrolované.\nNemôžete nainštalovať MediaWiki.",
        "config-env-php": "PHP $1 je nainštalované.",
        "config-env-php-toolow": "PHP $1 je nainštalované. Avšak, MediaWiki vyžaduje PHP $2 alebo vyššie.",
        "config-db-type": "Typ databázy:",
index 63c92bb..ed986c0 100644 (file)
@@ -50,7 +50,7 @@
        "config-help-restart": "是否要清除所有已輸入且儲存的資料,並重新開始安裝程序嗎?",
        "config-restart": "是的,重新開始",
        "config-welcome": "=== 環境檢查 ===\n現在會做基本的檢查,檢查環境是否符合 MediaWiki 安裝所需。\n若您要尋求如何完成安裝的協助,請記得提供以下訊息。",
-       "config-copyright": "=== 版權聲明與授權條款 ===\n\n$1\n\n本程式為自由軟體;您可依據自由軟體基金會所發表的 GNU 通用公共授權條款規定,將本程式重新發佈與/或修改;無論您依據的是本授權條款的第二版或 (您可自行選擇) 之後的任何版本。\n\n本程式發佈的目的是希望可以提供幫助,但 <strong>不負任何擔保責任</strong>;亦無隱含對 <strong>適售性</strong> 或 <strong>特定用途的適用性</strong> 的情形擔保。詳情請參照GNU 通用公共授權。\n\n您應已隨本程式收到 <doclink href=\"Copying\">GNU 通用公共授權條款</doclink>;如果沒有,請信件通知自由軟體基金會,51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA,或 [http://www.gnu.org/copyleft/gpl.html 線上閱讀]。",
+       "config-copyright": "=== 版權聲明與授權條款 ===\n\n$1\n\n本程式為自由軟體;您可依據自由軟體基金會所發表的 GNU 通用公共授權條款規定,將本程式重新發佈與/或修改;無論您依據的是本授權條款的第二版或 (您可自行選擇) 之後的任何版本。\n\n本程式發佈的目的是希望可以提供幫助,但 <strong>不負任何擔保責任</strong>;亦無隱含對 <strong>適售性</strong> 或 <strong>特定用途的適用性</strong> 的情形擔保。詳情請參照 GNU 通用公共授權。\n\n您應已隨本程式收到 <doclink href=\"Copying\">GNU 通用公共授權條款的副本</doclink>;如果沒有,請信件通知自由軟體基金會,51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA,或 [http://www.gnu.org/copyleft/gpl.html 線上閱讀]。",
        "config-sidebar": "* [www.mediawiki.org/wiki/MediaWiki/zh-hant MediaWiki 首頁]\n* [www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents/zh 使用者指南]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents/zh 管理者指南]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ/zh-hant 常見問題集]\n----\n* <doclink href=Readme>讀我說明</doclink>\n* <doclink href=ReleaseNotes>發行說明</doclink>\n* <doclink href=Copying>版權聲明</doclink>\n* <doclink href=UpgradeDoc>升級</doclink>",
        "config-env-good": "環境檢查已完成。\n您可以安裝 MediaWiki。",
        "config-env-bad": "環境檢查已完成。\n您無法安裝 MediaWiki。",
index 998805a..2990782 100644 (file)
@@ -1,4 +1,5 @@
 <?php
+// @codingStandardsIgnoreFile File external to MediaWiki. Ignore coding conventions checks.
 /**
  * JavaScript Minifier
  *
index f250217..ed0382c 100644 (file)
@@ -1,4 +1,5 @@
 <?php
+// @codingStandardsIgnoreFile File external to MediaWiki. Ignore coding conventions checks.
 /**
  * JSMinPlus version 1.4
  *
index e57dbcf..37723d5 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-
+// @codingStandardsIgnoreFile File external to MediaWiki. Ignore coding conventions checks.
 /**
  * lessphp v0.4.0@2cc77e3c7b
  * http://leafo.net/lessphp
index 607c4e5..44be178 100644 (file)
@@ -138,6 +138,10 @@ class BitmapHandler extends ImageHandler {
                        'dstUrl' => $dstUrl,
                );
 
+               if ( isset( $params['quality'] ) && $params['quality'] === 'low' ) {
+                       $scalerParams['quality'] = 30;
+               }
+
                # Determine scaler type
                $scaler = self::getScalerType( $dstPath );
 
@@ -147,6 +151,7 @@ class BitmapHandler extends ImageHandler {
                if ( !$image->mustRender() &&
                        $scalerParams['physicalWidth'] == $scalerParams['srcWidth']
                        && $scalerParams['physicalHeight'] == $scalerParams['srcHeight']
+                       && !isset( $scalerParams['quality'] )
                ) {
 
                        # normaliseParams (or the user) wants us to return the unscaled image
@@ -163,12 +168,14 @@ class BitmapHandler extends ImageHandler {
 
                if ( $flags & self::TRANSFORM_LATER ) {
                        wfDebug( __METHOD__ . ": Transforming later per flags.\n" );
-                       $params = array(
+                       $newParams = array(
                                'width' => $scalerParams['clientWidth'],
                                'height' => $scalerParams['clientHeight']
                        );
-
-                       return new ThumbnailImage( $image, $dstUrl, false, $params );
+                       if ( isset( $params['quality'] ) ) {
+                               $newParams['quality'] = $params['quality'];
+                       }
+                       return new ThumbnailImage( $image, $dstUrl, false, $newParams );
                }
 
                # Try to make a target path for the thumbnail
@@ -235,12 +242,14 @@ class BitmapHandler extends ImageHandler {
                } elseif ( $mto ) {
                        return $mto;
                } else {
-                       $params = array(
+                       $newParams = array(
                                'width' => $scalerParams['clientWidth'],
                                'height' => $scalerParams['clientHeight']
                        );
-
-                       return new ThumbnailImage( $image, $dstUrl, $dstPath, $params );
+                       if ( isset( $params['quality'] ) ) {
+                               $newParams['quality'] = $params['quality'];
+                       }
+                       return new ThumbnailImage( $image, $dstUrl, $dstPath, $newParams );
                }
        }
 
@@ -314,7 +323,8 @@ class BitmapHandler extends ImageHandler {
                $animation_post = array();
                $decoderHint = array();
                if ( $params['mimeType'] == 'image/jpeg' ) {
-                       $quality = array( '-quality', '80' ); // 80%
+                       $qualityVal = isset( $params['quality'] ) ? (string) $params['quality'] : null;
+                       $quality = array( '-quality', $qualityVal ?: '80' ); // 80%
                        # Sharpening, see bug 6193
                        if ( ( $params['physicalWidth'] + $params['physicalHeight'] )
                                / ( $params['srcWidth'] + $params['srcHeight'] )
@@ -419,7 +429,8 @@ class BitmapHandler extends ImageHandler {
                                        list( $radius, $sigma ) = explode( 'x', $wgSharpenParameter );
                                        $im->sharpenImage( $radius, $sigma );
                                }
-                               $im->setCompressionQuality( 80 );
+                               $qualityVal = isset( $params['quality'] ) ? (string) $params['quality'] : null;
+                               $im->setCompressionQuality( $qualityVal ?: 80 );
                        } elseif ( $params['mimeType'] == 'image/png' ) {
                                $im->setCompressionQuality( 95 );
                        } elseif ( $params['mimeType'] == 'image/gif' ) {
@@ -531,13 +542,14 @@ class BitmapHandler extends ImageHandler {
                # input routine for this.
 
                $typemap = array(
-                       'image/gif' => array( 'imagecreatefromgif', 'palette', 'imagegif' ),
-                       'image/jpeg' => array( 'imagecreatefromjpeg', 'truecolor',
+                       'image/gif' => array( 'imagecreatefromgif', 'palette', false, 'imagegif' ),
+                       'image/jpeg' => array( 'imagecreatefromjpeg', 'truecolor', true,
                                array( __CLASS__, 'imageJpegWrapper' ) ),
-                       'image/png' => array( 'imagecreatefrompng', 'bits', 'imagepng' ),
-                       'image/vnd.wap.wbmp' => array( 'imagecreatefromwbmp', 'palette', 'imagewbmp' ),
-                       'image/xbm' => array( 'imagecreatefromxbm', 'palette', 'imagexbm' ),
+                       'image/png' => array( 'imagecreatefrompng', 'bits', false, 'imagepng' ),
+                       'image/vnd.wap.wbmp' => array( 'imagecreatefromwbmp', 'palette', false, 'imagewbmp' ),
+                       'image/xbm' => array( 'imagecreatefromxbm', 'palette', false, 'imagexbm' ),
                );
+
                if ( !isset( $typemap[$params['mimeType']] ) ) {
                        $err = 'Image type not supported';
                        wfDebug( "$err\n" );
@@ -545,7 +557,7 @@ class BitmapHandler extends ImageHandler {
 
                        return $this->getMediaTransformError( $params, $errMsg );
                }
-               list( $loader, $colorStyle, $saveType ) = $typemap[$params['mimeType']];
+               list( $loader, $colorStyle, $useQuality, $saveType ) = $typemap[$params['mimeType']];
 
                if ( !function_exists( $loader ) ) {
                        $err = "Incomplete GD library configuration: missing function $loader";
@@ -597,7 +609,12 @@ class BitmapHandler extends ImageHandler {
 
                imagesavealpha( $dst_image, true );
 
-               call_user_func( $saveType, $dst_image, $params['dstPath'] );
+               $funcParams = array( $dst_image, $params['dstPath'] );
+               if ( $useQuality && isset( $params['quality'] ) ) {
+                       $funcParams[] = $params['quality'];
+               }
+               call_user_func_array( $saveType, $funcParams );
+
                imagedestroy( $dst_image );
                imagedestroy( $src_image );
 
@@ -730,9 +747,10 @@ class BitmapHandler extends ImageHandler {
                return $cache;
        }
 
-       static function imageJpegWrapper( $dst_image, $thumbPath ) {
+       // FIXME: transformImageMagick() & transformImageMagickExt() uses JPEG quality 80, here it's 95?
+       static function imageJpegWrapper( $dst_image, $thumbPath, $quality = 95 ) {
                imageinterlace( $dst_image );
-               imagejpeg( $dst_image, $thumbPath, 95 );
+               imagejpeg( $dst_image, $thumbPath, $quality );
        }
 
        /**
index 9ed626f..a0f7acb 100644 (file)
  * @ingroup Media
  */
 class JpegHandler extends ExifBitmapHandler {
+
+       function normaliseParams( $image, &$params ) {
+               if ( !parent::normaliseParams( $image, $params ) ) {
+                       return false;
+               }
+               if ( isset( $params['quality'] ) && !self::validateQuality( $params['quality'] ) ) {
+                       return false;
+               }
+               return true;
+       }
+
+       function validateParam( $name, $value ) {
+               if ( $name === 'quality' ) {
+                       return self::validateQuality( $value );
+               } else {
+                       return parent::validateParam( $name, $value );
+               }
+       }
+
+       /** Validate and normalize quality value to be between 1 and 100 (inclusive).
+        * @param int $value quality value, will be converted to integer or 0 if invalid
+        * @return bool true if the value is valid
+        */
+       private static function validateQuality( $value ) {
+               return $value === 'low';
+       }
+
+       function makeParamString( $params ) {
+               // Prepend quality as "qValue-". This has to match parseParamString() below
+               $res = parent::makeParamString( $params );
+               if ( $res && isset( $params['quality'] ) ) {
+                       $res = "q{$params['quality']}-$res";
+               }
+               return $res;
+       }
+
+       function parseParamString( $str ) {
+               // $str contains "qlow-200px" or "200px" strings because thumb.php would strip the filename
+               // first - check if the string begins with "qlow-", and if so, treat it as quality.
+               // Pass the first portion, or the whole string if "qlow-" not found, to the parent
+               // The parsing must match the makeParamString() above
+               $res = false;
+               $m = false;
+               if ( preg_match( '/q([^-]+)-(.*)$/', $str, $m ) ) {
+                       $v = $m[1];
+                       if ( self::validateQuality( $v ) ) {
+                               $res = parent::parseParamString( $m[2] );
+                               if ( $res ) {
+                                       $res['quality'] = $v;
+                               }
+                       }
+               } else {
+                       $res = parent::parseParamString( $str );
+               }
+               return $res;
+       }
+
+       function getScriptParams( $params ) {
+               $res = parent::getScriptParams( $params );
+               if ( isset( $params['quality'] ) ) {
+                       $res['quality'] = $params['quality'];
+               }
+               return $res;
+       }
+
        function getMetadata( $image, $filename ) {
                try {
                        $meta = BitmapMetadataHandler::Jpeg( $filename );
index 99eca62..d8d56a4 100644 (file)
@@ -106,6 +106,9 @@ abstract class MediaTransformOutput {
         */
        public function setStoragePath( $storagePath ) {
                $this->storagePath = $storagePath;
+               if ( $this->path === false ) {
+                       $this->path = $storagePath;
+               }
        }
 
        /**
@@ -140,9 +143,12 @@ abstract class MediaTransformOutput {
 
        /**
         * Check if an output thumbnail file actually exists.
+        *
         * This will return false if there was an error, the
         * thumbnail is to be handled client-side only, or if
         * transformation was deferred via TRANSFORM_LATER.
+        * This file may exist as a new file in /tmp, a file
+        * in permanent storage, or even refer to the original.
         *
         * @return bool
         */
index db0e579..6e50a8c 100644 (file)
@@ -28,7 +28,8 @@
  * @ingroup Cache
  */
 class HashBagOStuff extends BagOStuff {
-       var $bag;
+       /** @var array */
+       protected $bag;
 
        function __construct() {
                $this->bag = array();
index bc59c6f..9de840b 100644 (file)
@@ -1,4 +1,5 @@
 <?php
+// @codingStandardsIgnoreFile It's an external lib and it isn't. Let's not bother.
 /**
  * Memcached client for PHP.
  *
index c656bdd..497f75d 100644 (file)
@@ -29,7 +29,8 @@
  * @ingroup Cache
  */
 class MultiWriteBagOStuff extends BagOStuff {
-       var $caches;
+       /** @var array BagOStuff[] */
+       protected $caches;
 
        /**
         * Constructor. Parameters are:
index 3be251c..0009999 100644 (file)
@@ -27,7 +27,7 @@
  * @ingroup Cache
  */
 class ObjectCache {
-       static $instances = array();
+       public static $instances = array();
 
        /**
         * Get a cached instance of the specified type of cache object.
@@ -87,8 +87,9 @@ class ObjectCache {
                        $class = $params['class'];
                        return new $class( $params );
                } else {
-                       throw new MWException( "The definition of cache type \"" . print_r( $params, true ) . "\" lacks both " .
-                               "factory and class parameters." );
+                       throw new MWException( "The definition of cache type \""
+                               . print_r( $params, true ) . "\" lacks both "
+                               . "factory and class parameters." );
                }
        }
 
index e6a8c45..bcd5942 100644 (file)
  * @ingroup Cache
  */
 class SqlBagOStuff extends BagOStuff {
-       /**
-        * @var LoadBalancer
-        */
-       var $lb;
+       /** @var LoadBalancer */
+       protected $lb;
+
+       protected $serverInfos;
+
+       /** @var array */
+       protected $serverNames;
+
+       /** @var int */
+       protected $numServers;
+
+       /** @var array */
+       protected $conns;
+
+       /** @var int */
+       protected $lastExpireAll = 0;
 
-       var $serverInfos;
-       var $serverNames;
-       var $numServers;
-       var $conns;
-       var $lastExpireAll = 0;
-       var $purgePeriod = 100;
-       var $shards = 1;
-       var $tableName = 'objectcache';
+       /** @var int */
+       protected $purgePeriod = 100;
 
-       protected $connFailureTimes = array(); // UNIX timestamps
-       protected $connFailureErrors = array(); // exceptions
+       /** @var int */
+       protected $shards = 1;
+
+       /** @var string */
+       protected $tableName = 'objectcache';
+
+       /** @var array UNIX timestamps */
+       protected $connFailureTimes = array();
+
+       /** @var array Exceptions */
+       protected $connFailureErrors = array();
 
        /**
         * Constructor. Parameters are:
@@ -721,7 +736,8 @@ class SqlBagOStuff extends BagOStuff {
                if ( $exception->db && $exception->db->wasReadOnlyError() ) {
                        try {
                                $exception->db->rollback( __METHOD__ );
-                       } catch ( DBError $e ) {}
+                       } catch ( DBError $e ) {
+                       }
                }
                wfDebugLog( 'SQLBagOStuff', "DBError: {$exception->getMessage()}" );
                if ( $exception instanceof DBConnectionError ) {
@@ -780,4 +796,5 @@ class SqlBagOStuff extends BagOStuff {
 /**
  * Backwards compatibility alias
  */
-class MediaWikiBagOStuff extends SqlBagOStuff { }
+class MediaWikiBagOStuff extends SqlBagOStuff {
+}
index 464bacd..91f404a 100644 (file)
@@ -32,11 +32,23 @@ class CacheTime {
         */
        public $mUsedOptions;
 
-       var     $mVersion = Parser::VERSION,  # Compatibility check
-               $mCacheTime = '',             # Time when this object was generated, or -1 for uncacheable. Used in ParserCache.
-               $mCacheExpiry = null,         # Seconds after which the object should expire, use 0 for uncachable. Used in ParserCache.
-               $mContainsOldMagic,           # Boolean variable indicating if the input contained variables like {{CURRENTDAY}}
-               $mCacheRevisionId = null;     # Revision ID that was parsed
+       /** @var string Compatibility check */
+       protected $mVersion = Parser::VERSION;
+
+       /** @var string Time when this object was generated, or -1 for uncacheable. Used in ParserCache. */
+       protected $mCacheTime = '';
+
+       /**
+        * @var int Seconds after which the object should expire, use 0 for uncachable.
+        *   Used in ParserCache.
+        */
+       protected $mCacheExpiry = null;
+
+       /** @var bool Boolean variable indicating if the input contained variables like {{CURRENTDAY}} */
+       protected $mContainsOldMagic;
+
+       /** @var int Revision ID that was parsed */
+       protected $mCacheRevisionId = null;
 
        /**
         * @return string TS_MW timestamp
@@ -161,12 +173,14 @@ class CacheTime {
         */
        public function expired( $touched ) {
                global $wgCacheEpoch;
-               return !$this->isCacheable() || // parser says it's uncacheable
-                       $this->getCacheTime() < $touched ||
-                       $this->getCacheTime() <= $wgCacheEpoch ||
-                       $this->getCacheTime() < wfTimestamp( TS_MW, time() - $this->getCacheExpiry() ) || // expiry period has passed
-                       !isset( $this->mVersion ) ||
-                       version_compare( $this->mVersion, Parser::VERSION, "lt" );
+
+               return !$this->isCacheable() // parser says it's uncacheable
+                       || $this->getCacheTime() < $touched
+                       || $this->getCacheTime() <= $wgCacheEpoch
+                       || $this->getCacheTime() <
+                               wfTimestamp( TS_MW, time() - $this->getCacheExpiry() ) // expiry period has passed
+                       || !isset( $this->mVersion )
+                       || version_compare( $this->mVersion, Parser::VERSION, "lt" );
        }
 
        /**
index 65c3e1d..3425b6b 100644 (file)
@@ -71,7 +71,11 @@ class CoreParserFunctions {
                        $parser->setFunctionHook( 'displaytitle', array( __CLASS__, 'displaytitle' ), SFH_NO_HASH );
                }
                if ( $wgAllowSlowParserFunctions ) {
-                       $parser->setFunctionHook( 'pagesinnamespace', array( __CLASS__, 'pagesinnamespace' ), SFH_NO_HASH );
+                       $parser->setFunctionHook(
+                               'pagesinnamespace',
+                               array( __CLASS__, 'pagesinnamespace' ),
+                               SFH_NO_HASH
+                       );
                }
        }
 
@@ -83,7 +87,9 @@ class CoreParserFunctions {
        static function intFunction( $parser, $part1 = '' /*, ... */ ) {
                if ( strval( $part1 ) !== '' ) {
                        $args = array_slice( func_get_args(), 2 );
-                       $message = wfMessage( $part1, $args )->inLanguage( $parser->getOptions()->getUserLangObj() )->plain();
+                       $message = wfMessage( $part1, $args )
+                               ->inLanguage( $parser->getOptions()->getUserLangObj() )->plain();
+
                        return array( $message, 'noparse' => false );
                } else {
                        return array( 'found' => false );
@@ -188,7 +194,7 @@ class CoreParserFunctions {
        /**
         * @param Parser $parser
         * @param string $s
-        * @return
+        * @return string
         */
        static function lc( $parser, $s = '' ) {
                global $wgContLang;
@@ -198,7 +204,7 @@ class CoreParserFunctions {
        /**
         * @param Parser $parser
         * @param string $s
-        * @return
+        * @return string
         */
        static function uc( $parser, $s = '' ) {
                global $wgContLang;
@@ -285,7 +291,7 @@ class CoreParserFunctions {
         * @param Parser $parser
         * @param string $case
         * @param string $word
-        * @return
+        * @return string
         */
        static function grammar( $parser, $case = '', $word = '' ) {
                $word = $parser->killMarkers( $word );
@@ -295,7 +301,7 @@ class CoreParserFunctions {
        /**
         * @param Parser $parser
         * @param string $username
-        * @return
+        * @return string
         */
        static function gender( $parser, $username ) {
                wfProfileIn( __METHOD__ );
@@ -337,7 +343,7 @@ class CoreParserFunctions {
        /**
         * @param Parser $parser
         * @param string $text
-        * @return
+        * @return string
         */
        static function plural( $parser, $text = '' ) {
                $forms = array_slice( func_get_args(), 2 );
@@ -393,12 +399,21 @@ class CoreParserFunctions {
                // only requested titles that normalize to the actual title are allowed through
                // if $wgRestrictDisplayTitle is true (it is by default)
                // mimic the escaping process that occurs in OutputPage::setPageTitle
-               $text = Sanitizer::normalizeCharReferences( Sanitizer::removeHTMLtags( $text, $htmlTagsCallback, array(), array(), $bad ) );
+               $text = Sanitizer::normalizeCharReferences( Sanitizer::removeHTMLtags(
+                       $text,
+                       $htmlTagsCallback,
+                       array(),
+                       array(),
+                       $bad
+               ) );
                $title = Title::newFromText( Sanitizer::stripAllTags( $text ) );
 
                if ( !$wgRestrictDisplayTitle ) {
                        $parser->mOutput->setDisplayTitle( $text );
-               } elseif ( $title instanceof Title && !$title->hasFragment() && $title->equals( $parser->mTitle ) ) {
+               } elseif ( $title instanceof Title
+                       && !$title->hasFragment()
+                       && $title->equals( $parser->mTitle )
+               ) {
                        $parser->mOutput->setDisplayTitle( $text );
                }
 
@@ -466,6 +481,8 @@ class CoreParserFunctions {
         * corresponding magic word
         * Note: function name changed to "mwnamespace" rather than "namespace"
         * to not break PHP 5.3
+        * @param Parser $parser
+        * @param string $title
         * @return mixed|string
         */
        static function mwnamespace( $parser, $title = null ) {
@@ -521,6 +538,8 @@ class CoreParserFunctions {
        /**
         * Functions to get and normalize pagenames, corresponding to the magic words
         * of the same names
+        * @param Parser $parser
+        * @param string $title
         * @return string
         */
        static function pagename( $parser, $title = null ) {
@@ -626,6 +645,10 @@ class CoreParserFunctions {
         * Return the number of pages, files or subcats in the given category,
         * or 0 if it's nonexistent. This is an expensive parser function and
         * can't be called too many times per page.
+        * @param Parser $parser
+        * @param string $name
+        * @param string $arg1
+        * @param string $arg2
         * @return string
         */
        static function pagesincategory( $parser, $name = '', $arg1 = null, $arg2 = null ) {
@@ -855,8 +878,9 @@ class CoreParserFunctions {
                }
        }
 
-       // Usage {{filepath|300}}, {{filepath|nowiki}}, {{filepath|nowiki|300}} or {{filepath|300|nowiki}}
-       // or {{filepath|300px}}, {{filepath|200x300px}}, {{filepath|nowiki|200x300px}}, {{filepath|200x300px|nowiki}}
+       // Usage {{filepath|300}}, {{filepath|nowiki}}, {{filepath|nowiki|300}}
+       // or {{filepath|300|nowiki}} or {{filepath|300px}}, {{filepath|200x300px}},
+       // {{filepath|nowiki|200x300px}}, {{filepath|200x300px|nowiki}}.
        public static function filepath( $parser, $name = '', $argA = '', $argB = '' ) {
                $file = wfFindFile( $name );
 
@@ -995,6 +1019,7 @@ class CoreParserFunctions {
         * Get the pageid of a specified page
         * @param Parser $parser
         * @param string $title Title to get the pageid from
+        * @return int|null|string
         * @since 1.23
         */
        public static function pageid( $parser, $title = null ) {
@@ -1039,6 +1064,7 @@ class CoreParserFunctions {
         * Get the id from the last revision of a specified page.
         * @param Parser $parser
         * @param string $title Title to get the id from
+        * @return int|null|string
         * @since 1.23
         */
        public static function revisionid( $parser, $title = null ) {
@@ -1055,6 +1081,7 @@ class CoreParserFunctions {
         * Get the day from the last revision of a specified page.
         * @param Parser $parser
         * @param string $title Title to get the day from
+        * @return string
         * @since 1.23
         */
        public static function revisionday( $parser, $title = null ) {
@@ -1071,6 +1098,7 @@ class CoreParserFunctions {
         * Get the day with leading zeros from the last revision of a specified page.
         * @param Parser $parser
         * @param string $title Title to get the day from
+        * @return string
         * @since 1.23
         */
        public static function revisionday2( $parser, $title = null ) {
@@ -1087,6 +1115,7 @@ class CoreParserFunctions {
         * Get the month with leading zeros from the last revision of a specified page.
         * @param Parser $parser
         * @param string $title Title to get the month from
+        * @return string
         * @since 1.23
         */
        public static function revisionmonth( $parser, $title = null ) {
@@ -1103,6 +1132,7 @@ class CoreParserFunctions {
         * Get the month from the last revision of a specified page.
         * @param Parser $parser
         * @param string $title Title to get the month from
+        * @return string
         * @since 1.23
         */
        public static function revisionmonth1( $parser, $title = null ) {
@@ -1119,6 +1149,7 @@ class CoreParserFunctions {
         * Get the year from the last revision of a specified page.
         * @param Parser $parser
         * @param string $title Title to get the year from
+        * @return string
         * @since 1.23
         */
        public static function revisionyear( $parser, $title = null ) {
@@ -1135,6 +1166,7 @@ class CoreParserFunctions {
         * Get the timestamp from the last revision of a specified page.
         * @param Parser $parser
         * @param string $title Title to get the timestamp from
+        * @return string
         * @since 1.23
         */
        public static function revisiontimestamp( $parser, $title = null ) {
@@ -1151,6 +1183,7 @@ class CoreParserFunctions {
         * Get the user from the last revision of a specified page.
         * @param Parser $parser
         * @param string $title Title to get the user from
+        * @return string
         * @since 1.23
         */
        public static function revisionuser( $parser, $title = null ) {
index 3ddc9d4..f022646 100644 (file)
  * @ingroup Parser
  */
 class DateFormatter {
-       var $mSource, $mTarget;
-       var $monthNames = '', $rxDM, $rxMD, $rxDMY, $rxYDM, $rxMDY, $rxYMD;
+       protected $mSource;
 
-       var $regexes, $pDays, $pMonths, $pYears;
-       var $rules, $xMonths, $preferences;
+       protected $mTarget;
+
+       /** @var string */
+       protected $monthNames = '';
+
+       /** @todo Are these unused? */
+       private $rxDM;
+       private $rxMD;
+       private $rxDMY;
+       private $rxYDM;
+       private $rxMDY;
+       private $rxYMD;
+
+       /** @var array */
+       protected $regexes;
+
+       /** @todo Are these unused? */
+       private $pDays;
+       private $pMonths;
+       private $pYears;
+
+       /** @var array */
+       protected $rules;
+
+       /** @var array */
+       protected $xMonths;
+
+       /** @var array */
+       protected $preferences;
+
+       /** @var bool */
+       protected $mLinked;
 
        protected $lang;
 
@@ -205,7 +234,8 @@ class DateFormatter {
 
                $bits = array();
                $key = $this->keys[$this->mSource];
-               for ( $p = 0; $p < strlen( $key ); $p++ ) {
+               $keyLength = strlen( $key );
+               for ( $p = 0; $p < $keyLength; $p++ ) {
                        if ( $key[$p] != ' ' ) {
                                $bits[$key[$p]] = $matches[$p + 1];
                        }
@@ -254,7 +284,8 @@ class DateFormatter {
                        $bits['d'] = sprintf( '%02d', $bits['j'] );
                }
 
-               for ( $p = 0; $p < strlen( $format ); $p++ ) {
+               $formatLength = strlen( $format );
+               for ( $p = 0; $p < $formatLength; $p++ ) {
                        $char = $format[$p];
                        switch ( $char ) {
                                case 'd': # ISO day of month
@@ -293,6 +324,7 @@ class DateFormatter {
                        }
                }
                if ( $fail ) {
+                       /** @todo FIXME: $matches doesn't exist here, what's expected? */
                        $text = $matches[0];
                }
 
@@ -354,6 +386,7 @@ class DateFormatter {
 
        /**
         * @todo document
+        * @param string $iso
         * @return int|string
         */
        function makeNormalYear( $iso ) {
index 2f95af2..fd84265 100644 (file)
  * @ingroup Parser
  */
 class LinkHolderArray {
-       var $internals = array(), $interwikis = array();
-       var $size = 0;
-       var $parent;
+       /** @var array */
+       public $internals = array();
+
+       /** @var array */
+       public $interwikis = array();
+
+       /** @var int */
+       protected $size = 0;
+
+       /** @var Parser */
+       protected $parent;
+
+       /** @var int */
        protected $tempIdOffset;
 
        function __construct( $parent ) {
@@ -151,6 +161,7 @@ class LinkHolderArray {
        /**
         * Get a subset of the current LinkHolderArray which is sufficient to
         * interpret the given text.
+        * @param string $text
         * @return LinkHolderArray
         */
        function getSubArray( $text ) {
@@ -253,12 +264,14 @@ class LinkHolderArray {
        /**
         * Replace <!--LINK--> link placeholders with actual links, in the buffer
         *
+        * @param $text
         * @return array Array of link CSS classes, indexed by PDBK.
         */
        function replace( &$text ) {
                wfProfileIn( __METHOD__ );
 
-               $colours = $this->replaceInternal( $text ); // FIXME: replaceInternal doesn't return a value
+               /** @todo FIXME: replaceInternal doesn't return a value */
+               $colours = $this->replaceInternal( $text );
                $this->replaceInterwiki( $text );
 
                wfProfileOut( __METHOD__ );
@@ -334,7 +347,8 @@ class LinkHolderArray {
 
                        $res = $dbr->select(
                                'page',
-                               array( 'page_id', 'page_namespace', 'page_title', 'page_is_redirect', 'page_len', 'page_latest' ),
+                               array( 'page_id', 'page_namespace', 'page_title',
+                                       'page_is_redirect', 'page_len', 'page_latest' ),
                                $dbr->makeList( $where, LIST_OR ),
                                __METHOD__
                        );
@@ -537,7 +551,8 @@ class LinkHolderArray {
                        // construct query
                        $dbr = wfGetDB( DB_SLAVE );
                        $varRes = $dbr->select( 'page',
-                               array( 'page_id', 'page_namespace', 'page_title', 'page_is_redirect', 'page_len', 'page_latest' ),
+                               array( 'page_id', 'page_namespace', 'page_title',
+                                       'page_is_redirect', 'page_len', 'page_latest' ),
                                $linkBatch->constructSet( 'page', $dbr ),
                                __METHOD__
                        );
index 7423006..2066580 100644 (file)
@@ -119,101 +119,205 @@ class Parser {
        const TOC_START = '<mw:toc>';
        const TOC_END = '</mw:toc>';
 
-       # Persistent:
-       var $mTagHooks = array();
-       var $mTransparentTagHooks = array();
-       var $mFunctionHooks = array();
-       var $mFunctionSynonyms = array( 0 => array(), 1 => array() );
-       var $mFunctionTagHooks = array();
-       var $mStripList = array();
-       var $mDefaultStripList = array();
-       var $mVarCache = array();
-       var $mImageParams = array();
-       var $mImageParamsMagicArray = array();
-       var $mMarkerIndex = 0;
-       var $mFirstCall = true;
+       # Persistent
 
-       # Initialised by initialiseVariables()
+       /** @var array */
+       public $mTagHooks = array();
 
-       /**
-        * @var MagicWordArray
-        */
-       var $mVariables;
+       /** @var array */
+       public $mTransparentTagHooks = array();
+
+       /** @var array */
+       public $mFunctionHooks = array();
+
+       /** @var array */
+       protected $mFunctionSynonyms = array( 0 => array(), 1 => array() );
+
+       /** @var array */
+       protected $mFunctionTagHooks = array();
+
+       /** @var array */
+       protected $mStripList = array();
 
        /**
-        * @var MagicWordArray
+        * @var array
+        * @todo Unused?
         */
-       var $mSubstWords;
-       var $mConf, $mPreprocessor, $mExtLinkBracketedRegex, $mUrlProtocols; # Initialised in constructor
+       private $mDefaultStripList = array();
+
+       /** @var array */
+       protected $mVarCache = array();
+
+       /** @var array */
+       protected $mImageParams = array();
+
+       /** @var array */
+       protected $mImageParamsMagicArray = array();
+
+       /** @var int */
+       public $mMarkerIndex = 0;
+
+       /** @var bool */
+       protected $mFirstCall = true;
+
+       # Initialised by initialiseVariables()
+
+       /** @var MagicWordArray */
+       public $mVariables;
+
+       /** @var MagicWordArray */
+       protected $mSubstWords;
+
+       # Initialised in constructor
+
+       /** @var array */
+       protected $mConf;
+
+       /** @var Parser */
+       public $mPreprocessor;
+
+       /** @var string */
+       protected $mExtLinkBracketedRegex;
+
+       /** @var string */
+       protected $mUrlProtocols;
 
        # Cleared with clearState():
-       /**
-        * @var ParserOutput
-        */
-       var $mOutput;
-       var $mAutonumber, $mDTopen;
+
+       /** @var ParserOutput */
+       public $mOutput;
+
+       /** @var int */
+       protected $mAutonumber;
+
+       /** @var bool */
+       protected $mDTopen;
+
+       /** @var StripState */
+       public $mStripState;
 
        /**
-        * @var StripState
+        * @var array
+        * @todo Unused?
         */
-       var $mStripState;
+       private $mIncludeCount;
 
-       var $mIncludeCount, $mArgStack, $mLastSection, $mInPre;
        /**
-        * @var LinkHolderArray
+        * @var bool
+        * @todo Unused?
         */
-       var $mLinkHolders;
+       private $mArgStack;
 
-       var $mLinkID;
-       var $mIncludeSizes, $mPPNodeCount, $mGeneratedPPNodeCount, $mHighestExpansionDepth;
-       var $mDefaultSort;
-       var $mTplExpandCache; # empty-frame expansion cache
-       var $mTplRedirCache, $mTplDomCache, $mHeadings, $mDoubleUnderscores;
-       var $mExpensiveFunctionCount; # number of expensive parser function calls
-       var $mShowToc, $mForceTocPosition;
+       /** @var string */
+       protected $mLastSection;
 
-       /**
-        * @var User
-        */
-       var $mUser; # User object; only used when doing pre-save transform
+       /** @var bool */
+       protected $mInPre;
+
+       /** @var LinkHolderArray */
+       protected $mLinkHolders;
+
+       /** @var int */
+       protected $mLinkID;
+
+       /** @var array */
+       protected $mIncludeSizes;
+
+       /** @var int */
+       public $mPPNodeCount;
+
+       /** @var int */
+       public $mGeneratedPPNodeCount;
+
+       /** @var int */
+       public $mHighestExpansionDepth;
+
+       /** @var bool|string */
+       protected $mDefaultSort;
+
+       /** @var array Empty-frame expansion cache */
+       protected $mTplExpandCache;
+
+       /** @var array */
+       protected $mTplRedirCache;
+
+       /** @var array */
+       protected $mTplDomCache;
+
+       /** @var array */
+       public $mHeadings;
+
+       /** @var array */
+       protected $mDoubleUnderscores;
+
+       /** @var int Number of expensive parser function calls */
+       protected $mExpensiveFunctionCount;
+
+       /** @var bool */
+       protected $mShowToc;
+
+       /** @var bool */
+       protected $mForceTocPosition;
+
+       /** @var User User object; only used when doing pre-save transform */
+       protected $mUser;
 
        # Temporary
        # These are variables reset at least once per parse regardless of $clearState
 
-       /**
-        * @var ParserOptions
-        */
-       var $mOptions;
+       /** @var ParserOptions */
+       public $mOptions;
 
-       /**
-        * @var Title
-        */
-       var $mTitle;        # Title context, used for self-link rendering and similar things
-       var $mOutputType;   # Output type, one of the OT_xxx constants
-       var $ot;            # Shortcut alias, see setOutputType()
-       var $mRevisionObject; # The revision object of the specified revision ID
-       var $mRevisionId;   # ID to display in {{REVISIONID}} tags
-       var $mRevisionTimestamp; # The timestamp of the specified revision ID
-       var $mRevisionUser; # User to display in {{REVISIONUSER}} tag
-       var $mRevisionSize; # Size to display in {{REVISIONSIZE}} variable
-       var $mRevIdForTs;   # The revision ID which was used to fetch the timestamp
-       var $mInputSize = false; # For {{PAGESIZE}} on current page.
+       /** @var Title Title context, used for self-link rendering and similar things */
+       public $mTitle;
+
+       /** @var array Shortcut alias, see setOutputType() */
+       public $ot;
+
+       /** @var string The timestamp of the specified revision ID */
+       public $mRevisionTimestamp;
+
+       /** @var string */
+       public $mUniqPrefix;
 
        /**
-        * @var string
+        * @var boolean Recursive call protection.
+        * This variable should be treated as if it were private.
         */
-       var $mUniqPrefix;
+       public $mInParse = false;
+
+       /** @var int Output type, one of the OT_xxx constants */
+       protected $mOutputType;
+
+       /** @var Revision The revision object of the specified revision ID */
+       protected $mRevisionObject;
+
+       /** @var int ID to display in {{REVISIONID}} tags */
+       protected $mRevisionId;
+
+       /** @var string User to display in {{REVISIONUSER}} tag */
+       protected $mRevisionUser;
+
+       /** @var int Size to display in {{REVISIONSIZE}} variable */
+       protected $mRevisionSize;
+
+       /** @var bool|int For {{PAGESIZE}} on current page. */
+       protected $mInputSize = false;
 
        /**
         * @var array Array with the language name of each language link (i.e. the
         * interwiki prefix) in the key, value arbitrary. Used to avoid sending
         * duplicate language links to the ParserOutput.
         */
-       var $mLangLinkLanguages;
+       protected $mLangLinkLanguages;
+
+       /**
+        * @var int The revision ID which was used to fetch the timestamp
+        * @todo Unused?
+        */
+       private $mRevIdForTs;
 
        /**
-        * Constructor
-        *
         * @param array $conf
         */
        public function __construct( $conf = array() ) {
@@ -254,6 +358,7 @@ class Parser {
         * Allow extensions to clean up when the parser is cloned
         */
        function __clone() {
+               $this->mInParse = false;
                wfRunHooks( 'ParserCloned', array( $this ) );
        }
 
@@ -353,7 +458,9 @@ class Parser {
         * @param int $revid Number to pass in {{REVISIONID}}
         * @return ParserOutput A ParserOutput
         */
-       public function parse( $text, Title $title, ParserOptions $options, $linestart = true, $clearState = true, $revid = null ) {
+       public function parse( $text, Title $title, ParserOptions $options,
+               $linestart = true, $clearState = true, $revid = null
+       ) {
                /**
                 * First pass--just handle <nowiki> sections, pass the rest off
                 * to internalParse() which does all the real work.
@@ -364,6 +471,10 @@ class Parser {
                wfProfileIn( __METHOD__ );
                wfProfileIn( $fname );
 
+               if ( $clearState ) {
+                       $magicScopeVariable = $this->lock();
+               }
+
                $this->startParse( $title, $options, self::OT_HTML, $clearState );
 
                $this->mInputSize = strlen( $text );
@@ -591,7 +702,7 @@ class Parser {
         * If $frame is not provided, then template variables (e.g., {{{1}}}) within $text are not expanded
         *
         * @param string $text Text extension wants to have parsed
-        * @param PPFrame $frame The frame to use for expanding any template variables
+        * @param bool|PPFrame $frame The frame to use for expanding any template variables
         *
         * @return string
         */
@@ -615,6 +726,7 @@ class Parser {
         */
        function preprocess( $text, Title $title = null, ParserOptions $options, $revid = null ) {
                wfProfileIn( __METHOD__ );
+               $magicScopeVariable = $this->lock();
                $this->startParse( $title, $options, self::OT_PREPROCESS, true );
                if ( $revid !== null ) {
                        $this->mRevisionId = $revid;
@@ -632,7 +744,7 @@ class Parser {
         * hook.
         *
         * @param string $text Text to be expanded
-        * @param PPFrame $frame The frame to use for expanding any template variables
+        * @param bool|PPFrame $frame The frame to use for expanding any template variables
         * @return string
         * @since 1.19
         */
@@ -662,6 +774,7 @@ class Parser {
                $text = $msg->params( $params )->plain();
 
                # Parser (re)initialisation
+               $magicScopeVariable = $this->lock();
                $this->startParse( $title, $options, self::OT_PLAIN, true );
 
                $flags = PPFrame::NO_ARGS | PPFrame::NO_TEMPLATES;
@@ -1078,7 +1191,10 @@ class Parser {
                                array_push( $tr_history, false );
                                array_push( $td_history, false );
                                array_push( $last_tag_history, '' );
-                       } elseif ( $first_character === '|' || $first_character === '!' || substr( $line, 0, 2 ) === '|+' ) {
+                       } elseif ( $first_character === '|'
+                               || $first_character === '!'
+                               || substr( $line, 0, 2 ) === '|+'
+                       ) {
                                # This might be cell elements, td, th or captions
                                if ( substr( $line, 0, 2 ) === '|+' ) {
                                        $first_character = '+';
@@ -1223,7 +1339,12 @@ class Parser {
                }
 
                wfRunHooks( 'InternalParseBeforeSanitize', array( &$this, &$text, &$this->mStripState ) );
-               $text = Sanitizer::removeHTMLtags( $text, array( &$this, 'attributeStripCallback' ), false, array_keys( $this->mTransparentTagHooks ) );
+               $text = Sanitizer::removeHTMLtags(
+                       $text,
+                       array( &$this, 'attributeStripCallback' ),
+                       false,
+                       array_keys( $this->mTransparentTagHooks )
+               );
                wfRunHooks( 'InternalParseBeforeLinks', array( &$this, &$text, &$this->mStripState ) );
 
                # Tables need to come after variable replacement for things to work
@@ -1629,7 +1750,8 @@ class Parser {
                $bits = preg_split( $this->mExtLinkBracketedRegex, $text, -1, PREG_SPLIT_DELIM_CAPTURE );
                if ( $bits === false ) {
                        wfProfileOut( __METHOD__ );
-                       throw new MWException( "PCRE needs to be compiled with --enable-unicode-properties in order for MediaWiki to function" );
+                       throw new MWException( "PCRE needs to be compiled with "
+                               . "--enable-unicode-properties in order for MediaWiki to function" );
                }
                $s = array_shift( $bits );
 
@@ -1775,13 +1897,12 @@ class Parser {
        /**
         * make an image if it's allowed, either through the global
         * option, through the exception, or through the on-wiki whitelist
-        * @private
         *
-        * $param string $url
+        * @param string $url
         *
         * @return string
         */
-       function maybeMakeExternalImage( $url ) {
+       private function maybeMakeExternalImage( $url ) {
                $imagesfrom = $this->mOptions->getAllowExternalImagesFrom();
                $imagesexception = !empty( $imagesfrom );
                $text = false;
@@ -1799,16 +1920,23 @@ class Parser {
                } else {
                        $imagematch = false;
                }
+
                if ( $this->mOptions->getAllowExternalImages()
-                       || ( $imagesexception && $imagematch ) ) {
+                       || ( $imagesexception && $imagematch )
+               ) {
                        if ( preg_match( self::EXT_IMAGE_REGEX, $url ) ) {
                                # Image found
                                $text = Linker::makeExternalImage( $url );
                        }
                }
                if ( !$text && $this->mOptions->getEnableImageWhitelist()
-                       && preg_match( self::EXT_IMAGE_REGEX, $url ) ) {
-                       $whitelist = explode( "\n", wfMessage( 'external_image_whitelist' )->inContentLanguage()->text() );
+                       && preg_match( self::EXT_IMAGE_REGEX, $url )
+               ) {
+                       $whitelist = explode(
+                               "\n",
+                               wfMessage( 'external_image_whitelist' )->inContentLanguage()->text()
+                       );
+
                        foreach ( $whitelist as $entry ) {
                                # Sanitize the regex fragment, make it case-insensitive, ignore blank entries/comments
                                if ( strpos( $entry, '#' ) === 0 || $entry === '' ) {
@@ -1901,8 +2029,11 @@ class Parser {
                $useSubpages = $this->areSubpagesAllowed();
                wfProfileOut( __METHOD__ . '-setup' );
 
+               // @codingStandardsIgnoreStart Squiz.WhiteSpace.SemicolonSpacing.Incorrect
                # Loop for each link
                for ( ; $line !== false && $line !== null; $a->next(), $line = $a->current() ) {
+                       // @codingStandardsIgnoreStart
+
                        # Check for excessive memory usage
                        if ( $holders->isBig() ) {
                                # Too big
@@ -1953,7 +2084,8 @@ class Parser {
                                        $m[1] = str_replace( array( '<', '>' ), array( '&lt;', '&gt;' ), rawurldecode( $m[1] ) );
                                }
                                $trail = $m[3];
-                       } elseif ( preg_match( $e1_img, $line, $m ) ) { # Invalid, but might be an image with a link in its caption
+                       } elseif ( preg_match( $e1_img, $line, $m ) ) {
+                               # Invalid, but might be an image with a link in its caption
                                $might_be_img = true;
                                $text = $m[2];
                                if ( strpos( $m[1], '%' ) !== false ) {
@@ -2063,7 +2195,9 @@ class Parser {
                        if ( $noforce ) {
                                # Interwikis
                                wfProfileIn( __METHOD__ . "-interwiki" );
-                               if ( $iw && $this->mOptions->getInterwikiMagic() && $nottalk && Language::fetchLanguageName( $iw, null, 'mw' ) ) {
+                               if ( $iw && $this->mOptions->getInterwikiMagic()
+                                       && $nottalk && Language::fetchLanguageName( $iw, null, 'mw' )
+                               ) {
                                        // XXX: the above check prevents links to sites with identifiers that are not language codes
 
                                        # Bug 24502: filter duplicates
@@ -2335,7 +2469,7 @@ class Parser {
        }
 
        /**
-        * TODO: document
+        * @todo Document
         * @param string $char
         * @private
         *
@@ -2475,13 +2609,22 @@ class Parser {
                                wfProfileIn( __METHOD__ . "-paragraph" );
                                # No prefix (not in list)--go to paragraph mode
                                # XXX: use a stack for nestable elements like span, table and div
-                               $openmatch = preg_match( '/(?:<table|<h1|<h2|<h3|<h4|<h5|<h6|<pre|<tr|<p|<ul|<ol|<dl|<li|<\\/tr|<\\/td|<\\/th)/iS', $t );
+                               $openmatch = preg_match(
+                                       '/(?:<table|<h1|<h2|<h3|<h4|<h5|<h6|<pre|<tr|'
+                                               . '<p|<ul|<ol|<dl|<li|<\\/tr|<\\/td|<\\/th)/iS',
+                                       $t
+                               );
                                $closematch = preg_match(
-                                       '/(?:<\\/table|<\\/h1|<\\/h2|<\\/h3|<\\/h4|<\\/h5|<\\/h6|' .
-                                       '<td|<th|<\\/?blockquote|<\\/?div|<hr|<\\/pre|<\\/p|<\\/mw:|' . $this->mUniqPrefix . '-pre|<\\/li|<\\/ul|<\\/ol|<\\/dl|<\\/?center)/iS', $t );
+                                       '/(?:<\\/table|<\\/h1|<\\/h2|<\\/h3|<\\/h4|<\\/h5|<\\/h6|'
+                                               . '<td|<th|<\\/?blockquote|<\\/?div|<hr|<\\/pre|<\\/p|<\\/mw:|'
+                                               . $this->mUniqPrefix
+                                               . '-pre|<\\/li|<\\/ul|<\\/ol|<\\/dl|<\\/?center)/iS',
+                                       $t
+                               );
+
                                if ( $openmatch or $closematch ) {
                                        $paragraphStack = false;
-                                       # TODO bug 5718: paragraph closed
+                                       # @todo bug 5718: paragraph closed
                                        $output .= $this->closeParagraph();
                                        if ( $preOpenMatch and !$preCloseMatch ) {
                                                $this->mInPre = true;
@@ -2493,7 +2636,10 @@ class Parser {
                                        }
                                        $inBlockElem = !$closematch;
                                } elseif ( !$inBlockElem && !$this->mInPre ) {
-                                       if ( ' ' == substr( $t, 0, 1 ) and ( $this->mLastSection === 'pre' || trim( $t ) != '' ) and !$inBlockquote ) {
+                                       if ( ' ' == substr( $t, 0, 1 )
+                                               && ( $this->mLastSection === 'pre' || trim( $t ) != '' )
+                                               && !$inBlockquote
+                                       ) {
                                                # pre
                                                if ( $this->mLastSection !== 'pre' ) {
                                                        $paragraphStack = false;
@@ -2731,7 +2877,7 @@ class Parser {
         * @return string
         */
        function getVariableValue( $index, $frame = false ) {
-               global $wgContLang, $wgSitename, $wgServer;
+               global $wgContLang, $wgSitename, $wgServer, $wgServerName;
                global $wgArticlePath, $wgScriptPath, $wgStylePath;
 
                if ( is_null( $this->mTitle ) ) {
@@ -2823,13 +2969,21 @@ class Parser {
                                $value = wfEscapeWikiText( $this->mTitle->getRootText() );
                                break;
                        case 'rootpagenamee':
-                               $value = wfEscapeWikiText( wfUrlEncode( str_replace( ' ', '_', $this->mTitle->getRootText() ) ) );
+                               $value = wfEscapeWikiText( wfUrlEncode( str_replace(
+                                       ' ',
+                                       '_',
+                                       $this->mTitle->getRootText()
+                               ) ) );
                                break;
                        case 'basepagename':
                                $value = wfEscapeWikiText( $this->mTitle->getBaseText() );
                                break;
                        case 'basepagenamee':
-                               $value = wfEscapeWikiText( wfUrlEncode( str_replace( ' ', '_', $this->mTitle->getBaseText() ) ) );
+                               $value = wfEscapeWikiText( wfUrlEncode( str_replace(
+                                       ' ',
+                                       '_',
+                                       $this->mTitle->getBaseText()
+                               ) ) );
                                break;
                        case 'talkpagename':
                                if ( $this->mTitle->canTalk() ) {
@@ -2940,7 +3094,9 @@ class Parser {
                                $value = $this->mTitle->getNamespace();
                                break;
                        case 'talkspace':
-                               $value = $this->mTitle->canTalk() ? str_replace( '_', ' ', $this->mTitle->getTalkNsText() ) : '';
+                               $value = $this->mTitle->canTalk()
+                                       ? str_replace( '_', ' ', $this->mTitle->getTalkNsText() )
+                                       : '';
                                break;
                        case 'talkspacee':
                                $value = $this->mTitle->canTalk() ? wfUrlencode( $this->mTitle->getTalkNsText() ) : '';
@@ -2972,13 +3128,19 @@ class Parser {
                                $value = $pageLang->formatNum( MWTimestamp::getInstance( $ts )->format( 'w' ) );
                                break;
                        case 'localdayname':
-                               $value = $pageLang->getWeekdayName( (int)MWTimestamp::getLocalInstance( $ts )->format( 'w' ) + 1 );
+                               $value = $pageLang->getWeekdayName(
+                                       (int)MWTimestamp::getLocalInstance( $ts )->format( 'w' ) + 1
+                               );
                                break;
                        case 'localyear':
                                $value = $pageLang->formatNum( MWTimestamp::getLocalInstance( $ts )->format( 'Y' ), true );
                                break;
                        case 'localtime':
-                               $value = $pageLang->time( MWTimestamp::getLocalInstance( $ts )->format( 'YmdHis' ), false, false );
+                               $value = $pageLang->time(
+                                       MWTimestamp::getLocalInstance( $ts )->format( 'YmdHis' ),
+                                       false,
+                                       false
+                               );
                                break;
                        case 'localhour':
                                $value = $pageLang->formatNum( MWTimestamp::getLocalInstance( $ts )->format( 'H' ), true );
@@ -3032,8 +3194,7 @@ class Parser {
                        case 'server':
                                return $wgServer;
                        case 'servername':
-                               $serverParts = wfParseUrl( $wgServer );
-                               return $serverParts && isset( $serverParts['host'] ) ? $serverParts['host'] : $wgServer;
+                               return $wgServerName;
                        case 'scriptpath':
                                return $wgScriptPath;
                        case 'stylepath':
@@ -3048,7 +3209,11 @@ class Parser {
                                break;
                        default:
                                $ret = null;
-                               wfRunHooks( 'ParserGetVariableValueSwitch', array( &$this, &$this->mVarCache, &$index, &$ret, &$frame ) );
+                               wfRunHooks(
+                                       'ParserGetVariableValueSwitch',
+                                       array( &$this, &$this->mVarCache, &$index, &$ret, &$frame )
+                               );
+
                                return $ret;
                }
 
@@ -3132,15 +3297,16 @@ class Parser {
         *  self::OT_HTML: all templates and extension tags
         *
         * @param string $text The text to transform
-        * @param PPFrame $frame Object describing the arguments passed to the template.
-        *        Arguments may also be provided as an associative array, as was the usual case before MW1.12.
-        *        Providing arguments this way may be useful for extensions wishing to perform variable replacement explicitly.
-        * @param bool $argsOnly Only do argument (triple-brace) expansion, not double-brace expansion
-        * @private
-        *
+        * @param bool|PPFrame $frame Object describing the arguments passed to the
+        *   template. Arguments may also be provided as an associative array, as
+        *   was the usual case before MW1.12. Providing arguments this way may be
+        *   useful for extensions wishing to perform variable replacement
+        *   explicitly.
+        * @param bool $argsOnly Only do argument (triple-brace) expansion, not
+        *   double-brace expansion.
         * @return string
         */
-       function replaceVariables( $text, $frame = false, $argsOnly = false ) {
+       public function replaceVariables( $text, $frame = false, $argsOnly = false ) {
                # Is there any text? Also, Prevent too big inclusions!
                if ( strlen( $text ) < 1 || strlen( $text ) > $this->mOptions->getMaxIncludeSize() ) {
                        return $text;
@@ -3150,7 +3316,8 @@ class Parser {
                if ( $frame === false ) {
                        $frame = $this->getPreprocessor()->newFrame();
                } elseif ( !( $frame instanceof PPFrame ) ) {
-                       wfDebug( __METHOD__ . " called using plain parameters instead of a PPFrame instance. Creating custom frame.\n" );
+                       wfDebug( __METHOD__ . " called using plain parameters instead of "
+                               . "a PPFrame instance. Creating custom frame.\n" );
                        $frame = $this->getPreprocessor()->newCustomFrame( $frame );
                }
 
@@ -3211,8 +3378,8 @@ class Parser {
         *   'expansion-depth-exceeded' (corresponding messages:
         *       'expansion-depth-exceeded-warning',
         *       'expansion-depth-exceeded-category')
-        * @param int|null $current Current value
-        * @param int|null $max Maximum allowed, when an explicit limit has been
+        * @param string|int|null $current Current value
+        * @param string|int|null $max Maximum allowed, when an explicit limit has been
         *       exceeded, provide the values (optional)
         */
        function limitationWarn( $limitationType, $current = '', $max = '' ) {
@@ -3228,25 +3395,31 @@ class Parser {
         * replacing any variables or templates within the template.
         *
         * @param array $piece The parts of the template
-        *  $piece['title']: the title, i.e. the part before the |
-        *  $piece['parts']: the parameter array
-        *  $piece['lineStart']: whether the brace was at the start of a line
+        *   $piece['title']: the title, i.e. the part before the |
+        *   $piece['parts']: the parameter array
+        *   $piece['lineStart']: whether the brace was at the start of a line
         * @param PPFrame $frame The current frame, contains template arguments
-        * @throws MWException
+        * @throws Exception
         * @return string The text of the template
-        * @private
         */
-       function braceSubstitution( $piece, $frame ) {
+       public function braceSubstitution( $piece, $frame ) {
                wfProfileIn( __METHOD__ );
                wfProfileIn( __METHOD__ . '-setup' );
 
-               # Flags
-               $found = false;             # $text has been filled
-               $nowiki = false;            # wiki markup in $text should be escaped
-               $isHTML = false;            # $text is HTML, armour it against wikitext transformation
-               $forceRawInterwiki = false; # Force interwiki transclusion to be done in raw mode not rendered
-               $isChildObj = false;        # $text is a DOM node needing expansion in a child frame
-               $isLocalObj = false;        # $text is a DOM node needing expansion in the current frame
+               // Flags
+
+               // $text has been filled
+               $found = false;
+               // wiki markup in $text should be escaped
+               $nowiki = false;
+               // $text is HTML, armour it against wikitext transformation
+               $isHTML = false;
+               // Force interwiki transclusion to be done in raw mode not rendered
+               $forceRawInterwiki = false;
+               // $text is a DOM node needing expansion in a child frame
+               $isChildObj = false;
+               // $text is a DOM node needing expansion in the current frame
+               $isLocalObj = false;
 
                # Title object, where $text came from
                $title = false;
@@ -3261,7 +3434,8 @@ class Parser {
                $originalTitle = $part1;
 
                # $args is a list of argument nodes, starting from index 0, not including $part1
-               # @todo FIXME: If piece['parts'] is null then the call to getLength() below won't work b/c this $args isn't an object
+               # @todo FIXME: If piece['parts'] is null then the call to getLength()
+               # below won't work b/c this $args isn't an object
                $args = ( null == $piece['parts'] ) ? array() : $piece['parts'];
                wfProfileOut( __METHOD__ . '-setup' );
 
@@ -3401,7 +3575,8 @@ class Parser {
                                        // "uselang" will have no effect since the Language object
                                        // is forced to the one defined in ParserOptions.
                                        $pageArgs = array();
-                                       for ( $i = 0; $i < $args->getLength(); $i++ ) {
+                                       $argsLength = $args->getLength();
+                                       for ( $i = 0; $i < $argsLength; $i++ ) {
                                                $bits = $args->item( $i )->splitArg();
                                                if ( strval( $bits['index'] ) === '' ) {
                                                        $name = trim( $frame->expand( $bits['name'], PPFrame::STRIP_COMMENTS ) );
@@ -3534,7 +3709,8 @@ class Parser {
                                preg_replace( '/^:/', '', $originalTitle );
                                $text = "[[:$originalTitle]]";
                        }
-                       $text .= $this->insertStripItem( '<!-- WARNING: template omitted, post-expand include size too large -->' );
+                       $text .= $this->insertStripItem( '<!-- WARNING: template omitted, '
+                               . 'post-expand include size too large -->' );
                        $this->limitationWarn( 'post-expand-template-inclusion' );
                }
 
@@ -3564,6 +3740,7 @@ class Parser {
         * @param PPFrame $frame The current frame, contains template arguments
         * @param string $function Function name
         * @param array $args Arguments to the function
+        * @throws MWException
         * @return array
         */
        public function callParserFunction( $frame, $function, array $args = array() ) {
@@ -3708,7 +3885,8 @@ class Parser {
         * @return array ( string or false, Title )
         */
        function fetchTemplateAndTitle( $title ) {
-               $templateCb = $this->mOptions->getTemplateCallback(); # Defaults to Parser::statelessFetchTemplate()
+               // Defaults to Parser::statelessFetchTemplate()
+               $templateCb = $this->mOptions->getTemplateCallback();
                $stuff = call_user_func( $templateCb, $title, $this );
                $text = $stuff['text'];
                $finalTitle = isset( $stuff['finalTitle'] ) ? $stuff['finalTitle'] : $title;
@@ -3740,7 +3918,7 @@ class Parser {
         * Can be overridden via ParserOptions::setTemplateCallback().
         *
         * @param Title $title
-        * @param Parser $parser
+        * @param bool|Parser $parser
         *
         * @return array
         */
@@ -3917,8 +4095,10 @@ class Parser {
                $status = $req->execute(); // Status object
                if ( $status->isOK() ) {
                        $text = $req->getContent();
-               } elseif ( $req->getStatus() != 200 ) { // Though we failed to fetch the content, this status is useless.
-                       return wfMessage( 'scarytranscludefailed-httpstatus', $url, $req->getStatus() /* HTTP status */ )->inContentLanguage()->text();
+               } elseif ( $req->getStatus() != 200 ) {
+                       // Though we failed to fetch the content, this status is useless.
+                       return wfMessage( 'scarytranscludefailed-httpstatus' )
+                               ->params( $url, $req->getStatus() /* HTTP status */ )->inContentLanguage()->text();
                } else {
                        return wfMessage( 'scarytranscludefailed', $url )->inContentLanguage()->text();
                }
@@ -4000,7 +4180,8 @@ class Parser {
                $name = $frame->expand( $params['name'] );
                $attrText = !isset( $params['attr'] ) ? null : $frame->expand( $params['attr'] );
                $content = !isset( $params['inner'] ) ? null : $frame->expand( $params['inner'] );
-               $marker = "{$this->mUniqPrefix}-$name-" . sprintf( '%08X', $this->mMarkerIndex++ ) . self::MARKER_SUFFIX;
+               $marker = "{$this->mUniqPrefix}-$name-"
+                       . sprintf( '%08X', $this->mMarkerIndex++ ) . self::MARKER_SUFFIX;
 
                $isFunctionTag = isset( $this->mFunctionTagHooks[strtolower( $name )] ) &&
                        ( $this->ot['html'] || $this->ot['pre'] );
@@ -4132,7 +4313,9 @@ class Parser {
                if ( isset( $this->mDoubleUnderscores['notoc'] ) && !$this->mForceTocPosition ) {
                        $this->mShowToc = false;
                }
-               if ( isset( $this->mDoubleUnderscores['hiddencat'] ) && $this->mTitle->getNamespace() == NS_CATEGORY ) {
+               if ( isset( $this->mDoubleUnderscores['hiddencat'] )
+                       && $this->mTitle->getNamespace() == NS_CATEGORY
+               ) {
                        $this->addTrackingCategory( 'hidden-category-category' );
                }
                # (bug 8068) Allow control over whether robots index a page.
@@ -4227,7 +4410,11 @@ class Parser {
                # Get all headlines for numbering them and adding funky stuff like [edit]
                # links - this is for later, but we need the number of headlines right now
                $matches = array();
-               $numMatches = preg_match_all( '/<H(?P<level>[1-6])(?P<attrib>.*?' . '>)\s*(?P<header>[\s\S]*?)\s*<\/H[1-6] *>/i', $text, $matches );
+               $numMatches = preg_match_all(
+                       '/<H(?P<level>[1-6])(?P<attrib>.*?' . '>)\s*(?P<header>[\s\S]*?)\s*<\/H[1-6] *>/i',
+                       $text,
+                       $matches
+               );
 
                # if there are fewer than 4 headlines in the article, do not show TOC
                # unless it's been explicitly enabled.
@@ -4376,7 +4563,10 @@ class Parser {
                        # We strip any parameter from accepted tags (second regex), except dir="rtl|ltr" from <span>,
                        # to allow setting directionality in toc items.
                        $tocline = preg_replace(
-                               array( '#<(?!/?(span|sup|sub|i|b)(?: [^>]*)?>).*?' . '>#', '#<(/?(?:span(?: dir="(?:rtl|ltr)")?|sup|sub|i|b))(?: .*?)?' . '>#' ),
+                               array(
+                                       '#<(?!/?(span|sup|sub|i|b)(?: [^>]*)?>).*?' . '>#',
+                                       '#<(/?(?:span(?: dir="(?:rtl|ltr)")?|sup|sub|i|b))(?: .*?)?' . '>#'
+                               ),
                                array( '', '<$1>' ),
                                $safeHeadline
                        );
@@ -4440,7 +4630,11 @@ class Parser {
                        # Don't number the heading if it is the only one (looks silly)
                        if ( count( $matches[3] ) > 1 && $this->mOptions->getNumberHeadings() ) {
                                # the two are different if the line contains a link
-                               $headline = Html::element( 'span', array( 'class' => 'mw-headline-number' ), $numbering ) . ' ' . $headline;
+                               $headline = Html::element(
+                                       'span',
+                                       array( 'class' => 'mw-headline-number' ),
+                                       $numbering
+                               ) . ' ' . $headline;
                        }
 
                        # Create the anchor for linking from the TOC to the section
@@ -4490,14 +4684,22 @@ class Parser {
                                        # that sections inside <includeonly> should be counted.
                                        $editlinkArgs = array( $titleText, "T-$sectionIndex"/*, null */ );
                                } else {
-                                       $editlinkArgs = array( $this->mTitle->getPrefixedText(), $sectionIndex, $headlineHint );
+                                       $editlinkArgs = array(
+                                               $this->mTitle->getPrefixedText(),
+                                               $sectionIndex,
+                                               $headlineHint
+                                       );
                                }
-                               // We use a bit of pesudo-xml for editsection markers. The language converter is run later on
-                               // Using a UNIQ style marker leads to the converter screwing up the tokens when it converts stuff
-                               // And trying to insert strip tags fails too. At this point all real inputted tags have already been escaped
-                               // so we don't have to worry about a user trying to input one of these markers directly.
-                               // We use a page and section attribute to stop the language converter from converting these important bits
-                               // of data, but put the headline hint inside a content block because the language converter is supposed to
+                               // We use a bit of pesudo-xml for editsection markers. The
+                               // language converter is run later on. Using a UNIQ style marker
+                               // leads to the converter screwing up the tokens when it
+                               // converts stuff. And trying to insert strip tags fails too. At
+                               // this point all real inputted tags have already been escaped,
+                               // so we don't have to worry about a user trying to input one of
+                               // these markers directly. We use a page and section attribute
+                               // to stop the language converter from converting these
+                               // important bits of data, but put the headline hint inside a
+                               // content block because the language converter is supposed to
                                // be able to convert that piece of data.
                                $editlink = '<mw:editsection page="' . htmlspecialchars( $editlinkArgs[0] );
                                $editlink .= '" section="' . htmlspecialchars( $editlinkArgs[1] ) . '"';
@@ -4592,7 +4794,12 @@ class Parser {
         * @param bool $clearState Whether to clear the parser state first
         * @return string The altered wiki markup
         */
-       public function preSaveTransform( $text, Title $title, User $user, ParserOptions $options, $clearState = true ) {
+       public function preSaveTransform( $text, Title $title, User $user,
+               ParserOptions $options, $clearState = true
+       ) {
+               if ( $clearState ) {
+                       $magicScopeVariable = $this->lock();
+               }
                $this->startParse( $title, $options, self::OT_WIKI, $clearState );
                $this->setUser( $user );
 
@@ -4661,10 +4868,14 @@ class Parser {
                $tc = '[' . Title::legalChars() . ']';
                $nc = '[ _0-9A-Za-z\x80-\xff-]'; # Namespaces can use non-ascii!
 
-               $p1 = "/\[\[(:?$nc+:|:|)($tc+?)( ?\\($tc+\\))\\|]]/";                   # [[ns:page (context)|]]
-               $p4 = "/\[\[(:?$nc+:|:|)($tc+?)( ?($tc+))\\|]]/";                           # [[ns:page(context)|]] (double-width brackets, added in r40257)
-               $p3 = "/\[\[(:?$nc+:|:|)($tc+?)( ?\\($tc+\\)|)((?:, |,)$tc+|)\\|]]/";         # [[ns:page (context), context|]] (using either single or double-width comma)
-               $p2 = "/\[\[\\|($tc+)]]/";                                              # [[|page]] (reverse pipe trick: add context from page title)
+               // [[ns:page (context)|]]
+               $p1 = "/\[\[(:?$nc+:|:|)($tc+?)( ?\\($tc+\\))\\|]]/";
+               // [[ns:page(context)|]] (double-width brackets, added in r40257)
+               $p4 = "/\[\[(:?$nc+:|:|)($tc+?)( ?($tc+))\\|]]/";
+               // [[ns:page (context), context|]] (using either single or double-width comma)
+               $p3 = "/\[\[(:?$nc+:|:|)($tc+?)( ?\\($tc+\\)|)((?:, |,)$tc+|)\\|]]/";
+               // [[|page]] (reverse pipe trick: add context from page title)
+               $p2 = "/\[\[\\|($tc+)]]/";
 
                # try $p1 first, to turn "[[A, B (C)|]]" into "[[A, B (C)|A, B]]"
                $text = preg_replace( $p1, '[[\\1\\2\\3|\\2]]', $text );
@@ -4741,7 +4952,8 @@ class Parser {
                $nickText = wfEscapeWikiText( $nickname );
                $msgName = $user->isAnon() ? 'signature-anon' : 'signature';
 
-               return wfMessage( $msgName, $userText, $nickText )->inContentLanguage()->title( $this->getTitle() )->text();
+               return wfMessage( $msgName, $userText, $nickText )->inContentLanguage()
+                       ->title( $this->getTitle() )->text();
        }
 
        /**
@@ -4767,6 +4979,7 @@ class Parser {
        public function cleanSig( $text, $parsing = false ) {
                if ( !$parsing ) {
                        global $wgTitle;
+                       $magicScopeVariable = $this->lock();
                        $this->startParse( $wgTitle, new ParserOptions, self::OT_PREPROCESS, true );
                }
 
@@ -4814,7 +5027,9 @@ class Parser {
         * @param int $outputType
         * @param bool $clearState
         */
-       public function startExternalParse( Title $title = null, ParserOptions $options, $outputType, $clearState = true ) {
+       public function startExternalParse( Title $title = null, ParserOptions $options,
+               $outputType, $clearState = true
+       ) {
                $this->startParse( $title, $options, $outputType, $clearState );
        }
 
@@ -4824,7 +5039,9 @@ class Parser {
         * @param int $outputType
         * @param bool $clearState
         */
-       private function startParse( Title $title = null, ParserOptions $options, $outputType, $clearState = true ) {
+       private function startParse( Title $title = null, ParserOptions $options,
+               $outputType, $clearState = true
+       ) {
                $this->setTitle( $title );
                $this->mOptions = $options;
                $this->setOutputType( $outputType );
@@ -5508,7 +5725,7 @@ class Parser {
 
        /**
         * @param string $caption
-        * @param LinkHolderArray $holders
+        * @param LinkHolderArray|bool $holders
         * @return mixed|string
         */
        protected function stripAltText( $caption, $holders ) {
@@ -5549,7 +5766,7 @@ class Parser {
         * values, so they can be safely tested and escaped.
         *
         * @param string $text
-        * @param PPFrame $frame
+        * @param bool|PPFrame $frame
         * @return string
         */
        function attributeStripCallback( &$text, $frame = false ) {
@@ -5564,7 +5781,11 @@ class Parser {
         * @return array
         */
        function getTags() {
-               return array_merge( array_keys( $this->mTransparentTagHooks ), array_keys( $this->mTagHooks ), array_keys( $this->mFunctionTagHooks ) );
+               return array_merge(
+                       array_keys( $this->mTransparentTagHooks ),
+                       array_keys( $this->mTagHooks ),
+                       array_keys( $this->mFunctionTagHooks )
+               );
        }
 
        /**
@@ -5587,7 +5808,10 @@ class Parser {
                        list( $element, $content, $params, $tag ) = $data;
                        $tagName = strtolower( $element );
                        if ( isset( $this->mTransparentTagHooks[$tagName] ) ) {
-                               $output = call_user_func_array( $this->mTransparentTagHooks[$tagName], array( $content, $params, $this ) );
+                               $output = call_user_func_array(
+                                       $this->mTransparentTagHooks[$tagName],
+                                       array( $content, $params, $this )
+                               );
                        } else {
                                $output = $tag;
                        }
@@ -5627,6 +5851,8 @@ class Parser {
         */
        private function extractSections( $text, $section, $mode, $newText = '' ) {
                global $wgTitle; # not generally used but removes an ugly failure mode
+
+               $magicScopeVariable = $this->lock();
                $this->startParse( $wgTitle, new ParserOptions, self::OT_PLAIN, true );
                $outText = '';
                $frame = $this->getPreprocessor()->newFrame();
@@ -5972,6 +6198,7 @@ class Parser {
         * @return string
         */
        function testSrvus( $text, Title $title, ParserOptions $options, $outputType = self::OT_HTML ) {
+               $magicScopeVariable = $this->lock();
                $this->startParse( $title, $options, $outputType, true );
 
                $text = $this->replaceVariables( $text );
@@ -6149,4 +6376,28 @@ class Parser {
                }
                return $parsedWidthParam;
        }
+
+       /**
+        * Lock the current instance of the parser.
+        *
+        * This is meant to stop someone from calling the parser
+        * recursively and messing up all the strip state.
+        *
+        * @throws MWException If parser is in a parse
+        * @return ScopedCallback The lock will be released once the return value goes out of scope.
+        */
+       protected function lock() {
+               if ( $this->mInParse ) {
+                       throw new MWException( "Parser state cleared while parsing. "
+                               . "Did you call Parser::parse recursively?" );
+               }
+               $this->mInParse = true;
+
+               $that = $this;
+               $recursiveCheck = new ScopedCallback( function() use ( $that ) {
+                       $that->mInParse = false;
+               } );
+
+               return $recursiveCheck;
+       }
 }
index e374361..33f0f96 100644 (file)
@@ -26,6 +26,7 @@
  * @todo document
  */
 class ParserCache {
+       /** @var MWMemcached  */
        private $mMemc;
        /**
         * Get an instance of this object
@@ -144,7 +145,8 @@ class ParserCache {
                        if ( !$useOutdated && $optionsKey->expired( $article->getTouched() ) ) {
                                wfIncrStats( "pcache_miss_expired" );
                                $cacheTime = $optionsKey->getCacheTime();
-                               wfDebug( "Parser options key expired, touched " . $article->getTouched() . ", epoch $wgCacheEpoch, cached $cacheTime\n" );
+                               wfDebug( "Parser options key expired, touched " . $article->getTouched()
+                                       . ", epoch $wgCacheEpoch, cached $cacheTime\n" );
                                return false;
                        } elseif ( $optionsKey->isDifferentRevision( $article->getLatest() ) ) {
                                wfIncrStats( "pcache_miss_revid" );
@@ -164,7 +166,10 @@ class ParserCache {
                        $usedOptions = ParserOptions::legacyOptions();
                }
 
-               return $this->getParserOutputKey( $article, $popts->optionsHash( $usedOptions, $article->getTitle() ) );
+               return $this->getParserOutputKey(
+                       $article,
+                       $popts->optionsHash( $usedOptions, $article->getTitle() )
+               );
        }
 
        /**
@@ -215,7 +220,8 @@ class ParserCache {
                if ( !$useOutdated && $value->expired( $touched ) ) {
                        wfIncrStats( "pcache_miss_expired" );
                        $cacheTime = $value->getCacheTime();
-                       wfDebug( "ParserOutput key expired, touched $touched, epoch $wgCacheEpoch, cached $cacheTime\n" );
+                       wfDebug( "ParserOutput key expired, touched $touched, "
+                               . "epoch $wgCacheEpoch, cached $cacheTime\n" );
                        $value = false;
                } elseif ( $value->isDifferentRevision( $article->getLatest() ) ) {
                        wfIncrStats( "pcache_miss_revid" );
index 7c84b67..efd5f74 100644 (file)
 /**
  * \brief Set options of the Parser
  *
- * All member variables are supposed to be private in theory, although in practise this is not the case.
+ * All member variables are supposed to be private in theory, although in
+ * practise this is not the case.
  *
  * @ingroup Parser
  */
 class ParserOptions {
+       /** @var bool Parsing the page for a "preview" operation? */
+       public $mIsPreview = false;
 
-       /**
-        * Interlanguage links are removed and returned in an array
-        */
-       var $mInterwikiMagic;
+       /** @var bool Interlanguage links are removed and returned in an array */
+       protected $mInterwikiMagic;
 
-       /**
-        * Allow external images inline?
-        */
-       var $mAllowExternalImages;
+       /** @var bool Allow external images inline? */
+       protected $mAllowExternalImages;
 
-       /**
-        * If not, any exception?
-        */
-       var $mAllowExternalImagesFrom;
+       /** @var string|array If not, any exception? */
+       protected $mAllowExternalImagesFrom;
 
-       /**
-        * If not or it doesn't match, should we check an on-wiki whitelist?
-        */
-       var $mEnableImageWhitelist;
+       /** @var bool If not or it doesn't match, should we check an on-wiki whitelist? */
+       protected $mEnableImageWhitelist;
 
-       /**
-        * Date format index
-        */
-       var $mDateFormat = null;
+       /** @var string Date format index */
+       protected $mDateFormat = null;
 
-       /**
-        * Create "edit section" links?
-        */
-       var $mEditSection = true;
+       /** @var bool Create "edit section" links? */
+       protected $mEditSection = true;
 
-       /**
-        * Allow inclusion of special pages?
-        */
-       var $mAllowSpecialInclusion;
+       /** @var bool Allow inclusion of special pages? */
+       protected $mAllowSpecialInclusion;
 
-       /**
-        * Use tidy to cleanup output HTML?
-        */
-       var $mTidy = false;
+       /** @var bool Use tidy to cleanup output HTML? */
+       protected $mTidy = false;
 
        /**
-        * Which lang to call for PLURAL and GRAMMAR
+        * @var bool Which lang to call for PLURAL and GRAMMAR
+        * @todo FIXME: This comment doesn't appear to be correct.
+        *   Should be this? Whether this is an interface message.
         */
-       var $mInterfaceMessage = false;
+       protected $mInterfaceMessage = false;
 
-       /**
-        * Overrides $mInterfaceMessage with arbitrary language
-        */
-       var $mTargetLanguage = null;
+       /** @var string|Language Overrides $mInterfaceMessage with arbitrary language */
+       protected $mTargetLanguage = null;
 
-       /**
-        * Maximum size of template expansions, in bytes
-        */
-       var $mMaxIncludeSize;
+       /** @var int Maximum size of template expansions, in bytes */
+       protected $mMaxIncludeSize;
 
-       /**
-        * Maximum number of nodes touched by PPFrame::expand()
-        */
-       var $mMaxPPNodeCount;
+       /** @var int Maximum number of nodes touched by PPFrame::expand() */
+       protected $mMaxPPNodeCount;
 
-       /**
-        * Maximum number of nodes generated by Preprocessor::preprocessToObj()
-        */
-       var $mMaxGeneratedPPNodeCount;
+       /** @var int Maximum number of nodes generated by Preprocessor::preprocessToObj() */
+       protected $mMaxGeneratedPPNodeCount;
 
-       /**
-        * Maximum recursion depth in PPFrame::expand()
-        */
-       var $mMaxPPExpandDepth;
+       /** @var int Maximum recursion depth in PPFrame::expand() */
+       protected $mMaxPPExpandDepth;
 
-       /**
-        * Maximum recursion depth for templates within templates
-        */
-       var $mMaxTemplateDepth;
+       /** @var int Maximum recursion depth for templates within templates */
+       protected $mMaxTemplateDepth;
 
-       /**
-        * Maximum number of calls per parse to expensive parser functions
-        */
-       var $mExpensiveParserFunctionLimit;
+       /** @var int Maximum number of calls per parse to expensive parser functions */
+       protected $mExpensiveParserFunctionLimit;
 
-       /**
-        * Remove HTML comments. ONLY APPLIES TO PREPROCESS OPERATIONS
-        */
-       var $mRemoveComments = true;
+       /** @var bool Remove HTML comments. ONLY APPLIES TO PREPROCESS OPERATIONS */
+       protected $mRemoveComments = true;
 
-       /**
-        * Callback for template fetching. Used as first argument to call_user_func().
-        */
-       var $mTemplateCallback =
-               array( 'Parser', 'statelessFetchTemplate' );
+       /** @var array Callback for template fetching. Used as first argument to call_user_func(). */
+       protected $mTemplateCallback = array( 'Parser', 'statelessFetchTemplate' );
 
-       /**
-        * Enable limit report in an HTML comment on output
-        */
-       var $mEnableLimitReport = false;
+       /** @var bool Enable limit report in an HTML comment on output */
+       protected $mEnableLimitReport = false;
 
-       /**
-        * Timestamp used for {{CURRENTDAY}} etc.
-        */
-       var $mTimestamp;
+       /** @var string Timestamp used for {{CURRENTDAY}} etc. */
+       protected $mTimestamp;
 
-       /**
-        * Target attribute for external links
-        */
-       var $mExternalLinkTarget;
+       /** @var bool|string Target attribute for external links */
+       protected $mExternalLinkTarget;
 
        /**
-        * Clean up signature texts?
+        * @var bool Clean up signature texts?
         *
         * 1) Strip ~~~, ~~~~ and ~~~~~ out of signatures
         * 2) Substitute all transclusions
         */
-       var $mCleanSignatures;
+       protected $mCleanSignatures;
 
-       /**
-        * Transform wiki markup when saving the page?
-        */
-       var $mPreSaveTransform = true;
+       /** @var bool Transform wiki markup when saving the page? */
+       protected $mPreSaveTransform = true;
 
-       /**
-        * Whether content conversion should be disabled
-        */
-       var $mDisableContentConversion;
+       /** @var bool Whether content conversion should be disabled */
+       protected $mDisableContentConversion;
 
-       /**
-        * Whether title conversion should be disabled
-        */
-       var $mDisableTitleConversion;
+       /** @var bool Whether title conversion should be disabled */
+       protected $mDisableTitleConversion;
 
-       /**
-        * Automatically number headings?
-        */
-       var $mNumberHeadings;
+       /** @var string Automatically number headings? */
+       protected $mNumberHeadings;
 
-       /**
-        * Thumb size preferred by the user.
-        */
-       var $mThumbSize;
+       /** @var string Thumb size preferred by the user. */
+       protected $mThumbSize;
 
-       /**
-        * Maximum article size of an article to be marked as "stub"
-        */
+       /** @var Language Language object of the User language. */
+       protected $mUserLang;
+
+       /** @var User Stored user object */
+       protected $mUser;
+
+       /** @var bool Parsing the page for a "preview" operation on a single section? */
+       protected $mIsSectionPreview = false;
+
+       /** @var bool Parsing the printable version of the page? */
+       protected $mIsPrintable = false;
+
+       /** @var string Extra key that should be present in the caching key. */
+       protected $mExtraKey = '';
+
+       /** @var callable Function to be called when an option is accessed. */
+       protected $onAccessCallback = null;
+
+       /** @var int Maximum article size of an article to be marked as "stub" */
        private $mStubThreshold;
 
-       /**
-        * Language object of the User language.
-        */
-       var $mUserLang;
+       function getInterwikiMagic() {
+               return $this->mInterwikiMagic;
+       }
 
-       /**
-        * @var User
-        * Stored user object
-        */
-       var $mUser;
+       function getAllowExternalImages() {
+               return $this->mAllowExternalImages;
+       }
 
-       /**
-        * Parsing the page for a "preview" operation?
-        */
-       var $mIsPreview = false;
+       function getAllowExternalImagesFrom() {
+               return $this->mAllowExternalImagesFrom;
+       }
 
-       /**
-        * Parsing the page for a "preview" operation on a single section?
-        */
-       var $mIsSectionPreview = false;
+       function getEnableImageWhitelist() {
+               return $this->mEnableImageWhitelist;
+       }
 
-       /**
-        * Parsing the printable version of the page?
-        */
-       var $mIsPrintable = false;
+       function getEditSection() {
+               return $this->mEditSection;
+       }
 
-       /**
-        * Extra key that should be present in the caching key.
-        */
-       var $mExtraKey = '';
+       function getNumberHeadings() {
+               $this->optionUsed( 'numberheadings' );
 
-       /**
-        * Function to be called when an option is accessed.
-        */
-       protected $onAccessCallback = null;
+               return $this->mNumberHeadings;
+       }
+
+       function getAllowSpecialInclusion() {
+               return $this->mAllowSpecialInclusion;
+       }
+
+       function getTidy() {
+               return $this->mTidy;
+       }
+
+       function getInterfaceMessage() {
+               return $this->mInterfaceMessage;
+       }
+
+       function getTargetLanguage() {
+               return $this->mTargetLanguage;
+       }
+
+       function getMaxIncludeSize() {
+               return $this->mMaxIncludeSize;
+       }
+
+       function getMaxPPNodeCount() {
+               return $this->mMaxPPNodeCount;
+       }
+
+       function getMaxGeneratedPPNodeCount() {
+               return $this->mMaxGeneratedPPNodeCount;
+       }
+
+       function getMaxPPExpandDepth() {
+               return $this->mMaxPPExpandDepth;
+       }
+
+       function getMaxTemplateDepth() {
+               return $this->mMaxTemplateDepth;
+       }
 
-       function getInterwikiMagic()                { return $this->mInterwikiMagic; }
-       function getAllowExternalImages()           { return $this->mAllowExternalImages; }
-       function getAllowExternalImagesFrom()       { return $this->mAllowExternalImagesFrom; }
-       function getEnableImageWhitelist()          { return $this->mEnableImageWhitelist; }
-       function getEditSection()                   { return $this->mEditSection; }
-       function getNumberHeadings()                { $this->optionUsed( 'numberheadings' );
-                                                                                                 return $this->mNumberHeadings; }
-       function getAllowSpecialInclusion()         { return $this->mAllowSpecialInclusion; }
-       function getTidy()                          { return $this->mTidy; }
-       function getInterfaceMessage()              { return $this->mInterfaceMessage; }
-       function getTargetLanguage()                { return $this->mTargetLanguage; }
-       function getMaxIncludeSize()                { return $this->mMaxIncludeSize; }
-       function getMaxPPNodeCount()                { return $this->mMaxPPNodeCount; }
-       function getMaxGeneratedPPNodeCount()       { return $this->mMaxGeneratedPPNodeCount; }
-       function getMaxPPExpandDepth()              { return $this->mMaxPPExpandDepth; }
-       function getMaxTemplateDepth()              { return $this->mMaxTemplateDepth; }
        /* @since 1.20 */
-       function getExpensiveParserFunctionLimit()  { return $this->mExpensiveParserFunctionLimit; }
-       function getRemoveComments()                { return $this->mRemoveComments; }
-       function getTemplateCallback()              { return $this->mTemplateCallback; }
-       function getEnableLimitReport()             { return $this->mEnableLimitReport; }
-       function getCleanSignatures()               { return $this->mCleanSignatures; }
-       function getExternalLinkTarget()            { return $this->mExternalLinkTarget; }
-       function getDisableContentConversion()      { return $this->mDisableContentConversion; }
-       function getDisableTitleConversion()        { return $this->mDisableTitleConversion; }
-       function getThumbSize()                     { $this->optionUsed( 'thumbsize' );
-                                                                                                 return $this->mThumbSize; }
-       function getStubThreshold()                 { $this->optionUsed( 'stubthreshold' );
-                                                                                                 return $this->mStubThreshold; }
-
-       function getIsPreview()                     { return $this->mIsPreview; }
-       function getIsSectionPreview()              { return $this->mIsSectionPreview; }
-       function getIsPrintable()                   { $this->optionUsed( 'printable' );
-                                                                                                 return $this->mIsPrintable; }
-       function getUser()                          { return $this->mUser; }
-       function getPreSaveTransform()              { return $this->mPreSaveTransform; }
+       function getExpensiveParserFunctionLimit() {
+               return $this->mExpensiveParserFunctionLimit;
+       }
+
+       function getRemoveComments() {
+               return $this->mRemoveComments;
+       }
+
+       function getTemplateCallback() {
+               return $this->mTemplateCallback;
+       }
+
+       function getEnableLimitReport() {
+               return $this->mEnableLimitReport;
+       }
+
+       function getCleanSignatures() {
+               return $this->mCleanSignatures;
+       }
+
+       function getExternalLinkTarget() {
+               return $this->mExternalLinkTarget;
+       }
+
+       function getDisableContentConversion() {
+               return $this->mDisableContentConversion;
+       }
+
+       function getDisableTitleConversion() {
+               return $this->mDisableTitleConversion;
+       }
+
+       function getThumbSize() {
+               $this->optionUsed( 'thumbsize' );
+
+               return $this->mThumbSize;
+       }
+
+       function getStubThreshold() {
+               $this->optionUsed( 'stubthreshold' );
+
+               return $this->mStubThreshold;
+       }
+
+       function getIsPreview() {
+               return $this->mIsPreview;
+       }
+
+       function getIsSectionPreview() {
+               return $this->mIsSectionPreview;
+       }
+
+       function getIsPrintable() {
+               $this->optionUsed( 'printable' );
+
+               return $this->mIsPrintable;
+       }
+
+       function getUser() {
+               return $this->mUser;
+       }
+
+       function getPreSaveTransform() {
+               return $this->mPreSaveTransform;
+       }
 
        function getDateFormat() {
                $this->optionUsed( 'dateformat' );
@@ -293,47 +319,139 @@ class ParserOptions {
                return $this->getUserLangObj()->getCode();
        }
 
-       function setInterwikiMagic( $x )            { return wfSetVar( $this->mInterwikiMagic, $x ); }
-       function setAllowExternalImages( $x )       { return wfSetVar( $this->mAllowExternalImages, $x ); }
-       function setAllowExternalImagesFrom( $x )   { return wfSetVar( $this->mAllowExternalImagesFrom, $x ); }
-       function setEnableImageWhitelist( $x )      { return wfSetVar( $this->mEnableImageWhitelist, $x ); }
-       function setDateFormat( $x )                { return wfSetVar( $this->mDateFormat, $x ); }
-       function setEditSection( $x )               { return wfSetVar( $this->mEditSection, $x ); }
-       function setNumberHeadings( $x )            { return wfSetVar( $this->mNumberHeadings, $x ); }
-       function setAllowSpecialInclusion( $x )     { return wfSetVar( $this->mAllowSpecialInclusion, $x ); }
-       function setTidy( $x )                      { return wfSetVar( $this->mTidy, $x ); }
+       function setInterwikiMagic( $x ) {
+               return wfSetVar( $this->mInterwikiMagic, $x );
+       }
+
+       function setAllowExternalImages( $x ) {
+               return wfSetVar( $this->mAllowExternalImages, $x );
+       }
+
+       function setAllowExternalImagesFrom( $x ) {
+               return wfSetVar( $this->mAllowExternalImagesFrom, $x );
+       }
+
+       function setEnableImageWhitelist( $x ) {
+               return wfSetVar( $this->mEnableImageWhitelist, $x );
+       }
+
+       function setDateFormat( $x ) {
+               return wfSetVar( $this->mDateFormat, $x );
+       }
+
+       function setEditSection( $x ) {
+               return wfSetVar( $this->mEditSection, $x );
+       }
+
+       function setNumberHeadings( $x ) {
+               return wfSetVar( $this->mNumberHeadings, $x );
+       }
+
+       function setAllowSpecialInclusion( $x ) {
+               return wfSetVar( $this->mAllowSpecialInclusion, $x );
+       }
+
+       function setTidy( $x ) {
+               return wfSetVar( $this->mTidy, $x );
+       }
 
        /** @deprecated since 1.19 */
-       function setSkin( $x )                      { wfDeprecated( __METHOD__, '1.19' ); }
-       function setInterfaceMessage( $x )          { return wfSetVar( $this->mInterfaceMessage, $x ); }
-       function setTargetLanguage( $x )            { return wfSetVar( $this->mTargetLanguage, $x, true ); }
-       function setMaxIncludeSize( $x )            { return wfSetVar( $this->mMaxIncludeSize, $x ); }
-       function setMaxPPNodeCount( $x )            { return wfSetVar( $this->mMaxPPNodeCount, $x ); }
-       function setMaxGeneratedPPNodeCount( $x )   { return wfSetVar( $this->mMaxGeneratedPPNodeCount, $x ); }
-       function setMaxTemplateDepth( $x )          { return wfSetVar( $this->mMaxTemplateDepth, $x ); }
+       function setSkin( $x ) {
+               wfDeprecated( __METHOD__, '1.19' );
+       }
+
+       function setInterfaceMessage( $x ) {
+               return wfSetVar( $this->mInterfaceMessage, $x );
+       }
+
+       function setTargetLanguage( $x ) {
+               return wfSetVar( $this->mTargetLanguage, $x, true );
+       }
+
+       function setMaxIncludeSize( $x ) {
+               return wfSetVar( $this->mMaxIncludeSize, $x );
+       }
+
+       function setMaxPPNodeCount( $x ) {
+               return wfSetVar( $this->mMaxPPNodeCount, $x );
+       }
+
+       function setMaxGeneratedPPNodeCount( $x ) {
+               return wfSetVar( $this->mMaxGeneratedPPNodeCount, $x );
+       }
+
+       function setMaxTemplateDepth( $x ) {
+               return wfSetVar( $this->mMaxTemplateDepth, $x );
+       }
+
        /* @since 1.20 */
-       function setExpensiveParserFunctionLimit( $x ) { return wfSetVar( $this->mExpensiveParserFunctionLimit, $x ); }
-       function setRemoveComments( $x )            { return wfSetVar( $this->mRemoveComments, $x ); }
-       function setTemplateCallback( $x )          { return wfSetVar( $this->mTemplateCallback, $x ); }
-       function enableLimitReport( $x = true )     { return wfSetVar( $this->mEnableLimitReport, $x ); }
-       function setTimestamp( $x )                 { return wfSetVar( $this->mTimestamp, $x ); }
-       function setCleanSignatures( $x )           { return wfSetVar( $this->mCleanSignatures, $x ); }
-       function setExternalLinkTarget( $x )        { return wfSetVar( $this->mExternalLinkTarget, $x ); }
-       function disableContentConversion( $x = true ) { return wfSetVar( $this->mDisableContentConversion, $x ); }
-       function disableTitleConversion( $x = true ) { return wfSetVar( $this->mDisableTitleConversion, $x ); }
-       function setUserLang( $x )                  {
+       function setExpensiveParserFunctionLimit( $x ) {
+               return wfSetVar( $this->mExpensiveParserFunctionLimit, $x );
+       }
+
+       function setRemoveComments( $x ) {
+               return wfSetVar( $this->mRemoveComments, $x );
+       }
+
+       function setTemplateCallback( $x ) {
+               return wfSetVar( $this->mTemplateCallback, $x );
+       }
+
+       function enableLimitReport( $x = true ) {
+               return wfSetVar( $this->mEnableLimitReport, $x );
+       }
+
+       function setTimestamp( $x ) {
+               return wfSetVar( $this->mTimestamp, $x );
+       }
+
+       function setCleanSignatures( $x ) {
+               return wfSetVar( $this->mCleanSignatures, $x );
+       }
+
+       function setExternalLinkTarget( $x ) {
+               return wfSetVar( $this->mExternalLinkTarget, $x );
+       }
+
+       function disableContentConversion( $x = true ) {
+               return wfSetVar( $this->mDisableContentConversion, $x );
+       }
+
+       function disableTitleConversion( $x = true ) {
+               return wfSetVar( $this->mDisableTitleConversion, $x );
+       }
+
+       function setUserLang( $x ) {
                if ( is_string( $x ) ) {
                        $x = Language::factory( $x );
                }
+
                return wfSetVar( $this->mUserLang, $x );
        }
-       function setThumbSize( $x )                 { return wfSetVar( $this->mThumbSize, $x ); }
-       function setStubThreshold( $x )             { return wfSetVar( $this->mStubThreshold, $x ); }
-       function setPreSaveTransform( $x )          { return wfSetVar( $this->mPreSaveTransform, $x ); }
 
-       function setIsPreview( $x )                 { return wfSetVar( $this->mIsPreview, $x ); }
-       function setIsSectionPreview( $x )          { return wfSetVar( $this->mIsSectionPreview, $x ); }
-       function setIsPrintable( $x )               { return wfSetVar( $this->mIsPrintable, $x ); }
+       function setThumbSize( $x ) {
+               return wfSetVar( $this->mThumbSize, $x );
+       }
+
+       function setStubThreshold( $x ) {
+               return wfSetVar( $this->mStubThreshold, $x );
+       }
+
+       function setPreSaveTransform( $x ) {
+               return wfSetVar( $this->mPreSaveTransform, $x );
+       }
+
+       function setIsPreview( $x ) {
+               return wfSetVar( $this->mIsPreview, $x );
+       }
+
+       function setIsSectionPreview( $x ) {
+               return wfSetVar( $this->mIsSectionPreview, $x );
+       }
+
+       function setIsPrintable( $x ) {
+               return wfSetVar( $this->mIsPrintable, $x );
+       }
 
        /**
         * Extra key that should be present in the parser cache key.
@@ -464,7 +582,14 @@ class ParserOptions {
         * @return array
         */
        public static function legacyOptions() {
-               return array( 'stubthreshold', 'numberheadings', 'userlang', 'thumbsize', 'editsection', 'printable' );
+               return array(
+                       'stubthreshold',
+                       'numberheadings',
+                       'userlang',
+                       'thumbsize',
+                       'editsection',
+                       'printable'
+               );
        }
 
        /**
index b7cc490..74ce325 100644 (file)
  * @ingroup Parser
  */
 class ParserOutput extends CacheTime {
-       var $mText,                       # The output text
-               $mLanguageLinks,              # List of the full text of language links, in the order they appear
-               $mCategories,                 # Map of category names to sort keys
-               $mTitleText,                  # title text of the chosen language variant
-               $mLinks = array(),            # 2-D map of NS/DBK to ID for the links in the document. ID=zero for broken.
-               $mTemplates = array(),        # 2-D map of NS/DBK to ID for the template references. ID=zero for broken.
-               $mTemplateIds = array(),      # 2-D map of NS/DBK to rev ID for the template references. ID=zero for broken.
-               $mImages = array(),           # DB keys of the images used, in the array key only
-               $mFileSearchOptions = array(), # DB keys of the images used mapped to sha1 and MW timestamp
-               $mExternalLinks = array(),    # External link URLs, in the key only
-               $mInterwikiLinks = array(),   # 2-D map of prefix/DBK (in keys only) for the inline interwiki links in the document.
-               $mNewSection = false,         # Show a new section link?
-               $mHideNewSection = false,     # Hide the new section link?
-               $mNoGallery = false,          # No gallery on category page? (__NOGALLERY__)
-               $mHeadItems = array(),        # Items to put in the <head> section
-               $mModules = array(),          # Modules to be loaded by the resource loader
-               $mModuleScripts = array(),    # Modules of which only the JS will be loaded by the resource loader
-               $mModuleStyles = array(),     # Modules of which only the CSSS will be loaded by the resource loader
-               $mModuleMessages = array(),   # Modules of which only the messages will be loaded by the resource loader
-               $mJsConfigVars = array(),     # JavaScript config variable for mw.config combined with this page
-               $mOutputHooks = array(),      # Hook tags as per $wgParserOutputHooks
-               $mWarnings = array(),         # Warning text to be returned to the user. Wikitext formatted, in the key only
-               $mSections = array(),         # Table of contents
-               $mEditSectionTokens = false,  # prefix/suffix markers if edit sections were output as tokens
-               $mProperties = array(),       # Name/value pairs to be cached in the DB
-               $mTOCHTML = '',               # HTML of the TOC
-               $mTimestamp,                  # Timestamp of the revision
-               $mTOCEnabled = true;          # Whether TOC should be shown, can't override __NOTOC__
-               private $mIndexPolicy = '';       # 'index' or 'noindex'?  Any other value will result in no change.
-               private $mAccessedOptions = array(); # List of ParserOptions (stored in the keys)
-               private $mSecondaryDataUpdates = array(); # List of DataUpdate, used to save info from the page somewhere else.
-               private $mExtensionData = array(); # extra data used by extensions
-               private $mLimitReportData = array(); # Parser limit report data
-               private $mParseStartTime = array(); # Timestamps for getTimeSinceStart()
-
-       const EDITSECTION_REGEX = '#<(?:mw:)?editsection page="(.*?)" section="(.*?)"(?:/>|>(.*?)(</(?:mw:)?editsection>))#';
+       /** @var string The output text */
+       public $mText;
+
+       /** @var array List of the full text of language links; in the order they appear */
+       public $mLanguageLinks;
+
+       /** @var array Map of category names to sort keys */
+       public $mCategories;
+
+       /** @var array DB keys of the images used; in the array key only */
+       public $mImages = array();
+
+       /** @var array Modules to be loaded by the resource loader */
+       public $mModules = array();
+
+       /** @var array Name/value pairs to be cached in the DB */
+       public $mProperties = array();
+
+       /** @var string Title text of the chosen language variant */
+       protected $mTitleText;
+
+       /** @var array 2-D map of NS/DBK to ID for the links in the document. ID=zero for broken. */
+       protected $mLinks = array();
+
+       /** @var array 2-D map of NS/DBK to ID for the template references. ID=zero for broken. */
+       protected $mTemplates = array();
+
+       /** @var array 2-D map of NS/DBK to rev ID for the template references. ID=zero for broken. */
+       protected $mTemplateIds = array();
+
+       /** @var array DB keys of the images used mapped to sha1 and MW timestamp */
+       protected $mFileSearchOptions = array();
+
+       /** @var array External link URLs; in the key only */
+       protected $mExternalLinks = array();
+
+       /**
+        * @var array 2-D map of prefix/DBK (in keys only) for the inline interwiki
+        *   links in the document.
+        */
+       protected $mInterwikiLinks = array();
+
+       /** @var bool Show a new section link? */
+       protected $mNewSection = false;
+
+       /** @var bool Hide the new section link? */
+       protected $mHideNewSection = false;
+
+       /** @var bool No gallery on category page? (__NOGALLERY__) */
+       public $mNoGallery = false;
+
+       /** @var array Items to put in the <head> section */
+       protected $mHeadItems = array();
+
+       /** @var array Modules of which only the JS will be loaded by the resource loader */
+       protected $mModuleScripts = array();
+
+       /** @var array Modules of which only the CSSS will be loaded by the resource loader */
+       protected $mModuleStyles = array();
+
+       /** @var array Modules of which only the messages will be loaded by the resource loader */
+       protected $mModuleMessages = array();
+
+       /** @var array JavaScript config variable for mw.config combined with this page */
+       protected $mJsConfigVars = array();
+
+       /** @var array Hook tags as per $wgParserOutputHooks */
+       protected $mOutputHooks = array();
+
+       /** @var array Warning text to be returned to the user. Wikitext formatted; in the key only */
+       protected $mWarnings = array();
+
+       /** @var array Table of contents */
+       protected $mSections = array();
+
+       /** @var bool Prefix/suffix markers if edit sections were output as tokens */
+       protected $mEditSectionTokens = false;
+
+       /** @var string HTML of the TOC */
+       protected $mTOCHTML = '';
+
+       /** @var string Timestamp of the revision */
+       protected $mTimestamp;
+
+       /** @var bool Whether TOC should be shown, can't override __NOTOC__ */
+       protected $mTOCEnabled = true;
+
+       /** @var string 'index' or 'noindex'?  Any other value will result in no change. */
+       private $mIndexPolicy = '';
+
+       /** @var array List of ParserOptions (stored in the keys) */
+       private $mAccessedOptions = array();
+
+       /** @var array List of DataUpdate, used to save info from the page somewhere else. */
+       private $mSecondaryDataUpdates = array();
+
+       /** @var array Extra data used by extensions */
+       private $mExtensionData = array();
+
+       /** @var array Parser limit report data */
+       private $mLimitReportData = array();
+
+       /** @var array Timestamps for getTimeSinceStart() */
+       private $mParseStartTime = array();
+
+       const EDITSECTION_REGEX =
+               '#<(?:mw:)?editsection page="(.*?)" section="(.*?)"(?:/>|>(.*?)(</(?:mw:)?editsection>))#';
 
        function __construct( $text = '', $languageLinks = array(), $categoryLinks = array(),
                $containsOldMagic = false, $titletext = ''
@@ -116,50 +187,166 @@ class ParserOutput extends CacheTime {
                return call_user_func_array( array( $skin, 'doEditSectionLink' ), $args );
        }
 
-       function &getLanguageLinks()         { return $this->mLanguageLinks; }
-       function getInterwikiLinks()         { return $this->mInterwikiLinks; }
-       function getCategoryLinks()          { return array_keys( $this->mCategories ); }
-       function &getCategories()            { return $this->mCategories; }
-       function getTitleText()              { return $this->mTitleText; }
-       function getSections()               { return $this->mSections; }
-       function getEditSectionTokens()      { return $this->mEditSectionTokens; }
-       function &getLinks()                 { return $this->mLinks; }
-       function &getTemplates()             { return $this->mTemplates; }
-       function &getTemplateIds()           { return $this->mTemplateIds; }
-       function &getImages()                { return $this->mImages; }
-       function &getFileSearchOptions()     { return $this->mFileSearchOptions; }
-       function &getExternalLinks()         { return $this->mExternalLinks; }
-       function getNoGallery()              { return $this->mNoGallery; }
-       function getHeadItems()              { return $this->mHeadItems; }
-       function getModules()                { return $this->mModules; }
-       function getModuleScripts()          { return $this->mModuleScripts; }
-       function getModuleStyles()           { return $this->mModuleStyles; }
-       function getModuleMessages()         { return $this->mModuleMessages; }
+       function &getLanguageLinks() {
+               return $this->mLanguageLinks;
+       }
+
+       function getInterwikiLinks() {
+               return $this->mInterwikiLinks;
+       }
+
+       function getCategoryLinks() {
+               return array_keys( $this->mCategories );
+       }
+
+       function &getCategories() {
+               return $this->mCategories;
+       }
+
+       function getTitleText() {
+               return $this->mTitleText;
+       }
+
+       function getSections() {
+               return $this->mSections;
+       }
+
+       function getEditSectionTokens() {
+               return $this->mEditSectionTokens;
+       }
+
+       function &getLinks() {
+               return $this->mLinks;
+       }
+
+       function &getTemplates() {
+               return $this->mTemplates;
+       }
+
+       function &getTemplateIds() {
+               return $this->mTemplateIds;
+       }
+
+       function &getImages() {
+               return $this->mImages;
+       }
+
+       function &getFileSearchOptions() {
+               return $this->mFileSearchOptions;
+       }
+
+       function &getExternalLinks() {
+               return $this->mExternalLinks;
+       }
+
+       function getNoGallery() {
+               return $this->mNoGallery;
+       }
+
+       function getHeadItems() {
+               return $this->mHeadItems;
+       }
+
+       function getModules() {
+               return $this->mModules;
+       }
+
+       function getModuleScripts() {
+               return $this->mModuleScripts;
+       }
+
+       function getModuleStyles() {
+               return $this->mModuleStyles;
+       }
+
+       function getModuleMessages() {
+               return $this->mModuleMessages;
+       }
+
        /** @since 1.23 */
-       function getJsConfigVars()           { return $this->mJsConfigVars; }
-       function getOutputHooks()            { return (array)$this->mOutputHooks; }
-       function getWarnings()               { return array_keys( $this->mWarnings ); }
-       function getIndexPolicy()            { return $this->mIndexPolicy; }
-       function getTOCHTML()                { return $this->mTOCHTML; }
-       function getTimestamp()              { return $this->mTimestamp; }
-       function getLimitReportData()        { return $this->mLimitReportData; }
-       function getTOCEnabled()             { return $this->mTOCEnabled; }
-
-       function setText( $text )            { return wfSetVar( $this->mText, $text ); }
-       function setLanguageLinks( $ll )     { return wfSetVar( $this->mLanguageLinks, $ll ); }
-       function setCategoryLinks( $cl )     { return wfSetVar( $this->mCategories, $cl ); }
-
-       function setTitleText( $t )          { return wfSetVar( $this->mTitleText, $t ); }
-       function setSections( $toc )         { return wfSetVar( $this->mSections, $toc ); }
-       function setEditSectionTokens( $t )  { return wfSetVar( $this->mEditSectionTokens, $t ); }
-       function setIndexPolicy( $policy )   { return wfSetVar( $this->mIndexPolicy, $policy ); }
-       function setTOCHTML( $tochtml )      { return wfSetVar( $this->mTOCHTML, $tochtml ); }
-       function setTimestamp( $timestamp )  { return wfSetVar( $this->mTimestamp, $timestamp ); }
-       function setTOCEnabled( $flag )      { return wfSetVar( $this->mTOCEnabled, $flag ); }
-
-       function addCategory( $c, $sort )    { $this->mCategories[$c] = $sort; }
-       function addLanguageLink( $t )       { $this->mLanguageLinks[] = $t; }
-       function addWarning( $s )            { $this->mWarnings[$s] = 1; }
+       function getJsConfigVars() {
+               return $this->mJsConfigVars;
+       }
+
+       function getOutputHooks() {
+               return (array)$this->mOutputHooks;
+       }
+
+       function getWarnings() {
+               return array_keys( $this->mWarnings );
+       }
+
+       function getIndexPolicy() {
+               return $this->mIndexPolicy;
+       }
+
+       function getTOCHTML() {
+               return $this->mTOCHTML;
+       }
+
+       function getTimestamp() {
+               return $this->mTimestamp;
+       }
+
+       function getLimitReportData() {
+               return $this->mLimitReportData;
+       }
+
+       function getTOCEnabled() {
+               return $this->mTOCEnabled;
+       }
+
+       function setText( $text ) {
+               return wfSetVar( $this->mText, $text );
+       }
+
+       function setLanguageLinks( $ll ) {
+               return wfSetVar( $this->mLanguageLinks, $ll );
+       }
+
+       function setCategoryLinks( $cl ) {
+               return wfSetVar( $this->mCategories, $cl );
+       }
+
+       function setTitleText( $t ) {
+               return wfSetVar( $this->mTitleText, $t );
+       }
+
+       function setSections( $toc ) {
+               return wfSetVar( $this->mSections, $toc );
+       }
+
+       function setEditSectionTokens( $t ) {
+               return wfSetVar( $this->mEditSectionTokens, $t );
+       }
+
+       function setIndexPolicy( $policy ) {
+               return wfSetVar( $this->mIndexPolicy, $policy );
+       }
+
+       function setTOCHTML( $tochtml ) {
+               return wfSetVar( $this->mTOCHTML, $tochtml );
+       }
+
+       function setTimestamp( $timestamp ) {
+               return wfSetVar( $this->mTimestamp, $timestamp );
+       }
+
+       function setTOCEnabled( $flag ) {
+               return wfSetVar( $this->mTOCEnabled, $flag );
+       }
+
+       function addCategory( $c, $sort ) {
+               $this->mCategories[$c] = $sort;
+       }
+
+       function addLanguageLink( $t ) {
+               $this->mLanguageLinks[] = $t;
+       }
+
+       function addWarning( $s ) {
+               $this->mWarnings[$s] = 1;
+       }
 
        function addOutputHook( $hook, $data = false ) {
                $this->mOutputHooks[] = array( $hook, $data );
@@ -512,8 +699,8 @@ class ParserOutput extends CacheTime {
         * extracted from the page's content, including a LinksUpdate object for all links stored in
         * this ParserOutput object.
         *
-        * @note: Avoid using this method directly, use ContentHandler::getSecondaryDataUpdates() instead! The content
-        *        handler may provide additional update objects.
+        * @note Avoid using this method directly, use ContentHandler::getSecondaryDataUpdates()
+        *   instead! The content handler may provide additional update objects.
         *
         * @since 1.20
         *
index 920b6f6..4d821ca 100644 (file)
 /**
  * @ingroup Parser
  */
-class Parser_DiffTest
-{
-       var $parsers, $conf;
-       var $shortOutput = false;
+class Parser_DiffTest {
+       /** @var array */
+       protected $parsers;
 
-       var $dtUniqPrefix;
+       /** @var array */
+       protected $conf;
+
+       /** @var bool */
+       protected $shortOutput = false;
+
+       /** @var string */
+       protected $dtUniqPrefix;
 
        function __construct( $conf ) {
                if ( !isset( $conf['parsers'] ) ) {
index 4cd5694..b8e262a 100644 (file)
@@ -40,7 +40,8 @@ interface Preprocessor {
        function newFrame();
 
        /**
-        * Create a new custom frame for programmatic use of parameter replacement as used in some extensions
+        * Create a new custom frame for programmatic use of parameter replacement
+        * as used in some extensions.
         *
         * @param array $args
         *
@@ -49,7 +50,8 @@ interface Preprocessor {
        function newCustomFrame( $args );
 
        /**
-        * Create a new custom node for programmatic use of parameter replacement as used in some extensions
+        * Create a new custom node for programmatic use of parameter replacement
+        * as used in some extensions.
         *
         * @param array $values
         */
@@ -84,8 +86,8 @@ interface PPFrame {
        /**
         * Create a child frame
         *
-        * @param array $args
-        * @param Title $title
+        * @param array|bool $args
+        * @param bool|Title $title
         * @param int $indexOffset A number subtracted from the index attributes of the arguments
         *
         * @return PPFrame
index df3cbeb..7d8a0b6 100644 (file)
  * @ingroup Parser
  */
 class Preprocessor_DOM implements Preprocessor {
+       /** @var Parser */
+       public $parser;
 
-       /**
-        * @var Parser
-        */
-       var $parser;
-
-       var $memoryLimit;
+       protected $memoryLimit;
 
        const CACHE_VERSION = 1;
 
@@ -73,18 +70,34 @@ class Preprocessor_DOM implements Preprocessor {
 
                foreach ( $values as $k => $val ) {
                        if ( is_int( $k ) ) {
-                               $xml .= "<part><name index=\"$k\"/><value>" . htmlspecialchars( $val ) . "</value></part>";
+                               $xml .= "<part><name index=\"$k\"/><value>"
+                                       . htmlspecialchars( $val ) . "</value></part>";
                        } else {
-                               $xml .= "<part><name>" . htmlspecialchars( $k ) . "</name>=<value>" . htmlspecialchars( $val ) . "</value></part>";
+                               $xml .= "<part><name>" . htmlspecialchars( $k )
+                                       . "</name>=<value>" . htmlspecialchars( $val ) . "</value></part>";
                        }
                }
 
                $xml .= "</list>";
 
+               wfProfileIn( __METHOD__ . '-loadXML' );
                $dom = new DOMDocument();
-               $dom->loadXML( $xml );
-               $root = $dom->documentElement;
+               wfSuppressWarnings();
+               $result = $dom->loadXML( $xml );
+               wfRestoreWarnings();
+               if ( !$result ) {
+                       // Try running the XML through UtfNormal to get rid of invalid characters
+                       $xml = UtfNormal::cleanUp( $xml );
+                       // 1 << 19 == XML_PARSE_HUGE, needed so newer versions of libxml2 don't barf when the XML is >256 levels deep
+                       $result = $dom->loadXML( $xml, 1 << 19 );
+               }
+               wfProfileOut( __METHOD__ . '-loadXML' );
+
+               if ( !$result ) {
+                       throw new MWException( 'Parameters passed to ' . __METHOD__ . ' result in invalid XML' );
+               }
 
+               $root = $dom->documentElement;
                $node = new PPNode_DOM( $root->childNodes );
                return $node;
        }
@@ -111,8 +124,9 @@ class Preprocessor_DOM implements Preprocessor {
         *
         * @param string $text The text to parse
         * @param int $flags Bitwise combination of:
-        *     Parser::PTD_FOR_INCLUSION    Handle "<noinclude>" and "<includeonly>" as if the text is being
-        *                                  included. Default is to assume a direct page view.
+        *     Parser::PTD_FOR_INCLUSION  Handle "<noinclude>" and "<includeonly>"
+        *                                as if the text is being included. Default
+        *                                is to assume a direct page view.
         *
         * The generated DOM tree must depend only on the input text and the flags.
         * The DOM tree must be the same in OT_HTML and OT_WIKI mode, to avoid a regression of bug 4899.
@@ -180,7 +194,8 @@ class Preprocessor_DOM implements Preprocessor {
                if ( !$result ) {
                        // Try running the XML through UtfNormal to get rid of invalid characters
                        $xml = UtfNormal::cleanUp( $xml );
-                       // 1 << 19 == XML_PARSE_HUGE, needed so newer versions of libxml2 don't barf when the XML is >256 levels deep
+                       // 1 << 19 == XML_PARSE_HUGE, needed so newer versions of libxml2
+                       // don't barf when the XML is >256 levels deep.
                        $result = $dom->loadXML( $xml, 1 << 19 );
                }
                if ( $result ) {
@@ -233,7 +248,9 @@ class Preprocessor_DOM implements Preprocessor {
                        $ignoredTags = array( 'includeonly', '/includeonly' );
                        $ignoredElements = array( 'noinclude' );
                        $xmlishElements[] = 'noinclude';
-                       if ( strpos( $text, '<onlyinclude>' ) !== false && strpos( $text, '</onlyinclude>' ) !== false ) {
+                       if ( strpos( $text, '<onlyinclude>' ) !== false
+                               && strpos( $text, '</onlyinclude>' ) !== false
+                       ) {
                                $enableOnlyinclude = true;
                        }
                } else {
@@ -249,19 +266,28 @@ class Preprocessor_DOM implements Preprocessor {
                $stack = new PPDStack;
 
                $searchBase = "[{<\n"; #}
-               $revText = strrev( $text ); // For fast reverse searches
+               // For fast reverse searches
+               $revText = strrev( $text );
                $lengthText = strlen( $text );
 
-               $i = 0;                     # Input pointer, starts out pointing to a pseudo-newline before the start
-               $accum =& $stack->getAccum();   # Current accumulator
+               // Input pointer, starts out pointing to a pseudo-newline before the start
+               $i = 0;
+               // Current accumulator
+               $accum =& $stack->getAccum();
                $accum = '<root>';
-               $findEquals = false;            # True to find equals signs in arguments
-               $findPipe = false;              # True to take notice of pipe characters
+               // True to find equals signs in arguments
+               $findEquals = false;
+               // True to take notice of pipe characters
+               $findPipe = false;
                $headingIndex = 1;
-               $inHeading = false;        # True if $i is inside a possible heading
-               $noMoreGT = false;         # True if there are no more greater-than (>) signs right of $i
-               $findOnlyinclude = $enableOnlyinclude; # True to ignore all input up to the next <onlyinclude>
-               $fakeLineStart = true;     # Do a line-start run without outputting an LF character
+               // True if $i is inside a possible heading
+               $inHeading = false;
+               // True if there are no more greater-than (>) signs right of $i
+               $noMoreGT = false;
+               // True to ignore all input up to the next <onlyinclude>
+               $findOnlyinclude = $enableOnlyinclude;
+               // Do a line-start run without outputting an LF character
+               $fakeLineStart = true;
 
                while ( true ) {
                        //$this->memCheck();
@@ -346,7 +372,9 @@ class Preprocessor_DOM implements Preprocessor {
                        if ( $found == 'angle' ) {
                                $matches = false;
                                // Handle </onlyinclude>
-                               if ( $enableOnlyinclude && substr( $text, $i, strlen( '</onlyinclude>' ) ) == '</onlyinclude>' ) {
+                               if ( $enableOnlyinclude
+                                       && substr( $text, $i, strlen( '</onlyinclude>' ) ) == '</onlyinclude>'
+                               ) {
                                        $findOnlyinclude = true;
                                        continue;
                                }
@@ -460,7 +488,9 @@ class Preprocessor_DOM implements Preprocessor {
 
                                // Handle ignored tags
                                if ( in_array( $lowerName, $ignoredTags ) ) {
-                                       $accum .= '<ignore>' . htmlspecialchars( substr( $text, $i, $tagEndPos - $i + 1 ) ) . '</ignore>';
+                                       $accum .= '<ignore>'
+                                               . htmlspecialchars( substr( $text, $i, $tagEndPos - $i + 1 ) )
+                                               . '</ignore>';
                                        $i = $tagEndPos + 1;
                                        continue;
                                }
@@ -520,9 +550,11 @@ class Preprocessor_DOM implements Preprocessor {
 
                                $count = strspn( $text, '=', $i, 6 );
                                if ( $count == 1 && $findEquals ) {
-                                       // DWIM: This looks kind of like a name/value separator
-                                       // Let's let the equals handler have it and break the potential heading
-                                       // This is heuristic, but AFAICT the methods for completely correct disambiguation are very complex.
+                                       // DWIM: This looks kind of like a name/value separator.
+                                       // Let's let the equals handler have it and break the
+                                       // potential heading. This is heuristic, but AFAICT the
+                                       // methods for completely correct disambiguation are very
+                                       // complex.
                                } elseif ( $count > 0 ) {
                                        $piece = array(
                                                'open' => "\n",
@@ -541,8 +573,9 @@ class Preprocessor_DOM implements Preprocessor {
                                // A heading must be open, otherwise \n wouldn't have been in the search list
                                assert( '$piece->open == "\n"' );
                                $part = $piece->getCurrentPart();
-                               // Search back through the input to see if it has a proper close
-                               // Do this using the reversed string since the other solutions (end anchor, etc.) are inefficient
+                               // Search back through the input to see if it has a proper close.
+                               // Do this using the reversed string since the other solutions
+                               // (end anchor, etc.) are inefficient.
                                $wsLength = strspn( $revText, " \t", $lengthText - $i );
                                $searchStart = $i - $wsLength;
                                if ( isset( $part->commentEnd ) && $searchStart - 1 == $part->commentEnd ) {
@@ -736,16 +769,22 @@ class Preprocessor_DOM implements Preprocessor {
  * @ingroup Parser
  */
 class PPDStack {
-       var $stack, $rootAccum;
+       /** @var array */
+       public $stack;
 
-       /**
-        * @var PPDStack
-        */
-       var $top;
-       var $out;
-       var $elementClass = 'PPDStackElement';
+       /** @var string */
+       public $rootAccum;
+
+       /** @var bool|PPDStack */
+       public $top;
+
+       /** @var */
+       public $out;
 
-       static $false = false;
+       /** @var string */
+       protected $elementClass = 'PPDStackElement';
+
+       protected static $false = false;
 
        function __construct() {
                $this->stack = array();
@@ -825,13 +864,26 @@ class PPDStack {
  * @ingroup Parser
  */
 class PPDStackElement {
-       var     $open,              // Opening character (\n for heading)
-               $close,             // Matching closing character
-               $count,             // Number of opening characters found (number of "=" for heading)
-               $parts,             // Array of PPDPart objects describing pipe-separated parts.
-               $lineStart;         // True if the open char appeared at the start of the input line. Not set for headings.
+       /** @var string Opening character (\n for heading) */
+       public $open;
+
+       /** @var string Matching closing character */
+       public $close;
+
+       /** @var int Number of opening characters found (number of "=" for heading) */
+       public $count;
+
+       /** @var array PPDPart objects describing pipe-separated parts. */
+       public $parts;
+
+       /**
+        * @var bool True if the open char appeared at the start of the input line.
+        * Not set for headings.
+        */
+       public $lineStart;
 
-       var $partClass = 'PPDPart';
+       /** @var string */
+       protected $partClass = 'PPDPart';
 
        function __construct( $data = array() ) {
                $class = $this->partClass;
@@ -871,6 +923,7 @@ class PPDStackElement {
        /**
         * Get the output string that would result if the close is not found.
         *
+        * @param bool|int $openingCount
         * @return string
         */
        function breakSyntax( $openingCount = false ) {
@@ -899,7 +952,8 @@ class PPDStackElement {
  * @ingroup Parser
  */
 class PPDPart {
-       var $out; // Output accumulator string
+       /** @var string */
+       public $out;
 
        // Optional member variables:
        //   eqpos        Position of equals sign in output accumulator
@@ -916,34 +970,29 @@ class PPDPart {
  * @ingroup Parser
  */
 class PPFrame_DOM implements PPFrame {
+       /** @var array */
+       public $titleCache;
 
        /**
-        * @var Preprocessor
+        * @var array Hashtable listing templates which are disallowed for expansion
+        *   in this frame, having been encountered previously in parent frames.
         */
-       var $preprocessor;
+       public $loopCheckHash;
 
        /**
-        * @var Parser
+        * @var int Recursion depth of this frame, top = 0.
+        * Note that this is NOT the same as expansion depth in expand()
         */
-       var $parser;
+       public $depth;
 
-       /**
-        * @var Title
-        */
-       var $title;
-       var $titleCache;
+       /** @var Preprocessor */
+       protected $preprocessor;
 
-       /**
-        * Hashtable listing templates which are disallowed for expansion in this frame,
-        * having been encountered previously in parent frames.
-        */
-       var $loopCheckHash;
+       /** @var Parser */
+       protected $parser;
 
-       /**
-        * Recursion depth of this frame, top = 0
-        * Note that this is NOT the same as expansion depth in expand()
-        */
-       var $depth;
+       /** @var Title */
+       protected $title;
 
        /**
         * Construct a new preprocessor frame.
@@ -1148,8 +1197,9 @@ class PPFrame_DOM implements PPFrame {
                                        ) {
                                                $out .= '';
                                        } elseif ( $this->parser->ot['wiki'] && !( $flags & PPFrame::RECOVER_COMMENTS ) ) {
-                                               # Add a strip marker in PST mode so that pstPass2() can run some old-fashioned regexes on the result
-                                               # Not in RECOVER_COMMENTS mode (extractSections) though
+                                               # Add a strip marker in PST mode so that pstPass2() can
+                                               # run some old-fashioned regexes on the result.
+                                               # Not in RECOVER_COMMENTS mode (extractSections) though.
                                                $out .= $this->parser->insertStripItem( $contextNode->textContent );
                                        } else {
                                                # Recover the literal comment in RECOVER_COMMENTS and pre+no-remove
@@ -1160,7 +1210,9 @@ class PPFrame_DOM implements PPFrame {
                                        # OT_WIKI will only respect <ignore> in substed templates.
                                        # The other output types respect it unless NO_IGNORE is set.
                                        # extractSections() sets NO_IGNORE and so never respects it.
-                                       if ( ( !isset( $this->parent ) && $this->parser->ot['wiki'] ) || ( $flags & PPFrame::NO_IGNORE ) ) {
+                                       if ( ( !isset( $this->parent ) && $this->parser->ot['wiki'] )
+                                               || ( $flags & PPFrame::NO_IGNORE )
+                                       ) {
                                                $out .= $contextNode->textContent;
                                        } else {
                                                $out .= '';
@@ -1433,22 +1485,31 @@ class PPFrame_DOM implements PPFrame {
  * @ingroup Parser
  */
 class PPTemplateFrame_DOM extends PPFrame_DOM {
-       var $numberedArgs, $namedArgs;
+       /** @var PPFrame_DOM */
+       public $parent;
 
-       /**
-        * @var PPFrame_DOM
-        */
-       var $parent;
-       var $numberedExpansionCache, $namedExpansionCache;
+       /** @var array */
+       protected $numberedArgs;
+
+       /** @var array */
+       protected $namedArgs;
+
+       /** @var array */
+       protected $numberedExpansionCache;
+
+       /** @var string[] */
+       protected $namedExpansionCache;
 
        /**
         * @param Preprocessor $preprocessor
-        * @param PPFrame_DOM $parent
+        * @param bool|PPFrame_DOM $parent
         * @param array $numberedArgs
         * @param array $namedArgs
-        * @param Title $title
+        * @param bool|Title $title
         */
-       function __construct( $preprocessor, $parent = false, $numberedArgs = array(), $namedArgs = array(), $title = false ) {
+       function __construct( $preprocessor, $parent = false, $numberedArgs = array(),
+               $namedArgs = array(), $title = false
+       ) {
                parent::__construct( $preprocessor );
 
                $this->parent = $parent;
@@ -1524,7 +1585,10 @@ class PPTemplateFrame_DOM extends PPFrame_DOM {
                }
                if ( !isset( $this->numberedExpansionCache[$index] ) ) {
                        # No trimming for unnamed arguments
-                       $this->numberedExpansionCache[$index] = $this->parent->expand( $this->numberedArgs[$index], PPFrame::STRIP_COMMENTS );
+                       $this->numberedExpansionCache[$index] = $this->parent->expand(
+                               $this->numberedArgs[$index],
+                               PPFrame::STRIP_COMMENTS
+                       );
                }
                return $this->numberedExpansionCache[$index];
        }
@@ -1564,7 +1628,7 @@ class PPTemplateFrame_DOM extends PPFrame_DOM {
  * @ingroup Parser
  */
 class PPCustomFrame_DOM extends PPFrame_DOM {
-       var $args;
+       protected $args;
 
        function __construct( $preprocessor, $args ) {
                parent::__construct( $preprocessor );
@@ -1610,12 +1674,11 @@ class PPCustomFrame_DOM extends PPFrame_DOM {
  * @ingroup Parser
  */
 class PPNode_DOM implements PPNode {
+       /** @var DOMElement */
+       public $node;
 
-       /**
-        * @var DOMElement
-        */
-       var $node;
-       var $xpath;
+       /** @var DOMXPath */
+       protected $xpath;
 
        function __construct( $node, $xpath = false ) {
                $this->node = $node;
index aebb98e..a5b6b43 100644 (file)
  * @ingroup Parser
  */
 class Preprocessor_Hash implements Preprocessor {
-       /**
-        * @var Parser
-        */
-       var $parser;
+       /** @var Parser */
+       public $parser;
 
        const CACHE_VERSION = 1;
 
@@ -114,7 +112,9 @@ class Preprocessor_Hash implements Preprocessor {
                // Check cache.
                global $wgMemc, $wgPreprocessorCacheThreshold;
 
-               $cacheable = $wgPreprocessorCacheThreshold !== false && strlen( $text ) > $wgPreprocessorCacheThreshold;
+               $cacheable = $wgPreprocessorCacheThreshold !== false
+                       && strlen( $text ) > $wgPreprocessorCacheThreshold;
+
                if ( $cacheable ) {
                        wfProfileIn( __METHOD__ . '-cacheable' );
 
@@ -161,7 +161,9 @@ class Preprocessor_Hash implements Preprocessor {
                        $ignoredTags = array( 'includeonly', '/includeonly' );
                        $ignoredElements = array( 'noinclude' );
                        $xmlishElements[] = 'noinclude';
-                       if ( strpos( $text, '<onlyinclude>' ) !== false && strpos( $text, '</onlyinclude>' ) !== false ) {
+                       if ( strpos( $text, '<onlyinclude>' ) !== false
+                               && strpos( $text, '</onlyinclude>' ) !== false
+                       ) {
                                $enableOnlyinclude = true;
                        }
                } else {
@@ -177,18 +179,27 @@ class Preprocessor_Hash implements Preprocessor {
                $stack = new PPDStack_Hash;
 
                $searchBase = "[{<\n";
-               $revText = strrev( $text ); // For fast reverse searches
+               // For fast reverse searches
+               $revText = strrev( $text );
                $lengthText = strlen( $text );
 
-               $i = 0;                     # Input pointer, starts out pointing to a pseudo-newline before the start
-               $accum =& $stack->getAccum();   # Current accumulator
-               $findEquals = false;            # True to find equals signs in arguments
-               $findPipe = false;              # True to take notice of pipe characters
+               // Input pointer, starts out pointing to a pseudo-newline before the start
+               $i = 0;
+               // Current accumulator
+               $accum =& $stack->getAccum();
+               // True to find equals signs in arguments
+               $findEquals = false;
+               // True to take notice of pipe characters
+               $findPipe = false;
                $headingIndex = 1;
-               $inHeading = false;        # True if $i is inside a possible heading
-               $noMoreGT = false;         # True if there are no more greater-than (>) signs right of $i
-               $findOnlyinclude = $enableOnlyinclude; # True to ignore all input up to the next <onlyinclude>
-               $fakeLineStart = true;     # Do a line-start run without outputting an LF character
+               // True if $i is inside a possible heading
+               $inHeading = false;
+               // True if there are no more greater-than (>) signs right of $i
+               $noMoreGT = false;
+               // True to ignore all input up to the next <onlyinclude>
+               $findOnlyinclude = $enableOnlyinclude;
+               // Do a line-start run without outputting an LF character
+               $fakeLineStart = true;
 
                while ( true ) {
                        //$this->memCheck();
@@ -273,7 +284,9 @@ class Preprocessor_Hash implements Preprocessor {
                        if ( $found == 'angle' ) {
                                $matches = false;
                                // Handle </onlyinclude>
-                               if ( $enableOnlyinclude && substr( $text, $i, strlen( '</onlyinclude>' ) ) == '</onlyinclude>' ) {
+                               if ( $enableOnlyinclude
+                                       && substr( $text, $i, strlen( '</onlyinclude>' ) ) == '</onlyinclude>'
+                               ) {
                                        $findOnlyinclude = true;
                                        continue;
                                }
@@ -452,9 +465,10 @@ class Preprocessor_Hash implements Preprocessor {
 
                                $count = strspn( $text, '=', $i, 6 );
                                if ( $count == 1 && $findEquals ) {
-                                       // DWIM: This looks kind of like a name/value separator
-                                       // Let's let the equals handler have it and break the potential heading
-                                       // This is heuristic, but AFAICT the methods for completely correct disambiguation are very complex.
+                                       // DWIM: This looks kind of like a name/value separator.
+                                       // Let's let the equals handler have it and break the potential
+                                       // heading. This is heuristic, but AFAICT the methods for
+                                       // completely correct disambiguation are very complex.
                                } elseif ( $count > 0 ) {
                                        $piece = array(
                                                'open' => "\n",
@@ -472,8 +486,9 @@ class Preprocessor_Hash implements Preprocessor {
                                // A heading must be open, otherwise \n wouldn't have been in the search list
                                assert( '$piece->open == "\n"' );
                                $part = $piece->getCurrentPart();
-                               // Search back through the input to see if it has a proper close
-                               // Do this using the reversed string since the other solutions (end anchor, etc.) are inefficient
+                               // Search back through the input to see if it has a proper close.
+                               // Do this using the reversed string since the other solutions
+                               // (end anchor, etc.) are inefficient.
                                $wsLength = strspn( $revText, " \t", $lengthText - $i );
                                $searchStart = $i - $wsLength;
                                if ( isset( $part->commentEnd ) && $searchStart - 1 == $part->commentEnd ) {
@@ -805,7 +820,9 @@ class PPDPart_Hash extends PPDPart {
  * @ingroup Parser
  */
 class PPDAccum_Hash {
-       var $firstNode, $lastNode;
+       public $firstNode;
+
+       public $lastNode;
 
        function __construct() {
                $this->firstNode = $this->lastNode = false;
@@ -850,10 +867,10 @@ class PPDAccum_Hash {
        }
 
        /**
-        * Append a PPAccum_Hash
+        * Append a PPDAccum_Hash
         * Takes over ownership of the nodes in the source argument. These nodes may
         * subsequently be modified, especially nextSibling.
-        * @param PPAccum_Hash $accum
+        * @param PPDAccum_Hash $accum
         */
        function addAccum( $accum ) {
                if ( $accum->lastNode === false ) {
@@ -873,34 +890,30 @@ class PPDAccum_Hash {
  * @ingroup Parser
  */
 class PPFrame_Hash implements PPFrame {
-
        /**
-        * @var Parser
+        * @var int Recursion depth of this frame, top = 0
+        * Note that this is NOT the same as expansion depth in expand()
         */
-       var $parser;
+       public $depth;
 
-       /**
-        * @var Preprocessor
-        */
-       var $preprocessor;
+       /** @var Parser */
+       protected $parser;
 
-       /**
-        * @var Title
-        */
-       var $title;
-       var $titleCache;
+       /** @var Preprocessor */
+       protected $preprocessor;
 
-       /**
-        * Hashtable listing templates which are disallowed for expansion in this frame,
-        * having been encountered previously in parent frames.
-        */
-       var $loopCheckHash;
+       /** @var Title */
+       protected $title;
+
+       /** @var array */
+       protected $titleCache;
 
        /**
-        * Recursion depth of this frame, top = 0
-        * Note that this is NOT the same as expansion depth in expand()
+        * @var array Hashtable listing templates which are disallowed for
+        *   expansion in this frame, having been encountered previously in
+        *   parent frames.
         */
-       var $depth;
+       protected $loopCheckHash;
 
        /**
         * Construct a new preprocessor frame.
@@ -1038,7 +1051,11 @@ class PPFrame_Hash implements PPFrame {
                                        # Double-brace expansion
                                        $bits = $contextNode->splitTemplate();
                                        if ( $flags & PPFrame::NO_TEMPLATES ) {
-                                               $newIterator = $this->virtualBracketedImplode( '{{', '|', '}}', $bits['title'], $bits['parts'] );
+                                               $newIterator = $this->virtualBracketedImplode(
+                                                       '{{', '|', '}}',
+                                                       $bits['title'],
+                                                       $bits['parts']
+                                               );
                                        } else {
                                                $ret = $this->parser->braceSubstitution( $bits, $this );
                                                if ( isset( $ret['object'] ) ) {
@@ -1051,7 +1068,11 @@ class PPFrame_Hash implements PPFrame {
                                        # Triple-brace expansion
                                        $bits = $contextNode->splitTemplate();
                                        if ( $flags & PPFrame::NO_ARGS ) {
-                                               $newIterator = $this->virtualBracketedImplode( '{{{', '|', '}}}', $bits['title'], $bits['parts'] );
+                                               $newIterator = $this->virtualBracketedImplode(
+                                                       '{{{', '|', '}}}',
+                                                       $bits['title'],
+                                                       $bits['parts']
+                                               );
                                        } else {
                                                $ret = $this->parser->argSubstitution( $bits, $this );
                                                if ( isset( $ret['object'] ) ) {
@@ -1069,8 +1090,9 @@ class PPFrame_Hash implements PPFrame {
                                        ) {
                                                $out .= '';
                                        } elseif ( $this->parser->ot['wiki'] && !( $flags & PPFrame::RECOVER_COMMENTS ) ) {
-                                               # Add a strip marker in PST mode so that pstPass2() can run some old-fashioned regexes on the result
-                                               # Not in RECOVER_COMMENTS mode (extractSections) though
+                                               # Add a strip marker in PST mode so that pstPass2() can
+                                               # run some old-fashioned regexes on the result.
+                                               # Not in RECOVER_COMMENTS mode (extractSections) though.
                                                $out .= $this->parser->insertStripItem( $contextNode->firstChild->value );
                                        } else {
                                                # Recover the literal comment in RECOVER_COMMENTS and pre+no-remove
@@ -1081,7 +1103,9 @@ class PPFrame_Hash implements PPFrame {
                                        # OT_WIKI will only respect <ignore> in substed templates.
                                        # The other output types respect it unless NO_IGNORE is set.
                                        # extractSections() sets NO_IGNORE and so never respects it.
-                                       if ( ( !isset( $this->parent ) && $this->parser->ot['wiki'] ) || ( $flags & PPFrame::NO_IGNORE ) ) {
+                                       if ( ( !isset( $this->parent ) && $this->parser->ot['wiki'] )
+                                               || ( $flags & PPFrame::NO_IGNORE )
+                                       ) {
                                                $out .= $contextNode->firstChild->value;
                                        } else {
                                                //$out .= '';
@@ -1351,17 +1375,31 @@ class PPFrame_Hash implements PPFrame {
  * @ingroup Parser
  */
 class PPTemplateFrame_Hash extends PPFrame_Hash {
-       var $numberedArgs, $namedArgs, $parent;
-       var $numberedExpansionCache, $namedExpansionCache;
+       /** @var array */
+       protected $numberedArgs;
+
+       /** @var array */
+       protected $namedArgs;
+
+       /** @var bool|PPFrame */
+       protected $parent;
+
+       /** @var array */
+       protected $numberedExpansionCache;
+
+       /** @var  */
+       protected $namedExpansionCache;
 
        /**
         * @param Preprocessor $preprocessor
         * @param bool|PPFrame $parent
         * @param array $numberedArgs
         * @param array $namedArgs
-        * @param Title $title
+        * @param bool|Title $title
         */
-       function __construct( $preprocessor, $parent = false, $numberedArgs = array(), $namedArgs = array(), $title = false ) {
+       function __construct( $preprocessor, $parent = false, $numberedArgs = array(),
+               $namedArgs = array(), $title = false
+       ) {
                parent::__construct( $preprocessor );
 
                $this->parent = $parent;
@@ -1450,7 +1488,10 @@ class PPTemplateFrame_Hash extends PPFrame_Hash {
                }
                if ( !isset( $this->numberedExpansionCache[$index] ) ) {
                        # No trimming for unnamed arguments
-                       $this->numberedExpansionCache[$index] = $this->parent->expand( $this->numberedArgs[$index], PPFrame::STRIP_COMMENTS );
+                       $this->numberedExpansionCache[$index] = $this->parent->expand(
+                               $this->numberedArgs[$index],
+                               PPFrame::STRIP_COMMENTS
+                       );
                }
                return $this->numberedExpansionCache[$index];
        }
@@ -1498,7 +1539,8 @@ class PPTemplateFrame_Hash extends PPFrame_Hash {
  * @ingroup Parser
  */
 class PPCustomFrame_Hash extends PPFrame_Hash {
-       var $args;
+       /** @var array */
+       protected $args;
 
        function __construct( $preprocessor, $args ) {
                parent::__construct( $preprocessor );
@@ -1548,7 +1590,13 @@ class PPCustomFrame_Hash extends PPFrame_Hash {
  * @ingroup Parser
  */
 class PPNode_Hash_Tree implements PPNode {
-       var $name, $firstChild, $lastChild, $nextSibling;
+       public $name;
+
+       public $firstChild;
+
+       public $lastChild;
+
+       public $nextSibling;
 
        function __construct( $name ) {
                $this->name = $name;
@@ -1770,7 +1818,9 @@ class PPNode_Hash_Tree implements PPNode {
  * @ingroup Parser
  */
 class PPNode_Hash_Text implements PPNode {
-       var $value, $nextSibling;
+       public $value;
+
+       public $nextSibling;
 
        function __construct( $value ) {
                if ( is_object( $value ) ) {
@@ -1787,22 +1837,50 @@ class PPNode_Hash_Text implements PPNode {
                return $this->nextSibling;
        }
 
-       function getChildren() { return false; }
-       function getFirstChild() { return false; }
-       function getChildrenOfType( $name ) { return false; }
-       function getLength() { return false; }
-       function item( $i ) { return false; }
-       function getName() { return '#text'; }
-       function splitArg() { throw new MWException( __METHOD__ . ': not supported' ); }
-       function splitExt() { throw new MWException( __METHOD__ . ': not supported' ); }
-       function splitHeading() { throw new MWException( __METHOD__ . ': not supported' ); }
+       function getChildren() {
+               return false;
+       }
+
+       function getFirstChild() {
+               return false;
+       }
+
+       function getChildrenOfType( $name ) {
+               return false;
+       }
+
+       function getLength() {
+               return false;
+       }
+
+       function item( $i ) {
+               return false;
+       }
+
+       function getName() {
+               return '#text';
+       }
+
+       function splitArg() {
+               throw new MWException( __METHOD__ . ': not supported' );
+       }
+
+       function splitExt() {
+               throw new MWException( __METHOD__ . ': not supported' );
+       }
+
+       function splitHeading() {
+               throw new MWException( __METHOD__ . ': not supported' );
+       }
 }
 
 /**
  * @ingroup Parser
  */
 class PPNode_Hash_Array implements PPNode {
-       var $value, $nextSibling;
+       public $value;
+
+       public $nextSibling;
 
        function __construct( $value ) {
                $this->value = $value;
@@ -1820,25 +1898,50 @@ class PPNode_Hash_Array implements PPNode {
                return $this->value[$i];
        }
 
-       function getName() { return '#nodelist'; }
+       function getName() {
+               return '#nodelist';
+       }
 
        function getNextSibling() {
                return $this->nextSibling;
        }
 
-       function getChildren() { return false; }
-       function getFirstChild() { return false; }
-       function getChildrenOfType( $name ) { return false; }
-       function splitArg() { throw new MWException( __METHOD__ . ': not supported' ); }
-       function splitExt() { throw new MWException( __METHOD__ . ': not supported' ); }
-       function splitHeading() { throw new MWException( __METHOD__ . ': not supported' ); }
+       function getChildren() {
+               return false;
+       }
+
+       function getFirstChild() {
+               return false;
+       }
+
+       function getChildrenOfType( $name ) {
+               return false;
+       }
+
+       function splitArg() {
+               throw new MWException( __METHOD__ . ': not supported' );
+       }
+
+       function splitExt() {
+               throw new MWException( __METHOD__ . ': not supported' );
+       }
+
+       function splitHeading() {
+               throw new MWException( __METHOD__ . ': not supported' );
+       }
 }
 
 /**
  * @ingroup Parser
  */
 class PPNode_Hash_Attr implements PPNode {
-       var $name, $value, $nextSibling;
+       /** @var string */
+       public $name;
+
+       /** @var string */
+       public $value;
+
+       public $nextSibling;
 
        function __construct( $name, $value ) {
                $this->name = $name;
@@ -1857,12 +1960,35 @@ class PPNode_Hash_Attr implements PPNode {
                return $this->nextSibling;
        }
 
-       function getChildren() { return false; }
-       function getFirstChild() { return false; }
-       function getChildrenOfType( $name ) { return false; }
-       function getLength() { return false; }
-       function item( $i ) { return false; }
-       function splitArg() { throw new MWException( __METHOD__ . ': not supported' ); }
-       function splitExt() { throw new MWException( __METHOD__ . ': not supported' ); }
-       function splitHeading() { throw new MWException( __METHOD__ . ': not supported' ); }
+       function getChildren() {
+               return false;
+       }
+
+       function getFirstChild() {
+               return false;
+       }
+
+       function getChildrenOfType( $name ) {
+               return false;
+       }
+
+       function getLength() {
+               return false;
+       }
+
+       function item( $i ) {
+               return false;
+       }
+
+       function splitArg() {
+               throw new MWException( __METHOD__ . ': not supported' );
+       }
+
+       function splitExt() {
+               throw new MWException( __METHOD__ . ': not supported' );
+       }
+
+       function splitHeading() {
+               throw new MWException( __METHOD__ . ': not supported' );
+       }
 }
index a44200f..34953c0 100644 (file)
@@ -123,7 +123,10 @@ abstract class PoolCounter {
        abstract public function release();
 }
 
+// @codingStandardsIgnoreStart Squiz.Classes.ValidClassName.NotCamelCaps
 class PoolCounter_Stub extends PoolCounter {
+       // @codingStandardsIgnoreEnd
+
        public function __construct() {
                /* No parameters needed */
        }
index 36101e0..093fe49 100644 (file)
@@ -45,7 +45,7 @@
  * Also this should be on a server plenty of RAM for the working set to avoid evictions.
  * Evictions could temporarily allow wait queues to double in size or temporarily cause
  * pools to appear as full when they are not. Using volatile-ttl and bumping memory-samples
- * and redis.conf can be helpful otherwise.
+ * in redis.conf can be helpful otherwise.
  *
  * @ingroup Redis
  * @since 1.23
@@ -406,7 +406,8 @@ LUA;
                                if ( $poolCounter->slot !== null ) {
                                        $poolCounter->release();
                                }
-                       } catch ( Exception $e ) {}
+                       } catch ( Exception $e ) {
+                       }
                }
        }
 }
index efbdf05..f6bafd5 100644 (file)
@@ -101,8 +101,10 @@ abstract class Profiler {
        /** @var TransactionProfiler */
        protected $trxProfiler;
 
-       /** @var Profiler */
-       public static $__instance = null; // do not call this outside Profiler and ProfileSection
+       // @codingStandardsIgnoreStart PSR2.Classes.PropertyDeclaration.Underscore
+       /** @var Profiler Do not call this outside Profiler and ProfileSection */
+       public static $__instance = null;
+       // @codingStandardsIgnoreEnd
 
        /**
         * @param array $params
index 6911d4b..38a6436 100644 (file)
@@ -105,6 +105,7 @@ class ProfilerSimpleDB extends ProfilerStandard {
                        if ( $useTrx ) {
                                $dbw->commit();
                        }
-               } catch ( DBError $e ) {}
+               } catch ( DBError $e ) {
+               }
        }
 }
index 6de97ba..1d3b65d 100644 (file)
@@ -30,16 +30,37 @@ class ProfilerStub extends Profiler {
        public function isStub() {
                return true;
        }
+
        public function isPersistent() {
                return false;
        }
-       public function profileIn( $fn ) {}
-       public function profileOut( $fn ) {}
-       public function getOutput() {}
-       public function close() {}
-       public function logData() {}
-       public function getCurrentSection() { return ''; }
-       public function transactionWritingIn( $server, $db, $id = '' ) {}
-       public function transactionWritingOut( $server, $db, $id = '' ) {}
-       public function getRawData() { return array(); }
+
+       public function profileIn( $fn ) {
+       }
+
+       public function profileOut( $fn ) {
+       }
+
+       public function getOutput() {
+       }
+
+       public function close() {
+       }
+
+       public function logData() {
+       }
+
+       public function getCurrentSection() {
+               return '';
+       }
+
+       public function transactionWritingIn( $server, $db, $id = '' ) {
+       }
+
+       public function transactionWritingOut( $server, $db, $id = '' ) {
+       }
+
+       public function getRawData() {
+               return array();
+       }
 }
index c2e5b03..02a8d7e 100644 (file)
@@ -77,15 +77,22 @@ class IRCColourfulRCFeedFormatter implements RCFeedFormatter {
 
                if ( $attribs['rc_type'] == RC_LOG ) {
                        $targetText = $rc->getTitle()->getPrefixedText();
-                       $comment = self::cleanupForIRC( str_replace( "[[$targetText]]", "[[\00302$targetText\00310]]", $actionComment ) );
+                       $comment = self::cleanupForIRC( str_replace(
+                               "[[$targetText]]",
+                               "[[\00302$targetText\00310]]",
+                               $actionComment
+                       ) );
                        $flag = $attribs['rc_log_action'];
                } else {
                        $comment = self::cleanupForIRC( $attribs['rc_comment'] );
                        $flag = '';
-                       if ( !$attribs['rc_patrolled'] && ( $wgUseRCPatrol || $attribs['rc_type'] == RC_NEW && $wgUseNPPatrol ) ) {
+                       if ( !$attribs['rc_patrolled']
+                               && ( $wgUseRCPatrol || $attribs['rc_type'] == RC_NEW && $wgUseNPPatrol )
+                       ) {
                                $flag .= '!';
                        }
-                       $flag .= ( $attribs['rc_type'] == RC_NEW ? "N" : "" ) . ( $attribs['rc_minor'] ? "M" : "" ) . ( $attribs['rc_bot'] ? "B" : "" );
+                       $flag .= ( $attribs['rc_type'] == RC_NEW ? "N" : "" )
+                               . ( $attribs['rc_minor'] ? "M" : "" ) . ( $attribs['rc_bot'] ? "B" : "" );
                }
 
                if ( $feed['add_interwiki_prefix'] === true && $wgLocalInterwikis ) {
index e5077a2..3f17bcd 100644 (file)
@@ -38,7 +38,7 @@ abstract class MachineReadableRCFeedFormatter implements RCFeedFormatter {
         * @see RCFeedFormatter::getLine
         */
        public function getLine( array $feed, RecentChange $rc, $actionComment ) {
-               global $wgCanonicalServer, $wgScriptPath;
+               global $wgCanonicalServer, $wgServerName, $wgScriptPath;
                $attrib = $rc->getAttributes();
 
                $packet = array(
@@ -120,6 +120,8 @@ abstract class MachineReadableRCFeedFormatter implements RCFeedFormatter {
                }
 
                $packet['server_url'] = $wgCanonicalServer;
+               $packet['server_name'] = $wgServerName;
+
                $packet['server_script_path'] = $wgScriptPath ?: '/';
                $packet['wiki'] = wfWikiID();
 
index d723d0e..680bd99 100644 (file)
  *    https://www.mediawiki.org/wiki/ResourceLoader
  */
 class ResourceLoader {
-
-       /**
-        * @var int
-        */
+       /** @var int */
        protected static $filterCacheVersion = 7;
-       /**
-        * @var array
-        */
+
+       /** @var array */
        protected static $requiredSourceProperties = array( 'loadScript' );
 
-       /**
-        * @var array Module name/ResourceLoaderModule object pairs
-        */
+       /** @var array Module name/ResourceLoaderModule object pairs */
        protected $modules = array();
 
-       /**
-        * @var array Associative array mapping module name to info associative array
-        */
+       /** @var array Associative array mapping module name to info associative array */
        protected $moduleInfos = array();
 
        /**
@@ -55,14 +47,10 @@ class ResourceLoader {
         */
        protected $testModuleNames = array();
 
-       /**
-        * @var array e.g. array( 'source-id' => array( 'loadScript' => 'http://.../load.php' ) )
-        */
+       /** @var array e.g. array( 'source-id' => array( 'loadScript' => 'http://.../load.php' ) ) */
        protected $sources = array();
 
-       /**
-        * @var bool
-        */
+       /** @var bool */
        protected $hasErrors = false;
 
        /**
@@ -225,7 +213,10 @@ class ResourceLoader {
                wfProfileIn( __METHOD__ );
 
                // Add 'local' source first
-               $this->addSource( 'local', array( 'loadScript' => $wgLoadScript, 'apiScript' => wfScript( 'api' ) ) );
+               $this->addSource(
+                       'local',
+                       array( 'loadScript' => $wgLoadScript, 'apiScript' => wfScript( 'api' ) )
+               );
 
                // Add other sources
                $this->addSource( $wgResourceLoaderSources );
@@ -275,7 +266,8 @@ class ResourceLoader {
                        // Check $name for validity
                        if ( !self::isValidModuleName( $name ) ) {
                                wfProfileOut( __METHOD__ );
-                               throw new MWException( "ResourceLoader module name '$name' is invalid, see ResourceLoader::isValidModuleName()" );
+                               throw new MWException( "ResourceLoader module name '$name' is invalid, "
+                                       . "see ResourceLoader::isValidModuleName()" );
                        }
 
                        // Attach module
@@ -304,7 +296,9 @@ class ResourceLoader {
                global $IP, $wgEnableJavaScriptTest;
 
                if ( $wgEnableJavaScriptTest !== true ) {
-                       throw new MWException( 'Attempt to register JavaScript test modules but <code>$wgEnableJavaScriptTest</code> is false. Edit your <code>LocalSettings.php</code> to enable it.' );
+                       throw new MWException( 'Attempt to register JavaScript test modules '
+                               . 'but <code>$wgEnableJavaScriptTest</code> is false. '
+                               . 'Edit your <code>LocalSettings.php</code> to enable it.' );
                }
 
                wfProfileIn( __METHOD__ );
@@ -325,7 +319,8 @@ class ResourceLoader {
                        $module['dependencies'][] = 'test.mediawiki.qunit.testrunner';
                }
 
-               $testModules['qunit'] = ( include "$IP/tests/qunit/QUnitTestResources.php" ) + $testModules['qunit'];
+               $testModules['qunit'] =
+                       ( include "$IP/tests/qunit/QUnitTestResources.php" ) + $testModules['qunit'];
 
                foreach ( $testModules as $id => $names ) {
                        // Register test modules
@@ -395,10 +390,12 @@ class ResourceLoader {
         * @return array
         */
        public function getTestModuleNames( $framework = 'all' ) {
-               /// @todo api siteinfo prop testmodulenames modulenames
+               /** @todo api siteinfo prop testmodulenames modulenames */
                if ( $framework == 'all' ) {
                        return $this->testModuleNames;
-               } elseif ( isset( $this->testModuleNames[$framework] ) && is_array( $this->testModuleNames[$framework] ) ) {
+               } elseif ( isset( $this->testModuleNames[$framework] )
+                       && is_array( $this->testModuleNames[$framework] )
+               ) {
                        return $this->testModuleNames[$framework];
                } else {
                        return array();
@@ -763,7 +760,10 @@ class ResourceLoader {
                                $blobs = MessageBlobStore::get( $this, $modules, $context->getLanguage() );
                        } catch ( Exception $e ) {
                                MWExceptionHandler::logException( $e );
-                               wfDebugLog( 'resourceloader', __METHOD__ . ": pre-fetching blobs from MessageBlobStore failed: $e" );
+                               wfDebugLog(
+                                       'resourceloader',
+                                       __METHOD__ . ": pre-fetching blobs from MessageBlobStore failed: $e"
+                               );
                                $this->hasErrors = true;
                                // Add exception to the output as a comment
                                $exceptions .= self::formatException( $e );
@@ -795,9 +795,13 @@ class ResourceLoader {
                                                $scripts = $module->getScriptURLsForDebug( $context );
                                        } else {
                                                $scripts = $module->getScript( $context );
-                                               // rtrim() because there are usually a few line breaks after the last ';'.
-                                               // A new line at EOF, a new line added by ResourceLoaderFileModule::readScriptFiles, etc.
-                                               if ( is_string( $scripts ) && strlen( $scripts ) && substr( rtrim( $scripts ), -1 ) !== ';' ) {
+                                               // rtrim() because there are usually a few line breaks
+                                               // after the last ';'. A new line at EOF, a new line
+                                               // added by ResourceLoaderFileModule::readScriptFiles, etc.
+                                               if ( is_string( $scripts )
+                                                       && strlen( $scripts )
+                                                       && substr( rtrim( $scripts ), -1 ) !== ';'
+                                               ) {
                                                        // Append semicolon to prevent weird bugs caused by files not
                                                        // terminating their statements right (bug 27054)
                                                        $scripts .= ";\n";
@@ -1055,7 +1059,9 @@ class ResourceLoader {
         * @param string $script JavaScript code
         * @return string
         */
-       public static function makeCustomLoaderScript( $name, $version, $dependencies, $group, $source, $script ) {
+       public static function makeCustomLoaderScript( $name, $version, $dependencies,
+               $group, $source, $script
+       ) {
                $script = str_replace( "\n", "\n\t", trim( $script ) );
                return Xml::encodeJsCall(
                        "( function ( name, version, dependencies, group, source ) {\n\t$script\n} )",
@@ -1218,9 +1224,12 @@ class ResourceLoader {
         * @param array $extraQuery Extra query parameters to add
         * @return string URL to load.php. May be protocol-relative (if $wgLoadScript is procol-relative)
         */
-       public static function makeLoaderURL( $modules, $lang, $skin, $user = null, $version = null, $debug = false, $only = null,
-                       $printable = false, $handheld = false, $extraQuery = array() ) {
+       public static function makeLoaderURL( $modules, $lang, $skin, $user = null,
+               $version = null, $debug = false, $only = null, $printable = false,
+               $handheld = false, $extraQuery = array()
+       ) {
                global $wgLoadScript;
+
                $query = self::makeLoaderQuery( $modules, $lang, $skin, $user, $version, $debug,
                        $only, $printable, $handheld, $extraQuery
                );
@@ -1247,8 +1256,10 @@ class ResourceLoader {
         *
         * @return array
         */
-       public static function makeLoaderQuery( $modules, $lang, $skin, $user = null, $version = null, $debug = false, $only = null,
-                       $printable = false, $handheld = false, $extraQuery = array() ) {
+       public static function makeLoaderQuery( $modules, $lang, $skin, $user = null,
+               $version = null, $debug = false, $only = null, $printable = false,
+               $handheld = false, $extraQuery = array()
+       ) {
                $query = array(
                        'modules' => self::makePackedModulesString( $modules ),
                        'lang' => $lang,
index 63ec5de..9013e2b 100644 (file)
@@ -27,7 +27,6 @@
  * of a specific loader request
  */
 class ResourceLoaderContext {
-
        /* Protected Members */
 
        protected $resourceLoader;
@@ -109,7 +108,8 @@ class ResourceLoaderContext {
        }
 
        /**
-        * Return a dummy ResourceLoaderContext object suitable for passing into things that don't "really" need a context
+        * Return a dummy ResourceLoaderContext object suitable for passing into
+        * things that don't "really" need a context.
         * @return ResourceLoaderContext
         */
        public static function newDummyContext() {
index 61fb111..382bdd9 100644 (file)
  * ResourceLoader module based on local JavaScript/CSS files.
  */
 class ResourceLoaderFileModule extends ResourceLoaderModule {
-
        /* Protected Members */
 
        /** @var string Local base path, see __construct() */
        protected $localBasePath = '';
+
        /** @var string Remote base path, see __construct() */
        protected $remoteBasePath = '';
+
        /**
         * @var array List of paths to JavaScript files to always include
         * @par Usage:
@@ -41,6 +42,7 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
         * @endcode
         */
        protected $scripts = array();
+
        /**
         * @var array List of JavaScript files to include when using a specific language
         * @par Usage:
@@ -49,6 +51,7 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
         * @endcode
         */
        protected $languageScripts = array();
+
        /**
         * @var array List of JavaScript files to include when using a specific skin
         * @par Usage:
@@ -57,6 +60,7 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
         * @endcode
         */
        protected $skinScripts = array();
+
        /**
         * @var array List of paths to JavaScript files to include in debug mode
         * @par Usage:
@@ -65,6 +69,7 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
         * @endcode
         */
        protected $debugScripts = array();
+
        /**
         * @var array List of paths to JavaScript files to include in the startup module
         * @par Usage:
@@ -73,6 +78,7 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
         * @endcode
         */
        protected $loaderScripts = array();
+
        /**
         * @var array List of paths to CSS files to always include
         * @par Usage:
@@ -81,6 +87,7 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
         * @endcode
         */
        protected $styles = array();
+
        /**
         * @var array List of paths to CSS files to include when using specific skins
         * @par Usage:
@@ -89,6 +96,7 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
         * @endcode
         */
        protected $skinStyles = array();
+
        /**
         * @var array List of modules this module depends on
         * @par Usage:
@@ -97,6 +105,7 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
         * @endcode
         */
        protected $dependencies = array();
+
        /**
         * @var array List of message keys used by this module
         * @par Usage:
@@ -105,14 +114,19 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
         * @endcode
         */
        protected $messages = array();
+
        /** @var string Name of group to load this module in */
        protected $group;
+
        /** @var string Position on the page to load this module at */
        protected $position = 'bottom';
+
        /** @var bool Link to raw files in debug mode */
        protected $debugRaw = true;
+
        /** @var bool Whether mw.loader.state() call should be omitted */
        protected $raw = false;
+
        protected $targets = array( 'desktop' );
 
        /**
@@ -129,6 +143,7 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
         * @endcode
         */
        protected $modifiedTime = array();
+
        /**
         * @var array Place where readStyleFile() tracks file dependencies
         * @par Usage:
@@ -809,7 +824,8 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
                $result = $compiler->cachedCompile( $source );
 
                if ( !is_array( $result ) ) {
-                       throw new MWException( 'LESS compiler result has type ' . gettype( $result ) . '; array expected.' );
+                       throw new MWException( 'LESS compiler result has type '
+                               . gettype( $result ) . '; array expected.' );
                }
 
                $this->localFileRefs += array_keys( $result['files'] );
index 819bf5a..9ddd184 100644 (file)
@@ -26,7 +26,6 @@
  * Abstraction for resource loader modules, with name registration and maxage functionality.
  */
 abstract class ResourceLoaderModule {
-
        # Type of resource
        const TYPE_SCRIPTS = 'scripts';
        const TYPE_STYLES = 'styles';
@@ -441,6 +440,8 @@ abstract class ResourceLoaderModule {
        /**
         * Helper method for calculating when this module's definition summary was last changed.
         *
+        * @since 1.23
+        *
         * @return int UNIX timestamp or 0 if no definition summary was provided
         *  by getDefinitionSummary()
         */
@@ -474,7 +475,8 @@ abstract class ResourceLoaderModule {
                        return $data;
                }
 
-               wfDebugLog( 'resourceloader', __METHOD__ . ": New definition hash for module {$this->getName()} in context {$context->getHash()}: $hash." );
+               wfDebugLog( 'resourceloader', __METHOD__ . ": New definition hash for module "
+                       . "{$this->getName()} in context {$context->getHash()}: $hash." );
 
                $timestamp = time();
                $cache->set( $key, $timestamp );
@@ -505,6 +507,8 @@ abstract class ResourceLoaderModule {
         * contain arrays and scalars as values (avoid object instances) which means
         * it requires abstraction.
         *
+        * @since 1.23
+        *
         * @return array|null
         */
        public function getDefinitionSummary( ResourceLoaderContext $context ) {
index d0f0541..63a444b 100644 (file)
@@ -44,11 +44,12 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
                }
 
                global $wgLoadScript, $wgScript, $wgStylePath, $wgScriptExtension,
-                       $wgArticlePath, $wgScriptPath, $wgServer, $wgContLang,
-                       $wgVariantArticlePath, $wgActionPaths, $wgVersion,
+                       $wgArticlePath, $wgScriptPath, $wgServer, $wgServerName,
+                       $wgContLang, $wgVariantArticlePath, $wgActionPaths, $wgVersion,
                        $wgEnableAPI, $wgEnableWriteAPI, $wgDBname,
                        $wgSitename, $wgFileExtensions, $wgExtensionAssetsPath,
-                       $wgCookiePrefix, $wgResourceLoaderMaxQueryLength,
+                       $wgCookiePrefix, $wgCookieDomain, $wgCookiePath,
+                       $wgCookieExpiration, $wgResourceLoaderMaxQueryLength,
                        $wgResourceLoaderStorageEnabled, $wgResourceLoaderStorageVersion,
                        $wgSearchType;
 
@@ -85,6 +86,7 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
                        // becoming [] instead of {} in JS (bug 34604)
                        'wgActionPaths' => (object)$wgActionPaths,
                        'wgServer' => $wgServer,
+                       'wgServerName' => $wgServerName,
                        'wgUserLanguage' => $context->getLanguage(),
                        'wgContentLanguage' => $wgContLang->getCode(),
                        'wgVersion' => $wgVersion,
@@ -104,6 +106,9 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
                        'wgExtensionAssetsPath' => $wgExtensionAssetsPath,
                        // MediaWiki sets cookies to have this prefix by default
                        'wgCookiePrefix' => $wgCookiePrefix,
+                       'wgCookieDomain' => $wgCookieDomain,
+                       'wgCookiePath' => $wgCookiePath,
+                       'wgCookieExpiration' => $wgCookieExpiration,
                        'wgResourceLoaderMaxQueryLength' => $wgResourceLoaderMaxQueryLength,
                        'wgCaseSensitiveNamespaces' => $caseSensitiveNamespaces,
                        'wgLegalTitleChars' => Title::convertByteClassToUnicodeClass( Title::legalChars() ),
index dcec5dd..7e0e45d 100644 (file)
  * 'archive' table for traditionally-deleted revisions that have an
  * ar_rev_id saved.
  *
- * See RevDel_RevisionItem and RevDel_ArchivedRevisionItem for items.
+ * See RevDelRevisionItem and RevDelArchivedRevisionItem for items.
  */
-class RevDel_RevisionList extends RevDel_List {
-       var $currentRevId;
+class RevDelRevisionList extends RevDelList {
+       /** @var int */
+       protected $currentRevId;
 
        public function getType() {
                return 'revision';
@@ -80,7 +81,7 @@ class RevDel_RevisionList extends RevDel_List {
                }
 
                // Check if any requested revisions are available fully deleted.
-               $archived = $db->select( array( 'archive' ), '*',
+               $archived = $db->select( array( 'archive' ), Revision::selectArchiveFields(),
                        array(
                                'ar_rev_id' => $ids
                        ),
@@ -108,12 +109,12 @@ class RevDel_RevisionList extends RevDel_List {
 
        public function newItem( $row ) {
                if ( isset( $row->rev_id ) ) {
-                       return new RevDel_RevisionItem( $this, $row );
+                       return new RevDelRevisionItem( $this, $row );
                } elseif ( isset( $row->ar_rev_id ) ) {
-                       return new RevDel_ArchivedRevisionItem( $this, $row );
+                       return new RevDelArchivedRevisionItem( $this, $row );
                } else {
                        // This shouldn't happen. :)
-                       throw new MWException( 'Invalid row type in RevDel_RevisionList' );
+                       throw new MWException( 'Invalid row type in RevDelRevisionList' );
                }
        }
 
@@ -146,8 +147,8 @@ class RevDel_RevisionList extends RevDel_List {
 /**
  * Item class for a live revision table row
  */
-class RevDel_RevisionItem extends RevDel_Item {
-       var $revision;
+class RevDelRevisionItem extends RevDelItem {
+       protected $revision;
 
        public function __construct( $list, $row ) {
                parent::__construct( $list, $row );
@@ -225,7 +226,7 @@ class RevDel_RevisionItem extends RevDel_Item {
 
        /**
         * Get the HTML link to the revision text.
-        * Overridden by RevDel_ArchiveItem.
+        * Overridden by RevDelArchiveItem.
         * @return string
         */
        protected function getRevisionLink() {
@@ -248,7 +249,7 @@ class RevDel_RevisionItem extends RevDel_Item {
 
        /**
         * Get the HTML link to the diff.
-        * Overridden by RevDel_ArchiveItem
+        * Overridden by RevDelArchiveItem
         * @return string
         */
        protected function getDiffLink() {
@@ -308,7 +309,7 @@ class RevDel_RevisionItem extends RevDel_Item {
 /**
  * List for archive table items, i.e. revisions deleted via action=delete
  */
-class RevDel_ArchiveList extends RevDel_RevisionList {
+class RevDelArchiveList extends RevDelRevisionList {
        public function getType() {
                return 'archive';
        }
@@ -326,7 +327,7 @@ class RevDel_ArchiveList extends RevDel_RevisionList {
                foreach ( $this->ids as $id ) {
                        $timestamps[] = $db->timestamp( $id );
                }
-               return $db->select( 'archive', '*',
+               return $db->select( 'archive', Revision::selectArchiveFields(),
                                array(
                                        'ar_namespace' => $this->title->getNamespace(),
                                        'ar_title' => $this->title->getDBkey(),
@@ -338,7 +339,7 @@ class RevDel_ArchiveList extends RevDel_RevisionList {
        }
 
        public function newItem( $row ) {
-               return new RevDel_ArchiveItem( $this, $row );
+               return new RevDelArchiveItem( $this, $row );
        }
 
        public function doPreCommitUpdates() {
@@ -353,9 +354,9 @@ class RevDel_ArchiveList extends RevDel_RevisionList {
 /**
  * Item class for a archive table row
  */
-class RevDel_ArchiveItem extends RevDel_RevisionItem {
+class RevDelArchiveItem extends RevDelRevisionItem {
        public function __construct( $list, $row ) {
-               RevDel_Item::__construct( $list, $row );
+               RevDelItem::__construct( $list, $row );
                $this->revision = Revision::newFromArchiveRow( $row,
                        array( 'page' => $this->list->title->getArticleID() ) );
        }
@@ -436,11 +437,11 @@ class RevDel_ArchiveItem extends RevDel_RevisionItem {
 
 /**
  * Item class for a archive table row by ar_rev_id -- actually
- * used via RevDel_RevisionList.
+ * used via RevDelRevisionList.
  */
-class RevDel_ArchivedRevisionItem extends RevDel_ArchiveItem {
+class RevDelArchivedRevisionItem extends RevDelArchiveItem {
        public function __construct( $list, $row ) {
-               RevDel_Item::__construct( $list, $row );
+               RevDelItem::__construct( $list, $row );
 
                $this->revision = Revision::newFromArchiveRow( $row,
                        array( 'page' => $this->list->title->getArticleID() ) );
@@ -469,7 +470,16 @@ class RevDel_ArchivedRevisionItem extends RevDel_ArchiveItem {
 /**
  * List for oldimage table items
  */
-class RevDel_FileList extends RevDel_List {
+class RevDelFileList extends RevDelList {
+       /** @var array */
+       protected $storeBatch;
+
+       /** @var array */
+       protected $deleteBatch;
+
+       /** @var array */
+       protected $cleanupBatch;
+
        public function getType() {
                return 'oldimage';
        }
@@ -486,8 +496,6 @@ class RevDel_FileList extends RevDel_List {
                return File::DELETED_FILE;
        }
 
-       var $storeBatch, $deleteBatch, $cleanupBatch;
-
        /**
         * @param DatabaseBase $db
         * @return mixed
@@ -510,7 +518,7 @@ class RevDel_FileList extends RevDel_List {
        }
 
        public function newItem( $row ) {
-               return new RevDel_FileItem( $this, $row );
+               return new RevDelFileItem( $this, $row );
        }
 
        public function clearFileOps() {
@@ -568,12 +576,9 @@ class RevDel_FileList extends RevDel_List {
 /**
  * Item class for an oldimage table row
  */
-class RevDel_FileItem extends RevDel_Item {
-
-       /**
-        * @var File
-        */
-       var $file;
+class RevDelFileItem extends RevDelItem {
+       /** @var File */
+       protected $file;
 
        public function __construct( $list, $row ) {
                parent::__construct( $list, $row );
@@ -657,7 +662,7 @@ class RevDel_FileItem extends RevDel_Item {
 
        /**
         * Get the link to the file.
-        * Overridden by RevDel_ArchivedFileItem.
+        * Overridden by RevDelArchivedFileItem.
         * @return string
         */
        protected function getLink() {
@@ -782,7 +787,7 @@ class RevDel_FileItem extends RevDel_Item {
 /**
  * List for filearchive table items
  */
-class RevDel_ArchivedFileList extends RevDel_FileList {
+class RevDelArchivedFileList extends RevDelFileList {
        public function getType() {
                return 'filearchive';
        }
@@ -810,16 +815,16 @@ class RevDel_ArchivedFileList extends RevDel_FileList {
        }
 
        public function newItem( $row ) {
-               return new RevDel_ArchivedFileItem( $this, $row );
+               return new RevDelArchivedFileItem( $this, $row );
        }
 }
 
 /**
  * Item class for a filearchive table row
  */
-class RevDel_ArchivedFileItem extends RevDel_FileItem {
+class RevDelArchivedFileItem extends RevDelFileItem {
        public function __construct( $list, $row ) {
-               RevDel_Item::__construct( $list, $row );
+               RevDelItem::__construct( $list, $row );
                $this->file = ArchivedFile::newFromRow( $row );
        }
 
@@ -884,7 +889,7 @@ class RevDel_ArchivedFileItem extends RevDel_FileItem {
 /**
  * List for logging table items
  */
-class RevDel_LogList extends RevDel_List {
+class RevDelLogList extends RevDelList {
        public function getType() {
                return 'logging';
        }
@@ -921,7 +926,20 @@ class RevDel_LogList extends RevDel_List {
         */
        public function doQuery( $db ) {
                $ids = array_map( 'intval', $this->ids );
-               return $db->select( 'logging', '*',
+               return $db->select( 'logging', array(
+                               'log_id',
+                               'log_type',
+                               'log_action',
+                               'log_timestamp',
+                               'log_user',
+                               'log_user_text',
+                               'log_namespace',
+                               'log_title',
+                               'log_page',
+                               'log_comment',
+                               'log_params',
+                               'log_deleted'
+                       ),
                        array( 'log_id' => $ids ),
                        __METHOD__,
                        array( 'ORDER BY' => 'log_id DESC' )
@@ -929,7 +947,7 @@ class RevDel_LogList extends RevDel_List {
        }
 
        public function newItem( $row ) {
-               return new RevDel_LogItem( $this, $row );
+               return new RevDelLogItem( $this, $row );
        }
 
        public function getSuppressBit() {
@@ -952,7 +970,7 @@ class RevDel_LogList extends RevDel_List {
 /**
  * Item class for a logging table row
  */
-class RevDel_LogItem extends RevDel_Item {
+class RevDelLogItem extends RevDelItem {
        public function getIdField() {
                return 'log_id';
        }
@@ -1024,7 +1042,9 @@ class RevDel_LogItem extends RevDel_Item {
                // User links and action text
                $action = $formatter->getActionText();
                // Comment
-               $comment = $this->list->getLanguage()->getDirMark() . Linker::commentBlock( $this->row->log_comment );
+               $comment = $this->list->getLanguage()->getDirMark()
+                       . Linker::commentBlock( $this->row->log_comment );
+
                if ( LogEventsList::isDeleted( $this->row, LogPage::DELETED_COMMENT ) ) {
                        $comment = '<span class="history-deleted">' . $comment . '</span>';
                }
@@ -1040,9 +1060,15 @@ class RevDel_LogItem extends RevDel_Item {
                        'type' => $logEntry->getType(),
                        'action' => $logEntry->getSubtype(),
                );
-               $ret += $logEntry->isDeleted( LogPage::DELETED_USER ) ? array( 'userhidden' => '' ) : array();
-               $ret += $logEntry->isDeleted( LogPage::DELETED_COMMENT ) ? array( 'commenthidden' => '' ) : array();
-               $ret += $logEntry->isDeleted( LogPage::DELETED_ACTION ) ? array( 'actionhidden' => '' ) : array();
+               $ret += $logEntry->isDeleted( LogPage::DELETED_USER )
+                       ? array( 'userhidden' => '' )
+                       : array();
+               $ret += $logEntry->isDeleted( LogPage::DELETED_COMMENT )
+                       ? array( 'commenthidden' => '' )
+                       : array();
+               $ret += $logEntry->isDeleted( LogPage::DELETED_ACTION )
+                       ? array( 'actionhidden' => '' )
+                       : array();
 
                if ( LogEventsList::userCan( $this->row, LogPage::DELETED_ACTION, $user ) ) {
                        ApiQueryLogEvents::addLogParams(
index e326dce..086db3a 100644 (file)
 /**
  * Abstract base class for a list of deletable items. The list class
  * needs to be able to make a query from a set of identifiers to pull
- * relevant rows, to return RevDel_Item subclasses wrapping them, and
+ * relevant rows, to return RevDelItem subclasses wrapping them, and
  * to wrap bulk update operations.
  */
-abstract class RevDel_List extends RevisionListBase {
+abstract class RevDelList extends RevisionListBase {
        function __construct( IContextSource $context, Title $title, array $ids ) {
                parent::__construct( $context, $title );
                $this->ids = $ids;
@@ -105,7 +105,9 @@ abstract class RevDel_List extends RevisionListBase {
                        $status->itemStatuses = array();
                }
 
+               // @codingStandardsIgnoreStart Generic.CodeAnalysis.ForLoopWithTestFunctionCall.NotAllowed
                for ( $this->reset(); $this->current(); $this->next() ) {
+                       // @codingStandardsIgnoreEnd
                        $item = $this->current();
                        unset( $missing[$item->getId()] );
 
@@ -315,7 +317,7 @@ abstract class RevDel_List extends RevisionListBase {
 /**
  * Abstract base class for deletable items
  */
-abstract class RevDel_Item extends RevisionItemBase {
+abstract class RevDelItem extends RevisionItemBase {
        /**
         * Returns true if the item is "current", and the operation to set the given
         * bits can't be executed for that reason
index ecfe1d8..e42301b 100644 (file)
 class RevisionDeleter {
        /** List of known revdel types, with their corresponding list classes */
        private static $allowedTypes = array(
-               'revision' => 'RevDel_RevisionList',
-               'archive' => 'RevDel_ArchiveList',
-               'oldimage' => 'RevDel_FileList',
-               'filearchive' => 'RevDel_ArchivedFileList',
-               'logging' => 'RevDel_LogList',
+               'revision' => 'RevDelRevisionList',
+               'archive' => 'RevDelArchiveList',
+               'oldimage' => 'RevDelFileList',
+               'filearchive' => 'RevDelArchivedFileList',
+               'logging' => 'RevDelLogList',
        );
 
        /** Type map to support old log entries */
@@ -77,7 +77,7 @@ class RevisionDeleter {
         * @param IContextSource $context
         * @param Title $title
         * @param array $ids
-        * @return RevDel_List
+        * @return RevDelList
         */
        public static function createList( $typeName, IContextSource $context, Title $title, array $ids ) {
                $typeName = self::getCanonicalTypeName( $typeName );
index 827d8c3..907047e 100644 (file)
  * @ingroup Search
  */
 class SearchEngine {
-       var $limit = 10;
-       var $offset = 0;
-       var $prefix = '';
-       var $searchTerms = array();
-       var $namespaces = array( NS_MAIN );
+       /** @var string */
+       public $prefix = '';
+
+       /** @var int[] */
+       public $namespaces = array( NS_MAIN );
+
+       /** @var int */
+       protected $limit = 10;
+
+       /** @var int */
+       protected $offset = 0;
+
+       /** @var array|string */
+       protected $searchTerms = array();
+
+       /** @var bool */
        protected $showSuggestion = true;
 
        /** @var array Feature values */
@@ -106,8 +117,9 @@ class SearchEngine {
        }
 
        /**
-        * Transform search term in cases when parts of the query came as different GET params (when supported)
-        * e.g. for prefix queries: search=test&prefix=Main_Page/Archive -> test prefix:Main Page/Archive
+        * Transform search term in cases when parts of the query came as different
+        * GET params (when supported), e.g. for prefix queries:
+        * search=test&prefix=Main_Page/Archive -> test prefix:Main Page/Archive
         */
        function transformSearchTerm( $term ) {
                return $term;
@@ -148,7 +160,10 @@ class SearchEngine {
                $allSearchTerms = array( $searchterm );
 
                if ( $wgContLang->hasVariants() ) {
-                       $allSearchTerms = array_merge( $allSearchTerms, $wgContLang->autoConvertToAllVariants( $searchterm ) );
+                       $allSearchTerms = array_merge(
+                               $allSearchTerms,
+                               $wgContLang->autoConvertToAllVariants( $searchterm )
+                       );
                }
 
                $titleResult = null;
@@ -523,6 +538,7 @@ class SearchEngine {
         */
        public static function getOpenSearchTemplate() {
                global $wgOpenSearchTemplate, $wgCanonicalServer;
+
                if ( $wgOpenSearchTemplate ) {
                        return $wgOpenSearchTemplate;
                } else {
@@ -530,7 +546,9 @@ class SearchEngine {
                        if ( !$ns ) {
                                $ns = "0";
                        }
-                       return $wgCanonicalServer . wfScript( 'api' ) . '?action=opensearch&search={searchTerms}&namespace=' . $ns;
+
+                       return $wgCanonicalServer . wfScript( 'api' )
+                               . '?action=opensearch&search={searchTerms}&namespace=' . $ns;
                }
        }
 
index 5e734fe..b8b2bae 100644 (file)
@@ -27,7 +27,7 @@
  * @ingroup Search
  */
 class SearchHighlighter {
-       var $mCleanWikitext = true;
+       protected $mCleanWikitext = true;
 
        function __construct( $cleanupWikitext = true ) {
                $this->mCleanWikitext = $cleanupWikitext;
@@ -40,11 +40,11 @@ class SearchHighlighter {
         * @param array $terms Terms to highlight (unescaped)
         * @param int $contextlines
         * @param int $contextchars
-        * @return tring
+        * @return string
         */
        public function highlightText( $text, $terms, $contextlines, $contextchars ) {
-               global $wgContLang;
-               global $wgSearchHighlightBoundaries;
+               global $wgContLang, $wgSearchHighlightBoundaries;
+
                $fname = __METHOD__;
 
                if ( $text == '' ) {
@@ -138,7 +138,11 @@ class SearchHighlighter {
                foreach ( $terms as $index => $term ) {
                        // manually do upper/lowercase stuff for utf-8 since PHP won't do it
                        if ( preg_match( '/[\x80-\xff]/', $term ) ) {
-                               $terms[$index] = preg_replace_callback( '/./us', array( $this, 'caseCallback' ), $terms[$index] );
+                               $terms[$index] = preg_replace_callback(
+                                       '/./us',
+                                       array( $this, 'caseCallback' ),
+                                       $terms[$index]
+                               );
                        } else {
                                $terms[$index] = $term;
                        }
@@ -229,7 +233,12 @@ class SearchHighlighter {
                        if ( $len < $targetchars - 20 ) {
                                // complete this line
                                if ( $len < strlen( $all[$index] ) ) {
-                                       $extended[$index] = $this->extract( $all[$index], $offsets[$index], $offsets[$index] + $targetchars, $offsets[$index] );
+                                       $extended[$index] = $this->extract(
+                                               $all[$index],
+                                               $offsets[$index],
+                                               $offsets[$index] + $targetchars,
+                                               $offsets[$index]
+                                       );
                                        $len = strlen( $extended[$index] );
                                }
 
@@ -254,7 +263,9 @@ class SearchHighlighter {
                foreach ( $snippets as $index => $line ) {
                        if ( $last == - 1 ) {
                                $extract .= $line; // first line
-                       } elseif ( $last + 1 == $index && $offsets[$last] + strlen( $snippets[$last] ) >= strlen( $all[$last] ) ) {
+                       } elseif ( $last + 1 == $index
+                               && $offsets[$last] + strlen( $snippets[$last] ) >= strlen( $all[$last] )
+                       ) {
                                $extract .= " " . $line; // continous lines
                        } else {
                                $extract .= '<b> ... </b>' . $line;
@@ -360,7 +371,13 @@ class SearchHighlighter {
                $s = max( 0, $point - $tolerance );
                $l = min( strlen( $text ), $point + $tolerance ) - $s;
                $m = array();
-               if ( preg_match( '/[ ,.!?~!@#$%^&*\(\)+=\-\\\|\[\]"\'<>]/', substr( $text, $s, $l ), $m, PREG_OFFSET_CAPTURE ) ) {
+
+               if ( preg_match(
+                       '/[ ,.!?~!@#$%^&*\(\)+=\-\\\|\[\]"\'<>]/',
+                       substr( $text, $s, $l ),
+                       $m,
+                       PREG_OFFSET_CAPTURE
+               ) ) {
                        return $m[0][1] + $s + $offset;
                } else {
                        // check if point is on a valid first UTF8 char
@@ -373,6 +390,7 @@ class SearchHighlighter {
                                }
                                $char = ord( $text[$point] );
                        }
+
                        return $point;
 
                }
@@ -444,7 +462,11 @@ class SearchHighlighter {
                $text = preg_replace( "/\\{\\{([^|]+?)\\}\\}/", "", $text );
                $text = preg_replace( "/\\{\\{([^|]+\\|)(.*?)\\}\\}/", "\\2", $text );
                $text = preg_replace( "/\\[\\[([^|]+?)\\]\\]/", "\\1", $text );
-               $text = preg_replace_callback( "/\\[\\[([^|]+\\|)(.*?)\\]\\]/", array( $this, 'linkReplace' ), $text );
+               $text = preg_replace_callback(
+                       "/\\[\\[([^|]+\\|)(.*?)\\]\\]/",
+                       array( $this, 'linkReplace' ),
+                       $text
+               );
                // $text = preg_replace("/\\[\\[([^|]+\\|)(.*?)\\]\\]/", "\\2", $text);
                $text = preg_replace( "/<\/?[^>]+>/", "", $text );
                $text = preg_replace( "/'''''/", "", $text );
index ed76ff8..4960c42 100644 (file)
@@ -34,7 +34,10 @@ class SearchMssql extends SearchDatabase {
         * @access public
         */
        function searchText( $term ) {
-               $resultSet = $this->db->resultObject( $this->db->query( $this->getQuery( $this->filter( $term ), true ) ) );
+               $resultSet = $this->db->resultObject(
+                       $this->db->query( $this->getQuery( $this->filter( $term ), true ) )
+               );
+
                return new SqlSearchResultSet( $resultSet, $this->searchTerms );
        }
 
@@ -46,7 +49,10 @@ class SearchMssql extends SearchDatabase {
         * @access public
         */
        function searchTitle( $term ) {
-               $resultSet = $this->db->resultObject( $this->db->query( $this->getQuery( $this->filter( $term ), false ) ) );
+               $resultSet = $this->db->resultObject(
+                       $this->db->query( $this->getQuery( $this->filter( $term ), false ) )
+               );
+
                return new SqlSearchResultSet( $resultSet, $this->searchTerms );
        }
 
index cc20d02..77a0c43 100644 (file)
@@ -29,8 +29,9 @@
  * @ingroup Search
  */
 class SearchMySQL extends SearchDatabase {
-       var $strictMatching = true;
-       static $mMinSearchLength;
+       protected $strictMatching = true;
+
+       private static $mMinSearchLength;
 
        /**
         * Parse the user's query and transform it into an SQL fragment which will
@@ -43,6 +44,7 @@ class SearchMySQL extends SearchDatabase {
         */
        function parseQuery( $filteredText, $fulltext ) {
                global $wgContLang;
+
                $lc = $this->legalSearchChars(); // Minus format chars
                $searchon = '';
                $this->searchTerms = array();
@@ -52,7 +54,9 @@ class SearchMySQL extends SearchDatabase {
                if ( preg_match_all( '/([-+<>~]?)(([' . $lc . ']+)(\*?)|"[^"]*")/',
                                $filteredText, $m, PREG_SET_ORDER ) ) {
                        foreach ( $m as $bits ) {
-                               @list( /* all */, $modifier, $term, $nonQuoted, $wildcard ) = $bits;
+                               wfSuppressWarnings();
+                               list( /* all */, $modifier, $term, $nonQuoted, $wildcard ) = $bits;
+                               wfRestoreWarnings();
 
                                if ( $nonQuoted != '' ) {
                                        $term = $nonQuoted;
index c944152..4cfcec3 100644 (file)
@@ -29,7 +29,6 @@
  * @ingroup Search
  */
 class SearchOracle extends SearchDatabase {
-
        private $reservedWords = array(
                'ABOUT' => 1,
                'ACCUM' => 1,
@@ -70,7 +69,10 @@ class SearchOracle extends SearchDatabase {
                        return new SqlSearchResultSet( false, '' );
                }
 
-               $resultSet = $this->db->resultObject( $this->db->query( $this->getQuery( $this->filter( $term ), true ) ) );
+               $resultSet = $this->db->resultObject(
+                       $this->db->query( $this->getQuery( $this->filter( $term ), true ) )
+               );
+
                return new SqlSearchResultSet( $resultSet, $this->searchTerms );
        }
 
@@ -85,7 +87,10 @@ class SearchOracle extends SearchDatabase {
                        return new SqlSearchResultSet( false, '' );
                }
 
-               $resultSet = $this->db->resultObject( $this->db->query( $this->getQuery( $this->filter( $term ), false ) ) );
+               $resultSet = $this->db->resultObject(
+                       $this->db->query( $this->getQuery( $this->filter( $term ), false ) )
+               );
+
                return new SqlSearchResultSet( $resultSet, $this->searchTerms );
        }
 
index 6b1a6b2..62fb236 100644 (file)
@@ -50,7 +50,9 @@ class SearchSqlite extends SearchDatabase {
                if ( preg_match_all( '/([-+<>~]?)(([' . $lc . ']+)(\*?)|"[^"]*")/',
                                $filteredText, $m, PREG_SET_ORDER ) ) {
                        foreach ( $m as $bits ) {
-                               @list( /* all */, $modifier, $term, $nonQuoted, $wildcard ) = $bits;
+                               wfSuppressWarnings();
+                               list( /* all */, $modifier, $term, $nonQuoted, $wildcard ) = $bits;
+                               wfRestoreWarnings();
 
                                if ( $nonQuoted != '' ) {
                                        $term = $nonQuoted;
index 2a86b31..4854bcb 100644 (file)
@@ -33,7 +33,6 @@
  * @ingroup Site
  */
 class MediaWikiSite extends Site {
-
        const PATH_FILE = 'file_path';
        const PATH_PAGE = 'page_path';
 
@@ -76,14 +75,16 @@ class MediaWikiSite extends Site {
        }
 
        /**
-        * Returns the normalized form of the given page title, using the normalization rules of the given site.
-        * If the given title is a redirect, the redirect weill be resolved and the redirect target is returned.
+        * Returns the normalized form of the given page title, using the
+        * normalization rules of the given site. If the given title is a redirect,
+        * the redirect weill be resolved and the redirect target is returned.
         *
-        * @note  : This actually makes an API request to the remote site, so beware that this function is slow and depends
-        *          on an external service.
+        * @note This actually makes an API request to the remote site, so beware
+        *   that this function is slow and depends on an external service.
         *
-        * @note  : If MW_PHPUNIT_TEST is defined, the call to the external site is skipped, and the title
-        *          is normalized using the local normalization rules as implemented by the Title class.
+        * @note If MW_PHPUNIT_TEST is defined, the call to the external site is
+        *   skipped, and the title is normalized using the local normalization
+        *   rules as implemented by the Title class.
         *
         * @see Site::normalizePageName
         *
@@ -103,8 +104,10 @@ class MediaWikiSite extends Site {
 
                // Go on call the external site
                if ( defined( 'MW_PHPUNIT_TEST' ) ) {
-                       // If the code is under test, don't call out to other sites, just normalize locally.
-                       // Note: this may cause results to be inconsistent with the actual normalization used by the respective remote site!
+                       // If the code is under test, don't call out to other sites, just
+                       // normalize locally.
+                       // Note: this may cause results to be inconsistent with the actual
+                       // normalization used by the respective remote site!
 
                        $t = Title::newFromText( $pageName );
                        return $t->getPrefixedText();
@@ -152,12 +155,14 @@ class MediaWikiSite extends Site {
                $page = static::extractPageRecord( $data, $pageName );
 
                if ( isset( $page['missing'] ) ) {
-                       wfDebugLog( "MediaWikiSite", "call to <$url> returned a marker for a missing page title! " . $ret );
+                       wfDebugLog( "MediaWikiSite", "call to <$url> returned a marker for a missing page title! "
+                               . $ret );
                        return false;
                }
 
                if ( isset( $page['invalid'] ) ) {
-                       wfDebugLog( "MediaWikiSite", "call to <$url> returned a marker for an invalid page title! " . $ret );
+                       wfDebugLog( "MediaWikiSite", "call to <$url> returned a marker for an invalid page title! "
+                               . $ret );
                        return false;
                }
 
@@ -348,5 +353,4 @@ class MediaWikiSite extends Site {
 
                return $filePath;
        }
-
 }
index 59230c7..e3559f5 100644 (file)
@@ -27,7 +27,6 @@
  * @author Jeroen De Dauw < jeroendedauw@gmail.com >
  */
 class Site implements Serializable {
-
        const TYPE_UNKNOWN = 'unknown';
        const TYPE_MEDIAWIKI = 'mediawiki';
 
@@ -340,11 +339,12 @@ class Site implements Serializable {
        }
 
        /**
-        * Returns the main path type, that is the type of the path that should generally be used to construct links
-        * to the target site.
+        * Returns the main path type, that is the type of the path that should
+        * generally be used to construct links to the target site.
         *
-        * This default implementation returns Site::PATH_LINK as the default path type. Subclasses can override this
-        * to define a different default path type, or return false to disable site links.
+        * This default implementation returns Site::PATH_LINK as the default path
+        * type. Subclasses can override this to define a different default path
+        * type, or return false to disable site links.
         *
         * @since 1.21
         *
@@ -541,7 +541,9 @@ class Site implements Serializable {
         * @return string[]
         */
        public function getInterwikiIds() {
-               return array_key_exists( self::ID_INTERWIKI, $this->localIds ) ? $this->localIds[self::ID_INTERWIKI] : array();
+               return array_key_exists( self::ID_INTERWIKI, $this->localIds )
+                       ? $this->localIds[self::ID_INTERWIKI]
+                       : array();
        }
 
        /**
@@ -553,7 +555,9 @@ class Site implements Serializable {
         * @return string[]
         */
        public function getNavigationIds() {
-               return array_key_exists( self::ID_EQUIVALENT, $this->localIds ) ? $this->localIds[self::ID_EQUIVALENT] : array();
+               return array_key_exists( self::ID_EQUIVALENT, $this->localIds )
+                       ? $this->localIds[self::ID_EQUIVALENT] :
+                       array();
        }
 
        /**
@@ -693,10 +697,10 @@ class Site implements Serializable {
                $this->setForward( $fields['forward'] );
                $this->setInternalId( $fields['internalid'] );
        }
-
 }
 
 /**
  * @deprecated
  */
-class SiteObject extends Site {}
+class SiteObject extends Site {
+}
index 6992450..dfe4ec5 100644 (file)
@@ -27,7 +27,6 @@
  * @author Jeroen De Dauw < jeroendedauw@gmail.com >
  */
 class SiteList extends GenericArrayObject {
-
        /**
         * Internal site identifiers pointing to their sites offset value.
         *
@@ -350,10 +349,10 @@ class SiteList extends GenericArrayObject {
 
                return $serializationData;
        }
-
 }
 
 /**
  * @deprecated
  */
-class SiteArray extends SiteList {}
+class SiteArray extends SiteList {
+}
index d14569a..f382d98 100644 (file)
@@ -29,7 +29,6 @@
  * @author Jeroen De Dauw < jeroendedauw@gmail.com >
  */
 class SiteSQLStore implements SiteStore {
-
        /**
         * @since 1.21
         *
@@ -169,7 +168,10 @@ class SiteSQLStore implements SiteStore {
                }
 
                if ( $siteRow->hasField( 'language' ) ) {
-                       $site->setLanguageCode( $siteRow->getField( 'language' ) === '' ? null : $siteRow->getField( 'language' ) );
+                       $site->setLanguageCode( $siteRow->getField( 'language' ) === ''
+                               ? null
+                               : $siteRow->getField( 'language' )
+                       );
                }
 
                if ( $siteRow->hasField( 'source' ) ) {
@@ -504,5 +506,4 @@ class Sites extends SiteSQLStore {
        public function getSiteGroup( $group ) {
                return $this->getSites()->getGroup( $group );
        }
-
 }
index 7e108af..f7c95d1 100644 (file)
@@ -405,42 +405,42 @@ abstract class ChangesListSpecialPage extends SpecialPage {
                global $wgRecentChangesFlags;
                $user = $context->getUser();
                # The legend showing what the letters and stuff mean
-               $legend = Xml::openElement( 'dl' ) . "\n";
+               $legend = Html::openElement( 'dl' ) . "\n";
                # Iterates through them and gets the messages for both letter and tooltip
                $legendItems = $wgRecentChangesFlags;
-               if ( !$user->useRCPatrol() ) {
+               if ( !( $user->useRCPatrol() || $user->useNPPatrol() ) ) {
                        unset( $legendItems['unpatrolled'] );
                }
-               foreach ( $legendItems as $key => $legendInfo ) { # generate items of the legend
-                       $label = $legendInfo['title'];
-                       $letter = $legendInfo['letter'];
-                       $cssClass = isset( $legendInfo['class'] ) ? $legendInfo['class'] : $key;
+               foreach ( $legendItems as $key => $item ) { # generate items of the legend
+                       $label = $item['title'];
+                       $letter = $item['letter'];
+                       $cssClass = isset( $item['class'] ) ? $item['class'] : $key;
 
-                       $legend .= Xml::element( 'dt',
+                       $legend .= Html::element( 'dt',
                                array( 'class' => $cssClass ), $context->msg( $letter )->text()
                        ) . "\n";
                        if ( $key === 'newpage' ) {
-                               $legend .= Xml::openElement( 'dd' );
+                               $legend .= Html::openElement( 'dd' );
                                $legend .= $context->msg( $label )->escaped();
                                $legend .= ' ' . $context->msg( 'recentchanges-legend-newpage' )->parse();
-                               $legend .= Xml::closeElement( 'dd' ) . "\n";
+                               $legend .= Html::closeElement( 'dd' ) . "\n";
                        } else {
-                               $legend .= Xml::element( 'dd', array(),
+                               $legend .= Html::element( 'dd', array(),
                                        $context->msg( $label )->text()
                                ) . "\n";
                        }
                }
                # (+-123)
-               $legend .= Xml::tags( 'dt',
+               $legend .= Html::rawElement( 'dt',
                        array( 'class' => 'mw-plusminus-pos' ),
                        $context->msg( 'recentchanges-legend-plusminus' )->parse()
                ) . "\n";
-               $legend .= Xml::element(
+               $legend .= Html::element(
                        'dd',
                        array( 'class' => 'mw-changeslist-legend-plusminus' ),
                        $context->msg( 'recentchanges-label-plusminus' )->text()
                ) . "\n";
-               $legend .= Xml::closeElement( 'dl' ) . "\n";
+               $legend .= Html::closeElement( 'dl' ) . "\n";
 
                # Collapsibility
                $legend =
index 7304b6d..53cef7f 100644 (file)
@@ -410,17 +410,21 @@ class SpecialPageFactory {
         * Return categorised listable special pages which are available
         * for the current user, but not for everyone
         *
+        * @param User|null $user User object to use or null for $wgUser
         * @return array ( string => Specialpage )
         */
-       public static function getRestrictedPages() {
-               global $wgUser;
+       public static function getRestrictedPages( User $user = null ) {
                $pages = array();
+               if ( $user === null ) {
+                       global $wgUser;
+                       $user = $wgUser;
+               }
                foreach ( self::getList() as $name => $rec ) {
                        $page = self::getPage( $name );
                        if (
                                $page->isListed()
                                && $page->isRestricted()
-                               && $page->userCanExecute( $wgUser )
+                               && $page->userCanExecute( $user )
                        ) {
                                $pages[$name] = $page;
                        }
index d963677..c42c089 100644 (file)
@@ -31,7 +31,6 @@
  * @ingroup SpecialPage
  */
 class ActiveUsersPager extends UsersPager {
-
        /**
         * @var FormOptions
         */
@@ -194,20 +193,31 @@ class ActiveUsersPager extends UsersPager {
                $self = $this->getTitle();
                $limit = $this->mLimit ? Html::hidden( 'limit', $this->mLimit ) : '';
 
-               $out = Xml::openElement( 'form', array( 'method' => 'get', 'action' => $wgScript ) ); # Form tag
+               # Form tag
+               $out = Xml::openElement( 'form', array( 'method' => 'get', 'action' => $wgScript ) );
                $out .= Xml::fieldset( $this->msg( 'activeusers' )->text() ) . "\n";
                $out .= Html::hidden( 'title', $self->getPrefixedDBkey() ) . $limit . "\n";
 
+               # Username field
                $out .= Xml::inputLabel( $this->msg( 'activeusers-from' )->text(),
-                       'username', 'offset', 20, $this->requestedUser, array( 'tabindex' => 1 ) ) . '<br />';# Username field
+                       'username', 'offset', 20, $this->requestedUser, array( 'tabindex' => 1 ) ) . '<br />';
 
                $out .= Xml::checkLabel( $this->msg( 'activeusers-hidebots' )->text(),
                        'hidebots', 'hidebots', $this->opts->getValue( 'hidebots' ), array( 'tabindex' => 2 ) );
 
-               $out .= Xml::checkLabel( $this->msg( 'activeusers-hidesysops' )->text(),
-                       'hidesysops', 'hidesysops', $this->opts->getValue( 'hidesysops' ), array( 'tabindex' => 3 ) ) . '<br />';
-
-               $out .= Xml::submitButton( $this->msg( 'allpagessubmit' )->text(), array( 'tabindex' => 4 ) ) . "\n";# Submit button and form bottom
+               $out .= Xml::checkLabel(
+                       $this->msg( 'activeusers-hidesysops' )->text(),
+                       'hidesysops',
+                       'hidesysops',
+                       $this->opts->getValue( 'hidesysops' ),
+                       array( 'tabindex' => 3 )
+               ) . '<br />';
+
+               # Submit button and form bottom
+               $out .= Xml::submitButton(
+                       $this->msg( 'allpagessubmit' )->text(),
+                       array( 'tabindex' => 4 )
+               ) . "\n";
                $out .= Xml::closeElement( 'fieldset' );
                $out .= Xml::closeElement( 'form' );
 
index fe49cf2..ad92298 100644 (file)
@@ -35,30 +35,6 @@ class SpecialAllpages extends IncludableSpecialPage {
         */
        protected $maxPerPage = 345;
 
-       /**
-        * Maximum number of pages to show on single index subpage.
-        *
-        * @var int $maxLineCount
-        */
-       protected $maxLineCount = 100;
-
-       /**
-        * Maximum number of chars to show for an entry.
-        *
-        * @var int $maxPageLength
-        */
-       protected $maxPageLength = 70;
-
-       /**
-        * Maximum number of pages in a hierarchical ("top level") list.
-        *
-        * Traversal of the entire page list by spidering the top levels is thought
-        * to require O(N^3) DB CPU time where N is the number of pages on the wiki.
-        * See bug 56840. If this limit is exceeded, the behaviour becomes like a
-        * simple alphabetic pager.
-        */
-       protected $maxTopLevelPages = 50000;
-
        /**
         * Determines, which message describes the input field 'nsfrom'.
         *
@@ -180,183 +156,12 @@ class SpecialAllpages extends IncludableSpecialPage {
         * @param bool $hideredirects Dont show redirects (default false)
         */
        function showToplevel( $namespace = NS_MAIN, $from = '', $to = '', $hideredirects = false ) {
-               $output = $this->getOutput();
-
-               # TODO: Either make this *much* faster or cache the title index points
-               # in the querycache table.
-
-               $dbr = wfGetDB( DB_SLAVE );
-               $out = "";
-               $where = array( 'page_namespace' => $namespace );
-
-               if ( $hideredirects ) {
-                       $where['page_is_redirect'] = 0;
-               }
-
                $from = Title::makeTitleSafe( $namespace, $from );
                $to = Title::makeTitleSafe( $namespace, $to );
                $from = ( $from && $from->isLocal() ) ? $from->getDBkey() : null;
                $to = ( $to && $to->isLocal() ) ? $to->getDBkey() : null;
 
-               if ( isset( $from ) ) {
-                       $where[] = 'page_title >= ' . $dbr->addQuotes( $from );
-               }
-
-               if ( isset( $to ) ) {
-                       $where[] = 'page_title <= ' . $dbr->addQuotes( $to );
-               }
-
-               global $wgMemc;
-               $key = wfMemcKey( 'allpages', 'ns', $namespace, sha1( $from ), sha1( $to ) );
-               $lines = $wgMemc->get( $key );
-
-               $count = $dbr->estimateRowCount( 'page', '*', $where, __METHOD__ );
-
-               // Don't show a hierarchical list if the number of pages is very large,
-               // since generating it will cause a lot of scanning
-               if ( $count > $this->maxTopLevelPages ) {
-                       $this->showChunk( $namespace, $from, $to, $hideredirects );
-
-                       return;
-               }
-
-               $maxPerSubpage = intval( $count / $this->maxLineCount );
-               $maxPerSubpage = max( $maxPerSubpage, $this->maxPerPage );
-
-               if ( !is_array( $lines ) ) {
-                       $options = array( 'LIMIT' => 1 );
-                       $options['ORDER BY'] = 'page_title ASC';
-                       $firstTitle = $dbr->selectField( 'page', 'page_title', $where, __METHOD__, $options );
-                       $lastTitle = $firstTitle;
-                       # This array is going to hold the page_titles in order.
-                       $lines = array( $firstTitle );
-                       # If we are going to show n rows, we need n+1 queries to find the relevant titles.
-                       $done = false;
-                       while ( !$done ) {
-                               // Fetch the last title of this chunk and the first of the next
-                               $chunk = ( $lastTitle === false )
-                                       ? array()
-                                       : array( 'page_title >= ' . $dbr->addQuotes( $lastTitle ) );
-                               $res = $dbr->select( 'page', /* FROM */
-                                       'page_title', /* WHAT */
-                                       array_merge( $where, $chunk ),
-                                       __METHOD__,
-                                       array( 'LIMIT' => 2, 'OFFSET' => $maxPerSubpage - 1, 'ORDER BY' => 'page_title ASC' )
-                               );
-
-                               $s = $dbr->fetchObject( $res );
-                               if ( $s ) {
-                                       array_push( $lines, $s->page_title );
-                               } else {
-                                       // Final chunk, but ended prematurely. Go back and find the end.
-                                       $endTitle = $dbr->selectField( 'page', 'MAX(page_title)',
-                                               array_merge( $where, $chunk ),
-                                               __METHOD__ );
-                                       array_push( $lines, $endTitle );
-                                       $done = true;
-                               }
-
-                               $s = $res->fetchObject();
-                               if ( $s ) {
-                                       array_push( $lines, $s->page_title );
-                                       $lastTitle = $s->page_title;
-                               } else {
-                                       // This was a final chunk and ended exactly at the limit.
-                                       // Rare but convenient!
-                                       $done = true;
-                               }
-                               $res->free();
-                       }
-                       $wgMemc->add( $key, $lines, 3600 );
-               }
-
-               // If there are only two or less sections, don't even display them.
-               // Instead, display the first section directly.
-               if ( count( $lines ) <= 2 ) {
-                       if ( !empty( $lines ) ) {
-                               $this->showChunk( $namespace, $from, $to, $hideredirects );
-                       } else {
-                               $output->addHTML( $this->namespaceForm( $namespace, $from, $to, $hideredirects ) );
-                       }
-
-                       return;
-               }
-
-               # At this point, $lines should contain an even number of elements.
-               $out .= Xml::openElement( 'table', array( 'class' => 'allpageslist' ) );
-               while ( count( $lines ) > 0 ) {
-                       $inpoint = array_shift( $lines );
-                       $outpoint = array_shift( $lines );
-                       $out .= $this->showline( $inpoint, $outpoint, $namespace, $hideredirects );
-               }
-               $out .= Xml::closeElement( 'table' );
-               $nsForm = $this->namespaceForm( $namespace, $from, $to, $hideredirects );
-
-               # Is there more?
-               if ( $this->including() ) {
-                       $out2 = '';
-               } else {
-                       if ( isset( $from ) || isset( $to ) ) {
-                               $out2 = Xml::openElement( 'table', array( 'class' => 'mw-allpages-table-form' ) ) .
-                                       '<tr>
-                                                       <td>' .
-                                       $nsForm .
-                                       '</td>
-                                                       <td class="mw-allpages-nav">' .
-                                       Linker::link( $this->getPageTitle(), $this->msg( 'allpages' )->escaped(),
-                                               array(), array(), 'known' ) .
-                                       "</td>
-                                               </tr>" .
-                                       Xml::closeElement( 'table' );
-                       } else {
-                               $out2 = $nsForm;
-                       }
-               }
-               $output->addHTML( $out2 . $out );
-       }
-
-       /**
-        * Show a line of "ABC to DEF" ranges of articles
-        *
-        * @param string $inpoint Lower limit of pagenames
-        * @param string $outpoint Upper limit of pagenames
-        * @param int $namespace (Default NS_MAIN)
-        * @param bool $hideRedirects Don't show redirects. Default: false
-        * @return string
-        */
-       function showline( $inpoint, $outpoint, $namespace = NS_MAIN, $hideRedirects = false ) {
-               // Use content language since page titles are considered to use content language
-               global $wgContLang;
-
-               $inpointf = str_replace( '_', ' ', $inpoint );
-               $outpointf = str_replace( '_', ' ', $outpoint );
-
-               // Don't let the length runaway
-               $inpointf = $wgContLang->truncate( $inpointf, $this->maxPageLength );
-               $outpointf = $wgContLang->truncate( $outpointf, $this->maxPageLength );
-
-               $queryParams = array(
-                       'from' => $inpoint,
-                       'to' => $outpoint,
-               );
-
-               if ( $namespace ) {
-                       $queryParams['namespace'] = $namespace;
-               }
-               if ( $hideRedirects ) {
-                       $queryParams['hideredirects'] = 1;
-               }
-
-               $url = $this->getPageTitle()->getLocalURL( $queryParams );
-               $inlink = Html::element( 'a', array( 'href' => $url ), $inpointf );
-               $outlink = Html::element( 'a', array( 'href' => $url ), $outpointf );
-
-               $out = $this->msg( 'alphaindexline' )->rawParams(
-                       "$inlink</td><td>",
-                       "</td><td>$outlink"
-               )->escaped();
-
-               return '<tr><td class="mw-allpages-alphaindexline">' . $out . '</td></tr>';
+               $this->showChunk( $namespace, $from, $to, $hideredirects );
        }
 
        /**
@@ -441,118 +246,117 @@ class SpecialAllpages extends IncludableSpecialPage {
                }
 
                if ( $this->including() ) {
-                       $out2 = '';
+                       $output->addHTML( $out );
+                       return;
+               }
+
+               if ( $from == '' ) {
+                       // First chunk; no previous link.
+                       $prevTitle = null;
                } else {
-                       if ( $from == '' ) {
-                               // First chunk; no previous link.
-                               $prevTitle = null;
-                       } else {
-                               # Get the last title from previous chunk
-                               $dbr = wfGetDB( DB_SLAVE );
-                               $res_prev = $dbr->select(
-                                       'page',
-                                       'page_title',
-                                       array( 'page_namespace' => $namespace, 'page_title < ' . $dbr->addQuotes( $from ) ),
-                                       __METHOD__,
-                                       array( 'ORDER BY' => 'page_title DESC',
-                                               'LIMIT' => $this->maxPerPage, 'OFFSET' => ( $this->maxPerPage - 1 )
-                                       )
-                               );
+                       # Get the last title from previous chunk
+                       $dbr = wfGetDB( DB_SLAVE );
+                       $res_prev = $dbr->select(
+                               'page',
+                               'page_title',
+                               array( 'page_namespace' => $namespace, 'page_title < ' . $dbr->addQuotes( $from ) ),
+                               __METHOD__,
+                               array( 'ORDER BY' => 'page_title DESC',
+                                       'LIMIT' => $this->maxPerPage, 'OFFSET' => ( $this->maxPerPage - 1 )
+                               )
+                       );
 
-                               # Get first title of previous complete chunk
-                               if ( $dbr->numrows( $res_prev ) >= $this->maxPerPage ) {
-                                       $pt = $dbr->fetchObject( $res_prev );
-                                       $prevTitle = Title::makeTitle( $namespace, $pt->page_title );
+                       # Get first title of previous complete chunk
+                       if ( $dbr->numrows( $res_prev ) >= $this->maxPerPage ) {
+                               $pt = $dbr->fetchObject( $res_prev );
+                               $prevTitle = Title::makeTitle( $namespace, $pt->page_title );
+                       } else {
+                               # The previous chunk is not complete, need to link to the very first title
+                               # available in the database
+                               $options = array( 'LIMIT' => 1 );
+                               if ( !$dbr->implicitOrderby() ) {
+                                       $options['ORDER BY'] = 'page_title';
+                               }
+                               $reallyFirstPage_title = $dbr->selectField( 'page', 'page_title',
+                                       array( 'page_namespace' => $namespace ), __METHOD__, $options );
+                               # Show the previous link if it s not the current requested chunk
+                               if ( $from != $reallyFirstPage_title ) {
+                                       $prevTitle = Title::makeTitle( $namespace, $reallyFirstPage_title );
                                } else {
-                                       # The previous chunk is not complete, need to link to the very first title
-                                       # available in the database
-                                       $options = array( 'LIMIT' => 1 );
-                                       if ( !$dbr->implicitOrderby() ) {
-                                               $options['ORDER BY'] = 'page_title';
-                                       }
-                                       $reallyFirstPage_title = $dbr->selectField( 'page', 'page_title',
-                                               array( 'page_namespace' => $namespace ), __METHOD__, $options );
-                                       # Show the previous link if it s not the current requested chunk
-                                       if ( $from != $reallyFirstPage_title ) {
-                                               $prevTitle = Title::makeTitle( $namespace, $reallyFirstPage_title );
-                                       } else {
-                                               $prevTitle = null;
-                                       }
+                                       $prevTitle = null;
                                }
                        }
+               }
 
-                       $self = $this->getPageTitle();
-
-                       $nsForm = $this->namespaceForm( $namespace, $from, $to, $hideredirects );
-                       $out2 = Xml::openElement( 'table', array( 'class' => 'mw-allpages-table-form' ) ) .
-                               '<tr>
-                                                       <td>' .
-                               $nsForm .
-                               '</td>
-                                                       <td class="mw-allpages-nav">' .
-                               Linker::link( $self, $this->msg( 'allpages' )->escaped() );
-
-                       # Do we put a previous link ?
-                       if ( isset( $prevTitle ) && $pt = $prevTitle->getText() ) {
-                               $query = array( 'from' => $prevTitle->getText() );
+               $self = $this->getPageTitle();
 
-                               if ( $namespace ) {
-                                       $query['namespace'] = $namespace;
-                               }
+               $topLinks = array(
+                       Linker::link( $self, $this->msg( 'allpages' )->escaped() )
+               );
+               $bottomLinks = array();
 
-                               if ( $hideredirects ) {
-                                       $query['hideredirects'] = $hideredirects;
-                               }
+               # Do we put a previous link ?
+               if ( isset( $prevTitle ) && $pt = $prevTitle->getText() ) {
+                       $query = array( 'from' => $prevTitle->getText() );
 
-                               $prevLink = Linker::linkKnown(
-                                       $self,
-                                       $this->msg( 'prevpage', $pt )->escaped(),
-                                       array(),
-                                       $query
-                               );
-                               $out2 = $this->getLanguage()->pipeList( array( $out2, $prevLink ) );
+                       if ( $namespace ) {
+                               $query['namespace'] = $namespace;
                        }
 
-                       if ( $n == $this->maxPerPage && $s = $res->fetchObject() ) {
-                               # $s is the first link of the next chunk
-                               $t = Title::makeTitle( $namespace, $s->page_title );
-                               $query = array( 'from' => $t->getText() );
+                       if ( $hideredirects ) {
+                               $query['hideredirects'] = $hideredirects;
+                       }
 
-                               if ( $namespace ) {
-                                       $query['namespace'] = $namespace;
-                               }
+                       $prevLink = Linker::linkKnown(
+                               $self,
+                               $this->msg( 'prevpage', $pt )->escaped(),
+                               array(),
+                               $query
+                       );
+                       $topLinks[] = $prevLink;
+                       $bottomLinks[] = $prevLink;
+               }
 
-                               if ( $hideredirects ) {
-                                       $query['hideredirects'] = $hideredirects;
-                               }
+               if ( $n == $this->maxPerPage && $s = $res->fetchObject() ) {
+                       # $s is the first link of the next chunk
+                       $t = Title::makeTitle( $namespace, $s->page_title );
+                       $query = array( 'from' => $t->getText() );
 
-                               $nextLink = Linker::linkKnown(
-                                       $self,
-                                       $this->msg( 'nextpage', $t->getText() )->escaped(),
-                                       array(),
-                                       $query
-                               );
-                               $out2 = $this->getLanguage()->pipeList( array( $out2, $nextLink ) );
+                       if ( $namespace ) {
+                               $query['namespace'] = $namespace;
                        }
-                       $out2 .= "</td></tr></table>";
-               }
 
-               $output->addHTML( $out2 . $out );
+                       if ( $hideredirects ) {
+                               $query['hideredirects'] = $hideredirects;
+                       }
 
-               $links = array();
-               if ( isset( $prevLink ) ) {
-                       $links[] = $prevLink;
+                       $nextLink = Linker::linkKnown(
+                               $self,
+                               $this->msg( 'nextpage', $t->getText() )->escaped(),
+                               array(),
+                               $query
+                       );
+                       $topLinks[] = $nextLink;
+                       $bottomLinks[] = $nextLink;
                }
 
-               if ( isset( $nextLink ) ) {
-                       $links[] = $nextLink;
-               }
+               $nsForm = $this->namespaceForm( $namespace, $from, $to, $hideredirects );
+               $out2 = Xml::openElement( 'table', array( 'class' => 'mw-allpages-table-form' ) ) .
+                       '<tr>
+                                               <td>' .
+                       $nsForm .
+                       '</td>
+                                               <td class="mw-allpages-nav">' .
+                       $this->getLanguage()->pipeList( $topLinks ) .
+                       '</td></tr></table>';
+
+               $output->addHTML( $out2 . $out );
 
-               if ( count( $links ) ) {
+               if ( count( $bottomLinks ) ) {
                        $output->addHTML(
                                Html::element( 'hr' ) .
                                        Html::rawElement( 'div', array( 'class' => 'mw-allpages-nav' ),
-                                               $this->getLanguage()->pipeList( $links )
+                                               $this->getLanguage()->pipeList( $bottomLinks )
                                        )
                        );
                }
index 716bf80..8c46a93 100644 (file)
@@ -84,7 +84,8 @@ class SpecialBlock extends FormSpecialPage {
                        $this->getSkin()->setRelevantUser( $this->target );
                }
 
-               list( $this->previousTarget, /*...*/ ) = Block::parseTarget( $request->getVal( 'wpPreviousTarget' ) );
+               list( $this->previousTarget, /*...*/ ) =
+                       Block::parseTarget( $request->getVal( 'wpPreviousTarget' ) );
                $this->requestedHideUser = $request->getBool( 'wpHideUser' );
        }
 
@@ -129,7 +130,6 @@ class SpecialBlock extends FormSpecialPage {
                        'Target' => array(
                                'type' => 'text',
                                'label-message' => 'ipaddressorusername',
-                               'tabindex' => '1',
                                'id' => 'mw-bi-target',
                                'size' => '45',
                                'autofocus' => true,
@@ -140,7 +140,6 @@ class SpecialBlock extends FormSpecialPage {
                                'type' => !count( $suggestedDurations ) ? 'text' : 'selectorother',
                                'label-message' => 'ipbexpiry',
                                'required' => true,
-                               'tabindex' => '2',
                                'options' => $suggestedDurations,
                                'other' => $this->msg( 'ipbother' )->text(),
                                'default' => $this->msg( 'ipb-default-expiry' )->inContentLanguage()->text(),
@@ -361,7 +360,10 @@ class SpecialBlock extends FormSpecialPage {
 
                # Link to unblock the specified user, or to a blank unblock form
                if ( $this->target instanceof User ) {
-                       $message = $this->msg( 'ipb-unblock-addr', wfEscapeWikiText( $this->target->getName() ) )->parse();
+                       $message = $this->msg(
+                               'ipb-unblock-addr',
+                               wfEscapeWikiText( $this->target->getName() )
+                       )->parse();
                        $list = SpecialPage::getTitleFor( 'Unblock', $this->target->getName() );
                } else {
                        $message = $this->msg( 'ipb-unblock' )->parse();
@@ -451,7 +453,7 @@ class SpecialBlock extends FormSpecialPage {
 
        /**
         * Determine the target of the block, and the type of target
-        * TODO: should be in Block.php?
+        * @todo Should be in Block.php?
         * @param string $par subpage parameter passed to setup, or data value from
         *     the HTMLForm
         * @param WebRequest $request Optionally try and get data from a request too
@@ -765,7 +767,11 @@ class SpecialBlock extends FormSpecialPage {
 
                # Can't watch a rangeblock
                if ( $type != Block::TYPE_RANGE && $data['Watch'] ) {
-                       WatchAction::doWatch( Title::makeTitle( NS_USER, $target ), $performer, WatchedItem::IGNORE_USER_RIGHTS );
+                       WatchAction::doWatch(
+                               Title::makeTitle( NS_USER, $target ),
+                               $performer,
+                               WatchedItem::IGNORE_USER_RIGHTS
+                       );
                }
 
                # Block constructor sanitizes certain block options on insert
@@ -969,7 +975,3 @@ class SpecialBlock extends FormSpecialPage {
                return 'users';
        }
 }
-
-# BC @since 1.18
-class IPBlockForm extends SpecialBlock {
-}
index 4c9a682..9170e3e 100644 (file)
@@ -27,8 +27,9 @@
  * @ingroup SpecialPage
  */
 class SpecialBlockList extends SpecialPage {
+       protected $target;
 
-       protected $target, $options;
+       protected $options;
 
        function __construct() {
                parent::__construct( 'BlockList' );
@@ -203,7 +204,11 @@ class SpecialBlockList extends SpecialPage {
                        foreach ( $otherBlockLink as $link ) {
                                $list .= Html::rawElement( 'li', array(), $link ) . "\n";
                        }
-                       $out->addHTML( Html::rawElement( 'ul', array( 'class' => 'mw-ipblocklist-otherblocks' ), $list ) . "\n" );
+                       $out->addHTML( Html::rawElement(
+                               'ul',
+                               array( 'class' => 'mw-ipblocklist-otherblocks' ),
+                               $list
+                       ) . "\n" );
                }
        }
 
@@ -471,11 +476,15 @@ class HTMLBlockedUsersItemSelect extends HTMLSelectField {
                }
 
                // Let folks pick an explicit limit not from our list, as long as it's a real numbr.
-               if ( !in_array( $value, $this->mParams['options'] ) && $value == intval( $value ) && $value > 0 ) {
+               if ( !in_array( $value, $this->mParams['options'] )
+                       && $value == intval( $value )
+                       && $value > 0
+               ) {
                        // This adds the explicitly requested limit value to the drop-down,
                        // then makes sure it's sorted correctly so when we output the list
                        // later, the custom option doesn't just show up last.
-                       $this->mParams['options'][$this->mParent->getLanguage()->formatNum( $value )] = intval( $value );
+                       $this->mParams['options'][$this->mParent->getLanguage()->formatNum( $value )] =
+                               intval( $value );
                        asort( $this->mParams['options'] );
                }
 
index 79636b1..581619f 100644 (file)
@@ -30,7 +30,6 @@
  * @ingroup SpecialPage
  */
 class SpecialBookSources extends SpecialPage {
-
        /**
         * ISBN passed to the page, if any
         */
@@ -55,7 +54,10 @@ class SpecialBookSources extends SpecialPage {
                $this->getOutput()->addHTML( $this->makeForm() );
                if ( strlen( $this->isbn ) > 0 ) {
                        if ( !self::isValidISBN( $this->isbn ) ) {
-                               $this->getOutput()->wrapWikiMsg( "<div class=\"error\">\n$1\n</div>", 'booksources-invalid-isbn' );
+                               $this->getOutput()->wrapWikiMsg(
+                                       "<div class=\"error\">\n$1\n</div>",
+                                       'booksources-invalid-isbn'
+                               );
                        }
                        $this->showList();
                }
@@ -118,10 +120,21 @@ class SpecialBookSources extends SpecialPage {
                global $wgScript;
 
                $form = Html::openElement( 'fieldset' ) . "\n";
-               $form .= Html::element( 'legend', array(), $this->msg( 'booksources-search-legend' )->text() ) . "\n";
+               $form .= Html::element(
+                       'legend',
+                       array(),
+                       $this->msg( 'booksources-search-legend' )->text()
+               ) . "\n";
                $form .= Html::openElement( 'form', array( 'method' => 'get', 'action' => $wgScript ) ) . "\n";
                $form .= Html::hidden( 'title', $this->getPageTitle()->getPrefixedText() ) . "\n";
-               $form .= '<p>' . Xml::inputLabel( $this->msg( 'booksources-isbn' )->text(), 'isbn', 'isbn', 20, $this->isbn, array( 'autofocus' => true ) );
+               $form .= '<p>' . Xml::inputLabel(
+                       $this->msg( 'booksources-isbn' )->text(),
+                       'isbn',
+                       'isbn',
+                       20,
+                       $this->isbn,
+                       array( 'autofocus' => true )
+               );
                $form .= '&#160;' . Xml::submitButton( $this->msg( 'booksources-go' )->text() ) . "</p>\n";
                $form .= Html::closeElement( 'form' ) . "\n";
                $form .= Html::closeElement( 'fieldset' ) . "\n";
index b2ddc22..1bbdbea 100644 (file)
@@ -28,7 +28,6 @@
  * @ingroup SpecialPage
  */
 class BrokenRedirectsPage extends QueryPage {
-
        function __construct( $name = 'BrokenRedirects' ) {
                parent::__construct( $name );
        }
@@ -148,7 +147,8 @@ class BrokenRedirectsPage extends QueryPage {
                        );
                }
 
-               $out .= $this->msg( 'parentheses' )->rawParams( $this->getLanguage()->pipeList( $links ) )->escaped();
+               $out .= $this->msg( 'parentheses' )->rawParams( $this->getLanguage()
+                       ->pipeList( $links ) )->escaped();
                $out .= " {$arr} {$to}";
 
                return $out;
index 7763166..cb9b07c 100644 (file)
@@ -38,7 +38,6 @@
  * @since 1.20
  */
 abstract class SpecialCachedPage extends SpecialPage implements ICacheHelper {
-
        /**
         * CacheHelper object to which we forward the non-SpecialPage specific caching work.
         * Initialized in startCache.
@@ -142,7 +141,11 @@ abstract class SpecialCachedPage extends SpecialPage implements ICacheHelper {
         * @param string|null $key
         */
        public function addCachedHTML( $computeFunction, $args = array(), $key = null ) {
-               $this->getOutput()->addHTML( $this->cacheHelper->getCachedValue( $computeFunction, $args, $key ) );
+               $this->getOutput()->addHTML( $this->cacheHelper->getCachedValue(
+                       $computeFunction,
+                       $args,
+                       $key
+               ) );
        }
 
        /**
@@ -158,7 +161,8 @@ abstract class SpecialCachedPage extends SpecialPage implements ICacheHelper {
        }
 
        /**
-        * Sets the time to live for the cache, in seconds or a unix timestamp indicating the point of expiry.
+        * Sets the time to live for the cache, in seconds or a unix timestamp
+        * indicating the point of expiry.
         *
         * @since 1.20
         *
index 07a2a86..c57e33b 100644 (file)
@@ -27,7 +27,6 @@
  * @ingroup SpecialPage
  */
 class SpecialChangeEmail extends UnlistedSpecialPage {
-
        /**
         * Users password
         * @var string
@@ -233,13 +232,19 @@ class SpecialChangeEmail extends UnlistedSpecialPage {
                $throttleCount = LoginForm::incLoginThrottle( $user->getName() );
                if ( $throttleCount === true ) {
                        $lang = $this->getLanguage();
-                       $this->error( array( 'changeemail-throttled', $lang->formatDuration( $wgPasswordAttemptThrottle['seconds'] ) ) );
+                       $this->error( array(
+                               'changeemail-throttled',
+                               $lang->formatDuration( $wgPasswordAttemptThrottle['seconds'] )
+                       ) );
 
                        return false;
                }
 
                global $wgRequirePasswordforEmailChange;
-               if ( $wgRequirePasswordforEmailChange && !$user->checkTemporaryPassword( $pass ) && !$user->checkPassword( $pass ) ) {
+               if ( $wgRequirePasswordforEmailChange
+                       && !$user->checkTemporaryPassword( $pass )
+                       && !$user->checkPassword( $pass )
+               ) {
                        $this->error( 'wrongpassword' );
 
                        return false;
index 8afbf4b..f4ce882 100644 (file)
@@ -27,8 +27,8 @@
  * @ingroup SpecialPage
  */
 class SpecialChangePassword extends FormSpecialPage {
-
-       protected $mUserName, $mDomain;
+       protected $mUserName;
+       protected $mDomain;
 
        // Optional Wikitext Message to show above the password change form
        protected $mPreTextMessage = null;
@@ -178,7 +178,6 @@ class SpecialChangePassword extends FormSpecialPage {
                        return false;
                }
 
-
                if ( $request->getCheck( 'wpCancel' ) ) {
                        $titleObj = Title::newFromText( $request->getVal( 'returnto' ) );
                        if ( !$titleObj instanceof Title ) {
index 6a4467c..0571d0d 100644 (file)
@@ -1055,7 +1055,8 @@ class ContribsPager extends ReverseChronologicalPager {
                        # Show user names for /newbies as there may be different users.
                        # Note that we already excluded rows with hidden user names.
                        if ( $this->contribs == 'newbie' ) {
-                               $userlink = ' . . ' . $lang->getDirMark() . Linker::userLink( $rev->getUser(), $rev->getUserText() );
+                               $userlink = ' . . ' . $lang->getDirMark()
+                                       . Linker::userLink( $rev->getUser(), $rev->getUserText() );
                                $userlink .= ' ' . $this->msg( 'parentheses' )->rawParams(
                                        Linker::userTalkLink( $rev->getUser(), $rev->getUserText() ) )->escaped() . ' ';
                        } else {
index d781e6d..448637e 100644 (file)
  */
 class SpecialCreateAccount extends SpecialRedirectToSpecial {
        function __construct() {
-               parent::__construct( 'CreateAccount', 'Userlogin', 'signup', array( 'returnto', 'returntoquery', 'uselang' ) );
+               parent::__construct(
+                       'CreateAccount',
+                       'Userlogin',
+                       'signup',
+                       array( 'returnto', 'returntoquery', 'uselang' )
+               );
        }
 
        // No reason to hide this link on Special:Specialpages
index 0c860a5..ebbef17 100644 (file)
@@ -93,6 +93,14 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
                                        $out->addReturnTo( SpecialPage::getTitleFor( 'Watchlist' ) );
                                }
                                break;
+                       case self::EDIT_CLEAR:
+                               $out->setPageTitle( $this->msg( 'watchlistedit-clear-title' ) );
+                               $form = $this->getClearForm();
+                               if ( $form->show() ) {
+                                       $out->addHTML( $this->successMessage );
+                                       $out->addReturnTo( SpecialPage::getTitleFor( 'Watchlist' ) );
+                               }
+                               break;
 
                        case self::EDIT_NORMAL:
                        default:
@@ -191,6 +199,18 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
                return true;
        }
 
+       public function submitClear( $data ) {
+               $current = $this->getWatchlist();
+               $this->clearWatchlist();
+               $this->getUser()->invalidateCache();
+               $this->successMessage = $this->msg( 'watchlistedit-clear-done' )->parse();
+               $this->successMessage .= ' ' . $this->msg( 'watchlistedit-clear-removed' )
+                       ->numParams( count( $current ) )->parse();
+               $this->showTitles( $current, $this->successMessage );
+
+               return true;
+       }
+
        /**
         * Print out a list of linked titles
         *
@@ -204,6 +224,10 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
                $talk = $this->msg( 'talkpagelinktext' )->escaped();
                // Do a batch existence check
                $batch = new LinkBatch();
+               if (count($titles) >= 100) {
+                       $output = wfMessage( 'watchlistedit-too-many' )->parse();
+                       return;
+               }
                foreach ( $titles as $title ) {
                        if ( !$title instanceof Title ) {
                                $title = Title::newFromText( $title );
@@ -538,7 +562,8 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
                $context->setTitle( $this->getPageTitle() ); // Remove subpage
                $form = new EditWatchlistNormalHTMLForm( $fields, $context );
                $form->setSubmitTextMsg( 'watchlistedit-normal-submit' );
-               # Used message keys: 'accesskey-watchlistedit-normal-submit', 'tooltip-watchlistedit-normal-submit'
+               # Used message keys:
+               # 'accesskey-watchlistedit-normal-submit', 'tooltip-watchlistedit-normal-submit'
                $form->setSubmitTooltip( 'watchlistedit-normal-submit' );
                $form->setWrapperLegendMsg( 'watchlistedit-normal-legend' );
                $form->addHeaderText( $this->msg( 'watchlistedit-normal-explain' )->parse() );
@@ -579,7 +604,10 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
                        );
                }
 
-               wfRunHooks( 'WatchlistEditorBuildRemoveLine', array( &$tools, $title, $title->isRedirect(), $this->getSkin() ) );
+               wfRunHooks(
+                       'WatchlistEditorBuildRemoveLine',
+                       array( &$tools, $title, $title->isRedirect(), $this->getSkin() )
+               );
 
                return $link . " (" . $this->getLanguage()->pipeList( $tools ) . ")";
        }
@@ -611,6 +639,25 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
                return $form;
        }
 
+       /**
+        * Get a form for clearing the watchlist
+        *
+        * @return HTMLForm
+        */
+       protected function getClearForm() {
+               $context = new DerivativeContext( $this->getContext() );
+               $context->setTitle( $this->getPageTitle( 'clear' ) ); // Reset subpage
+               $form = new HTMLForm( array(), $context );
+               $form->setSubmitTextMsg( 'watchlistedit-clear-submit' );
+               # Used message keys: 'accesskey-watchlistedit-clear-submit', 'tooltip-watchlistedit-clear-submit'
+               $form->setSubmitTooltip( 'watchlistedit-clear-submit' );
+               $form->setWrapperLegendMsg( 'watchlistedit-clear-legend' );
+               $form->addHeaderText( $this->msg( 'watchlistedit-clear-explain' )->parse() );
+               $form->setSubmitCallback( array( $this, 'submitClear' ) );
+
+               return $form;
+       }
+
        /**
         * Determine whether we are editing the watchlist, and if so, what
         * kind of editing operation
@@ -625,6 +672,7 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
                switch ( $mode ) {
                        case 'clear':
                        case self::EDIT_CLEAR:
+                               return self::EDIT_CLEAR;
                        case 'raw':
                        case self::EDIT_RAW:
                                return self::EDIT_RAW;
@@ -651,6 +699,7 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
                        'view' => array( 'Watchlist', false ),
                        'edit' => array( 'EditWatchlist', false ),
                        'raw' => array( 'EditWatchlist', 'raw' ),
+                       'clear' => array( 'EditWatchlist', 'clear' ),
                );
 
                foreach ( $modes as $mode => $arr ) {
@@ -669,10 +718,6 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
        }
 }
 
-# B/C since 1.18
-class WatchlistEditor extends SpecialEditWatchlist {
-}
-
 /**
  * Extend HTMLForm purely so we can have a more sane way of getting the section headers
  */
index 487d979..bc8e728 100644 (file)
@@ -259,8 +259,14 @@ class SpecialExport extends SpecialPage {
                        ) . '<br />';
                }
 
-               // Enable this when we can do something useful exporting/importing image information. :)
-               //$form .= Xml::checkLabel( $this->msg( 'export-images' )->text(), 'images', 'wpExportImages', false ) . '<br />';
+               /* Enable this when we can do something useful exporting/importing image information.
+               $form .= Xml::checkLabel(
+                               $this->msg( 'export-images' )->text(),
+                               'images',
+                               'wpExportImages',
+                               false
+                       ) . '<br />';
+               */
                $form .= Xml::checkLabel(
                        $this->msg( 'export-download' )->text(),
                        'wpDownload',
@@ -510,7 +516,9 @@ class SpecialExport extends SpecialPage {
         * @return array
         */
        private function getPageLinks( $inputPages, $pageSet, $depth ) {
+               // @codingStandardsIgnoreStart Squiz.WhiteSpace.SemicolonSpacing.Incorrect
                for ( ; $depth > 0; --$depth ) {
+                       // @codingStandardsIgnoreEnd
                        $pageSet = $this->getLinks(
                                $inputPages, $pageSet, 'pagelinks',
                                array( 'namespace' => 'pl_namespace', 'title' => 'pl_title' ),
index 891962b..28e6479 100644 (file)
@@ -99,7 +99,9 @@ class SpecialImport extends SpecialPage {
                $sourceName = $request->getVal( "source" );
 
                $this->logcomment = $request->getText( 'log-comment' );
-               $this->pageLinkDepth = $wgExportMaxLinkDepth == 0 ? 0 : $request->getIntOrNull( 'pagelink-depth' );
+               $this->pageLinkDepth = $wgExportMaxLinkDepth == 0
+                       ? 0
+                       : $request->getIntOrNull( 'pagelink-depth' );
                $this->rootpage = $request->getText( 'rootpage' );
 
                $user = $this->getUser();
@@ -242,7 +244,10 @@ class SpecialImport extends SpecialPage {
                                </tr>
                                <tr>
                                        <td class='mw-label'>" .
-                                       Xml::label( $this->msg( 'import-interwiki-rootpage' )->text(), 'mw-interwiki-rootpage-upload' ) .
+                                       Xml::label(
+                                               $this->msg( 'import-interwiki-rootpage' )->text(),
+                                               'mw-interwiki-rootpage-upload'
+                                       ) .
                                        "</td>
                                        <td class='mw-input'>" .
                                        Xml::input( 'rootpage', 50, $this->rootpage,
@@ -434,7 +439,9 @@ class ImportReporter extends ContextSource {
        }
 
        function reportNotice( $msg, array $params ) {
-               $this->getOutput()->addHTML( Html::element( 'li', array(), $this->msg( $msg, $params )->text() ) );
+               $this->getOutput()->addHTML(
+                       Html::element( 'li', array(), $this->msg( $msg, $params )->text() )
+               );
        }
 
        function reportLogItem( /* ... */ ) {
@@ -475,7 +482,8 @@ class ImportReporter extends ContextSource {
                                $detail = $this->msg( 'import-logentry-upload-detail' )->numParams(
                                        $successCount )->inContentLanguage()->text();
                                if ( $this->reason ) {
-                                       $detail .= $this->msg( 'colon-separator' )->inContentLanguage()->text() . $this->reason;
+                                       $detail .= $this->msg( 'colon-separator' )->inContentLanguage()->text()
+                                               . $this->reason;
                                }
                                $log->addEntry( 'upload', $title, $detail, array(), $this->getUser() );
                        } else {
@@ -484,7 +492,8 @@ class ImportReporter extends ContextSource {
                                $detail = $this->msg( 'import-logentry-interwiki-detail' )->numParams(
                                        $successCount )->params( $interwiki )->inContentLanguage()->text();
                                if ( $this->reason ) {
-                                       $detail .= $this->msg( 'colon-separator' )->inContentLanguage()->text() . $this->reason;
+                                       $detail .= $this->msg( 'colon-separator' )->inContentLanguage()->text()
+                                               . $this->reason;
                                }
                                $log->addEntry( 'interwiki', $title, $detail, array(), $this->getUser() );
                        }
@@ -492,13 +501,23 @@ class ImportReporter extends ContextSource {
                        $comment = $detail; // quick
                        $dbw = wfGetDB( DB_MASTER );
                        $latest = $title->getLatestRevID();
-                       $nullRevision = Revision::newNullRevision( $dbw, $title->getArticleID(), $comment, true, $this->getUser() );
+                       $nullRevision = Revision::newNullRevision(
+                               $dbw,
+                               $title->getArticleID(),
+                               $comment,
+                               true,
+                               $this->getUser()
+                       );
+
                        if ( !is_null( $nullRevision ) ) {
                                $nullRevision->insertOn( $dbw );
                                $page = WikiPage::factory( $title );
                                # Update page record
                                $page->updateRevisionOn( $dbw, $nullRevision );
-                               wfRunHooks( 'NewRevisionFromEditComplete', array( $page, $nullRevision, $latest, $this->getUser() ) );
+                               wfRunHooks(
+                                       'NewRevisionFromEditComplete',
+                                       array( $page, $nullRevision, $latest, $this->getUser() )
+                               );
                        }
                } else {
                        $this->getOutput()->addHTML( "<li>" . Linker::linkKnown( $title ) . " " .
index 7982d5c..1c4f79f 100644 (file)
  * @ingroup SpecialPage
  */
 class SpecialJavaScriptTest extends SpecialPage {
-
        /**
-        * @var $frameworks Array: Mapping of framework ids and their initilizer methods
+        * @var array Mapping of framework ids and their initilizer methods
         * in this class. If a framework is requested but not in this array,
         * the 'unknownframework' error is served.
         */
-       static $frameworks = array(
+       private static $frameworks = array(
                'qunit' => 'initQUnitTesting',
        );
 
index f9caff6..6b54fe8 100644 (file)
@@ -68,14 +68,20 @@ class SpecialListFiles extends IncludableSpecialPage {
  * @ingroup SpecialPage Pager
  */
 class ImageListPager extends TablePager {
-       var $mFieldNames = null;
+       protected $mFieldNames = null;
+
        // Subclasses should override buildQueryConds instead of using $mQueryConds variable.
-       var $mQueryConds = array();
-       var $mUserName = null;
-       var $mSearch = '';
-       var $mIncluding = false;
-       var $mShowAll = false;
-       var $mTableName = 'image';
+       protected $mQueryConds = array();
+
+       protected $mUserName = null;
+
+       protected $mSearch = '';
+
+       protected $mIncluding = false;
+
+       protected $mShowAll = false;
+
+       protected $mTableName = 'image';
 
        function __construct( IContextSource $context, $userName = null, $search = '',
                $including = false, $showAll = false
@@ -298,7 +304,8 @@ class ImageListPager extends TablePager {
        function reallyDoQuery( $offset, $limit, $asc ) {
                $prevTableName = $this->mTableName;
                $this->mTableName = 'image';
-               list( $tables, $fields, $conds, $fname, $options, $join_conds ) = $this->buildQueryInfo( $offset, $limit, $asc );
+               list( $tables, $fields, $conds, $fname, $options, $join_conds ) =
+                       $this->buildQueryInfo( $offset, $limit, $asc );
                $imageRes = $this->mDb->select( $tables, $fields, $conds, $fname, $options, $join_conds );
                $this->mTableName = $prevTableName;
 
@@ -315,7 +322,8 @@ class ImageListPager extends TablePager {
                }
                $this->mIndexField = 'oi_' . substr( $this->mIndexField, 4 );
 
-               list( $tables, $fields, $conds, $fname, $options, $join_conds ) = $this->buildQueryInfo( $offset, $limit, $asc );
+               list( $tables, $fields, $conds, $fname, $options, $join_conds ) =
+                       $this->buildQueryInfo( $offset, $limit, $asc );
                $oldimageRes = $this->mDb->select( $tables, $fields, $conds, $fname, $options, $join_conds );
 
                $this->mTableName = $prevTableName;
@@ -360,11 +368,17 @@ class ImageListPager extends TablePager {
                                }
                        }
                }
+
+               // @codingStandardsIgnoreStart Squiz.WhiteSpace.SemicolonSpacing.Incorrect
                for ( ; $i < $limit && $topRes1; $i++ ) {
+                       // @codingStandardsIgnoreEnd
                        $resultArray[] = $topRes1;
                        $topRes1 = $res1->next();
                }
+
+               // @codingStandardsIgnoreStart Squiz.WhiteSpace.SemicolonSpacing.Incorrect
                for ( ; $i < $limit && $topRes2; $i++ ) {
+                       // @codingStandardsIgnoreEnd
                        $resultArray[] = $topRes2;
                        $topRes2 = $res2->next();
                }
index 31034f9..a77b70c 100644 (file)
@@ -29,9 +29,6 @@
  * @author Petr Kadlec <mormegil@centrum.cz>
  */
 class SpecialListGroupRights extends SpecialPage {
-       /**
-        * Constructor
-        */
        function __construct() {
                parent::__construct( 'Listgrouprights' );
        }
@@ -118,11 +115,12 @@ class SpecialListGroupRights extends SpecialPage {
                        $addgroups = isset( $wgAddGroups[$group] ) ? $wgAddGroups[$group] : array();
                        $removegroups = isset( $wgRemoveGroups[$group] ) ? $wgRemoveGroups[$group] : array();
                        $addgroupsSelf = isset( $wgGroupsAddToSelf[$group] ) ? $wgGroupsAddToSelf[$group] : array();
-                       $removegroupsSelf = isset( $wgGroupsRemoveFromSelf[$group] ) ? $wgGroupsRemoveFromSelf[$group] : array();
+                       $removegroupsSelf = isset( $wgGroupsRemoveFromSelf[$group] )
+                               ? $wgGroupsRemoveFromSelf[$group]
+                               : array();
 
                        $id = $group == '*' ? false : Sanitizer::escapeId( $group );
-                       $out->addHTML( Html::rawElement( 'tr', array( 'id' => $id ),
-                               "
+                       $out->addHTML( Html::rawElement( 'tr', array( 'id' => $id ), "
                                <td>$grouppage$grouplink</td>
                                        <td>" .
                                        $this->formatPermissions( $permissions, $revoke, $addgroups, $removegroups,
index 95ef951..3382405 100644 (file)
@@ -27,7 +27,7 @@
  * @ingroup SpecialPage
  */
 class SpecialLockdb extends FormSpecialPage {
-       var $reason = '';
+       protected $reason = '';
 
        public function __construct() {
                parent::__construct( 'Lockdb', 'siteadmin' );
index dd5ab93..6da6674 100644 (file)
@@ -80,7 +80,9 @@ class SpecialLog extends SpecialPage {
                $type = $opts->getValue( 'type' );
                if ( !LogPage::isLogType( $type ) ) {
                        $opts->setValue( 'type', '' );
-               } elseif ( isset( $wgLogRestrictions[$type] ) && !$this->getUser()->isAllowed( $wgLogRestrictions[$type] ) ) {
+               } elseif ( isset( $wgLogRestrictions[$type] )
+                       && !$this->getUser()->isAllowed( $wgLogRestrictions[$type] )
+               ) {
                        throw new PermissionsError( $wgLogRestrictions[$type] );
                }
 
index f799fc5..097f1b6 100644 (file)
  * @ingroup SpecialPage
  */
 class SpecialMergeHistory extends SpecialPage {
-       var $mAction, $mTarget, $mDest, $mTimestamp, $mTargetID, $mDestID, $mComment;
+       /** @var string */
+       protected $mAction;
 
-       /**
-        * @var Title
-        */
-       var $mTargetObj, $mDestObj;
+       /** @var string */
+       protected $mTarget;
+
+       /** @var string */
+       protected $mDest;
+
+       /** @var string */
+       protected $mTimestamp;
+
+       /** @var int */
+       protected $mTargetID;
+
+       /** @var int */
+       protected $mDestID;
+
+       /** @var string */
+       protected $mComment;
+
+       /** @var bool Was posted? */
+       protected $mMerge;
+
+       /** @var bool Was submitted? */
+       protected $mSubmitted;
+
+       /** @var Title */
+       protected $mTargetObj;
+
+       /** @var Title */
+       protected $mDestObj;
 
        public function __construct() {
                parent::__construct( 'MergeHistory', 'mergehistory' );
@@ -57,7 +83,9 @@ class SpecialMergeHistory extends SpecialPage {
                }
                $this->mComment = $request->getText( 'wpComment' );
 
-               $this->mMerge = $request->wasPosted() && $this->getUser()->matchEditToken( $request->getVal( 'wpEditToken' ) );
+               $this->mMerge = $request->wasPosted()
+                       && $this->getUser()->matchEditToken( $request->getVal( 'wpEditToken' ) );
+
                // target page
                if ( $this->mSubmitted ) {
                        $this->mTargetObj = Title::newFromURL( $this->mTarget );
@@ -203,7 +231,10 @@ class SpecialMergeHistory extends SpecialPage {
                                        <tr>
                                                <td>&#160;</td>
                                                <td class="mw-submit">' .
-                                       Xml::submitButton( $this->msg( 'mergehistory-submit' )->text(), array( 'name' => 'merge', 'id' => 'mw-merge-submit' ) ) .
+                                       Xml::submitButton(
+                                               $this->msg( 'mergehistory-submit' )->text(),
+                                               array( 'name' => 'merge', 'id' => 'mw-merge-submit' )
+                                       ) .
                                        '</td>
                                        </tr>' .
                                        Xml::closeElement( 'table' ) .
@@ -290,7 +321,8 @@ class SpecialMergeHistory extends SpecialPage {
                $comment = Linker::revComment( $rev );
 
                return Html::rawElement( 'li', array(),
-                       $this->msg( 'mergehistory-revisionrow' )->rawParams( $checkBox, $last, $pageLink, $userLink, $stxt, $comment )->escaped() );
+                       $this->msg( 'mergehistory-revisionrow' )
+                               ->rawParams( $checkBox, $last, $pageLink, $userLink, $stxt, $comment )->escaped() );
        }
 
        function merge() {
@@ -434,7 +466,11 @@ class SpecialMergeHistory extends SpecialPage {
 }
 
 class MergeHistoryPager extends ReverseChronologicalPager {
-       public $mForm, $mConds;
+       /** @var IContextSource */
+       public $mForm;
+
+       /** @var array */
+       public $mConds;
 
        function __construct( $form, $conds = array(), $source, $dest ) {
                $this->mForm = $form;
index 91ef797..dce5ad9 100644 (file)
  * @ingroup SpecialPage
  */
 class MovePageForm extends UnlistedSpecialPage {
-       /**
-        * Objects
-        * @var Title
-        */
-       var $oldTitle, $newTitle;
-       // Text input
-       var $reason;
+       /** @var Title */
+       protected $oldTitle;
+
+       /** @var Title */
+       protected $newTitle;
+
+
+       /** @var string Text input */
+       protected $reason;
+
        // Checks
-       var $moveTalk, $deleteAndMove, $moveSubpages, $fixRedirects, $leaveRedirect, $moveOverShared;
+
+       /** @var bool */
+       protected $moveTalk;
+
+       /** @var bool */
+       protected $deleteAndMove;
+
+       /** @var bool */
+       protected $moveSubpages;
+
+       /** @var bool */
+       protected $fixRedirects;
+
+       /** @var bool */
+       protected $leaveRedirect;
+
+       /** @var bool */
+       protected $moveOverShared;
 
        private $watch = false;
 
@@ -163,6 +183,11 @@ class MovePageForm extends UnlistedSpecialPage {
                                        "<div class=\"error mw-moveuserpage-warning\">\n$1\n</div>",
                                        'moveuserpage-warning'
                                );
+                       } elseif ( $this->oldTitle->getNamespace() == NS_CATEGORY ) {
+                               $out->wrapWikiMsg(
+                                       "<div class=\"error mw-movecategorypage-warning\">\n$1\n</div>",
+                                       'movecategorypage-warning'
+                               );
                        }
 
                        $out->addWikiMsg( $wgFixDoubleRedirects ?
@@ -680,17 +705,20 @@ class MovePageForm extends UnlistedSpecialPage {
                                        );
 
                                        $newLink = Linker::linkKnown( $newSubpage );
-                                       $extraOutput[] = $this->msg( 'movepage-page-moved' )->rawParams( $oldLink, $newLink )->escaped();
+                                       $extraOutput[] = $this->msg( 'movepage-page-moved' )
+                                               ->rawParams( $oldLink, $newLink )->escaped();
                                        ++$count;
 
                                        if ( $count >= $wgMaximumMovedPages ) {
-                                               $extraOutput[] = $this->msg( 'movepage-max-pages' )->numParams( $wgMaximumMovedPages )->escaped();
+                                               $extraOutput[] = $this->msg( 'movepage-max-pages' )
+                                                       ->numParams( $wgMaximumMovedPages )->escaped();
                                                break;
                                        }
                                } else {
                                        $oldLink = Linker::linkKnown( $oldSubpage );
                                        $newLink = Linker::link( $newSubpage );
-                                       $extraOutput[] = $this->msg( 'movepage-page-unmoved' )->rawParams( $oldLink, $newLink )->escaped();
+                                       $extraOutput[] = $this->msg( 'movepage-page-unmoved' )
+                                               ->rawParams( $oldLink, $newLink )->escaped();
                                }
                        }
                }
index 1d06071..147d176 100644 (file)
@@ -76,7 +76,7 @@ class NewFilesPager extends ReverseChronologicalPager {
        /**
         * @var ImageGallery
         */
-       var $gallery;
+       protected $gallery;
 
        function __construct( IContextSource $context, $par = null ) {
                $this->like = $context->getRequest()->getText( 'like' );
@@ -183,7 +183,7 @@ class NewFilesPager extends ReverseChronologicalPager {
                        ),
                        'showbots' => array(
                                'type' => 'check',
-                               'label' => $this->msg( 'showhidebots', $this->msg( 'show' )->plain() )->escaped(),
+                               'label-message' => 'newimages-showbots',
                                'name' => 'showbots',
                        ),
                        'limit' => array(
index 66ec693..505a1ec 100644 (file)
  * @ingroup SpecialPage
  */
 class SpecialNewpages extends IncludableSpecialPage {
-       // Stored objects
-
        /**
         * @var FormOptions
         */
        protected $opts;
        protected $customFilters;
 
-       // Some internal settings
        protected $showNavigation = false;
 
        public function __construct() {
@@ -394,7 +391,8 @@ class SpecialNewpages extends IncludableSpecialPage {
                        $oldTitleText = $this->msg( 'rc-old-title' )->params( $oldTitleText )->escaped();
                }
 
-               return "<li{$css}>{$time} {$dm}{$plink} {$hist} {$dm}{$length} {$dm}{$ulink} {$comment} {$tagDisplay} {$oldTitleText}</li>\n";
+               return "<li{$css}>{$time} {$dm}{$plink} {$hist} {$dm}{$length} "
+                       . "{$dm}{$ulink} {$comment} {$tagDisplay} {$oldTitleText}</li>\n";
        }
 
        /**
index 6edf2c0..7554e37 100644 (file)
@@ -27,7 +27,6 @@
  * @ingroup SpecialPage
  */
 class SpecialProtectedpages extends SpecialPage {
-
        protected $IdLevel = 'level';
        protected $IdType = 'type';
 
@@ -438,7 +437,11 @@ class ProtectedPagesPager extends TablePager {
                                        );
                                } else {
                                        $username = UserCache::singleton()->getProp( $value, 'name' );
-                                       if ( LogEventsList::userCanBitfield( $row->log_deleted, LogPage::DELETED_USER, $this->getUser() ) ) {
+                                       if ( LogEventsList::userCanBitfield(
+                                               $row->log_deleted,
+                                               LogPage::DELETED_USER,
+                                               $this->getUser()
+                                       ) ) {
                                                if ( $username === false ) {
                                                        $formatted = htmlspecialchars( $value );
                                                } else {
@@ -473,7 +476,11 @@ class ProtectedPagesPager extends TablePager {
                                                $this->msg( 'protectedpages-unknown-reason' )->escaped()
                                        );
                                } else {
-                                       if ( LogEventsList::userCanBitfield( $row->log_deleted, LogPage::DELETED_COMMENT, $this->getUser() ) ) {
+                                       if ( LogEventsList::userCanBitfield(
+                                               $row->log_deleted,
+                                               LogPage::DELETED_COMMENT,
+                                               $this->getUser()
+                                       ) ) {
                                                $formatted = Linker::formatComment( $value !== null ? $value : '' );
                                        } else {
                                                $formatted = $this->msg( 'rev-deleted-comment' )->escaped();
index 4edf33c..797f588 100644 (file)
@@ -55,7 +55,7 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
        /** @var array UI Labels about the current type */
        private $typeLabels;
 
-       /** @var RevDel_List RevDel_List object, storing the list of items to be deleted/undeleted */
+       /** @var RevDelList RevDelList object, storing the list of items to be deleted/undeleted */
        private $revDelList;
 
        /** @var bool Whether user is allowed to perform the action */
@@ -132,7 +132,9 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
                // $this->ids = array_map( 'intval', $this->ids );
                $this->ids = array_unique( array_filter( $this->ids ) );
 
-               if ( $request->getVal( 'action' ) == 'historysubmit' || $request->getVal( 'action' ) == 'revisiondelete' ) {
+               if ( $request->getVal( 'action' ) == 'historysubmit'
+                       || $request->getVal( 'action' ) == 'revisiondelete'
+               ) {
                        // For show/hide form submission from history page
                        // Since we are access through index.php?title=XXX&action=historysubmit
                        // getFullTitle() will contain the target title and not our title
@@ -162,7 +164,11 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
                $this->mIsAllowed = $user->isAllowed( RevisionDeleter::getRestriction( $this->typeName ) );
 
                # Allow the list type to adjust the passed target
-               $this->targetObj = RevisionDeleter::suggestTarget( $this->typeName, $this->targetObj, $this->ids );
+               $this->targetObj = RevisionDeleter::suggestTarget(
+                       $this->typeName,
+                       $this->targetObj,
+                       $this->ids
+               );
 
                $this->otherReason = $request->getVal( 'wpReason' );
                # We need a target page!
@@ -277,7 +283,7 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
 
        /**
         * Show a deleted file version requested by the visitor.
-        * TODO Mostly copied from Special:Undelete. Refactor.
+        * @todo Mostly copied from Special:Undelete. Refactor.
         * @param string $archiveName
         */
        protected function tryShowFile( $archiveName ) {
@@ -326,7 +332,9 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
                # a user without appropriate permissions can toddle off and
                # nab the image, and Squid will serve it
                $this->getRequest()->response()->header( 'Expires: ' . gmdate( 'D, d M Y H:i:s', 0 ) . ' GMT' );
-               $this->getRequest()->response()->header( 'Cache-Control: no-cache, no-store, max-age=0, must-revalidate' );
+               $this->getRequest()->response()->header(
+                       'Cache-Control: no-cache, no-store, max-age=0, must-revalidate'
+               );
                $this->getRequest()->response()->header( 'Pragma: no-cache' );
 
                $key = $oimage->getStorageKey();
@@ -336,7 +344,7 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
 
        /**
         * Get the list object for this request
-        * @return RevDel_List
+        * @return RevDelList
         */
        protected function getList() {
                if ( is_null( $this->revDelList ) ) {
@@ -364,14 +372,18 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
                $numRevisions = 0;
                // Live revisions...
                $list = $this->getList();
+               // @codingStandardsIgnoreStart Generic.CodeAnalysis.ForLoopWithTestFunctionCall.NotAllowed
                for ( $list->reset(); $list->current(); $list->next() ) {
+                       // @codingStandardsIgnoreEnd
                        $item = $list->current();
+
                        if ( !$item->canView() ) {
                                if ( !$this->submitClicked ) {
                                        throw new PermissionsError( 'suppressrevision' );
                                }
                                $userAllowed = false;
                        }
+
                        $numRevisions++;
                        $this->getOutput()->addHTML( $item->getHTML() );
                }
@@ -413,7 +425,12 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
                                                Xml::label( $this->msg( 'revdelete-otherreason' )->text(), 'wpReason' ) .
                                        '</td>' .
                                        '<td class="mw-input">' .
-                                               Xml::input( 'wpReason', 60, $this->otherReason, array( 'id' => 'wpReason', 'maxlength' => 100 ) ) .
+                                               Xml::input(
+                                                       'wpReason',
+                                                       60,
+                                                       $this->otherReason,
+                                                       array( 'id' => 'wpReason', 'maxlength' => 100 )
+                                               ) .
                                        '</td>' .
                                "</tr><tr>\n" .
                                        '<td></td>' .
@@ -454,10 +471,15 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
         */
        protected function addUsageText() {
                // Messages: revdelete-text-text, revdelete-text-file, logdelete-text
-               $this->getOutput()->wrapWikiMsg( "<strong>$1</strong>\n$2", $this->typeLabels['text'], 'revdelete-text-others' );
+               $this->getOutput()->wrapWikiMsg(
+                       "<strong>$1</strong>\n$2", $this->typeLabels['text'],
+                       'revdelete-text-others'
+               );
+
                if ( $this->getUser()->isAllowed( 'suppressrevision' ) ) {
                        $this->getOutput()->addWikiMsg( 'revdelete-suppress-text' );
                }
+
                if ( $this->mIsAllowed ) {
                        $this->getOutput()->addWikiMsg( 'revdelete-confirm' );
                }
@@ -473,26 +495,38 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
                if ( $list->length() == 1 ) {
                        $list->reset();
                        $bitfield = $list->current()->getBits(); // existing field
+
                        if ( $this->submitClicked ) {
                                $bitfield = RevisionDeleter::extractBitfield( $this->extractBitParams(), $bitfield );
                        }
+
                        foreach ( $this->checks as $item ) {
                                // Messages: revdelete-hide-text, revdelete-hide-image, revdelete-hide-name,
                                // revdelete-hide-comment, revdelete-hide-user, revdelete-hide-restricted
                                list( $message, $name, $field ) = $item;
-                               $innerHTML = Xml::checkLabel( $this->msg( $message )->text(), $name, $name, $bitfield & $field );
+                               $innerHTML = Xml::checkLabel(
+                                       $this->msg( $message )->text(),
+                                       $name,
+                                       $name,
+                                       $bitfield & $field
+                               );
+
                                if ( $field == Revision::DELETED_RESTRICTED ) {
                                        $innerHTML = "<b>$innerHTML</b>";
                                }
+
                                $line = Xml::tags( 'td', array( 'class' => 'mw-input' ), $innerHTML );
                                $html .= "<tr>$line</tr>\n";
                        }
                } else {
                        // Otherwise, use tri-state radios
                        $html .= '<tr>';
-                       $html .= '<th class="mw-revdel-checkbox">' . $this->msg( 'revdelete-radio-same' )->escaped() . '</th>';
-                       $html .= '<th class="mw-revdel-checkbox">' . $this->msg( 'revdelete-radio-unset' )->escaped() . '</th>';
-                       $html .= '<th class="mw-revdel-checkbox">' . $this->msg( 'revdelete-radio-set' )->escaped() . '</th>';
+                       $html .= '<th class="mw-revdel-checkbox">'
+                               . $this->msg( 'revdelete-radio-same' )->escaped() . '</th>';
+                       $html .= '<th class="mw-revdel-checkbox">'
+                               . $this->msg( 'revdelete-radio-unset' )->escaped() . '</th>';
+                       $html .= '<th class="mw-revdel-checkbox">'
+                               . $this->msg( 'revdelete-radio-set' )->escaped() . '</th>';
                        $html .= "<th></th></tr>\n";
                        foreach ( $this->checks as $item ) {
                                // Messages: revdelete-hide-text, revdelete-hide-image, revdelete-hide-name,
@@ -535,16 +569,20 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
                        return false;
                }
                $bitParams = $this->extractBitParams();
-               $listReason = $this->getRequest()->getText( 'wpRevDeleteReasonList', 'other' ); // from dropdown
+               // from dropdown
+               $listReason = $this->getRequest()->getText( 'wpRevDeleteReasonList', 'other' );
                $comment = $listReason;
                if ( $comment != 'other' && $this->otherReason != '' ) {
                        // Entry from drop down menu + additional comment
-                       $comment .= $this->msg( 'colon-separator' )->inContentLanguage()->text() . $this->otherReason;
+                       $comment .= $this->msg( 'colon-separator' )->inContentLanguage()->text()
+                               . $this->otherReason;
                } elseif ( $comment == 'other' ) {
                        $comment = $this->otherReason;
                }
                # Can the user set this field?
-               if ( $bitParams[Revision::DELETED_RESTRICTED] == 1 && !$this->getUser()->isAllowed( 'suppressrevision' ) ) {
+               if ( $bitParams[Revision::DELETED_RESTRICTED] == 1
+                       && !$this->getUser()->isAllowed( 'suppressrevision' )
+               ) {
                        throw new PermissionsError( 'suppressrevision' );
                }
                # If the save went through, go to success message...
@@ -567,7 +605,10 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
        protected function success() {
                // Messages: revdelete-success, logdelete-success
                $this->getOutput()->setPageTitle( $this->msg( 'actioncomplete' ) );
-               $this->getOutput()->wrapWikiMsg( "<span class=\"success\">\n$1\n</span>", $this->typeLabels['success'] );
+               $this->getOutput()->wrapWikiMsg(
+                       "<span class=\"success\">\n$1\n</span>",
+                       $this->typeLabels['success']
+               );
                $this->wasSaved = true;
                $this->revDelList->reloadFromMaster();
                $this->showForm();
@@ -606,7 +647,7 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
        }
 
        /**
-        * Do the write operations. Simple wrapper for RevDel_*List::setVisibility().
+        * Do the write operations. Simple wrapper for RevDel*List::setVisibility().
         * @param int $bitfield
         * @param string $reason
         * @param Title $title
index 10e7009..63eff36 100644 (file)
@@ -66,12 +66,13 @@ class SpecialRunJobs extends UnlistedSpecialPage {
 
                // Constant-time signature verification
                // http://www.emerose.com/timing-attacks-explained
-               // @todo: make a common method for this
+               // @todo Make a common method for this
                if ( !is_string( $rSig ) || strlen( $rSig ) !== strlen( $cSig ) ) {
                        $verified = false;
                } else {
                        $result = 0;
-                       for ( $i = 0; $i < strlen( $cSig ); $i++ ) {
+                       $cSigLength = strlen( $cSig );
+                       for ( $i = 0; $i < $cSigLength; $i++ ) {
                                $result |= ord( $cSig[$i] ) ^ ord( $rSig[$i] );
                        }
                        $verified = ( $result == 0 );
index c2b5f9b..2713a5f 100644 (file)
@@ -226,7 +226,11 @@ class SpecialSearch extends SpecialPage {
                                $out->addHTML(
                                        Xml::openElement( 'fieldset' ) .
                                        Xml::element( 'legend', null, $this->msg( 'search-external' )->text() ) .
-                                       Xml::element( 'p', array( 'class' => 'mw-searchdisabled' ), $this->msg( 'searchdisabled' )->text() ) .
+                                       Xml::element(
+                                               'p',
+                                               array( 'class' => 'mw-searchdisabled' ),
+                                               $this->msg( 'searchdisabled' )->text()
+                                       ) .
                                        $this->msg( 'googlesearch' )->rawParams(
                                                htmlspecialchars( $term ),
                                                'UTF-8',
@@ -284,7 +288,8 @@ class SpecialSearch extends SpecialPage {
                                $stParams
                        );
 
-                       $this->didYouMeanHtml = '<div class="searchdidyoumean">' . $this->msg( 'search-suggest' )->rawParams( $suggestLink )->text() . '</div>';
+                       $this->didYouMeanHtml = '<div class="searchdidyoumean">'
+                               . $this->msg( 'search-suggest' )->rawParams( $suggestLink )->text() . '</div>';
                }
 
                if ( !wfRunHooks( 'SpecialSearchResultsPrepend', array( $this, $out, $term ) ) ) {
@@ -363,7 +368,10 @@ class SpecialSearch extends SpecialPage {
                        // Show the create link ahead
                        $this->showCreateLink( $title, $num, $titleMatches, $textMatches );
                        if ( $totalRes > $this->limit || $this->offset ) {
-                               $prevnext = $this->getLanguage()->viewPrevNext( $this->getPageTitle(), $this->offset, $this->limit,
+                               $prevnext = $this->getLanguage()->viewPrevNext(
+                                       $this->getPageTitle(),
+                                       $this->offset,
+                                       $this->limit,
                                        $this->powerSearchOptions() + array( 'search' => $term ),
                                        max( $titleMatchesNum, $textMatchesNum ) < $this->limit
                                );
@@ -444,7 +452,11 @@ class SpecialSearch extends SpecialPage {
                } else {
                        $messageName = 'searchmenu-new-nocreate';
                }
-               $params = array( $messageName, wfEscapeWikiText( $title->getPrefixedText() ), Message::numParam( $num ) );
+               $params = array(
+                       $messageName,
+                       wfEscapeWikiText( $title->getPrefixedText() ),
+                       Message::numParam( $num )
+               );
                wfRunHooks( 'SpecialSearchCreateLink', array( $title, &$params ) );
 
                // Extensions using the hook might still return an empty $messageName
@@ -708,7 +720,8 @@ class SpecialSearch extends SpecialPage {
                        &$score, &$size, &$date, &$related,
                        &$html
                ) ) ) {
-                       $html = "<li><div class='mw-search-result-heading'>{$link} {$redirect} {$section} {$fileMatch}</div> {$extract}\n" .
+                       $html = "<li><div class='mw-search-result-heading'>" .
+                               "{$link} {$redirect} {$section} {$fileMatch}</div> {$extract}\n" .
                                "<div class='mw-search-result-data'>{$score}{$size} - {$date}{$related}</div>" .
                                "</li>\n";
                }
@@ -734,7 +747,8 @@ class SpecialSearch extends SpecialPage {
 
                // work out custom project captions
                $customCaptions = array();
-               $customLines = explode( "\n", $this->msg( 'search-interwiki-custom' )->text() ); // format per line <iwprefix>:<caption>
+               // format per line <iwprefix>:<caption>
+               $customLines = explode( "\n", $this->msg( 'search-interwiki-custom' )->text() );
                foreach ( $customLines as $line ) {
                        $parts = explode( ":", $line, 2 );
                        if ( count( $parts ) == 2 ) { // validate line
@@ -756,8 +770,7 @@ class SpecialSearch extends SpecialPage {
                        }
                }
 
-
-               // TODO: should support paging in a non-confusing way (not sure how though, maybe via ajax)..
+               // @todo Should support paging in a non-confusing way (not sure how though, maybe via ajax)..
                $out .= "</ul></div>\n";
 
                // convert the whole thing to desired language variant
index 4006e49..bee94f8 100644 (file)
@@ -193,7 +193,10 @@ class LoginForm extends SpecialPage {
                                'title' => null,
                        ) + $this->mRequest->getQueryValues();
                        $url = $title->getFullURL( $query, false, PROTO_HTTPS );
-                       if ( $wgSecureLogin && wfCanIPUseHTTPS( $this->getRequest()->getIP() ) ) {
+                       if ( $wgSecureLogin
+                               && wfCanIPUseHTTPS( $this->getRequest()->getIP() )
+                               && !$this->mFromHTTP ) // Avoid infinite redirect
+                       {
                                $url = wfAppendQuery( $url, 'fromhttp=1' );
                                $this->getOutput()->redirect( $url );
                                // Since we only do this redir to change proto, always vary
@@ -435,7 +438,11 @@ class LoginForm extends SpecialPage {
 
                // Normalize the name so that silly things don't cause "invalid username"
                // errors. User::newFromName does some rather strict checking, rejecting
-               // e.g. leading/trailing/multiple spaces.
+               // e.g. leading/trailing/multiple spaces. But first we need to reject
+               // usernames that would be treated as titles with a fragment part.
+               if ( strpos( $this->mUsername, '#' ) !== false ) {
+                       return Status::newFatal( 'noname' );
+               }
                $title = Title::makeTitleSafe( NS_USER, $this->mUsername );
                if ( !is_object( $title ) ) {
                        return Status::newFatal( 'noname' );
index fc39ef5..490e81f 100644 (file)
@@ -50,6 +50,8 @@ class SpecialWatchlist extends ChangesListSpecialPage {
                if ( $mode !== false ) {
                        if ( $mode === SpecialEditWatchlist::EDIT_RAW ) {
                                $title = SpecialPage::getTitleFor( 'EditWatchlist', 'raw' );
+                       } elseif ( $mode === SpecialEditWatchlist::EDIT_CLEAR ) {
+                               $title = SpecialPage::getTitleFor( 'EditWatchlist', 'clear' );
                        } else {
                                $title = SpecialPage::getTitleFor( 'EditWatchlist' );
                        }
index d5b8d8b..33b2400 100644 (file)
@@ -1,4 +1,5 @@
 <?php
+// @codingStandardsIgnoreFile
 /**
  * Template used when there is no LocalSettings.php file.
  *
index 1c8bbd1..9118701 100644 (file)
@@ -1,4 +1,5 @@
 <?php
+// @codingStandardsIgnoreFile
 /**
  * Html form for account creation (since 1.22 with VForm appearance).
  *
@@ -22,7 +23,6 @@
  */
 
 class UsercreateTemplate extends BaseTemplate {
-
        /**
         * Extensions (AntiSpoof and TitleBlacklist) call this in response to
         * UserCreateForm hook to add checkboxes to the create account form.
index 29908d7..0aad07d 100644 (file)
@@ -1,4 +1,5 @@
 <?php
+// @codingStandardsIgnoreFile
 /**
  * Html form for user login (since 1.22 with VForm appearance).
  *
index 746c16d..b32780f 100644 (file)
@@ -44,7 +44,13 @@ abstract class UploadBase {
        protected $mBlackListedExtensions;
        protected $mJavaDetected, $mSVGNSError;
 
-       protected static $safeXmlEncodings = array( 'UTF-8', 'ISO-8859-1', 'ISO-8859-2', 'UTF-16', 'UTF-32' );
+       protected static $safeXmlEncodings = array(
+               'UTF-8',
+               'ISO-8859-1',
+               'ISO-8859-2',
+               'UTF-16',
+               'UTF-32'
+       );
 
        const SUCCESS = 0;
        const OK = 0;
@@ -120,11 +126,12 @@ abstract class UploadBase {
                                return $permission;
                        }
                }
+
                return true;
        }
 
        // Upload handlers. Should probably just be a global.
-       static $uploadHandlers = array( 'Stash', 'File', 'Url' );
+       private static $uploadHandlers = array( 'Stash', 'File', 'Url' );
 
        /**
         * Create a form of UploadBase depending on wpSourceType and initializes it
@@ -167,6 +174,7 @@ abstract class UploadBase {
                $handler = new $className;
 
                $handler->initializeFromRequest( $request );
+
                return $handler;
        }
 
@@ -179,7 +187,8 @@ abstract class UploadBase {
                return false;
        }
 
-       public function __construct() {}
+       public function __construct() {
+       }
 
        /**
         * Returns the upload type. Should be overridden by child classes
@@ -256,8 +265,9 @@ abstract class UploadBase {
                wfProfileIn( __METHOD__ );
                $repo = RepoGroup::singleton()->getLocalRepo();
                if ( $repo->isVirtualUrl( $srcPath ) ) {
-                       // @todo just make uploads work with storage paths
-                       // UploadFromStash loads files via virtual URLs
+                       /** @todo Just make uploads work with storage paths UploadFromStash
+                        *  loads files via virtual URLs.
+                        */
                        $tmpFile = $repo->getLocalCopy( $srcPath );
                        if ( $tmpFile ) {
                                $tmpFile->bind( $this ); // keep alive with $this
@@ -267,6 +277,7 @@ abstract class UploadBase {
                        $path = $srcPath;
                }
                wfProfileOut( __METHOD__ );
+
                return $path;
        }
 
@@ -282,6 +293,7 @@ abstract class UploadBase {
                 */
                if ( $this->isEmptyFile() ) {
                        wfProfileOut( __METHOD__ );
+
                        return array( 'status' => self::EMPTY_FILE );
                }
 
@@ -291,6 +303,7 @@ abstract class UploadBase {
                $maxSize = self::getMaxUploadSize( $this->getSourceType() );
                if ( $this->mFileSize > $maxSize ) {
                        wfProfileOut( __METHOD__ );
+
                        return array(
                                'status' => self::FILE_TOO_LARGE,
                                'max' => $maxSize,
@@ -305,6 +318,7 @@ abstract class UploadBase {
                $verification = $this->verifyFile();
                if ( $verification !== true ) {
                        wfProfileOut( __METHOD__ );
+
                        return array(
                                'status' => self::VERIFICATION_ERROR,
                                'details' => $verification
@@ -317,6 +331,7 @@ abstract class UploadBase {
                $result = $this->validateName();
                if ( $result !== true ) {
                        wfProfileOut( __METHOD__ );
+
                        return $result;
                }
 
@@ -325,10 +340,12 @@ abstract class UploadBase {
                        array( $this->mDestName, $this->mTempPath, &$error ) )
                ) {
                        wfProfileOut( __METHOD__ );
+
                        return array( 'status' => self::HOOK_ABORTED, 'error' => $error );
                }
 
                wfProfileOut( __METHOD__ );
+
                return array( 'status' => self::OK );
        }
 
@@ -351,6 +368,7 @@ abstract class UploadBase {
                                        $result['blacklistedExt'] = $this->mBlackListedExtensions;
                                }
                        }
+
                        return $result;
                }
                $this->mDestName = $this->getLocalFile()->getName();
@@ -374,6 +392,7 @@ abstract class UploadBase {
                        global $wgMimeTypeBlacklist;
                        if ( $this->checkFileExtension( $mime, $wgMimeTypeBlacklist ) ) {
                                wfProfileOut( __METHOD__ );
+
                                return array( 'filetype-badmime', $mime );
                        }
 
@@ -388,12 +407,14 @@ abstract class UploadBase {
                        foreach ( $ieTypes as $ieType ) {
                                if ( $this->checkFileExtension( $ieType, $wgMimeTypeBlacklist ) ) {
                                        wfProfileOut( __METHOD__ );
+
                                        return array( 'filetype-bad-ie-mime', $ieType );
                                }
                        }
                }
 
                wfProfileOut( __METHOD__ );
+
                return true;
        }
 
@@ -409,6 +430,7 @@ abstract class UploadBase {
                $status = $this->verifyPartialFile();
                if ( $status !== true ) {
                        wfProfileOut( __METHOD__ );
+
                        return $status;
                }
 
@@ -419,6 +441,7 @@ abstract class UploadBase {
                        # XXX: Missing extension will be caught by validateName() via getTitle()
                        if ( $this->mFinalExtension != '' && !$this->verifyExtension( $mime, $this->mFinalExtension ) ) {
                                wfProfileOut( __METHOD__ );
+
                                return array( 'filetype-mime-mismatch', $this->mFinalExtension, $mime );
                        }
                }
@@ -429,6 +452,7 @@ abstract class UploadBase {
                        if ( !$handlerStatus->isOK() ) {
                                $errors = $handlerStatus->getErrorsArray();
                                wfProfileOut( __METHOD__ );
+
                                return reset( $errors );
                        }
                }
@@ -436,11 +460,13 @@ abstract class UploadBase {
                wfRunHooks( 'UploadVerifyFile', array( $this, $mime, &$status ) );
                if ( $status !== true ) {
                        wfProfileOut( __METHOD__ );
+
                        return $status;
                }
 
                wfDebug( __METHOD__ . ": all clear; passing.\n" );
                wfProfileOut( __METHOD__ );
+
                return true;
        }
 
@@ -466,6 +492,7 @@ abstract class UploadBase {
                $status = $this->verifyMimeType( $mime );
                if ( $status !== true ) {
                        wfProfileOut( __METHOD__ );
+
                        return $status;
                }
 
@@ -473,12 +500,14 @@ abstract class UploadBase {
                if ( !$wgDisableUploadScriptChecks ) {
                        if ( self::detectScript( $this->mTempPath, $mime, $this->mFinalExtension ) ) {
                                wfProfileOut( __METHOD__ );
+
                                return array( 'uploadscripted' );
                        }
                        if ( $this->mFinalExtension == 'svg' || $mime == 'image/svg+xml' ) {
                                $svgStatus = $this->detectScriptInSvg( $this->mTempPath );
                                if ( $svgStatus !== false ) {
                                        wfProfileOut( __METHOD__ );
+
                                        return $svgStatus;
                                }
                        }
@@ -495,11 +524,13 @@ abstract class UploadBase {
                                $error = reset( $errors );
                                if ( $error[0] !== 'zip-wrong-format' ) {
                                        wfProfileOut( __METHOD__ );
+
                                        return $error;
                                }
                        }
                        if ( $this->mJavaDetected ) {
                                wfProfileOut( __METHOD__ );
+
                                return array( 'uploadjava' );
                        }
                }
@@ -508,10 +539,12 @@ abstract class UploadBase {
                $virus = $this->detectVirus( $this->mTempPath );
                if ( $virus ) {
                        wfProfileOut( __METHOD__ );
+
                        return array( 'uploadvirus', $virus );
                }
 
                wfProfileOut( __METHOD__ );
+
                return true;
        }
 
@@ -541,8 +574,10 @@ abstract class UploadBase {
        }
 
        /**
-        * Alias for verifyTitlePermissions. The function was originally 'verifyPermissions'
-        * but that suggests it's checking the user, when it's really checking the title + user combination.
+        * Alias for verifyTitlePermissions. The function was originally
+        * 'verifyPermissions', but that suggests it's checking the user, when it's
+        * really checking the title + user combination.
+        *
         * @param User $user User object to verify the permissions against
         * @return mixed An array as returned by getUserPermissionsErrors or true
         *   in case the user has proper permissions.
@@ -581,6 +616,7 @@ abstract class UploadBase {
                if ( $permErrors || $permErrorsUpload || $permErrorsCreate ) {
                        $permErrors = array_merge( $permErrors, wfArrayDiff2( $permErrorsUpload, $permErrors ) );
                        $permErrors = array_merge( $permErrors, wfArrayDiff2( $permErrorsCreate, $permErrors ) );
+
                        return $permErrors;
                }
 
@@ -618,7 +654,8 @@ abstract class UploadBase {
                if ( $this->mDesiredDestName != $filename && $comparableName != $filename ) {
                        $warnings['badfilename'] = $filename;
                        // Debugging for bug 62241
-                       wfDebugLog( 'upload', "Filename: '$filename', mDesiredDestName: '$this->mDesiredDestName', comparableName: '$comparableName'" );
+                       wfDebugLog( 'upload', "Filename: '$filename', mDesiredDestName: "
+                               . "'$this->mDesiredDestName', comparableName: '$comparableName'" );
                }
 
                // Check whether the file extension is on the unwanted list
@@ -670,6 +707,7 @@ abstract class UploadBase {
                }
 
                wfProfileOut( __METHOD__ );
+
                return $warnings;
        }
 
@@ -699,12 +737,17 @@ abstract class UploadBase {
 
                if ( $status->isGood() ) {
                        if ( $watch ) {
-                               WatchAction::doWatch( $this->getLocalFile()->getTitle(), $user, WatchedItem::IGNORE_USER_RIGHTS );
+                               WatchAction::doWatch(
+                                       $this->getLocalFile()->getTitle(),
+                                       $user,
+                                       WatchedItem::IGNORE_USER_RIGHTS
+                               );
                        }
                        wfRunHooks( 'UploadComplete', array( &$this ) );
                }
 
                wfProfileOut( __METHOD__ );
+
                return $status;
        }
 
@@ -733,6 +776,7 @@ abstract class UploadBase {
                if ( strlen( $this->mFilteredName ) > 240 ) {
                        $this->mTitleError = self::FILENAME_TOO_LONG;
                        $this->mTitle = null;
+
                        return $this->mTitle;
                }
 
@@ -747,6 +791,7 @@ abstract class UploadBase {
                if ( is_null( $nt ) ) {
                        $this->mTitleError = self::ILLEGAL_FILENAME;
                        $this->mTitle = null;
+
                        return $this->mTitle;
                }
                $this->mFilteredName = $nt->getDBkey();
@@ -789,27 +834,34 @@ abstract class UploadBase {
                if ( $this->mFinalExtension == '' ) {
                        $this->mTitleError = self::FILETYPE_MISSING;
                        $this->mTitle = null;
+
                        return $this->mTitle;
                } elseif ( $blackListedExtensions ||
-                               ( $wgCheckFileExtensions && $wgStrictFileExtensions &&
-                                       !$this->checkFileExtension( $this->mFinalExtension, $wgFileExtensions ) ) ) {
+                       ( $wgCheckFileExtensions && $wgStrictFileExtensions &&
+                               !$this->checkFileExtension( $this->mFinalExtension, $wgFileExtensions ) )
+               ) {
                        $this->mBlackListedExtensions = $blackListedExtensions;
                        $this->mTitleError = self::FILETYPE_BADTYPE;
                        $this->mTitle = null;
+
                        return $this->mTitle;
                }
 
-               // Windows may be broken with special characters, see bug XXX
-               if ( wfIsWindows() && !preg_match( '/^[\x0-\x7f]*$/', $nt->getText() ) ) {
+               // Windows may be broken with special characters, see bug 1780
+               if ( !preg_match( '/^[\x0-\x7f]*$/', $nt->getText() )
+                       && !RepoGroup::singleton()->getLocalRepo()->backendSupportsUnicodePaths()
+               ) {
                        $this->mTitleError = self::WINDOWS_NONASCII_FILENAME;
                        $this->mTitle = null;
+
                        return $this->mTitle;
                }
 
                # If there was more than one "extension", reassemble the base
                # filename to prevent bogus complaints about length
                if ( count( $ext ) > 1 ) {
-                       for ( $i = 0; $i < count( $ext ) - 1; $i++ ) {
+                       $iterations = count( $ext ) - 1;
+                       for ( $i = 0; $i < $iterations; $i++ ) {
                                $partname .= '.' . $ext[$i];
                        }
                }
@@ -817,10 +869,12 @@ abstract class UploadBase {
                if ( strlen( $partname ) < 1 ) {
                        $this->mTitleError = self::MIN_LENGTH_PARTNAME;
                        $this->mTitle = null;
+
                        return $this->mTitle;
                }
 
                $this->mTitle = $nt;
+
                return $this->mTitle;
        }
 
@@ -834,17 +888,21 @@ abstract class UploadBase {
                        $nt = $this->getTitle();
                        $this->mLocalFile = is_null( $nt ) ? null : wfLocalFile( $nt );
                }
+
                return $this->mLocalFile;
        }
 
        /**
-        * If the user does not supply all necessary information in the first upload form submission (either by accident or
-        * by design) then we may want to stash the file temporarily, get more information, and publish the file later.
+        * If the user does not supply all necessary information in the first upload
+        * form submission (either by accident or by design) then we may want to
+        * stash the file temporarily, get more information, and publish the file
+        * later.
         *
-        * This method will stash a file in a temporary directory for later processing, and save the necessary descriptive info
-        * into the database.
-        * This method returns the file object, which also has a 'fileKey' property which can be passed through a form or
-        * API request to find this stashed file again.
+        * This method will stash a file in a temporary directory for later
+        * processing, and save the necessary descriptive info into the database.
+        * This method returns the file object, which also has a 'fileKey' property
+        * which can be passed through a form or API request to find this stashed
+        * file again.
         *
         * @param User $user
         * @return UploadStashFile Stashed file
@@ -858,11 +916,13 @@ abstract class UploadBase {
                $this->mLocalFile = $file;
 
                wfProfileOut( __METHOD__ );
+
                return $file;
        }
 
        /**
-        * Stash a file in a temporary directory, returning a key which can be used to find the file again. See stashFile().
+        * Stash a file in a temporary directory, returning a key which can be used
+        * to find the file again. See stashFile().
         *
         * @return string File key
         */
@@ -906,6 +966,7 @@ abstract class UploadBase {
        public static function splitExtensions( $filename ) {
                $bits = explode( '.', $filename );
                $basename = array_shift( $bits );
+
                return array( $basename, $bits );
        }
 
@@ -947,10 +1008,12 @@ abstract class UploadBase {
                        if ( !$magic->isRecognizableExtension( $extension ) ) {
                                wfDebug( __METHOD__ . ": passing file with unknown detected mime type; " .
                                        "unrecognized extension '$extension', can't verify\n" );
+
                                return true;
                        } else {
                                wfDebug( __METHOD__ . ": rejecting file with unknown detected mime type; " .
                                        "recognized extension '$extension', so probably invalid file\n" );
+
                                return false;
                        }
                }
@@ -960,19 +1023,22 @@ abstract class UploadBase {
                if ( $match === null ) {
                        if ( $magic->getTypesForExtension( $extension ) !== null ) {
                                wfDebug( __METHOD__ . ": No extension known for $mime, but we know a mime for $extension\n" );
+
                                return false;
                        } else {
                                wfDebug( __METHOD__ . ": no file extension known for mime type $mime, passing file\n" );
+
                                return true;
                        }
                } elseif ( $match === true ) {
                        wfDebug( __METHOD__ . ": mime type $mime matches extension $extension, passing file\n" );
 
-                       #TODO: if it's a bitmap, make sure PHP or ImageMagic resp. can handle it!
+                       /** @todo If it's a bitmap, make sure PHP or ImageMagick resp. can handle it! */
                        return true;
-
                } else {
-                       wfDebug( __METHOD__ . ": mime type $mime mismatches file extension $extension, rejecting file\n" );
+                       wfDebug( __METHOD__
+                               . ": mime type $mime mismatches file extension $extension, rejecting file\n" );
+
                        return false;
                }
        }
@@ -1007,6 +1073,7 @@ abstract class UploadBase {
 
                if ( !$chunk ) {
                        wfProfileOut( __METHOD__ );
+
                        return false;
                }
 
@@ -1025,12 +1092,13 @@ abstract class UploadBase {
 
                $chunk = trim( $chunk );
 
-               # @todo FIXME: Convert from UTF-16 if necessary!
+               /** @todo FIXME: Convert from UTF-16 if necessary! */
                wfDebug( __METHOD__ . ": checking for embedded scripts and HTML stuff\n" );
 
                # check for HTML doctype
                if ( preg_match( "/<!DOCTYPE *X?HTML/i", $chunk ) ) {
                        wfProfileOut( __METHOD__ );
+
                        return true;
                }
 
@@ -1039,6 +1107,7 @@ abstract class UploadBase {
                if ( $extension == 'svg' || strpos( $mime, 'image/svg' ) === 0 ) {
                        if ( self::checkXMLEncodingMissmatch( $file ) ) {
                                wfProfileOut( __METHOD__ );
+
                                return true;
                        }
                }
@@ -1062,7 +1131,7 @@ abstract class UploadBase {
                        '<a href',
                        '<body',
                        '<head',
-                       '<html',   #also in safari
+                       '<html', #also in safari
                        '<img',
                        '<pre',
                        '<script', #also in safari
@@ -1077,6 +1146,7 @@ abstract class UploadBase {
                        if ( false !== strpos( $chunk, $tag ) ) {
                                wfDebug( __METHOD__ . ": found something that may make it be mistaken for html: $tag\n" );
                                wfProfileOut( __METHOD__ );
+
                                return true;
                        }
                }
@@ -1092,6 +1162,7 @@ abstract class UploadBase {
                if ( preg_match( '!type\s*=\s*[\'"]?\s*(?:\w*/)?(?:ecma|java)!sim', $chunk ) ) {
                        wfDebug( __METHOD__ . ": found script types\n" );
                        wfProfileOut( __METHOD__ );
+
                        return true;
                }
 
@@ -1099,6 +1170,7 @@ abstract class UploadBase {
                if ( preg_match( '!(?:href|src|data)\s*=\s*[\'"]?\s*(?:ecma|java)script:!sim', $chunk ) ) {
                        wfDebug( __METHOD__ . ": found html-style script urls\n" );
                        wfProfileOut( __METHOD__ );
+
                        return true;
                }
 
@@ -1106,11 +1178,13 @@ abstract class UploadBase {
                if ( preg_match( '!url\s*\(\s*[\'"]?\s*(?:ecma|java)script:!sim', $chunk ) ) {
                        wfDebug( __METHOD__ . ": found css-style script urls\n" );
                        wfProfileOut( __METHOD__ );
+
                        return true;
                }
 
                wfDebug( __METHOD__ . ": no scripts found\n" );
                wfProfileOut( __METHOD__ );
+
                return false;
        }
 
@@ -1131,16 +1205,19 @@ abstract class UploadBase {
                                && !in_array( strtoupper( $encMatch[1] ), self::$safeXmlEncodings )
                        ) {
                                wfDebug( __METHOD__ . ": Found unsafe XML encoding '{$encMatch[1]}'\n" );
+
                                return true;
                        }
                } elseif ( preg_match( "!<\?xml\b!si", $contents ) ) {
                        // Start of XML declaration without an end in the first $wgSVGMetadataCutoff
                        // bytes. There shouldn't be a legitimate reason for this to happen.
                        wfDebug( __METHOD__ . ": Unmatched XML declaration start\n" );
+
                        return true;
                } elseif ( substr( $contents, 0, 4 ) == "\x4C\x6F\xA7\x94" ) {
                        // EBCDIC encoded XML
                        wfDebug( __METHOD__ . ": EBCDIC Encoded XML\n" );
+
                        return true;
                }
 
@@ -1151,17 +1228,19 @@ abstract class UploadBase {
                        wfSuppressWarnings();
                        $str = iconv( $encoding, 'UTF-8', $contents );
                        wfRestoreWarnings();
-                       if ( $str != '' && preg_match( "!<\?xml\b(.*?)\?>!si", $str, $matches ) ) {
+                       if ( $str != '' && preg_match( "!<\?xml\b(.*?)\?>!si", $str, $matches ) ) {
                                if ( preg_match( $encodingRegex, $matches[1], $encMatch )
                                        && !in_array( strtoupper( $encMatch[1] ), self::$safeXmlEncodings )
                                ) {
                                        wfDebug( __METHOD__ . ": Found unsafe XML encoding '{$encMatch[1]}'\n" );
+
                                        return true;
                                }
                        } elseif ( $str != '' && preg_match( "!<\?xml\b!si", $str ) ) {
                                // Start of XML declaration without an end in the first $wgSVGMetadataCutoff
                                // bytes. There shouldn't be a legitimate reason for this to happen.
                                wfDebug( __METHOD__ . ": Unmatched XML declaration start\n" );
+
                                return true;
                        }
                }
@@ -1188,8 +1267,10 @@ abstract class UploadBase {
                        if ( $this->mSVGNSError ) {
                                return array( 'uploadscriptednamespace', $this->mSVGNSError );
                        }
+
                        return array( 'uploadscripted' );
                }
+
                return false;
        }
 
@@ -1204,6 +1285,7 @@ abstract class UploadBase {
                if ( preg_match( '/xml-stylesheet/i', $target ) ) {
                        return true;
                }
+
                return false;
        }
 
@@ -1255,8 +1337,9 @@ abstract class UploadBase {
 
                if ( !in_array( $namespace, $validNamespaces ) ) {
                        wfDebug( __METHOD__ . ": Non-svg namespace '$namespace' in uploaded file.\n" );
-                       // @TODO return a status object to a closure in XmlTypeCheck, for MW1.21+
+                       /** @todo Return a status object to a closure in XmlTypeCheck, for MW1.21+ */
                        $this->mSVGNSError = $namespace;
+
                        return true;
                }
 
@@ -1265,24 +1348,29 @@ abstract class UploadBase {
                 */
                if ( $strippedElement == 'script' ) {
                        wfDebug( __METHOD__ . ": Found script element '$element' in uploaded file.\n" );
+
                        return true;
                }
 
-               # e.g., <svg xmlns="http://www.w3.org/2000/svg"> <handler xmlns:ev="http://www.w3.org/2001/xml-events" ev:event="load">alert(1)</handler> </svg>
+               # e.g., <svg xmlns="http://www.w3.org/2000/svg">
+               #  <handler xmlns:ev="http://www.w3.org/2001/xml-events" ev:event="load">alert(1)</handler> </svg>
                if ( $strippedElement == 'handler' ) {
                        wfDebug( __METHOD__ . ": Found scriptable element '$element' in uploaded file.\n" );
+
                        return true;
                }
 
                # SVG reported in Feb '12 that used xml:stylesheet to generate javascript block
                if ( $strippedElement == 'stylesheet' ) {
                        wfDebug( __METHOD__ . ": Found scriptable element '$element' in uploaded file.\n" );
+
                        return true;
                }
 
                # Block iframes, in case they pass the namespace check
                if ( $strippedElement == 'iframe' ) {
                        wfDebug( __METHOD__ . ": iframe in uploaded file.\n" );
+
                        return true;
                }
 
@@ -1291,69 +1379,105 @@ abstract class UploadBase {
                        $value = strtolower( $value );
 
                        if ( substr( $stripped, 0, 2 ) == 'on' ) {
-                               wfDebug( __METHOD__ . ": Found event-handler attribute '$attrib'='$value' in uploaded file.\n" );
+                               wfDebug( __METHOD__
+                                       . ": Found event-handler attribute '$attrib'='$value' in uploaded file.\n" );
+
                                return true;
                        }
 
                        # href with javascript target
                        if ( $stripped == 'href' && strpos( strtolower( $value ), 'javascript:' ) !== false ) {
-                               wfDebug( __METHOD__ . ": Found script in href attribute '$attrib'='$value' in uploaded file.\n" );
+                               wfDebug( __METHOD__
+                                       . ": Found script in href attribute '$attrib'='$value' in uploaded file.\n" );
+
                                return true;
                        }
 
                        # href with embedded svg as target
                        if ( $stripped == 'href' && preg_match( '!data:[^,]*image/svg[^,]*,!sim', $value ) ) {
-                               wfDebug( __METHOD__ . ": Found href to embedded svg \"<$strippedElement '$attrib'='$value'...\" in uploaded file.\n" );
+                               wfDebug( __METHOD__ . ": Found href to embedded svg "
+                                       . "\"<$strippedElement '$attrib'='$value'...\" in uploaded file.\n" );
+
                                return true;
                        }
 
                        # href with embedded (text/xml) svg as target
                        if ( $stripped == 'href' && preg_match( '!data:[^,]*text/xml[^,]*,!sim', $value ) ) {
-                               wfDebug( __METHOD__ . ": Found href to embedded svg \"<$strippedElement '$attrib'='$value'...\" in uploaded file.\n" );
+                               wfDebug( __METHOD__ . ": Found href to embedded svg "
+                                       . "\"<$strippedElement '$attrib'='$value'...\" in uploaded file.\n" );
+
                                return true;
                        }
 
                        # use set/animate to add event-handler attribute to parent
-                       if ( ( $strippedElement == 'set' || $strippedElement == 'animate' ) && $stripped == 'attributename' && substr( $value, 0, 2 ) == 'on' ) {
-                               wfDebug( __METHOD__ . ": Found svg setting event-handler attribute with \"<$strippedElement $stripped='$value'...\" in uploaded file.\n" );
+                       if ( ( $strippedElement == 'set' || $strippedElement == 'animate' )
+                               && $stripped == 'attributename'
+                               && substr( $value, 0, 2 ) == 'on'
+                       ) {
+                               wfDebug( __METHOD__ . ": Found svg setting event-handler attribute with "
+                                       . "\"<$strippedElement $stripped='$value'...\" in uploaded file.\n" );
+
                                return true;
                        }
 
                        # use set to add href attribute to parent element
-                       if ( $strippedElement == 'set' && $stripped == 'attributename' && strpos( $value, 'href' ) !== false ) {
+                       if ( $strippedElement == 'set'
+                               && $stripped == 'attributename'
+                               && strpos( $value, 'href' ) !== false
+                       ) {
                                wfDebug( __METHOD__ . ": Found svg setting href attribute '$value' in uploaded file.\n" );
+
                                return true;
                        }
 
                        # use set to add a remote / data / script target to an element
-                       if ( $strippedElement == 'set' && $stripped == 'to' && preg_match( '!(http|https|data|script):!sim', $value ) ) {
+                       if ( $strippedElement == 'set'
+                               && $stripped == 'to'
+                               && preg_match( '!(http|https|data|script):!sim', $value )
+                       ) {
                                wfDebug( __METHOD__ . ": Found svg setting attribute to '$value' in uploaded file.\n" );
+
                                return true;
                        }
 
                        # use handler attribute with remote / data / script
                        if ( $stripped == 'handler' && preg_match( '!(http|https|data|script):!sim', $value ) ) {
-                               wfDebug( __METHOD__ . ": Found svg setting handler with remote/data/script '$attrib'='$value' in uploaded file.\n" );
+                               wfDebug( __METHOD__ . ": Found svg setting handler with remote/data/script "
+                                       . "'$attrib'='$value' in uploaded file.\n" );
+
                                return true;
                        }
 
                        # use CSS styles to bring in remote code
                        # catch url("http:..., url('http:..., url(http:..., but not url("#..., url('#..., url(#....
-                       if ( $stripped == 'style' && preg_match_all( '!((?:font|clip-path|fill|filter|marker|marker-end|marker-mid|marker-start|mask|stroke)\s*:\s*url\s*\(\s*["\']?\s*[^#]+.*?\))!sim', $value, $matches ) ) {
+                       $tagsList = "font|clip-path|fill|filter|marker|marker-end|marker-mid|marker-start|mask|stroke";
+                       if ( $stripped == 'style'
+                               && preg_match_all(
+                                       '!((?:' . $tagsList . ')\s*:\s*url\s*\(\s*["\']?\s*[^#]+.*?\))!sim',
+                                       $value,
+                                       $matches
+                               )
+                       ) {
                                foreach ( $matches[1] as $match ) {
-                                       if ( !preg_match( '!(?:font|clip-path|fill|filter|marker|marker-end|marker-mid|marker-start|mask|stroke)\s*:\s*url\s*\(\s*(#|\'#|"#)!sim', $match ) ) {
-                                               wfDebug( __METHOD__ . ": Found svg setting a style with remote url '$attrib'='$value' in uploaded file.\n" );
+                                       if ( !preg_match( '!(?:' . $tagsList . ')\s*:\s*url\s*\(\s*(#|\'#|"#)!sim', $match ) ) {
+                                               wfDebug( __METHOD__ . ": Found svg setting a style with "
+                                                       . "remote url '$attrib'='$value' in uploaded file.\n" );
+
                                                return true;
                                        }
                                }
                        }
 
                        # image filters can pull in url, which could be svg that executes scripts
-                       if ( $strippedElement == 'image' && $stripped == 'filter' && preg_match( '!url\s*\(!sim', $value ) ) {
-                               wfDebug( __METHOD__ . ": Found image filter with url: \"<$strippedElement $stripped='$value'...\" in uploaded file.\n" );
+                       if ( $strippedElement == 'image'
+                               && $stripped == 'filter'
+                               && preg_match( '!url\s*\(!sim', $value )
+                       ) {
+                               wfDebug( __METHOD__ . ": Found image filter with url: "
+                                       . "\"<$strippedElement $stripped='$value'...\" in uploaded file.\n" );
+
                                return true;
                        }
-
                }
 
                return false; //No scripts detected
@@ -1369,6 +1493,7 @@ abstract class UploadBase {
                $parts = explode( ':', strtolower( $element ) );
                $name = array_pop( $parts );
                $ns = implode( ':', $parts );
+
                return array( $ns, $name );
        }
 
@@ -1379,6 +1504,7 @@ abstract class UploadBase {
        private function stripXmlNamespace( $name ) {
                // 'http://www.w3.org/2000/svg:script' -> 'script'
                $parts = explode( ':', strtolower( $name ) );
+
                return array_pop( $parts );
        }
 
@@ -1399,6 +1525,7 @@ abstract class UploadBase {
                if ( !$wgAntivirus ) {
                        wfDebug( __METHOD__ . ": virus scanner disabled\n" );
                        wfProfileOut( __METHOD__ );
+
                        return null;
                }
 
@@ -1407,6 +1534,7 @@ abstract class UploadBase {
                        $wgOut->wrapWikiMsg( "<div class=\"error\">\n$1\n</div>",
                                array( 'virus-badscanner', $wgAntivirus ) );
                        wfProfileOut( __METHOD__ );
+
                        return wfMessage( 'virus-unknownscanner' )->text() . " $wgAntivirus";
                }
 
@@ -1451,7 +1579,9 @@ abstract class UploadBase {
                        # scan failed (code was mapped to false by $exitCodeMap)
                        wfDebug( __METHOD__ . ": failed to scan $file (code $exitCode).\n" );
 
-                       $output = $wgAntivirusRequired ? wfMessage( 'virus-scanfailed', array( $exitCode ) )->text() : null;
+                       $output = $wgAntivirusRequired
+                               ? wfMessage( 'virus-scanfailed', array( $exitCode ) )->text()
+                               : null;
                } elseif ( $mappedCode === AV_SCAN_ABORTED ) {
                        # scan failed because filetype is unknown (probably imune)
                        wfDebug( __METHOD__ . ": unsupported file type $file (code $exitCode).\n" );
@@ -1478,6 +1608,7 @@ abstract class UploadBase {
                }
 
                wfProfileOut( __METHOD__ );
+
                return $output;
        }
 
@@ -1589,7 +1720,7 @@ abstract class UploadBase {
 
                // Check for files with the same name but a different extension
                $similarFiles = RepoGroup::singleton()->getLocalRepo()->findFilesByPrefix(
-                               "{$partname}.", 1 );
+                       "{$partname}.", 1 );
                if ( count( $similarFiles ) ) {
                        return array(
                                'warning' => 'exists-normalized',
@@ -1600,7 +1731,10 @@ abstract class UploadBase {
 
                if ( self::isThumbName( $file->getName() ) ) {
                        # Check for filenames like 50px- or 180px-, these are mostly thumbnails
-                       $nt_thb = Title::newFromText( substr( $partname, strpos( $partname, '-' ) + 1 ) . '.' . $extension, NS_FILE );
+                       $nt_thb = Title::newFromText(
+                               substr( $partname, strpos( $partname, '-' ) + 1 ) . '.' . $extension,
+                               NS_FILE
+                       );
                        $file_thb = wfLocalFile( $nt_thb );
                        if ( $file_thb->exists() ) {
                                return array(
@@ -1639,11 +1773,12 @@ abstract class UploadBase {
        public static function isThumbName( $filename ) {
                $n = strrpos( $filename, '.' );
                $partname = $n ? substr( $filename, 0, $n ) : $filename;
+
                return (
-                                       substr( $partname, 3, 3 ) == 'px-' ||
-                                       substr( $partname, 2, 3 ) == 'px-'
-                               ) &&
-                               preg_match( "/[0-9]{2}/", substr( $partname, 0, 2 ) );
+                       substr( $partname, 3, 3 ) == 'px-' ||
+                       substr( $partname, 2, 3 ) == 'px-'
+               ) &&
+               preg_match( "/[0-9]{2}/", substr( $partname, 0, 2 ) );
        }
 
        /**
@@ -1670,23 +1805,28 @@ abstract class UploadBase {
                                $blacklist[] = trim( $line );
                        }
                }
+
                return $blacklist;
        }
 
        /**
         * Gets image info about the file just uploaded.
         *
-        * Also has the effect of setting metadata to be an 'indexed tag name' in returned API result if
-        * 'metadata' was requested. Oddly, we have to pass the "result" object down just so it can do that
-        * with the appropriate format, presumably.
+        * Also has the effect of setting metadata to be an 'indexed tag name' in
+        * returned API result if 'metadata' was requested. Oddly, we have to pass
+        * the "result" object down just so it can do that with the appropriate
+        * format, presumably.
         *
         * @param ApiResult $result
         * @return array Image info
         */
        public function getImageInfo( $result ) {
                $file = $this->getLocalFile();
-               // TODO This cries out for refactoring. We really want to say $file->getAllInfo(); here.
-               // Perhaps "info" methods should be moved into files, and the API should just wrap them in queries.
+               /** @todo This cries out for refactoring.
+                *  We really want to say $file->getAllInfo(); here.
+                * Perhaps "info" methods should be moved into files, and the API should
+                * just wrap them in queries.
+                */
                if ( $file instanceof UploadStashFile ) {
                        $imParam = ApiQueryStashImageInfo::getPropertyNames();
                        $info = ApiQueryStashImageInfo::getInfo( $file, array_flip( $imParam ), $result );
@@ -1694,6 +1834,7 @@ abstract class UploadBase {
                        $imParam = ApiQueryImageInfo::getPropertyNames();
                        $info = ApiQueryImageInfo::getInfo( $file, array_flip( $imParam ), $result );
                }
+
                return $info;
        }
 
@@ -1704,6 +1845,7 @@ abstract class UploadBase {
        public function convertVerifyErrorToStatus( $error ) {
                $code = $error['status'];
                unset( $code['status'] );
+
                return Status::newFatal( $this->getVerificationErrorCode( $code ), $error );
        }
 
index d15ae43..6f90280 100644 (file)
@@ -87,6 +87,7 @@ class UploadFromChunks extends UploadFromFile {
 
                // Update db table to reflect initial "chunk" state
                $this->updateChunkStatus();
+
                return $this->mLocalFile;
        }
 
@@ -154,6 +155,7 @@ class UploadFromChunks extends UploadFromFile {
                if ( $ret['status'] !== UploadBase::OK ) {
                        wfDebugLog( 'fileconcatenate', "Verification failed for chunked upload" );
                        $status->fatal( $this->getVerificationErrorCode( $ret['status'] ) );
+
                        return $status;
                }
 
@@ -178,6 +180,7 @@ class UploadFromChunks extends UploadFromFile {
         */
        public function performUpload( $comment, $pageText, $watch, $user ) {
                $rv = parent::performUpload( $comment, $pageText, $watch, $user );
+
                return $rv;
        }
 
@@ -188,11 +191,11 @@ class UploadFromChunks extends UploadFromFile {
         */
        function getVirtualChunkLocation( $index ) {
                return $this->repo->getVirtualUrl( 'temp' ) .
-                               '/' .
-                               $this->repo->getHashPath(
-                                       $this->getChunkFileKey( $index )
-                               ) .
-                               $this->getChunkFileKey( $index );
+                       '/' .
+                       $this->repo->getHashPath(
+                               $this->getChunkFileKey( $index )
+                       ) .
+                       $this->getChunkFileKey( $index );
        }
 
        /**
@@ -234,6 +237,7 @@ class UploadFromChunks extends UploadFromFile {
                                $status = Status::newFatal( 'invalid-chunk-offset' );
                        }
                }
+
                return $status;
        }
 
@@ -242,7 +246,7 @@ class UploadFromChunks extends UploadFromFile {
         */
        private function updateChunkStatus() {
                wfDebug( __METHOD__ . " update chunk status for {$this->mFileKey} offset:" .
-                                       $this->getOffset() . ' inx:' . $this->getChunkIndex() . "\n" );
+                       $this->getOffset() . ' inx:' . $this->getChunkIndex() . "\n" );
 
                $dbw = $this->repo->getMasterDb();
                // Use a quick transaction since we will upload the full temp file into shared
@@ -294,6 +298,7 @@ class UploadFromChunks extends UploadFromFile {
                if ( $this->mChunkIndex !== null ) {
                        return $this->mChunkIndex;
                }
+
                return 0;
        }
 
@@ -305,6 +310,7 @@ class UploadFromChunks extends UploadFromFile {
                if ( $this->mOffset !== null ) {
                        return $this->mOffset;
                }
+
                return 0;
        }
 
@@ -325,19 +331,20 @@ class UploadFromChunks extends UploadFromFile {
                        $this->repo->getZonePath( 'temp' ) . "/{$hashPath}{$fileKey}" );
 
                // Check for error in stashing the chunk:
-               if ( ! $storeStatus->isOK() ) {
+               if ( !$storeStatus->isOK() ) {
                        $error = $storeStatus->getErrorsArray();
                        $error = reset( $error );
-                       if ( ! count( $error ) ) {
+                       if ( !count( $error ) ) {
                                $error = $storeStatus->getWarningsArray();
                                $error = reset( $error );
-                               if ( ! count( $error ) ) {
+                               if ( !count( $error ) ) {
                                        $error = array( 'unknown', 'no error recorded' );
                                }
                        }
                        throw new UploadChunkFileException( "Error storing file in '$chunkPath': " .
                                implode( '; ', $error ) );
                }
+
                return $storeStatus;
        }
 
@@ -345,6 +352,7 @@ class UploadFromChunks extends UploadFromFile {
                if ( $index === null ) {
                        $index = $this->getChunkIndex();
                }
+
                return $this->mFileKey . '.' . $index;
        }
 
index 5bc040c..3a1e8bd 100644 (file)
@@ -28,7 +28,6 @@
  * @author Bryan Tong Minh
  */
 class UploadFromFile extends UploadBase {
-
        /**
         * @var WebRequestUpload
         */
index a67fc57..b4e815f 100644 (file)
@@ -157,6 +157,7 @@ class UploadFromStash extends UploadBase {
                // replace mLocalFile with an instance of UploadStashFile, which adds some methods
                // that are useful for stashed files.
                $this->mLocalFile = parent::stashFile( $user );
+
                return $this->mLocalFile;
        }
 
@@ -187,6 +188,7 @@ class UploadFromStash extends UploadBase {
        public function performUpload( $comment, $pageText, $watch, $user ) {
                $rv = parent::performUpload( $comment, $pageText, $watch, $user );
                $this->unsaveUploadedFile();
+
                return $rv;
        }
 }
index 9ebd7a9..b605640 100644 (file)
@@ -49,6 +49,7 @@ class UploadFromUrl extends UploadBase {
                if ( !$user->isAllowed( 'upload_by_url' ) ) {
                        return 'upload_by_url';
                }
+
                return parent::isAllowed( $user );
        }
 
@@ -58,6 +59,7 @@ class UploadFromUrl extends UploadBase {
         */
        public static function isEnabled() {
                global $wgAllowCopyUploads;
+
                return $wgAllowCopyUploads && parent::isEnabled();
        }
 
@@ -103,6 +105,7 @@ class UploadFromUrl extends UploadBase {
                        }
                        */
                }
+
                return $valid;
        }
 
@@ -118,6 +121,7 @@ class UploadFromUrl extends UploadBase {
                        wfRunHooks( 'IsUploadAllowedFromUrl', array( $url, &$allowed ) );
                        self::$allowedUrls[$url] = $allowed;
                }
+
                return self::$allowedUrls[$url];
        }
 
@@ -169,6 +173,7 @@ class UploadFromUrl extends UploadBase {
                global $wgUser;
 
                $url = $request->getVal( 'wpUploadFileURL' );
+
                return !empty( $url )
                        && Http::isValidURI( $url )
                        && $wgUser->isAllowed( 'upload_by_url' );
@@ -202,6 +207,7 @@ class UploadFromUrl extends UploadBase {
                if ( !$this->mAsync ) {
                        return $this->reallyFetchFile( $httpOptions );
                }
+
                return Status::newGood();
        }
 
@@ -213,6 +219,7 @@ class UploadFromUrl extends UploadBase {
        protected function makeTemporaryFile() {
                $tmpFile = TempFSFile::factory( 'URL' );
                $tmpFile->bind( $this );
+
                return $tmpFile->getPath();
        }
 
@@ -259,12 +266,12 @@ class UploadFromUrl extends UploadBase {
                $this->mRemoveTempFile = true;
                $this->mFileSize = 0;
 
-               $options = $httpOptions + array(
-                       'followRedirects' => true,
-               );
+               $options = $httpOptions + array( 'followRedirects' => true );
+
                if ( $wgCopyUploadProxy !== false ) {
                        $options['proxy'] = $wgCopyUploadProxy;
                }
+
                if ( $wgCopyUploadTimeout && !isset( $options['timeout'] ) ) {
                        $options['timeout'] = $wgCopyUploadTimeout;
                }
@@ -297,6 +304,7 @@ class UploadFromUrl extends UploadBase {
                if ( $this->mAsync ) {
                        return array( 'status' => UploadBase::OK );
                }
+
                return parent::verifyUpload();
        }
 
@@ -308,8 +316,10 @@ class UploadFromUrl extends UploadBase {
        public function checkWarnings() {
                if ( $this->mAsync ) {
                        $this->mIgnoreWarnings = false;
+
                        return array();
                }
+
                return parent::checkWarnings();
        }
 
@@ -323,6 +333,7 @@ class UploadFromUrl extends UploadBase {
                if ( $this->mAsync ) {
                        return true;
                }
+
                return parent::verifyTitlePermissions( $user );
        }
 
@@ -367,7 +378,7 @@ class UploadFromUrl extends UploadBase {
                ) );
                $job->initializeSessionData();
                JobQueueGroup::singleton()->push( $job );
+
                return $sessionKey;
        }
-
 }
index 33cb0db..a7e7100 100644 (file)
 
 /**
  * UploadStash is intended to accomplish a few things:
- *   - enable applications to temporarily stash files without publishing them to the wiki.
- *      - Several parts of MediaWiki do this in similar ways: UploadBase, UploadWizard, and FirefoggChunkedExtension
- *        And there are several that reimplement stashing from scratch, in idiosyncratic ways. The idea is to unify them all here.
- *       Mostly all of them are the same except for storing some custom fields, which we subsume into the data array.
- *   - enable applications to find said files later, as long as the db table or temp files haven't been purged.
- *   - enable the uploading user (and *ONLY* the uploading user) to access said files, and thumbnails of said files, via a URL.
- *     We accomplish this using a database table, with ownership checking as you might expect. See SpecialUploadStash, which
- *     implements a web interface to some files stored this way.
+ *   - Enable applications to temporarily stash files without publishing them to
+ *     the wiki.
+ *      - Several parts of MediaWiki do this in similar ways: UploadBase,
+ *        UploadWizard, and FirefoggChunkedExtension.
+ *        And there are several that reimplement stashing from scratch, in
+ *        idiosyncratic ways. The idea is to unify them all here.
+ *        Mostly all of them are the same except for storing some custom fields,
+ *        which we subsume into the data array.
+ *   - Enable applications to find said files later, as long as the db table or
+ *     temp files haven't been purged.
+ *   - Enable the uploading user (and *ONLY* the uploading user) to access said
+ *     files, and thumbnails of said files, via a URL. We accomplish this using
+ *     a database table, with ownership checking as you might expect. See
+ *     SpecialUploadStash, which implements a web interface to some files stored
+ *     this way.
  *
- * UploadStash right now is *mostly* intended to show you one user's slice of the entire stash. The user parameter is only optional
- * because there are few cases where we clean out the stash from an automated script. In the future we might refactor this.
+ * UploadStash right now is *mostly* intended to show you one user's slice of
+ * the entire stash. The user parameter is only optional because there are few
+ * cases where we clean out the stash from an automated script. In the future we
+ * might refactor this.
  *
  * UploadStash represents the entire stash of temporary files.
  * UploadStashFile is a filestore for the actual physical disk files.
- * UploadFromStash extends UploadBase, and represents a single stashed file as it is moved from the stash to the regular file repository
+ * UploadFromStash extends UploadBase, and represents a single stashed file as
+ * it is moved from the stash to the regular file repository
  *
  * @ingroup Upload
  */
 class UploadStash {
-
        // Format of the key for files -- has to be suitable as a filename itself (e.g. ab12cd34ef.jpg)
        const KEY_FORMAT_REGEX = '/^[\w-\.]+\.\w*$/';
 
@@ -95,7 +104,8 @@ class UploadStash {
 
        /**
         * Get a file and its metadata from the stash.
-        * The noAuth param is a bit janky but is required for automated scripts which clean out the stash.
+        * The noAuth param is a bit janky but is required for automated scripts
+        * which clean out the stash.
         *
         * @param string $key Key under which file information is stored
         * @param bool $noAuth (optional) Don't check authentication. Used by maintenance scripts.
@@ -106,7 +116,7 @@ class UploadStash {
         * @return UploadStashFile
         */
        public function getFile( $key, $noAuth = false ) {
-               if ( ! preg_match( self::KEY_FORMAT_REGEX, $key ) ) {
+               if ( !preg_match( self::KEY_FORMAT_REGEX, $key ) ) {
                        throw new UploadStashBadPathException( "key '$key' is not in a proper format" );
                }
 
@@ -117,7 +127,8 @@ class UploadStash {
 
                if ( !isset( $this->fileMetadata[$key] ) ) {
                        if ( !$this->fetchFileMetadata( $key ) ) {
-                               // If nothing was received, it's likely due to replication lag.  Check the master to see if the record is there.
+                               // If nothing was received, it's likely due to replication lag.
+                               // Check the master to see if the record is there.
                                $this->fetchFileMetadata( $key, DB_MASTER );
                        }
 
@@ -138,14 +149,15 @@ class UploadStash {
                        }
                }
 
-               if ( ! $this->files[$key]->exists() ) {
+               if ( !$this->files[$key]->exists() ) {
                        wfDebug( __METHOD__ . " tried to get file at $key, but it doesn't exist\n" );
                        throw new UploadStashBadPathException( "path doesn't exist" );
                }
 
                if ( !$noAuth ) {
                        if ( $this->fileMetadata[$key]['us_user'] != $this->userId ) {
-                               throw new UploadStashWrongOwnerException( "This file ($key) doesn't belong to the current user." );
+                               throw new UploadStashWrongOwnerException( "This file ($key) doesn't "
+                                       . "belong to the current user." );
                        }
                }
 
@@ -160,6 +172,7 @@ class UploadStash {
         */
        public function getMetadata( $key ) {
                $this->getFile( $key );
+
                return $this->fileMetadata[$key];
        }
 
@@ -171,14 +184,17 @@ class UploadStash {
         */
        public function getFileProps( $key ) {
                $this->getFile( $key );
+
                return $this->fileProps[$key];
        }
 
        /**
-        * Stash a file in a temp directory and record that we did this in the database, along with other metadata.
+        * Stash a file in a temp directory and record that we did this in the
+        * database, along with other metadata.
         *
         * @param string $path Path to file you want stashed
-        * @param string $sourceType The type of upload that generated this file (currently, I believe, 'file' or null)
+        * @param string $sourceType The type of upload that generated this file
+        *   (currently, I believe, 'file' or null)
         * @throws UploadStashBadPathException
         * @throws UploadStashFileException
         * @throws UploadStashNotLoggedInException
@@ -201,10 +217,11 @@ class UploadStash {
                        $pathWithGoodExtension = $path;
                }
 
-               // If no key was supplied, make one.  a mysql insertid would be totally reasonable here, except
-               // that for historical reasons, the key is this random thing instead.  At least it's not guessable.
+               // If no key was supplied, make one.  a mysql insertid would be totally
+               // reasonable here, except that for historical reasons, the key is this
+               // random thing instead.  At least it's not guessable.
                //
-               // some things that when combined will make a suitably unique key.
+               // Some things that when combined will make a suitably unique key.
                // see: http://www.jwz.org/doc/mid.html
                list( $usec, $sec ) = explode( ' ', microtime() );
                $usec = substr( $usec, 2 );
@@ -215,7 +232,7 @@ class UploadStash {
 
                $this->fileProps[$key] = $fileProps;
 
-               if ( ! preg_match( self::KEY_FORMAT_REGEX, $key ) ) {
+               if ( !preg_match( self::KEY_FORMAT_REGEX, $key ) ) {
                        throw new UploadStashBadPathException( "key '$key' is not in a proper format" );
                }
 
@@ -224,30 +241,36 @@ class UploadStash {
                // if not already in a temporary area, put it there
                $storeStatus = $this->repo->storeTemp( basename( $pathWithGoodExtension ), $path );
 
-               if ( ! $storeStatus->isOK() ) {
-                       // It is a convention in MediaWiki to only return one error per API exception, even if multiple errors
-                       // are available. We use reset() to pick the "first" thing that was wrong, preferring errors to warnings.
-                       // This is a bit lame, as we may have more info in the $storeStatus and we're throwing it away, but to fix it means
+               if ( !$storeStatus->isOK() ) {
+                       // It is a convention in MediaWiki to only return one error per API
+                       // exception, even if multiple errors are available. We use reset()
+                       // to pick the "first" thing that was wrong, preferring errors to
+                       // warnings. This is a bit lame, as we may have more info in the
+                       // $storeStatus and we're throwing it away, but to fix it means
                        // redesigning API errors significantly.
-                       // $storeStatus->value just contains the virtual URL (if anything) which is probably useless to the caller
+                       // $storeStatus->value just contains the virtual URL (if anything)
+                       // which is probably useless to the caller.
                        $error = $storeStatus->getErrorsArray();
                        $error = reset( $error );
-                       if ( ! count( $error ) ) {
+                       if ( !count( $error ) ) {
                                $error = $storeStatus->getWarningsArray();
                                $error = reset( $error );
-                               if ( ! count( $error ) ) {
+                               if ( !count( $error ) ) {
                                        $error = array( 'unknown', 'no error recorded' );
                                }
                        }
-                       // at this point, $error should contain the single "most important" error, plus any parameters.
+                       // At this point, $error should contain the single "most important"
+                       // error, plus any parameters.
                        $errorMsg = array_shift( $error );
-                       throw new UploadStashFileException( "Error storing file in '$path': " . wfMessage( $errorMsg, $error )->text() );
+                       throw new UploadStashFileException( "Error storing file in '$path': "
+                               . wfMessage( $errorMsg, $error )->text() );
                }
                $stashPath = $storeStatus->value;
 
                // fetch the current user ID
                if ( !$this->isLoggedIn ) {
-                       throw new UploadStashNotLoggedInException( __METHOD__ . ' No user is logged in, files must belong to users' );
+                       throw new UploadStashNotLoggedInException( __METHOD__
+                               . ' No user is logged in, files must belong to users' );
                }
 
                // insert the file metadata into the db.
@@ -279,7 +302,8 @@ class UploadStash {
                        __METHOD__
                );
 
-               // store the insertid in the class variable so immediate retrieval (possibly laggy) isn't necesary.
+               // store the insertid in the class variable so immediate retrieval
+               // (possibly laggy) isn't necesary.
                $this->fileMetadata[$key]['us_id'] = $dbw->insertId();
 
                # create the UploadStashFile object for this file.
@@ -297,7 +321,8 @@ class UploadStash {
         */
        public function clear() {
                if ( !$this->isLoggedIn ) {
-                       throw new UploadStashNotLoggedInException( __METHOD__ . ' No user is logged in, files must belong to users' );
+                       throw new UploadStashNotLoggedInException( __METHOD__
+                               . ' No user is logged in, files must belong to users' );
                }
 
                wfDebug( __METHOD__ . ' clearing all rows for user ' . $this->userId . "\n" );
@@ -319,18 +344,20 @@ class UploadStash {
         * Remove a particular file from the stash.  Also removes it from the repo.
         *
         * @param string $key
-        * @throws UploadStashNoSuchKeyException|UploadStashNotLoggedInException|UploadStashWrongOwnerException
+        * @throws UploadStashNoSuchKeyException|UploadStashNotLoggedInException
+        * @throws UploadStashWrongOwnerException
         * @return bool Success
         */
        public function removeFile( $key ) {
                if ( !$this->isLoggedIn ) {
-                       throw new UploadStashNotLoggedInException( __METHOD__ . ' No user is logged in, files must belong to users' );
+                       throw new UploadStashNotLoggedInException( __METHOD__
+                               . ' No user is logged in, files must belong to users' );
                }
 
                $dbw = $this->repo->getMasterDb();
 
-               // this is a cheap query. it runs on the master so that this function still works when there's lag.
-               // it won't be called all that often.
+               // this is a cheap query. it runs on the master so that this function
+               // still works when there's lag. It won't be called all that often.
                $row = $dbw->selectRow(
                        'uploadstash',
                        'us_user',
@@ -343,7 +370,8 @@ class UploadStash {
                }
 
                if ( $row->us_user != $this->userId ) {
-                       throw new UploadStashWrongOwnerException( "Can't delete: the file ($key) doesn't belong to this user." );
+                       throw new UploadStashWrongOwnerException( "Can't delete: "
+                               . "the file ($key) doesn't belong to this user." );
                }
 
                return $this->removeFileNoAuth( $key );
@@ -369,8 +397,9 @@ class UploadStash {
                        __METHOD__
                );
 
-               // TODO: look into UnregisteredLocalFile and find out why the rv here is sometimes wrong (false when file was removed)
-               // for now, ignore.
+               /** @todo Look into UnregisteredLocalFile and find out why the rv here is
+                *  sometimes wrong (false when file was removed). For now, ignore.
+                */
                $this->files[$key]->remove();
 
                unset( $this->files[$key] );
@@ -387,7 +416,8 @@ class UploadStash {
         */
        public function listFiles() {
                if ( !$this->isLoggedIn ) {
-                       throw new UploadStashNotLoggedInException( __METHOD__ . ' No user is logged in, files must belong to users' );
+                       throw new UploadStashNotLoggedInException( __METHOD__
+                               . ' No user is logged in, files must belong to users' );
                }
 
                $dbr = $this->repo->getSlaveDb();
@@ -451,6 +481,7 @@ class UploadStash {
                        // put it in a web accesible directory.
                        return '';
                }
+
                return $extension;
        }
 
@@ -502,6 +533,7 @@ class UploadStash {
                        throw new UploadStashZeroLengthFileException( "File is zero length" );
                }
                $this->files[$key] = $file;
+
                return true;
        }
 }
@@ -512,8 +544,10 @@ class UploadStashFile extends UnregisteredLocalFile {
        protected $url;
 
        /**
-        * A LocalFile wrapper around a file that has been temporarily stashed, so we can do things like create thumbnails for it
-        * Arguably UnregisteredLocalFile should be handling its own file repo but that class is a bit retarded currently
+        * A LocalFile wrapper around a file that has been temporarily stashed,
+        * so we can do things like create thumbnails for it. Arguably
+        * UnregisteredLocalFile should be handling its own file repo but that
+        * class is a bit retarded currently.
         *
         * @param FileRepo $repo Repository where we should find the path
         * @param string $path Path to file
@@ -528,18 +562,21 @@ class UploadStashFile extends UnregisteredLocalFile {
                if ( $repo->isVirtualUrl( $path ) ) {
                        $path = $repo->resolveVirtualUrl( $path );
                } else {
-
-                       // check if path appears to be sane, no parent traversals, and is in this repo's temp zone.
+                       // check if path appears to be sane, no parent traversals,
+                       // and is in this repo's temp zone.
                        $repoTempPath = $repo->getZonePath( 'temp' );
-                       if ( ( ! $repo->validateFilename( $path ) ) ||
-                                       ( strpos( $path, $repoTempPath ) !== 0 ) ) {
-                               wfDebug( "UploadStash: tried to construct an UploadStashFile from a file that should already exist at '$path', but path is not valid\n" );
+                       if ( ( !$repo->validateFilename( $path ) ) ||
+                               ( strpos( $path, $repoTempPath ) !== 0 )
+                       ) {
+                               wfDebug( "UploadStash: tried to construct an UploadStashFile "
+                                       . "from a file that should already exist at '$path', but path is not valid\n" );
                                throw new UploadStashBadPathException( 'path is not valid' );
                        }
 
                        // check if path exists! and is a plain file.
-                       if ( ! $repo->fileExists( $path ) ) {
-                               wfDebug( "UploadStash: tried to construct an UploadStashFile from a file that should already exist at '$path', but path is not found\n" );
+                       if ( !$repo->fileExists( $path ) ) {
+                               wfDebug( "UploadStash: tried to construct an UploadStashFile from "
+                                       . "a file that should already exist at '$path', but path is not found\n" );
                                throw new UploadStashFileNotFoundException( 'cannot find path, or not a plain file' );
                        }
                }
@@ -552,8 +589,8 @@ class UploadStashFile extends UnregisteredLocalFile {
        /**
         * A method needed by the file transforming and scaling routines in File.php
         * We do not necessarily care about doing the description at this point
-        * However, we also can't return the empty string, as the rest of MediaWiki demands this (and calls to imagemagick
-        * convert require it to be there)
+        * However, we also can't return the empty string, as the rest of MediaWiki
+        * demands this (and calls to imagemagick convert require it to be there)
         *
         * @return string Dummy value
         */
@@ -566,14 +603,17 @@ class UploadStashFile extends UnregisteredLocalFile {
         * The actual argument is the result of thumbName although we seem to have
         * buggy code elsewhere that expects a boolean 'suffix'
         *
-        * @param string $thumbName Name of thumbnail (e.g. "120px-123456.jpg" ), or false to just get the path
-        * @return string Path thumbnail should take on filesystem, or containing directory if thumbname is false
+        * @param string $thumbName Name of thumbnail (e.g. "120px-123456.jpg" ),
+        *   or false to just get the path
+        * @return string Path thumbnail should take on filesystem, or containing
+        *   directory if thumbname is false
         */
        public function getThumbPath( $thumbName = false ) {
                $path = dirname( $this->path );
                if ( $thumbName !== false ) {
                        $path .= "/$thumbName";
                }
+
                return $path;
        }
 
@@ -591,7 +631,8 @@ class UploadStashFile extends UnregisteredLocalFile {
        }
 
        /**
-        * Helper function -- given a 'subpage', return the local URL e.g. /wiki/Special:UploadStash/subpage
+        * Helper function -- given a 'subpage', return the local URL,
+        * e.g. /wiki/Special:UploadStash/subpage
         * @param string $subPage
         * @return string Local URL for this subpage in the Special:UploadStash space.
         */
@@ -602,14 +643,16 @@ class UploadStashFile extends UnregisteredLocalFile {
        /**
         * Get a URL to access the thumbnail
         * This is required because the model of how files work requires that
-        * the thumbnail urls be predictable. However, in our model the URL is not based on the filename
-        * (that's hidden in the db)
+        * the thumbnail urls be predictable. However, in our model the URL is
+        * not based on the filename (that's hidden in the db)
         *
-        * @param string $thumbName Basename of thumbnail file -- however, we don't want to use the file exactly
+        * @param string $thumbName Basename of thumbnail file -- however, we don't
+        *   want to use the file exactly
         * @return string URL to access thumbnail, or URL with partial path
         */
        public function getThumbUrl( $thumbName = false ) {
                wfDebug( __METHOD__ . " getting for $thumbName \n" );
+
                return $this->getSpecialUrl( 'thumb/' . $this->getUrlName() . '/' . $thumbName );
        }
 
@@ -620,9 +663,10 @@ class UploadStashFile extends UnregisteredLocalFile {
         * @return string Base url name, like '120px-123456.jpg'
         */
        public function getUrlName() {
-               if ( ! $this->urlName ) {
+               if ( !$this->urlName ) {
                        $this->urlName = $this->fileKey;
                }
+
                return $this->urlName;
        }
 
@@ -636,12 +680,14 @@ class UploadStashFile extends UnregisteredLocalFile {
                if ( !isset( $this->url ) ) {
                        $this->url = $this->getSpecialUrl( 'file/' . $this->getUrlName() );
                }
+
                return $this->url;
        }
 
        /**
-        * Parent classes use this method, for no obvious reason, to return the path (relative to wiki root, I assume).
-        * But with this class, the URL is unrelated to the path.
+        * Parent classes use this method, for no obvious reason, to return the path
+        * (relative to wiki root, I assume). But with this class, the URL is
+        * unrelated to the path.
         *
         * @return string Url
         */
@@ -650,7 +696,8 @@ class UploadStashFile extends UnregisteredLocalFile {
        }
 
        /**
-        * Getter for file key (the unique id by which this file's location & metadata is stored in the db)
+        * Getter for file key (the unique id by which this file's location &
+        * metadata is stored in the db)
         *
         * @return string File key
         */
@@ -674,15 +721,32 @@ class UploadStashFile extends UnregisteredLocalFile {
        public function exists() {
                return $this->repo->fileExists( $this->path );
        }
+}
+
+class UploadStashException extends MWException {
+}
+
+class UploadStashNotAvailableException extends UploadStashException {
+}
+
+class UploadStashFileNotFoundException extends UploadStashException {
+}
+
+class UploadStashBadPathException extends UploadStashException {
+}
+
+class UploadStashFileException extends UploadStashException {
+}
+
+class UploadStashZeroLengthFileException extends UploadStashException {
+}
+
+class UploadStashNotLoggedInException extends UploadStashException {
+}
+
+class UploadStashWrongOwnerException extends UploadStashException {
+}
 
+class UploadStashNoSuchKeyException extends UploadStashException {
 }
 
-class UploadStashException extends MWException {};
-class UploadStashNotAvailableException extends UploadStashException {};
-class UploadStashFileNotFoundException extends UploadStashException {};
-class UploadStashBadPathException extends UploadStashException {};
-class UploadStashFileException extends UploadStashException {};
-class UploadStashZeroLengthFileException extends UploadStashException {};
-class UploadStashNotLoggedInException extends UploadStashException {};
-class UploadStashWrongOwnerException extends UploadStashException {};
-class UploadStashNoSuchKeyException extends UploadStashException {};
index 037663c..b6df18b 100644 (file)
@@ -109,7 +109,9 @@ class ArrayUtils {
         * @return int|bool The item index of the lower bound, or false if the target value
         *     sorts before all items.
         */
-       public static function findLowerBound( $valueCallback, $valueCount, $comparisonCallback, $target ) {
+       public static function findLowerBound( $valueCallback, $valueCount,
+               $comparisonCallback, $target
+       ) {
                if ( $valueCount === 0 ) {
                        return false;
                }
index f556ee7..b16d4a4 100644 (file)
@@ -158,4 +158,5 @@ abstract class CdbWriter {
  * Exception for Cdb errors.
  * This explicitly doesn't subclass MWException to encourage reuse.
  */
-class CdbException extends Exception {}
+class CdbException extends Exception {
+}
index c178ffe..baba580 100644 (file)
@@ -101,28 +101,28 @@ class CdbFunctions {
  */
 class CdbReaderPHP extends CdbReader {
        /** The filename */
-       var $fileName;
+       protected $fileName;
 
        /* number of hash slots searched under this key */
-       var $loop;
+       protected $loop;
 
        /* initialized if loop is nonzero */
-       var $khash;
+       protected $khash;
 
        /* initialized if loop is nonzero */
-       var $kpos;
+       protected $kpos;
 
        /* initialized if loop is nonzero */
-       var $hpos;
+       protected $hpos;
 
        /* initialized if loop is nonzero */
-       var $hslots;
+       protected $hslots;
 
        /* initialized if findNext() returns true */
-       var $dpos;
+       protected $dpos;
 
        /* initialized if cdb_findnext() returns 1 */
-       var $dlen;
+       protected $dlen;
 
        /**
         * @param $fileName string
@@ -288,8 +288,11 @@ class CdbReaderPHP extends CdbReader {
  * CDB writer class
  */
 class CdbWriterPHP extends CdbWriter {
-       var $hplist;
-       var $numentries, $pos;
+       protected $hplist;
+
+       protected $numentries;
+
+       protected $pos;
 
        /**
         * @param $fileName string
diff --git a/includes/utils/ConfEditor.php b/includes/utils/ConfEditor.php
deleted file mode 100644 (file)
index a2fe507..0000000
+++ /dev/null
@@ -1,1125 +0,0 @@
-<?php
-/**
- * Configuration file editor.
- *
- * 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
- */
-
-/**
- * This is a state machine style parser with two internal stacks:
- *   * A next state stack, which determines the state the machine will progress to next
- *   * A path stack, which keeps track of the logical location in the file.
- *
- * Reference grammar:
- *
- * file = T_OPEN_TAG *statement
- * statement = T_VARIABLE "=" expression ";"
- * expression = array / scalar / T_VARIABLE
- * array = T_ARRAY "(" [ element *( "," element ) [ "," ] ] ")"
- * element = assoc-element / expression
- * assoc-element = scalar T_DOUBLE_ARROW expression
- * scalar = T_LNUMBER / T_DNUMBER / T_STRING / T_CONSTANT_ENCAPSED_STRING
- */
-class ConfEditor {
-       /** The text to parse */
-       var $text;
-
-       /** The token array from token_get_all() */
-       var $tokens;
-
-       /** The current position in the token array */
-       var $pos;
-
-       /** The current 1-based line number */
-       var $lineNum;
-
-       /** The current 1-based column number */
-       var $colNum;
-
-       /** The current 0-based byte number */
-       var $byteNum;
-
-       /** The current ConfEditorToken object */
-       var $currentToken;
-
-       /** The previous ConfEditorToken object */
-       var $prevToken;
-
-       /**
-        * The state machine stack. This is an array of strings where the topmost
-        * element will be popped off and become the next parser state.
-        */
-       var $stateStack;
-
-       /**
-        * The path stack is a stack of associative arrays with the following elements:
-        *    name              The name of top level of the path
-        *    level             The level (number of elements) of the path
-        *    startByte         The byte offset of the start of the path
-        *    startToken        The token offset of the start
-        *    endByte           The byte offset of thee
-        *    endToken          The token offset of the end, plus one
-        *    valueStartToken   The start token offset of the value part
-        *    valueStartByte    The start byte offset of the value part
-        *    valueEndToken     The end token offset of the value part, plus one
-        *    valueEndByte      The end byte offset of the value part, plus one
-        *    nextArrayIndex    The next numeric array index at this level
-        *    hasComma          True if the array element ends with a comma
-        *    arrowByte         The byte offset of the "=>", or false if there isn't one
-        */
-       var $pathStack;
-
-       /**
-        * The elements of the top of the pathStack for every path encountered, indexed
-        * by slash-separated path.
-        */
-       var $pathInfo;
-
-       /**
-        * Next serial number for whitespace placeholder paths (\@extra-N)
-        */
-       var $serial;
-
-       /**
-        * Editor state. This consists of the internal copy/insert operations which
-        * are applied to the source string to obtain the destination string.
-        */
-       var $edits;
-
-       /**
-        * Simple entry point for command-line testing
-        *
-        * @param $text string
-        *
-        * @return string
-        */
-       static function test( $text ) {
-               try {
-                       $ce = new self( $text );
-                       $ce->parse();
-               } catch ( ConfEditorParseError $e ) {
-                       return $e->getMessage() . "\n" . $e->highlight( $text );
-               }
-
-               return "OK";
-       }
-
-       /**
-        * Construct a new parser
-        */
-       public function __construct( $text ) {
-               $this->text = $text;
-       }
-
-       /**
-        * Edit the text. Returns the edited text.
-        * @param array $ops of operations.
-        *
-        * Operations are given as an associative array, with members:
-        *    type:     One of delete, set, append or insert (required)
-        *    path:     The path to operate on (required)
-        *    key:      The array key to insert/append, with PHP quotes
-        *    value:    The value, with PHP quotes
-        *
-        * delete
-        *    Deletes an array element or statement with the specified path.
-        *    e.g.
-        *        array('type' => 'delete', 'path' => '$foo/bar/baz' )
-        *    is equivalent to the runtime PHP code:
-        *        unset( $foo['bar']['baz'] );
-        *
-        * set
-        *    Sets the value of an array element. If the element doesn't exist, it
-        *    is appended to the array. If it does exist, the value is set, with
-        *    comments and indenting preserved.
-        *
-        * append
-        *    Appends a new element to the end of the array. Adds a trailing comma.
-        *    e.g.
-        *        array( 'type' => 'append', 'path', '$foo/bar',
-        *            'key' => 'baz', 'value' => "'x'" )
-        *    is like the PHP code:
-        *        $foo['bar']['baz'] = 'x';
-        *
-        * insert
-        *    Insert a new element at the start of the array.
-        *
-        * @throws MWException
-        * @return string
-        */
-       public function edit( $ops ) {
-               $this->parse();
-
-               $this->edits = array(
-                       array( 'copy', 0, strlen( $this->text ) )
-               );
-               foreach ( $ops as $op ) {
-                       $type = $op['type'];
-                       $path = $op['path'];
-                       $value = isset( $op['value'] ) ? $op['value'] : null;
-                       $key = isset( $op['key'] ) ? $op['key'] : null;
-
-                       switch ( $type ) {
-                               case 'delete':
-                                       list( $start, $end ) = $this->findDeletionRegion( $path );
-                                       $this->replaceSourceRegion( $start, $end, false );
-                                       break;
-                               case 'set':
-                                       if ( isset( $this->pathInfo[$path] ) ) {
-                                               list( $start, $end ) = $this->findValueRegion( $path );
-                                               $encValue = $value; // var_export( $value, true );
-                                               $this->replaceSourceRegion( $start, $end, $encValue );
-                                               break;
-                                       }
-                                       // No existing path, fall through to append
-                                       $slashPos = strrpos( $path, '/' );
-                                       $key = var_export( substr( $path, $slashPos + 1 ), true );
-                                       $path = substr( $path, 0, $slashPos );
-                                       // Fall through
-                               case 'append':
-                                       // Find the last array element
-                                       $lastEltPath = $this->findLastArrayElement( $path );
-                                       if ( $lastEltPath === false ) {
-                                               throw new MWException( "Can't find any element of array \"$path\"" );
-                                       }
-                                       $lastEltInfo = $this->pathInfo[$lastEltPath];
-
-                                       // Has it got a comma already?
-                                       if ( strpos( $lastEltPath, '@extra' ) === false && !$lastEltInfo['hasComma'] ) {
-                                               // No comma, insert one after the value region
-                                               list( , $end ) = $this->findValueRegion( $lastEltPath );
-                                               $this->replaceSourceRegion( $end - 1, $end - 1, ',' );
-                                       }
-
-                                       // Make the text to insert
-                                       list( $start, $end ) = $this->findDeletionRegion( $lastEltPath );
-
-                                       if ( $key === null ) {
-                                               list( $indent, ) = $this->getIndent( $start );
-                                               $textToInsert = "$indent$value,";
-                                       } else {
-                                               list( $indent, $arrowIndent ) =
-                                                       $this->getIndent( $start, $key, $lastEltInfo['arrowByte'] );
-                                               $textToInsert = "$indent$key$arrowIndent=> $value,";
-                                       }
-                                       $textToInsert .= ( $indent === false ? ' ' : "\n" );
-
-                                       // Insert the item
-                                       $this->replaceSourceRegion( $end, $end, $textToInsert );
-                                       break;
-                               case 'insert':
-                                       // Find first array element
-                                       $firstEltPath = $this->findFirstArrayElement( $path );
-                                       if ( $firstEltPath === false ) {
-                                               throw new MWException( "Can't find array element of \"$path\"" );
-                                       }
-                                       list( $start, ) = $this->findDeletionRegion( $firstEltPath );
-                                       $info = $this->pathInfo[$firstEltPath];
-
-                                       // Make the text to insert
-                                       if ( $key === null ) {
-                                               list( $indent, ) = $this->getIndent( $start );
-                                               $textToInsert = "$indent$value,";
-                                       } else {
-                                               list( $indent, $arrowIndent ) =
-                                                       $this->getIndent( $start, $key, $info['arrowByte'] );
-                                               $textToInsert = "$indent$key$arrowIndent=> $value,";
-                                       }
-                                       $textToInsert .= ( $indent === false ? ' ' : "\n" );
-
-                                       // Insert the item
-                                       $this->replaceSourceRegion( $start, $start, $textToInsert );
-                                       break;
-                               default:
-                                       throw new MWException( "Unrecognised operation: \"$type\"" );
-                       }
-               }
-
-               // Do the edits
-               $out = '';
-               foreach ( $this->edits as $edit ) {
-                       if ( $edit[0] == 'copy' ) {
-                               $out .= substr( $this->text, $edit[1], $edit[2] - $edit[1] );
-                       } else { // if ( $edit[0] == 'insert' )
-                               $out .= $edit[1];
-                       }
-               }
-
-               // Do a second parse as a sanity check
-               $this->text = $out;
-               try {
-                       $this->parse();
-               } catch ( ConfEditorParseError $e ) {
-                       throw new MWException(
-                               "Sorry, ConfEditor broke the file during editing and it won't parse anymore: " .
-                               $e->getMessage() );
-               }
-
-               return $out;
-       }
-
-       /**
-        * Get the variables defined in the text
-        * @return array( varname => value )
-        */
-       function getVars() {
-               $vars = array();
-               $this->parse();
-               foreach ( $this->pathInfo as $path => $data ) {
-                       if ( $path[0] != '$' ) {
-                               continue;
-                       }
-                       $trimmedPath = substr( $path, 1 );
-                       $name = $data['name'];
-                       if ( $name[0] == '@' ) {
-                               continue;
-                       }
-                       if ( $name[0] == '$' ) {
-                               $name = substr( $name, 1 );
-                       }
-                       $parentPath = substr( $trimmedPath, 0,
-                               strlen( $trimmedPath ) - strlen( $name ) );
-                       if ( substr( $parentPath, -1 ) == '/' ) {
-                               $parentPath = substr( $parentPath, 0, -1 );
-                       }
-
-                       $value = substr( $this->text, $data['valueStartByte'],
-                               $data['valueEndByte'] - $data['valueStartByte']
-                       );
-                       $this->setVar( $vars, $parentPath, $name,
-                               $this->parseScalar( $value ) );
-               }
-
-               return $vars;
-       }
-
-       /**
-        * Set a value in an array, unless it's set already. For instance,
-        * setVar( $arr, 'foo/bar', 'baz', 3 ); will set
-        * $arr['foo']['bar']['baz'] = 3;
-        * @param $array array
-        * @param string $path slash-delimited path
-        * @param $key mixed Key
-        * @param $value mixed Value
-        */
-       function setVar( &$array, $path, $key, $value ) {
-               $pathArr = explode( '/', $path );
-               $target =& $array;
-               if ( $path !== '' ) {
-                       foreach ( $pathArr as $p ) {
-                               if ( !isset( $target[$p] ) ) {
-                                       $target[$p] = array();
-                               }
-                               $target =& $target[$p];
-                       }
-               }
-               if ( !isset( $target[$key] ) ) {
-                       $target[$key] = $value;
-               }
-       }
-
-       /**
-        * Parse a scalar value in PHP
-        * @return mixed Parsed value
-        */
-       function parseScalar( $str ) {
-               if ( $str !== '' && $str[0] == '\'' ) {
-                       // Single-quoted string
-                       // @todo FIXME: trim() call is due to mystery bug where whitespace gets
-                       // appended to the token; without it we ended up reading in the
-                       // extra quote on the end!
-                       return strtr( substr( trim( $str ), 1, -1 ),
-                               array( '\\\'' => '\'', '\\\\' => '\\' ) );
-               }
-               if ( $str !== '' && $str[0] == '"' ) {
-                       // Double-quoted string
-                       // @todo FIXME: trim() call is due to mystery bug where whitespace gets
-                       // appended to the token; without it we ended up reading in the
-                       // extra quote on the end!
-                       return stripcslashes( substr( trim( $str ), 1, -1 ) );
-               }
-               if ( substr( $str, 0, 4 ) == 'true' ) {
-                       return true;
-               }
-               if ( substr( $str, 0, 5 ) == 'false' ) {
-                       return false;
-               }
-               if ( substr( $str, 0, 4 ) == 'null' ) {
-                       return null;
-               }
-
-               // Must be some kind of numeric value, so let PHP's weak typing
-               // be useful for a change
-               return $str;
-       }
-
-       /**
-        * Replace the byte offset region of the source with $newText.
-        * Works by adding elements to the $this->edits array.
-        */
-       function replaceSourceRegion( $start, $end, $newText = false ) {
-               // Split all copy operations with a source corresponding to the region
-               // in question.
-               $newEdits = array();
-               foreach ( $this->edits as $edit ) {
-                       if ( $edit[0] !== 'copy' ) {
-                               $newEdits[] = $edit;
-                               continue;
-                       }
-                       $copyStart = $edit[1];
-                       $copyEnd = $edit[2];
-                       if ( $start >= $copyEnd || $end <= $copyStart ) {
-                               // Outside this region
-                               $newEdits[] = $edit;
-                               continue;
-                       }
-                       if ( ( $start < $copyStart && $end > $copyStart )
-                               || ( $start < $copyEnd && $end > $copyEnd )
-                       ) {
-                               throw new MWException( "Overlapping regions found, can't do the edit" );
-                       }
-                       // Split the copy
-                       $newEdits[] = array( 'copy', $copyStart, $start );
-                       if ( $newText !== false ) {
-                               $newEdits[] = array( 'insert', $newText );
-                       }
-                       $newEdits[] = array( 'copy', $end, $copyEnd );
-               }
-               $this->edits = $newEdits;
-       }
-
-       /**
-        * Finds the source byte region which you would want to delete, if $pathName
-        * was to be deleted. Includes the leading spaces and tabs, the trailing line
-        * break, and any comments in between.
-        * @param $pathName
-        * @throws MWException
-        * @return array
-        */
-       function findDeletionRegion( $pathName ) {
-               if ( !isset( $this->pathInfo[$pathName] ) ) {
-                       throw new MWException( "Can't find path \"$pathName\"" );
-               }
-               $path = $this->pathInfo[$pathName];
-               // Find the start
-               $this->firstToken();
-               while ( $this->pos != $path['startToken'] ) {
-                       $this->nextToken();
-               }
-               $regionStart = $path['startByte'];
-               for ( $offset = -1; $offset >= -$this->pos; $offset-- ) {
-                       $token = $this->getTokenAhead( $offset );
-                       if ( !$token->isSkip() ) {
-                               // If there is other content on the same line, don't move the start point
-                               // back, because that will cause the regions to overlap.
-                               $regionStart = $path['startByte'];
-                               break;
-                       }
-                       $lfPos = strrpos( $token->text, "\n" );
-                       if ( $lfPos === false ) {
-                               $regionStart -= strlen( $token->text );
-                       } else {
-                               // The line start does not include the LF
-                               $regionStart -= strlen( $token->text ) - $lfPos - 1;
-                               break;
-                       }
-               }
-               // Find the end
-               while ( $this->pos != $path['endToken'] ) {
-                       $this->nextToken();
-               }
-               $regionEnd = $path['endByte']; // past the end
-               $count = count( $this->tokens );
-               for ( $offset = 0; $offset < $count - $this->pos; $offset++ ) {
-                       $token = $this->getTokenAhead( $offset );
-                       if ( !$token->isSkip() ) {
-                               break;
-                       }
-                       $lfPos = strpos( $token->text, "\n" );
-                       if ( $lfPos === false ) {
-                               $regionEnd += strlen( $token->text );
-                       } else {
-                               // This should point past the LF
-                               $regionEnd += $lfPos + 1;
-                               break;
-                       }
-               }
-
-               return array( $regionStart, $regionEnd );
-       }
-
-       /**
-        * Find the byte region in the source corresponding to the value part.
-        * This includes the quotes, but does not include the trailing comma
-        * or semicolon.
-        *
-        * The end position is the past-the-end (end + 1) value as per convention.
-        * @param $pathName
-        * @throws MWException
-        * @return array
-        */
-       function findValueRegion( $pathName ) {
-               if ( !isset( $this->pathInfo[$pathName] ) ) {
-                       throw new MWException( "Can't find path \"$pathName\"" );
-               }
-               $path = $this->pathInfo[$pathName];
-               if ( $path['valueStartByte'] === false || $path['valueEndByte'] === false ) {
-                       throw new MWException( "Can't find value region for path \"$pathName\"" );
-               }
-
-               return array( $path['valueStartByte'], $path['valueEndByte'] );
-       }
-
-       /**
-        * Find the path name of the last element in the array.
-        * If the array is empty, this will return the \@extra interstitial element.
-        * If the specified path is not found or is not an array, it will return false.
-        * @return bool|int|string
-        */
-       function findLastArrayElement( $path ) {
-               // Try for a real element
-               $lastEltPath = false;
-               foreach ( $this->pathInfo as $candidatePath => $info ) {
-                       $part1 = substr( $candidatePath, 0, strlen( $path ) + 1 );
-                       $part2 = substr( $candidatePath, strlen( $path ) + 1, 1 );
-                       if ( $part2 == '@' ) {
-                               // Do nothing
-                       } elseif ( $part1 == "$path/" ) {
-                               $lastEltPath = $candidatePath;
-                       } elseif ( $lastEltPath !== false ) {
-                               break;
-                       }
-               }
-               if ( $lastEltPath !== false ) {
-                       return $lastEltPath;
-               }
-
-               // Try for an interstitial element
-               $extraPath = false;
-               foreach ( $this->pathInfo as $candidatePath => $info ) {
-                       $part1 = substr( $candidatePath, 0, strlen( $path ) + 1 );
-                       if ( $part1 == "$path/" ) {
-                               $extraPath = $candidatePath;
-                       } elseif ( $extraPath !== false ) {
-                               break;
-                       }
-               }
-
-               return $extraPath;
-       }
-
-       /**
-        * Find the path name of first element in the array.
-        * If the array is empty, this will return the \@extra interstitial element.
-        * If the specified path is not found or is not an array, it will return false.
-        * @return bool|int|string
-        */
-       function findFirstArrayElement( $path ) {
-               // Try for an ordinary element
-               foreach ( $this->pathInfo as $candidatePath => $info ) {
-                       $part1 = substr( $candidatePath, 0, strlen( $path ) + 1 );
-                       $part2 = substr( $candidatePath, strlen( $path ) + 1, 1 );
-                       if ( $part1 == "$path/" && $part2 != '@' ) {
-                               return $candidatePath;
-                       }
-               }
-
-               // Try for an interstitial element
-               foreach ( $this->pathInfo as $candidatePath => $info ) {
-                       $part1 = substr( $candidatePath, 0, strlen( $path ) + 1 );
-                       if ( $part1 == "$path/" ) {
-                               return $candidatePath;
-                       }
-               }
-
-               return false;
-       }
-
-       /**
-        * Get the indent string which sits after a given start position.
-        * Returns false if the position is not at the start of the line.
-        * @return array
-        */
-       function getIndent( $pos, $key = false, $arrowPos = false ) {
-               $arrowIndent = ' ';
-               if ( $pos == 0 || $this->text[$pos - 1] == "\n" ) {
-                       $indentLength = strspn( $this->text, " \t", $pos );
-                       $indent = substr( $this->text, $pos, $indentLength );
-               } else {
-                       $indent = false;
-               }
-               if ( $indent !== false && $arrowPos !== false ) {
-                       $arrowIndentLength = $arrowPos - $pos - $indentLength - strlen( $key );
-                       if ( $arrowIndentLength > 0 ) {
-                               $arrowIndent = str_repeat( ' ', $arrowIndentLength );
-                       }
-               }
-
-               return array( $indent, $arrowIndent );
-       }
-
-       /**
-        * Run the parser on the text. Throws an exception if the string does not
-        * match our defined subset of PHP syntax.
-        */
-       public function parse() {
-               $this->initParse();
-               $this->pushState( 'file' );
-               $this->pushPath( '@extra-' . ( $this->serial++ ) );
-               $token = $this->firstToken();
-
-               while ( !$token->isEnd() ) {
-                       $state = $this->popState();
-                       if ( !$state ) {
-                               $this->error( 'internal error: empty state stack' );
-                       }
-
-                       switch ( $state ) {
-                               case 'file':
-                                       $this->expect( T_OPEN_TAG );
-                                       $token = $this->skipSpace();
-                                       if ( $token->isEnd() ) {
-                                               break 2;
-                                       }
-                                       $this->pushState( 'statement', 'file 2' );
-                                       break;
-                               case 'file 2':
-                                       $token = $this->skipSpace();
-                                       if ( $token->isEnd() ) {
-                                               break 2;
-                                       }
-                                       $this->pushState( 'statement', 'file 2' );
-                                       break;
-                               case 'statement':
-                                       $token = $this->skipSpace();
-                                       if ( !$this->validatePath( $token->text ) ) {
-                                               $this->error( "Invalid variable name \"{$token->text}\"" );
-                                       }
-                                       $this->nextPath( $token->text );
-                                       $this->expect( T_VARIABLE );
-                                       $this->skipSpace();
-                                       $arrayAssign = false;
-                                       if ( $this->currentToken()->type == '[' ) {
-                                               $this->nextToken();
-                                               $token = $this->skipSpace();
-                                               if ( !$token->isScalar() ) {
-                                                       $this->error( "expected a string or number for the array key" );
-                                               }
-                                               if ( $token->type == T_CONSTANT_ENCAPSED_STRING ) {
-                                                       $text = $this->parseScalar( $token->text );
-                                               } else {
-                                                       $text = $token->text;
-                                               }
-                                               if ( !$this->validatePath( $text ) ) {
-                                                       $this->error( "Invalid associative array name \"$text\"" );
-                                               }
-                                               $this->pushPath( $text );
-                                               $this->nextToken();
-                                               $this->skipSpace();
-                                               $this->expect( ']' );
-                                               $this->skipSpace();
-                                               $arrayAssign = true;
-                                       }
-                                       $this->expect( '=' );
-                                       $this->skipSpace();
-                                       $this->startPathValue();
-                                       if ( $arrayAssign ) {
-                                               $this->pushState( 'expression', 'array assign end' );
-                                       } else {
-                                               $this->pushState( 'expression', 'statement end' );
-                                       }
-                                       break;
-                               case 'array assign end':
-                               case 'statement end':
-                                       $this->endPathValue();
-                                       if ( $state == 'array assign end' ) {
-                                               $this->popPath();
-                                       }
-                                       $this->skipSpace();
-                                       $this->expect( ';' );
-                                       $this->nextPath( '@extra-' . ( $this->serial++ ) );
-                                       break;
-                               case 'expression':
-                                       $token = $this->skipSpace();
-                                       if ( $token->type == T_ARRAY ) {
-                                               $this->pushState( 'array' );
-                                       } elseif ( $token->isScalar() ) {
-                                               $this->nextToken();
-                                       } elseif ( $token->type == T_VARIABLE ) {
-                                               $this->nextToken();
-                                       } else {
-                                               $this->error( "expected simple expression" );
-                                       }
-                                       break;
-                               case 'array':
-                                       $this->skipSpace();
-                                       $this->expect( T_ARRAY );
-                                       $this->skipSpace();
-                                       $this->expect( '(' );
-                                       $this->skipSpace();
-                                       $this->pushPath( '@extra-' . ( $this->serial++ ) );
-                                       if ( $this->isAhead( ')' ) ) {
-                                               // Empty array
-                                               $this->pushState( 'array end' );
-                                       } else {
-                                               $this->pushState( 'element', 'array end' );
-                                       }
-                                       break;
-                               case 'array end':
-                                       $this->skipSpace();
-                                       $this->popPath();
-                                       $this->expect( ')' );
-                                       break;
-                               case 'element':
-                                       $token = $this->skipSpace();
-                                       // Look ahead to find the double arrow
-                                       if ( $token->isScalar() && $this->isAhead( T_DOUBLE_ARROW, 1 ) ) {
-                                               // Found associative element
-                                               $this->pushState( 'assoc-element', 'element end' );
-                                       } else {
-                                               // Not associative
-                                               $this->nextPath( '@next' );
-                                               $this->startPathValue();
-                                               $this->pushState( 'expression', 'element end' );
-                                       }
-                                       break;
-                               case 'element end':
-                                       $token = $this->skipSpace();
-                                       if ( $token->type == ',' ) {
-                                               $this->endPathValue();
-                                               $this->markComma();
-                                               $this->nextToken();
-                                               $this->nextPath( '@extra-' . ( $this->serial++ ) );
-                                               // Look ahead to find ending bracket
-                                               if ( $this->isAhead( ")" ) ) {
-                                                       // Found ending bracket, no continuation
-                                                       $this->skipSpace();
-                                               } else {
-                                                       // No ending bracket, continue to next element
-                                                       $this->pushState( 'element' );
-                                               }
-                                       } elseif ( $token->type == ')' ) {
-                                               // End array
-                                               $this->endPathValue();
-                                       } else {
-                                               $this->error( "expected the next array element or the end of the array" );
-                                       }
-                                       break;
-                               case 'assoc-element':
-                                       $token = $this->skipSpace();
-                                       if ( !$token->isScalar() ) {
-                                               $this->error( "expected a string or number for the array key" );
-                                       }
-                                       if ( $token->type == T_CONSTANT_ENCAPSED_STRING ) {
-                                               $text = $this->parseScalar( $token->text );
-                                       } else {
-                                               $text = $token->text;
-                                       }
-                                       if ( !$this->validatePath( $text ) ) {
-                                               $this->error( "Invalid associative array name \"$text\"" );
-                                       }
-                                       $this->nextPath( $text );
-                                       $this->nextToken();
-                                       $this->skipSpace();
-                                       $this->markArrow();
-                                       $this->expect( T_DOUBLE_ARROW );
-                                       $this->skipSpace();
-                                       $this->startPathValue();
-                                       $this->pushState( 'expression' );
-                                       break;
-                       }
-               }
-               if ( count( $this->stateStack ) ) {
-                       $this->error( 'unexpected end of file' );
-               }
-               $this->popPath();
-       }
-
-       /**
-        * Initialise a parse.
-        */
-       protected function initParse() {
-               $this->tokens = token_get_all( $this->text );
-               $this->stateStack = array();
-               $this->pathStack = array();
-               $this->firstToken();
-               $this->pathInfo = array();
-               $this->serial = 1;
-       }
-
-       /**
-        * Set the parse position. Do not call this except from firstToken() and
-        * nextToken(), there is more to update than just the position.
-        */
-       protected function setPos( $pos ) {
-               $this->pos = $pos;
-               if ( $this->pos >= count( $this->tokens ) ) {
-                       $this->currentToken = ConfEditorToken::newEnd();
-               } else {
-                       $this->currentToken = $this->newTokenObj( $this->tokens[$this->pos] );
-               }
-
-               return $this->currentToken;
-       }
-
-       /**
-        * Create a ConfEditorToken from an element of token_get_all()
-        * @return ConfEditorToken
-        */
-       function newTokenObj( $internalToken ) {
-               if ( is_array( $internalToken ) ) {
-                       return new ConfEditorToken( $internalToken[0], $internalToken[1] );
-               } else {
-                       return new ConfEditorToken( $internalToken, $internalToken );
-               }
-       }
-
-       /**
-        * Reset the parse position
-        */
-       function firstToken() {
-               $this->setPos( 0 );
-               $this->prevToken = ConfEditorToken::newEnd();
-               $this->lineNum = 1;
-               $this->colNum = 1;
-               $this->byteNum = 0;
-
-               return $this->currentToken;
-       }
-
-       /**
-        * Get the current token
-        */
-       function currentToken() {
-               return $this->currentToken;
-       }
-
-       /**
-        * Advance the current position and return the resulting next token
-        */
-       function nextToken() {
-               if ( $this->currentToken ) {
-                       $text = $this->currentToken->text;
-                       $lfCount = substr_count( $text, "\n" );
-                       if ( $lfCount ) {
-                               $this->lineNum += $lfCount;
-                               $this->colNum = strlen( $text ) - strrpos( $text, "\n" );
-                       } else {
-                               $this->colNum += strlen( $text );
-                       }
-                       $this->byteNum += strlen( $text );
-               }
-               $this->prevToken = $this->currentToken;
-               $this->setPos( $this->pos + 1 );
-
-               return $this->currentToken;
-       }
-
-       /**
-        * Get the token $offset steps ahead of the current position.
-        * $offset may be negative, to get tokens behind the current position.
-        * @return ConfEditorToken
-        */
-       function getTokenAhead( $offset ) {
-               $pos = $this->pos + $offset;
-               if ( $pos >= count( $this->tokens ) || $pos < 0 ) {
-                       return ConfEditorToken::newEnd();
-               } else {
-                       return $this->newTokenObj( $this->tokens[$pos] );
-               }
-       }
-
-       /**
-        * Advances the current position past any whitespace or comments
-        */
-       function skipSpace() {
-               while ( $this->currentToken && $this->currentToken->isSkip() ) {
-                       $this->nextToken();
-               }
-
-               return $this->currentToken;
-       }
-
-       /**
-        * Throws an error if the current token is not of the given type, and
-        * then advances to the next position.
-        */
-       function expect( $type ) {
-               if ( $this->currentToken && $this->currentToken->type == $type ) {
-                       return $this->nextToken();
-               } else {
-                       $this->error( "expected " . $this->getTypeName( $type ) .
-                               ", got " . $this->getTypeName( $this->currentToken->type ) );
-               }
-       }
-
-       /**
-        * Push a state or two on to the state stack.
-        */
-       function pushState( $nextState, $stateAfterThat = null ) {
-               if ( $stateAfterThat !== null ) {
-                       $this->stateStack[] = $stateAfterThat;
-               }
-               $this->stateStack[] = $nextState;
-       }
-
-       /**
-        * Pop a state from the state stack.
-        * @return mixed
-        */
-       function popState() {
-               return array_pop( $this->stateStack );
-       }
-
-       /**
-        * Returns true if the user input path is valid.
-        * This exists to allow "/" and "@" to be reserved for string path keys
-        * @return bool
-        */
-       function validatePath( $path ) {
-               return strpos( $path, '/' ) === false && substr( $path, 0, 1 ) != '@';
-       }
-
-       /**
-        * Internal function to update some things at the end of a path region. Do
-        * not call except from popPath() or nextPath().
-        */
-       function endPath() {
-               $key = '';
-               foreach ( $this->pathStack as $pathInfo ) {
-                       if ( $key !== '' ) {
-                               $key .= '/';
-                       }
-                       $key .= $pathInfo['name'];
-               }
-               $pathInfo['endByte'] = $this->byteNum;
-               $pathInfo['endToken'] = $this->pos;
-               $this->pathInfo[$key] = $pathInfo;
-       }
-
-       /**
-        * Go up to a new path level, for example at the start of an array.
-        */
-       function pushPath( $path ) {
-               $this->pathStack[] = array(
-                       'name' => $path,
-                       'level' => count( $this->pathStack ) + 1,
-                       'startByte' => $this->byteNum,
-                       'startToken' => $this->pos,
-                       'valueStartToken' => false,
-                       'valueStartByte' => false,
-                       'valueEndToken' => false,
-                       'valueEndByte' => false,
-                       'nextArrayIndex' => 0,
-                       'hasComma' => false,
-                       'arrowByte' => false
-               );
-       }
-
-       /**
-        * Go down a path level, for example at the end of an array.
-        */
-       function popPath() {
-               $this->endPath();
-               array_pop( $this->pathStack );
-       }
-
-       /**
-        * Go to the next path on the same level. This ends the current path and
-        * starts a new one. If $path is \@next, the new path is set to the next
-        * numeric array element.
-        */
-       function nextPath( $path ) {
-               $this->endPath();
-               $i = count( $this->pathStack ) - 1;
-               if ( $path == '@next' ) {
-                       $nextArrayIndex =& $this->pathStack[$i]['nextArrayIndex'];
-                       $this->pathStack[$i]['name'] = $nextArrayIndex;
-                       $nextArrayIndex++;
-               } else {
-                       $this->pathStack[$i]['name'] = $path;
-               }
-               $this->pathStack[$i] =
-                       array(
-                               'startByte' => $this->byteNum,
-                               'startToken' => $this->pos,
-                               'valueStartToken' => false,
-                               'valueStartByte' => false,
-                               'valueEndToken' => false,
-                               'valueEndByte' => false,
-                               'hasComma' => false,
-                               'arrowByte' => false,
-                       ) + $this->pathStack[$i];
-       }
-
-       /**
-        * Mark the start of the value part of a path.
-        */
-       function startPathValue() {
-               $path =& $this->pathStack[count( $this->pathStack ) - 1];
-               $path['valueStartToken'] = $this->pos;
-               $path['valueStartByte'] = $this->byteNum;
-       }
-
-       /**
-        * Mark the end of the value part of a path.
-        */
-       function endPathValue() {
-               $path =& $this->pathStack[count( $this->pathStack ) - 1];
-               $path['valueEndToken'] = $this->pos;
-               $path['valueEndByte'] = $this->byteNum;
-       }
-
-       /**
-        * Mark the comma separator in an array element
-        */
-       function markComma() {
-               $path =& $this->pathStack[count( $this->pathStack ) - 1];
-               $path['hasComma'] = true;
-       }
-
-       /**
-        * Mark the arrow separator in an associative array element
-        */
-       function markArrow() {
-               $path =& $this->pathStack[count( $this->pathStack ) - 1];
-               $path['arrowByte'] = $this->byteNum;
-       }
-
-       /**
-        * Generate a parse error
-        */
-       function error( $msg ) {
-               throw new ConfEditorParseError( $this, $msg );
-       }
-
-       /**
-        * Get a readable name for the given token type.
-        * @return string
-        */
-       function getTypeName( $type ) {
-               if ( is_int( $type ) ) {
-                       return token_name( $type );
-               } else {
-                       return "\"$type\"";
-               }
-       }
-
-       /**
-        * Looks ahead to see if the given type is the next token type, starting
-        * from the current position plus the given offset. Skips any intervening
-        * whitespace.
-        * @return bool
-        */
-       function isAhead( $type, $offset = 0 ) {
-               $ahead = $offset;
-               $token = $this->getTokenAhead( $offset );
-               while ( !$token->isEnd() ) {
-                       if ( $token->isSkip() ) {
-                               $ahead++;
-                               $token = $this->getTokenAhead( $ahead );
-                               continue;
-                       } elseif ( $token->type == $type ) {
-                               // Found the type
-                               return true;
-                       } else {
-                               // Not found
-                               return false;
-                       }
-               }
-
-               return false;
-       }
-
-       /**
-        * Get the previous token object
-        */
-       function prevToken() {
-               return $this->prevToken;
-       }
-
-       /**
-        * Echo a reasonably readable representation of the tokenizer array.
-        */
-       function dumpTokens() {
-               $out = '';
-               foreach ( $this->tokens as $token ) {
-                       $obj = $this->newTokenObj( $token );
-                       $out .= sprintf( "%-28s %s\n",
-                               $this->getTypeName( $obj->type ),
-                               addcslashes( $obj->text, "\0..\37" ) );
-               }
-               echo "<pre>" . htmlspecialchars( $out ) . "</pre>";
-       }
-}
-
-/**
- * Exception class for parse errors
- */
-class ConfEditorParseError extends MWException {
-       var $lineNum, $colNum;
-
-       function __construct( $editor, $msg ) {
-               $this->lineNum = $editor->lineNum;
-               $this->colNum = $editor->colNum;
-               parent::__construct( "Parse error on line {$editor->lineNum} " .
-                       "col {$editor->colNum}: $msg" );
-       }
-
-       function highlight( $text ) {
-               $lines = StringUtils::explode( "\n", $text );
-               foreach ( $lines as $lineNum => $line ) {
-                       if ( $lineNum == $this->lineNum - 1 ) {
-                               return "$line\n" . str_repeat( ' ', $this->colNum - 1 ) . "^\n";
-                       }
-               }
-
-               return '';
-       }
-}
-
-/**
- * Class to wrap a token from the tokenizer.
- */
-class ConfEditorToken {
-       var $type, $text;
-
-       static $scalarTypes = array( T_LNUMBER, T_DNUMBER, T_STRING, T_CONSTANT_ENCAPSED_STRING );
-       static $skipTypes = array( T_WHITESPACE, T_COMMENT, T_DOC_COMMENT );
-
-       static function newEnd() {
-               return new self( 'END', '' );
-       }
-
-       function __construct( $type, $text ) {
-               $this->type = $type;
-               $this->text = $text;
-       }
-
-       function isSkip() {
-               return in_array( $this->type, self::$skipTypes );
-       }
-
-       function isScalar() {
-               return in_array( $this->type, self::$scalarTypes );
-       }
-
-       function isEnd() {
-               return $this->type == 'END';
-       }
-}
index c7bb4f3..e2013b0 100644 (file)
@@ -278,7 +278,9 @@ class UIDGenerator {
                if ( ( $flags & self::QUICK_VOLATILE ) && PHP_SAPI !== 'cli' ) {
                        try {
                                $cache = ObjectCache::newAccelerator( array() );
-                       } catch ( MWException $e ) {} // not supported
+                       } catch ( MWException $e ) {
+                               // not supported
+                       }
                }
                if ( $cache ) {
                        $counter = $cache->incr( $bucket, $count );
index 964cd9f..38d3af5 100644 (file)
@@ -1908,12 +1908,9 @@ class Language {
                        $data[0] = 'Offset';
                }
 
-               $minDiff = 0;
                if ( $data[0] == 'System' || $tz == '' ) {
-                       #  Global offset in minutes.
-                       if ( isset( $wgLocalTZoffset ) ) {
-                               $minDiff = $wgLocalTZoffset;
-                       }
+                       # Global offset in minutes.
+                       $minDiff = $wgLocalTZoffset;
                } elseif ( $data[0] == 'Offset' ) {
                        $minDiff = intval( $data[1] );
                } else {
index 98938b2..65d74e9 100644 (file)
@@ -754,6 +754,9 @@ class LanguageConverter {
                global $wgDisableLangConversion, $wgDisableTitleConversion, $wgRequest;
                $isredir = $wgRequest->getText( 'redirect', 'yes' );
                $action = $wgRequest->getText( 'action' );
+               if ( $action == 'edit' && $wgRequest->getBool( 'redlink' ) ) {
+                       $action = 'view';
+               }
                $linkconvert = $wgRequest->getText( 'linkconvert', 'yes' );
                $disableLinkConversion = $wgDisableLangConversion
                        || $wgDisableTitleConversion;
index 64e08a2..838f0e6 100644 (file)
@@ -5,7 +5,8 @@
                        "Csisc",
                        "Kuwaity26",
                        "Malekbr",
-                       "아라"
+                       "아라",
+                       "Aħmedbaɛl"
                ]
        },
        "tog-underline": "ضع خطا تحت الوصلات:",
        "booksources-go": "اذهب",
        "log": "سجلات",
        "allpages": "kol ess'afa7at",
-       "alphaindexline": "$1 إلى $2",
        "allarticles": "kol ess'afa7at",
        "allpagessubmit": "اذهب",
        "categories": "تصنيفات",
        "watchlistall2": "الكل",
        "namespacesall": "الكل",
        "monthsall": "الكل",
+       "watchlistedit-clear-explain": "Elɛanawin lkol bech yetnaħaw mel'lista mteɛek",
+       "watchlistedit-clear-titles": "Elɛanawin",
+       "watchlistedit-too-many": "Famma barcha pajet w'manajmouch nħotouhom lkol lahné",
        "watchlisttools-view": "اعرض التغييرات المرتبطة",
        "watchlisttools-edit": "اعرض قائمة المراقبة وعدلها",
        "watchlisttools-raw": "عدل قائمة المراقبة الخام",
index 8119185..68d3d11 100644 (file)
        "permalink": "Permanente skakel",
        "print": "Druk",
        "view": "Wys",
+       "view-foreign": "Wys op $1",
        "edit": "Wysig",
+       "edit-local": "Wysig plaaslike beskrywing",
        "create": "Skep",
+       "create-local": "Voeg plaaslike beskrywing by",
        "editthispage": "Wysig hierdie bladsy",
        "create-this-page": "Skep hierdie bladsy",
        "delete": "Skrap",
        "loginlanguagelabel": "Taal: $1",
        "suspicious-userlogout": "U versoek om af te teken is geïgnoreer omdat dit lyk asof dit deur 'n gebreekte webleser of instaanbediener gestuur is.",
        "createacct-another-realname-tip": "Regte naam is opsioneel.\nAs u dit verskaf, sal dit gebruik word om u erkenning vir u werk te gee.",
+       "pt-login": "Meld aan",
+       "pt-login-button": "Meld aan",
+       "pt-createaccount": "Skep gebruiker",
+       "pt-userlogout": "Meld af",
        "php-mail-error-unknown": "Onbekende fout in PHP se mail()-funksie",
        "user-mail-no-addy": "Geprobeer om e-pos te stuur sonder 'n e-posadres.",
        "user-mail-no-body": "Daar is probeer om 'n leë of 'n onredelike kort boodskap te stuur.",
        "edit-gone-missing": "Die bladsy is nie gewysig nie.\nDit lyk of dit verwyder is.",
        "edit-conflict": "Wysigingskonflik",
        "edit-no-change": "U wysiging was geignoreer omdat die teks nie verander is nie.",
+       "postedit-confirmation-created": "Die bladsy is geskep.",
+       "postedit-confirmation-restored": "Die bladsy is teruggeplaas.",
        "postedit-confirmation-saved": "U wysigings is gestoor.",
        "edit-already-exists": "Die bladsy is nie geskep nie.\nDit bestaan alreeds.",
        "defaultmessagetext": "Verstekteks",
        "search-section": "(afdeling $1)",
        "search-suggest": "Het u $1 bedoel?",
        "search-interwiki-caption": "Susterprojekte",
-       "search-interwiki-default": "$1 resultate:",
+       "search-interwiki-default": "Resultate van $1:",
        "search-interwiki-more": "(meer)",
        "search-relatedarticle": "Verwante",
        "searcheverything-enable": "Soek in alle naamruimtes",
        "prefs-emailconfirm-label": "E-posbevestiging:",
        "youremail": "E-posadres:",
        "username": "{{GENDER:$1|Gebruikersnaam}}:",
-       "uid": "{{GENDER:$1|Gebruiker-ID}}:",
        "prefs-memberingroups": "{{GENDER:$2|Lid}} van {{PLURAL:$1|groep|groepe}}:",
        "prefs-registration": "Registrasiedatum:",
        "yourrealname": "Regte naam:",
        "rcnotefrom": "Wysigings sedert <strong>$2</strong> (maksimum van <strong>$1</strong> word gewys).",
        "rclistfrom": "Vertoon wysigings vanaf $3 $2",
        "rcshowhideminor": "$1 klein wysigings",
+       "rcshowhideminor-show": "Wys",
+       "rcshowhideminor-hide": "Versteek",
        "rcshowhidebots": "$1 robotte",
+       "rcshowhidebots-show": "Wys",
+       "rcshowhidebots-hide": "Versteek",
        "rcshowhideliu": "$1 geregistreerde gebruikers",
+       "rcshowhideliu-show": "Wys",
+       "rcshowhideliu-hide": "Versteek",
        "rcshowhideanons": "$1 anonieme gebruikers",
+       "rcshowhideanons-show": "Wys",
+       "rcshowhideanons-hide": "Versteek",
        "rcshowhidepatr": "$1 gekontroleerde wysigings",
+       "rcshowhidepatr-show": "Wys",
+       "rcshowhidepatr-hide": "Versteek",
        "rcshowhidemine": "$1 my wysigings",
+       "rcshowhidemine-show": "Wys",
+       "rcshowhidemine-hide": "Versteek",
        "rclinks": "Vertoon die laaste $1 wysigings in die afgelope $2 dae<br />$3",
        "diff": "verskil",
        "hist": "geskiedenis",
        "protectedpages": "Beskermde bladsye",
        "protectedpages-indef": "Slegs blokkades sonder vervaldatum",
        "protectedpages-cascade": "Slegs blokkades wat neergolf",
+       "protectedpages-noredirect": "Versteek aansture",
        "protectedpagesempty": "Geen bladsye is tans met die parameters beveilig nie.",
+       "protectedpages-timestamp": "Tydstip",
+       "protectedpages-page": "Bladsy",
+       "protectedpages-expiry": "Verval",
+       "protectedpages-reason": "Rede",
+       "protectedpages-unknown-timestamp": "Onbekend",
+       "protectedpages-unknown-performer": "Onbekende gebruiker",
        "protectedtitles": "Beskermde titels",
        "protectedtitlesempty": "Geen titels is tans met die parameters beveilig nie.",
        "listusers": "Gebruikerslys",
        "log-title-wildcard": "Soek bladsye wat met die naam begin",
        "showhideselectedlogentries": "Wys/versteek gekose logboekreëls",
        "allpages": "Alle bladsye",
-       "alphaindexline": "$1 tot $2",
        "nextpage": "Volgende blad ($1)",
        "prevpage": "Vorige bladsye ($1)",
        "allpagesfrom": "Wys bladsye vanaf:",
        "listgrouprights-removegroup-self": "Die volgende {{PLURAL:$2|groep|groepe}} verwyder van eie gebruiker: $1",
        "listgrouprights-addgroup-self-all": "Alle groepe byvoeg tot eie gebruiker",
        "listgrouprights-removegroup-self-all": "Alle groepe verwyder van eie gebruiker",
+       "listgrouprights-namespaceprotection-namespace": "Naamruimte",
+       "trackingcategories-name": "Boodskapnaam",
+       "trackingcategories-nodesc": "Geen beskrywing beskikbaar nie.",
+       "trackingcategories-disabled": "Kategorie is gedeaktiveer",
        "mailnologin": "Geen versendadres beskikbaar",
        "mailnologintext": "U moet [[Special:UserLogin|ingeteken]] wees en 'n geldige e-posadres in u [[Special:Preferences|voorkeure]] hê om e-pos aan ander gebruikers te kan stuur.",
        "emailuser": "Stuur e-pos na hierdie gebruiker",
        "contributions-title": "$1 se bydraes",
        "mycontris": "Bydraes",
        "contribsub2": "Vir {{GENDER:$3|$1}} ($2)",
+       "contributions-userdoesnotexist": "Die gebruiker \"$1\" is nie geregistreer nie.",
        "nocontribs": "Geen veranderinge wat by hierdie kriteria pas, is gevind nie.",
        "uctop": "(laaste wysiging)",
        "month": "Vanaf maand (en vroeër):",
        "sp-contributions-newbies-sub": "Vir nuwe gebruikers",
        "sp-contributions-newbies-title": "Bydraes van nuwe gebruikers",
        "sp-contributions-blocklog": "blokkeer-logboek",
+       "sp-contributions-suppresslog": "onderdrukte gebruikersbydraes",
        "sp-contributions-deleted": "geskrapte gebruikersbydraes",
        "sp-contributions-uploads": "oplaaie",
        "sp-contributions-logs": "logboeke",
        "newimages-summary": "Die spesiale bladsy wys die nuutste lêers wat na die wiki opgelaai is.",
        "newimages-legend": "Filter",
        "newimages-label": "Lêernaam (of deel daarvan):",
-       "showhidebots": "($1 robotte)",
        "noimages": "Niks te sien nie.",
        "ilsubmit": "Soek",
        "bydate": "volgens datum",
        "htmlform-no": "Nee",
        "htmlform-yes": "Ja",
        "htmlform-chosen-placeholder": "Kies 'n opsie",
+       "htmlform-cloner-delete": "Verwyder",
+       "htmlform-cloner-required": "Ten minste één waarde verwag.",
        "sqlite-has-fts": "Weergawe $1 met ondersteuning vir vol-teks soektogte (\"full-text search\")",
        "sqlite-no-fts": "Weergawe $1 sonder ondersteuning vir vol-teks soektogte (\"full-text search\")",
        "logentry-delete-delete": "$1 {{GENDER:$2|het}} bladsy $3 verwyder",
index e5b1221..3752ef0 100644 (file)
        "newimages": "የአዳዲስ ሥዕሎች ማሳያ አዳራሽ",
        "imagelisttext": "$1 የተጨመሩ ሥእሎች ወይም ፋይሎች ከታች ይዘረዝራሉ ($2)።",
        "newimages-legend": "ማጣሪያ",
-       "showhidebots": "(«bots» $1)",
        "noimages": "ምንም የለም!",
        "ilsubmit": "ፍለጋ",
        "bydate": "በተጨመሩበት ወቅት",
index 61a5bcb..1c2bcae 100644 (file)
        "newimages-summary": "Ista pachina especial amuestra os zaguers fichers cargatos.",
        "newimages-legend": "Filtro",
        "newimages-label": "Nombre d'o fichero (u bella parte d'el):",
-       "showhidebots": "($1 bots)",
        "noimages": "No bi ha cosa a veyer.",
        "ilsubmit": "Mirar",
        "bydate": "por a calendata",
index 65290dd..4649132 100644 (file)
        "prefs-emailconfirm-label": "تأكيد البريد الإلكتروني:",
        "youremail": "البريد:",
        "username": "{{GENDER:$1|اسم المستخدم|اسم المستخدمة}}:",
-       "uid": "رقم {{GENDER:$1|المستخدم|المستخدمة}}:",
        "prefs-memberingroups": "{{GENDER:$2|عضو|عضوة}} في {{PLURAL:$1|مجموعة|مجموعة|مجموعتي|مجموعات}}:",
        "prefs-registration": "وقت التسجيل:",
        "yourrealname": "الاسم الحقيقي:",
        "right-move": "نقل الصفحات",
        "right-move-subpages": "نقل الصفحات مع صفحاتها الفرعية",
        "right-move-rootuserpages": "نقل صفحات المستخدمين الأساسية",
+       "right-move-categorypages": "انقل صفحات التصنيف",
        "right-movefile": "نقل الملفات",
        "right-suppressredirect": "عدم إنشاء تحويلة من الاسم القديم عند نقل صفحة",
        "right-upload": "رفع الملفات",
        "action-move": "نقل هذه الصفحة",
        "action-move-subpages": "نقل هذه الصفحة، وصفحاتها الفرعية",
        "action-move-rootuserpages": "نقل صفحات المستخدمين الأساسية",
+       "action-move-categorypages": "انقل صفحات التصنيف",
        "action-movefile": "نقل هذا الملف",
        "action-upload": "رفع هذا الملف",
        "action-reupload": "الكتابة على هذا الملف الموجود",
        "log-title-wildcard": "ابحث عن عناوين تبدأ بهذا النص",
        "showhideselectedlogentries": "إطهار/إخفاء سجلات الدخول المختارة",
        "allpages": "كل الصفحات",
-       "alphaindexline": "$1 إلى $2",
        "nextpage": "الصفحة التالية ($1)",
        "prevpage": "الصفحة السابقة ($1)",
        "allpagesfrom": "اعرض الصفحات ابتداء من:",
        "listgrouprights-removegroup-self-all": "يمكنه إزالة كل المجموعات من حسابه الخاص",
        "listgrouprights-namespaceprotection-namespace": "النطاق",
        "trackingcategories-name": "اسم الرسالة",
+       "trackingcategories-desc": "معايير إدراج تصنيف",
        "trackingcategories-disabled": "التصنيف غير مفعل",
        "mailnologin": "لا يوجد عنوان للإرسال",
        "mailnologintext": "يجب أن تقوم [[Special:UserLogin|بتسجيل الدخول]] وإدخال بريد إلكتروني صالح في صفحة [[Special:Preferences|التفضيلات]] لتتمكن من إرسال الرسائل لمستخدمين آخرين.",
        "newimages-summary": "هذه الصفحة الخاصة تعرض آخر الملفات المرفوعة.",
        "newimages-legend": "المرشح",
        "newimages-label": "اسم الملف (أو جزء منه):",
-       "showhidebots": "($1 بوتات)",
+       "newimages-showbots": "أظهر التحميلات بواسطة البوتات",
        "noimages": "لا شيء للعرض.",
        "ilsubmit": "بحث",
        "bydate": "حسب التاريخ",
        "watchlistedit-raw-done": "قائمة مراقبتك تم تحديثها.",
        "watchlistedit-raw-added": "تمت إضافة {{PLURAL:$1||عنوان واحد|عنوانين|$1 عناوين|$1 عنوانا|$1 عنوان}}:",
        "watchlistedit-raw-removed": "تمت إزالة {{PLURAL:$1||عنوان واحد|عنوانين|$1 عناوين|$1 عنوانا|$1 عنوان}}:",
+       "watchlistedit-clear-titles": "العناوين:",
        "watchlisttools-view": "اعرض التغييرات المرتبطة",
        "watchlisttools-edit": "اعرض قائمة المراقبة وعدلها",
        "watchlisttools-raw": "عدل قائمة المراقبة الخام",
index d2e2328..ae9538a 100644 (file)
        "newimages-summary": "الصفحةالمخصوصة دى بتعرض آخر الملفات المتحملة",
        "newimages-legend": "اسم الملف",
        "newimages-label": "اسم الملف (او حتة منه):",
-       "showhidebots": "($1 بوتات)",
        "noimages": "مافيش حاجة للعرض.",
        "ilsubmit": "تدوير",
        "bydate": "على حسب التاريخ",
index 639129c..c4f45d0 100644 (file)
        "accmailtext": "[[User talk:$1|$1]]-ৰ কাৰণে যাদৃচ্ছিকভাৱে উৎপন্ন কৰা গুপ্তশব্দ $2লৈ পঠোৱা হ'ল । \nএই নতুন একাউন্টত প্ৰৱেশ কৰি ''[[Special:ChangePassword|গুপ্তশব্দ সলনি কৰক]]'' পৃষ্ঠাখনত শব্দতো সলনি কৰি ল’ব পাৰিব ।",
        "newarticle": "(নতুন)",
        "newarticletext": "আপুনি বিচৰা প্ৰবন্ধটো বিচাৰি পোৱা নগ'ল।\n\nইচ্ছা কৰিলে আপুনিয়েই এই প্ৰবন্ধটো লিখা আৰম্ভ কৰিব পাৰে। [$1 ইয়াত] সহায় পাব।\n\nআপুনি যদি ইয়ালৈ ভুলতে আহিছে, তেনেহলে আপোনাৰ ব্ৰাওজাৰৰ '''BACK''' বুটামত টিপা মাৰক।",
-       "anontalkpagetext": "----''à¦\8fà¦\87à¦\96ন à¦\86লà§\8bà¦\9aনা à¦ªà§\83ষà§\8dঠা à¦¬à§\87নামà§\80 à¦¸à¦¦à¦¸à§\8dযৰ à¦¬à¦¾à¦¬à§\87, à¦¯à¦¿à¦¯à¦¼à§\87 à¦¨à¦¿à¦\9cা à¦\8fà¦\95াà¦\89নà§\8dà¦\9f  à¦¸à§\83ষà§\8dà¦\9fি à¦\95ৰা à¦¨à¦¾à¦\87 à¦¬à¦¾ à¦¯à¦¿à¦¯à¦¼à§\87 à¦¸à§\87à¦\87 à¦\8fà¦\95াà¦\89নà§\8dà¦\9f à¦¬à§\8dযৱহাৰ à¦¨à¦\95ৰà§\87 à¥¤\nà¦\8fতà§\87à¦\95à§\87 à¦\86মি à¦¤à§\87à¦\96à§\87তসà¦\95লà¦\95 à¦\86à¦\87-পি à¦ à¦¿à¦\95নাৰà§\87 à¦\9aিনাà¦\95à§\8dত à¦\95ৰিবলà§\88 à¦¬à¦¾à¦§à§\8dয à¥¤\nসà§\87à¦\87 à¦\8fà¦\95à§\87à¦\87 à¦\86à¦\87-পি à¦ à¦¿à¦\95না à¦\85নà§\87à¦\95à§\87à¦\87 à¦¬à§\8dযৱহাৰ à¦\95ৰিব à¦ªà¦¾à§°à§\87 ।\nআপুনি যদি এজন বেনামী সদস্য আৰু যদি আপুনি অনুভৱ কৰে যে আপোনাৰ প্ৰতি অপ্ৰাসঙ্গিক মন্তব্য কৰা হৈছে, তেনেহলে আন বেনামী সদস্যৰ পৰা পৃথক কৰিবলৈ \n[[Special:UserLogin/signup|একাউন্ট সৃষ্টি কৰক]] বা [[Special:UserLogin|প্ৰৱেশ কৰক]] ।''",
+       "anontalkpagetext": "----''à¦\8fà¦\87à¦\96ন à¦\86লà§\8bà¦\9aনা à¦ªà§\83ষà§\8dঠা à¦¬à§\87নামà§\80 à¦¸à¦¦à¦¸à§\8dযৰ à¦¬à¦¾à¦¬à§\87, à¦¯à¦¿à¦¯à¦¼à§\87 à¦¨à¦¿à¦\9cা à¦\8fà¦\95াà¦\89ণà§\8dà¦\9f  à¦¸à§\83ষà§\8dà¦\9fি à¦\95ৰা à¦¨à¦¾à¦\87 à¦¬à¦¾ à¦¯à¦¿à¦¯à¦¼à§\87 à¦¸à§\87à¦\87 à¦\8fà¦\95াà¦\89ণà§\8dà¦\9f à¦¬à§\8dযৱহাৰ à¦¨à¦\95ৰà§\87।\nà¦\8fতà§\87à¦\95à§\87 à¦\86মি à¦¤à§\87à¦\96à§\87তসà¦\95লà¦\95 à¦\86à¦\87-পি à¦ à¦¿à¦\95নাৰà§\87 à¦\9aিনাà¦\95à§\8dত à¦\95ৰিবলà§\88 à¦¬à¦¾à¦§à§\8dয।\nসà§\87à¦\87 à¦\8fà¦\95à§\87à¦\87 à¦\86à¦\87-পি à¦ à¦¿à¦\95না à¦\85নà§\87à¦\95à§\87à¦\87 à¦¬à§\8dযৱহাৰ à¦\95ৰিব à¦ªà¦¾à§°à§\87।\nআপুনি যদি এজন বেনামী সদস্য আৰু যদি আপুনি অনুভৱ কৰে যে আপোনাৰ প্ৰতি অপ্ৰাসঙ্গিক মন্তব্য কৰা হৈছে, তেনেহলে আন বেনামী সদস্যৰ পৰা পৃথক কৰিবলৈ \n[[Special:UserLogin/signup|একাউন্ট সৃষ্টি কৰক]] বা [[Special:UserLogin|প্ৰৱেশ কৰক]] ।''",
        "noarticletext": "এই পৃষ্ঠাত বৰ্তমান কোনো পাঠ্য নাই ।\nআপুনি আন পৃষ্ঠাত [[Special:Search/{{PAGENAME}}| এই শিৰোনামা অনুসন্ধান কৰিব পাৰে]],\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} সম্পৰ্কীয় অভিলেখ অনুসন্ধান কৰিব পাৰে],\nবা [{{fullurl:{{FULLPAGENAME}}|action=edit}} এই পৃষ্ঠা সম্পাদনা কৰিব পাৰে]</span>",
        "noarticletext-nopermission": "এই পৃষ্ঠাত বৰ্তমান কোনো পাঠ্য নাই।\nআপুনি আন পৃষ্ঠাত [[Special:Search/{{PAGENAME}}|এই শিৰোনামা অনুসন্ধান কৰিব পাৰে]],\nবা <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} সম্পৰ্কীয় অভিলেখ অনুসন্ধান কৰিব পাৰে]</span>, কিন্তু এই পৃষ্ঠা সৃষ্টি কৰিবলৈ আপোনাৰ অনুমতি নাই।",
        "missing-revision": "\"{{FULLPAGENAME}}\" নামৰ পৃষ্ঠাৰ #$1 সংশোধনৰ অস্তিত্ব নাই।\n\nসাধাৰণতে বিলোপ কৰা এখন পৃষ্ঠাৰ পুৰণা ইতিহাস লিংক অনুসৰণ কৰিলে এনে হয়।\n[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} বিলোপন ল'গ]ত অধিক তথ্য পাব।",
        "prefs-emailconfirm-label": "ইমেইল নিশ্চিতকৰণ:",
        "youremail": "আপোনাৰ ই-মেইল *",
        "username": "{{GENDER:$1|সদস্যনাম}}:",
-       "uid": "{{GENDER:$1|User}} চিহ্ন:",
        "prefs-memberingroups": "{{PLURAL:$1|গোট|গোটসমূহৰ}} {{GENDER:$2|সদস্য}} :",
        "prefs-registration": "পঞ্জীয়ন কৰাৰ সময়:",
        "yourrealname": "প্ৰকৃত নাম:",
        "action-edit": "এই পৃষ্ঠা সম্পাদনা কৰক",
        "action-createpage": "পৃষ্ঠা সৃষ্টি কৰক",
        "action-createtalk": "কথাবতৰা পৃষ্ঠা সৃষ্টি কৰক",
-       "action-createaccount": "à¦\8fà¦\87 à¦¸à¦¦à¦¸à§\8dয à¦\8fà¦\95াà¦\89নà§\8dà¦\9f  সৃষ্টি কৰক",
+       "action-createaccount": "à¦\8fà¦\87 à¦¸à¦¦à¦¸à§\8dয à¦\8fà¦\95াà¦\89ণà§\8dà¦\9f সৃষ্টি কৰক",
        "action-minoredit": "সম্পাদনা অগুৰুত্বপূৰ্ণ বুলি চিহ্নিত কৰক",
        "action-move": "এই পৃষ্ঠা স্থানান্তৰ কৰক",
        "action-move-subpages": "এই পৃষ্ঠা আৰু ইয়াৰ উপপৃষ্ঠাসমূহ আঁতৰাওক",
        "log-title-wildcard": "এই পাঠেৰে আৰম্ভ হোৱা শিৰোনামাসমূহ অনুসন্ধান কৰক",
        "showhideselectedlogentries": "নিৰ্বাচিত ল'গ ভুক্তি দেখুৱাওক/লুকুৱাওক",
        "allpages": "সকলোবোৰ পৃষ্ঠা",
-       "alphaindexline": "$1 -ৰ পৰা $2 -লৈ",
        "nextpage": "পৰৱৰ্তী পৃষ্ঠা ($1)",
        "prevpage": "পিছৰ পৃষ্ঠা($1)",
        "allpagesfrom": "ইয়াৰে আৰম্ভ হোৱা পৃষ্ঠাবোৰ দেখুৱাওক:",
        "blocklogtext": "এই অভিলেখ অৱৰোধ কৰা আৰু অৱৰোধ আঁতৰ কৰা সদস্য সম্পৰ্কীয়।\nস্বয়ংক্ৰিয়ভাৱে প্ৰতিবন্ধক পোৱা আই.পি. ঠিকনাবোৰ ইয়াত তালিকাভুক্ত কৰা হোৱা নাই।\nসাম্প্ৰতিক কাৰ্যৰত নিষেধ আৰু প্ৰতিবন্ধকৰ বাবে [[Special:BlockList|প্ৰতিবন্ধক তালিকা]] চাওক।",
        "unblocklogentry": "$1 বাৰণ উঠাই লোৱা হ’ল",
        "block-log-flags-anononly": "কেৱল বেনামী সদস্য",
-       "block-log-flags-nocreate": "à¦\8fà¦\95াà¦\89ন্ট সৃষ্টি নিষ্ক্ৰিয় কৰা হৈছে",
+       "block-log-flags-nocreate": "à¦\8fà¦\95াà¦\89ণ্ট সৃষ্টি নিষ্ক্ৰিয় কৰা হৈছে",
        "block-log-flags-noautoblock": "স্বয়ংক্ৰিয়-প্ৰতিবন্ধক নিষ্ক্ৰিয় কৰা হৈছে",
        "block-log-flags-noemail": "ই-মেইল অৱৰোধ কৰা হৈছে",
        "block-log-flags-nousertalk": "নিজৰ কথা-বতৰা পৃষ্ঠা সম্পাদনা কৰিব নোৱাৰি",
        "block-log-flags-angry-autoblock": "বৰ্ধিত স্বয়ংক্ৰিয়-প্ৰতিবন্ধক সক্ৰিয় কৰা হৈছে",
        "block-log-flags-hiddenname": "সদস্যনাম গোপন কৰা হ’ল",
-       "range_block_disabled": "প্ৰশাসকৰ পৰিসীমা প্ৰতিবন্ধক সৃষ্টি কৰিব পৰা ক্ষমতা নিষ্ক্ৰিয় কৰা হৈছে ।",
+       "range_block_disabled": "প্ৰশাসকৰ পৰিসীমা প্ৰতিবন্ধক সৃষ্টি কৰিব পৰা ক্ষমতা নিষ্ক্ৰিয় কৰা হৈছে।",
        "ipb_expiry_invalid": "অবৈধ ম্যাদ উকলা সময়",
        "ipb_expiry_temp": "গুপ্ত সদস্যনাম অৱৰোধ স্থায়ী হ’ব লাগিব ।",
        "ipb_hide_invalid": "এই বিষয়বস্তু নিবাৰণ কৰিব পৰা নগ’ল; ইয়াত {{PLURAL:$1|এটা সম্পাদনা|$1টা সম্পাদনা}} আছে ।",
        "newimages-summary": "এই বিশেষ পৃষ্ঠাখনত সৰ্বশেষত আপল'ড কৰা ফাইলসমূহ দেখিব ।",
        "newimages-legend": "ছেকনী",
        "newimages-label": "নথিৰ নাম (বা তাৰ এটা অংশ)",
-       "showhidebots": "(বট $1)",
        "noimages": "চাবলৈ একো নাই ।",
        "ilsubmit": "সন্ধান কৰক",
        "bydate": "তাৰিখ অনুযায়ী",
index ab26a63..bb61034 100644 (file)
        "tog-hideminor": "Anubrir les ediciones menores nos cambeos recientes",
        "tog-hidepatrolled": "Anubrir les ediciones vixilaes nos cambeos recientes",
        "tog-newpageshidepatrolled": "Anubrir les páxines vixilaes na llista de páxines nueves",
-       "tog-extendwatchlist": "Espander la llista de vixilancia p'amosar tolos cambeos, non solo los más recientes.",
-       "tog-usenewrc": "Agrupar los cambeos por páxina nos cambeos recientes y na llista de vixilancia",
+       "tog-extendwatchlist": "Espander la llista de siguimientu p'amosar tolos cambeos, non solo los más recientes",
+       "tog-usenewrc": "Agrupar los cambeos por páxina nos cambeos recientes y na llista de siguimientu",
        "tog-numberheadings": "Autonumberar los encabezaos",
        "tog-showtoolbar": "Amosar la barra de ferramientes d'edición",
        "tog-editondblclick": "Editar páxines con doble clic",
        "tog-editsectiononrightclick": "Activar la edición de seiciones calcando col botón drechu nos títulos de seición",
-       "tog-watchcreations": "Amestar les páxines que creo y los ficheros que cargo a la mio llista de vixilancia",
-       "tog-watchdefault": "Amestar les páxines y ficheros qu'edito a la mio llista de vixilancia",
-       "tog-watchmoves": "Amestar les páxines y ficheros que muevo a la mio llista de vixilancia",
-       "tog-watchdeletion": "Amestar les páxines y ficheros que desanicio a la mio llista de vixilancia",
+       "tog-watchcreations": "Amestar les páxines que cree y los ficheros que xuba a la mio llista de siguimientu",
+       "tog-watchdefault": "Amestar les páxines y ficheros qu'edite a la mio llista de siguimientu",
+       "tog-watchmoves": "Amestar les páxines y ficheros que tresllade a la mio llista de siguimientu",
+       "tog-watchdeletion": "Amestar les páxines y ficheros que desanicie a la mio llista de siguimientu",
        "tog-minordefault": "Marcar toles ediciones como menores de mou predetermináu",
        "tog-previewontop": "Amosar previsualización enantes del cuadru d'edición",
        "tog-previewonfirst": "Amosar previsualización na primera edición",
-       "tog-enotifwatchlistpages": "Mandame un corréu cuando camude una páxina o ficheru de la mio llista de vixilancia",
+       "tog-enotifwatchlistpages": "Mandame un corréu cuando camude una páxina o ficheru de la mio llista de siguimientu",
        "tog-enotifusertalkpages": "Mandame un corréu cuando camude la mio páxina d'alderique",
        "tog-enotifminoredits": "Mandame tamién un corréu cuando heba ediciones menores de les páxines y ficheros",
        "tog-enotifrevealaddr": "Amosar la mio direición de corréu nos correos de notificación",
        "tog-fancysig": "Tratar la firma como testu wiki (ensin enllaz automáticu)",
        "tog-uselivepreview": "Usar vista previa en tiempu real (experimental)",
        "tog-forceeditsummary": "Avisame cuando grabe col resume d'edición en blanco",
-       "tog-watchlisthideown": "Anubrir les mios ediciones na llista de vixilancia",
-       "tog-watchlisthidebots": "Anubrir les ediciones de bots na llista de vixilancia",
-       "tog-watchlisthideminor": "Anubrir les ediciones menores na llista de vixilancia",
-       "tog-watchlisthideliu": "Anubrir les ediciones d'usuarios identificaos na llista de vixilancia",
-       "tog-watchlisthideanons": "Anubrir les ediciones d'usuarios anónimos na llista de vixilancia",
-       "tog-watchlisthidepatrolled": "Anubrir les ediciones vixilaes de la llista de vixilancia",
+       "tog-watchlisthideown": "Anubrir les mios ediciones na llista de siguimientu",
+       "tog-watchlisthidebots": "Anubrir les ediciones de bots na llista de siguimientu",
+       "tog-watchlisthideminor": "Anubrir les ediciones menores na llista de siguimientu",
+       "tog-watchlisthideliu": "Anubrir les ediciones d'usuarios identificaos na llista de siguimientu",
+       "tog-watchlisthideanons": "Anubrir les ediciones d'usuarios anónimos na llista de siguimientu",
+       "tog-watchlisthidepatrolled": "Anubrir les ediciones patrullaes na llista de siguimientu",
        "tog-ccmeonemails": "Mandame copies de los correos qu'unvio a otros usuarios",
        "tog-diffonly": "Nun amosar el conteníu de la páxina embaxo de les diferencies",
        "tog-showhiddencats": "Amosar categoríes anubríes",
        "jumptonavigation": "navegación",
        "jumptosearch": "buscar",
        "view-pool-error": "Sentímoslo, los sirvidores tán sobrecargaos nestos momentos.\nHai demasiaos usuarios intentando ver esta páxina.\nPor favor espera un ratu enantes d'intentar otra vuelta entrar a esta páxina.\n\n$1",
+       "generic-pool-error": "Sentímoslo, los sirvidores tán sobrecargaos nestos momentos.\nHai demasiaos usuarios intentando ver esti recursu.\nPor favor espera un momentu enantes d'intentar otra vuelta acceder a esti recursu.",
        "pool-timeout": "Tiempu escosáu esperando pal bloquéu",
        "pool-queuefull": "La cola de trabayu ta enllena",
        "pool-errorunknown": "Fallu desconocíu",
        "edit-gone-missing": "Nun se pudo actualizar la páxina.\nPaez que se desanició.",
        "edit-conflict": "Conflictu d'edición.",
        "edit-no-change": "S'inoró la to edición, porque nun se fizo nengún cambéu nel testu.",
+       "postedit-confirmation-created": "Creóse la páxina.",
+       "postedit-confirmation-restored": "Restauróse la páxina.",
        "postedit-confirmation-saved": "Guardose la edición.",
        "edit-already-exists": "Nun pudo crease una páxina nueva.\nEsta yá esiste.",
        "defaultmessagetext": "Testu predetermináu",
        "prefs-user-pages": "Páxines d'usuariu",
        "prefs-personal": "Perfil del usuariu",
        "prefs-rc": "Cambios recientes",
-       "prefs-watchlist": "Llista de vixilancia",
-       "prefs-watchlist-days": "Númberu de díes qu'amosar na llista de vixilancia:",
+       "prefs-watchlist": "Llista de siguimientu",
+       "prefs-watchlist-days": "Númberu de díes qu'amosar na llista de siguimientu:",
        "prefs-watchlist-days-max": "Máximo $1 {{PLURAL:$1|día|díes}}",
-       "prefs-watchlist-edits": "Númberu d'ediciones qu'amosar na llista de vixilancia espandida:",
+       "prefs-watchlist-edits": "Númberu máximu d'ediciones qu'amosar na llista de siguimientu espandida:",
        "prefs-watchlist-edits-max": "Númberu máximu: 1000",
-       "prefs-watchlist-token": "Marca de la llista de vixilancia:",
+       "prefs-watchlist-token": "Pase de la llista de siguimientu:",
        "prefs-misc": "Varios",
        "prefs-resetpass": "Camudar la conseña",
        "prefs-changeemail": "Camudar el corréu electrónicu",
        "prefs-emailconfirm-label": "Confirmación del corréu:",
        "youremail": "Corréu electrónicu:",
        "username": "Nome d'{{GENDER:$1|usuariu|usuaria}}:",
-       "uid": "ID {{GENDER:$1|del usuariu|de la usuaria}}:",
        "prefs-memberingroups": "{{GENDER:$2|Miembru}} {{PLURAL:$1|del grupu|de los grupos}}:",
        "prefs-registration": "Hora del rexistru:",
        "yourrealname": "Nome real:",
        "right-move": "Treslladar páxines",
        "right-move-subpages": "Treslladar les páxines coles sos subpáxines",
        "right-move-rootuserpages": "Treslladar páxines d'un usuariu root",
+       "right-move-categorypages": "Treslladar les páxines de categoría",
        "right-movefile": "Treslladar archivos",
        "right-suppressredirect": "Nun crear una redireición dende'l nome antiguu cuando se tresllada una páxina",
        "right-upload": "Xubir ficheros",
        "action-createpage": "crear páxines",
        "action-createtalk": "crear páxines d'alderique",
        "action-createaccount": "crear esta cuenta d'usuariu",
+       "action-history": "ver l'historial d'esta páxina",
        "action-minoredit": "marcar esta edición como menor",
        "action-move": "treslladar esta páxina",
        "action-move-subpages": "treslladar esta páxina y les sos subpáxines",
        "action-move-rootuserpages": "treslladar páxines d'un usuariu root",
+       "action-move-categorypages": "treslladar les páxines de categoría",
        "action-movefile": "treslladar esti archivu",
        "action-upload": "xubir esti archivu",
        "action-reupload": "sobreescribir esti archivu esistente",
        "recentchangeslinked-feed": "Cambios rellacionaos",
        "recentchangeslinked-toolbox": "Cambios rellacionaos",
        "recentchangeslinked-title": "Cambios rellacionaos con \"$1\"",
-       "recentchangeslinked-summary": "Esta ye una llista de los caberos cambios fechos nes páxines enllaciaes dende una páxina determinada (o nos miembros d'una categoría determinada). Les páxines de [[Special:Watchlist|la to llista de vixilancia]] tán en '''negrina'''.",
+       "recentchangeslinked-summary": "Esta ye una llista de los caberos cambios fechos nes páxines enllaciaes dende una páxina determinada (o nos miembros d'una categoría determinada).\nLes páxines de [[Special:Watchlist|la to llista de siguimientu]] tán en <strong>negrina</strong>.",
        "recentchangeslinked-page": "Nome de la páxina:",
        "recentchangeslinked-to": "Amosar los cambios de les páxines qu'enllacen en cuenta de los de la páxina dada",
        "upload": "Xubir ficheru",
        "pageswithprop-prophidden-binary": "valor de propiedá binaria tapecíu ($1)",
        "doubleredirects": "Redireiciones dobles",
        "doubleredirectstext": "Esta páxina llista páxines que redireicionen a otres páxines de redireición.\nCada filera contién enllaces a la primer y segunda redireición, asina como al oxetivu de la segunda redireición, que de vezu ye la páxina oxetivu \"real\", onde tendría d'empobinar la primer redireición.\nLes entraes <del>tachaes</del> tan resueltes.",
-       "double-redirect-fixed-move": "[[$1]] foi treslladáu, agora ye una redireición haza [[$2]]",
-       "double-redirect-fixed-maintenance": "Iguando la doble redireición de [[$1]] a [[$2]].",
+       "double-redirect-fixed-move": "[[$1]] treslladóse.\nAnovóse automáticamente y agora redirixe haza [[$2]].",
+       "double-redirect-fixed-maintenance": "Iguando automáticamente la doble redireición de [[$1]] a [[$2]] nuna xera de mantenimientu.",
        "double-redirect-fixer": "Iguador de redireiciones",
        "brokenredirects": "Redireiciones rotes",
        "brokenredirectstext": "Les siguientes redireiciones enllacien a páxines non esistentes:",
        "log-title-wildcard": "Buscar títulos qu'emprimen con esti testu",
        "showhideselectedlogentries": "Amosar/anubrir les entraes del rexistru seleicionaes",
        "allpages": "Toles páxines",
-       "alphaindexline": "$1 a $2",
        "nextpage": "Páxina siguiente ($1)",
        "prevpage": "Páxina anterior ($1)",
        "allpagesfrom": "Amosar páxines qu'entamen por:",
        "emailuserfooter": "Esti corréu electrónicu unviolu $1 a $2 per aciu de la función \"Manda-y un corréu a un usuariu\" de {{SITENAME}}.",
        "usermessage-summary": "Dexar un mensaxe del sistema.",
        "usermessage-editor": "Mensaxería del sistema",
-       "watchlist": "Llista de vixilancia",
-       "mywatchlist": "Llista de vixilancia",
+       "watchlist": "Llista de siguimientu",
+       "mywatchlist": "Llista de siguimientu",
        "watchlistfor2": "Pa $1 $2",
-       "nowatchlist": "La to llista de vixilancia ta vacia.",
-       "watchlistanontext": "Por favor $1 pa ver o editar entraes na to llista de vixilancia.",
+       "nowatchlist": "La to llista de siguimientu ta vacia.",
+       "watchlistanontext": "Tienes d'$1 pa ver o editar entraes de la to llista de siguimientu.",
        "watchnologin": "Non identificáu",
-       "addwatch": "Amestar a la llista de vixilancia",
-       "addedwatchtext": "La páxina \"[[:$1]]\" s'amestó a la to [[Special:Watchlist|llista de vixilancia]].\nLos futuro cambeos nesta páxina y na so páxina d'alderique asociada apaecerán allí.",
-       "removewatch": "Desaniciar de la llista de vixilancia",
-       "removedwatchtext": "Desapuntóse la páxina \"[[:$1]]\" de la [[Special:Watchlist|to llista de vixilancia]].",
+       "addwatch": "Amestar a la llista de siguimientu",
+       "addedwatchtext": "La páxina \"[[:$1]]\" s'amestó a la to [[Special:Watchlist|llista de llista de siguimientu]].\nLos cambeos futuros nesta páxina y na so páxina d'alderique asociada apaecerán allí.",
+       "removewatch": "Desaniciar de la llista de siguimientu",
+       "removedwatchtext": "La páxina \"[[:$1]]\" desanicióse de la [[Special:Watchlist|to llista de siguimientu]].",
        "watch": "Vixilar",
        "watchthispage": "Vixilar esta páxina",
        "unwatch": "Dexar de vixilar",
        "unwatchthispage": "Dexar de vixilar",
        "notanarticle": "Nun ye un artículu",
        "notvisiblerev": "Esborróse la revisión",
-       "watchlist-details": "{{PLURAL:$1|$1 páxina|$1 páxines}} na to llista de vixilancia, ensin cuntar aparte les páxines d'alderique.",
+       "watchlist-details": "{{PLURAL:$1|$1 páxina|$1 páxines}} na to llista de siguimientu, ensin cuntar aparte les páxines d'alderique.",
        "wlheader-enotif": "La notificación per corréu electrónicu ta activada.",
        "wlheader-showupdated": "Les páxines que camudaron dende que les visitasti anteriormente amuesense en '''negrina'''",
        "wlnote2": "Abaxo tan los cambios {{PLURAL:$1|na cabera hora|nes caberes <strong>$1</strong> hores}}, el día $2 a les $3.",
        "wlshowlast": "Amosar les últimes $1 hores $2 díes $3",
-       "watchlist-options": "Opciones de la llista de vixilancia",
+       "watchlist-options": "Opciones de la llista de siguimientu",
        "watching": "Vixilando...",
        "unwatching": "Dexando de vixilar...",
-       "watcherrortext": "Hebo un fallu al camudar la configuración de la to llista de vixilancia pa «$1».",
+       "watcherrortext": "Hebo un error al camudar la configuración de la to llista de siguimientu pa «$1».",
        "enotif_reset": "Marcar toles páxines visitaes",
        "enotif_impersonal_salutation": "Usuariu de {{SITENAME}}",
        "enotif_subject_deleted": "{{GENDER:$2|$2}} desanició la páxina «$1» de {{SITENAME}}",
        "enotif_lastvisited": "Mira en $1 pa ver tolos cambios dende la cabera visita.",
        "enotif_lastdiff": "Mira en $1 pa ver esti cambéu.",
        "enotif_anon_editor": "usuariu anónimu $1",
-       "enotif_body": "Estimáu $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nResume del editor: $PAGESUMMARY $PAGEMINOREDIT\n\nPonte en contautu col editor:\ncorréu: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nEn casu de producise más actividá, nun habrá más notificaciones a nun ser que visites esta páxina teniendo sesión aniciada. Tamién podríes reaniciar na to llista de vixilancia los marcadores de notificación de toles páxines que tengas vixilaes.\n\nEl to abertable sistema de notificación de {{SITENAME}}\n\n--\nPa camudar les preferencies d'avisos per corréu, visita\n{{canonicalurl:{{#special:Preferences}}}}\n\nPa camudar la configuración de la to llista de vixilancia, visita\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nPa desaniciar la páxina de la to llista de vixilancia, visita\n$UNWATCHURL\n\nMás ayuda y sofitu:\n$HELPPAGE",
+       "enotif_body": "Estimáu $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nResume del editor: $PAGESUMMARY $PAGEMINOREDIT\n\nPa comunicate col editor:\ncorréu: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nEn casu de producise más actividá, nun habrá más notificaciones a nun ser que visites esta páxina teniendo sesión aniciada. Tamién podríes reaniciar na to llista de siguimientu los marcadores de notificación de toles páxines que sigues.\n\nEl to abertable sistema de notificación de {{SITENAME}}\n\n--\nPa camudar les preferencies d'avisos per corréu, visita\n{{canonicalurl:{{#special:Preferences}}}}\n\nPa camudar la configuración de la to llista de siguimientu, visita\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nPa desaniciar la páxina de la to llista de siguimientu, visita\n$UNWATCHURL\n\nMás ayuda y sofitu:\n$HELPPAGE",
        "created": "creada",
        "changed": "camudada",
        "deletepage": "Esborrar páxina",
        "ipbnounblockself": "Nun tienes permisu pa desbloquiate tu mesmu",
        "lockdb": "Protexer la base de datos",
        "unlockdb": "Desprotexer la base de datos",
-       "lockdbtext": "Al bloquiar la base de datos suspenderáse la capacidá de tolos usuarios pa editar páxines, camudar les sos preferencies, editar les llistes de vixilancia y otres aiciones que requieran cambios na base de datos. Por favor confirma que ye lo que quies facer, y que vas desbloquiar la base de datos cuando fines col mantenimientu.",
-       "unlockdbtext": "Al desbloquiar la base de datos restauraráse la capacidá de tolos usuarios pa editar páxines, camudar les sos preferencies, editar les sos llistes de vixilancia y otres aiciones que requieren cambios na base de datos. Por favor confirma que ye lo quies facer.",
+       "lockdbtext": "Al bloquiar la base de datos suspenderáse la capacidá de tolos usuarios pa editar páxines, camudar les sos preferencies, editar les llistes de siguimientu y otres aiciones que requieran cambios na base de datos. Por favor confirma que ye lo que quies facer, y que desbloquiarás la base de datos cuando fines col mantenimientu.",
+       "unlockdbtext": "Al desbloquiar la base de datos restauraráse la capacidá de tolos usuarios pa editar páxines, camudar les sos preferencies, editar les sos llistes de siguimientu y otres aiciones que requieren cambios na base de datos. Por favor confirma que ye lo quies facer.",
        "lockconfirm": "Si, quiero candar daveres la base de datos.",
        "unlockconfirm": "Sí, quiero descandar daveres la base de datos.",
        "lockbtn": "Protexer la base de datos",
        "movepagetalktext": "La páxina d'alderique asociada va ser treslladada automáticamente '''a nun ser que:'''\n*Yá esista una páxina d'alderique non vacia col nuevu nome, o\n*Desactives la caxella d'equí baxo.\n\nNestos casos vas tener que treslladar o fusionar la páxina manualmente.",
        "movearticle": "Treslladar la páxina:",
        "moveuserpage-warning": "'''Atención:''' Tas a piques de mover una páxina d'usuariu. Atalanta que namái se va mover la páxina y que ''nun'' se va renomar l'usuariu.",
+       "movecategorypage-warning": "<strong>Avisu:</strong> Tas a piques de treslladar una páxina de categoría. Ten en cuenta que sólo se treslladará la páxina y que cualquier páxina que tuviera na categoría antigua <em>nun</em> se recategorizará na nueva.",
        "movenologintext": "Tienes que ser un usuariu rexistráu y tar [[Special:UserLogin|identificáu]] pa treslladar una páxina.",
        "movenotallowed": "Nun tienes permisu pa mover páxines.",
        "movenotallowedfile": "Nun tienes permisu pa mover ficheros.",
        "cant-move-user-page": "Nun tienes permisu pa treslladar páxines d'usuariu (independientemente de les subpáxines).",
        "cant-move-to-user-page": "Nun tienes permisu pa treslladar una páxina a una páxina d'usuariu (sacante a una subpáxina d'usuariu).",
+       "cant-move-category-page": "Nun tienes permisu pa treslladar páxines de categoría.",
+       "cant-move-to-category-page": "Nun tienes permisu pa treslladar una páxina a una páxina de categoría.",
        "newtitle": "Al títulu nuevu:",
        "move-watch": "Vixilar esta páxina",
        "movepagebtn": "Treslladar la páxina",
        "tooltip-ca-delete": "Desaniciar esta páxina",
        "tooltip-ca-undelete": "Restaura les ediciones feches nesta páxina enantes de que fuera esborrada",
        "tooltip-ca-move": "Tresllada esta páxina",
-       "tooltip-ca-watch": "Amiesta esta páxina na to llista de vixilancia",
-       "tooltip-ca-unwatch": "Desaniciar esta páxina de la to llista de vixilancia",
+       "tooltip-ca-watch": "Amiesta esta páxina a la to llista de siguimientu",
+       "tooltip-ca-unwatch": "Desaniciar esta páxina de la to llista de siguimientu",
        "tooltip-search": "Busca en {{SITENAME}}",
        "tooltip-search-go": "Dir a una páxina con esti nome exautu si esiste",
        "tooltip-search-fulltext": "Busca páxines con esti testu",
        "tooltip-preview": "Vista previa de los cambios, ¡usa esto enantes de guardar!",
        "tooltip-diff": "Amuesa los cambios que fixisti nel testu.",
        "tooltip-compareselectedversions": "Ver les diferencies ente les dos revisiones seleicionaes d'esta páxina.",
-       "tooltip-watch": "Amiesta esta páxina a la to llista de vixilancia",
+       "tooltip-watch": "Amiesta esta páxina a la to llista de siguimientu",
        "tooltip-watchlistedit-normal-submit": "Desaniciar títulos",
        "tooltip-watchlistedit-raw-submit": "Anovar llista de vixilancia",
        "tooltip-recreate": "Vuelve a crear la páxina magar que se tenga esborrao",
        "newimages-summary": "Esta páxina especial amuesa los caberos archivos xubíos.",
        "newimages-legend": "Peñera",
        "newimages-label": "Nome d'archivu (o una parte d'él):",
-       "showhidebots": "($1 bots)",
+       "newimages-showbots": "Ver les xubíes de los bots",
        "noimages": "Nun hai nada que ver.",
        "ilsubmit": "Buscar",
        "bydate": "por fecha",
        "size-gigabytes": "$1 XB",
        "lag-warn-normal": "Los cambios más nuevos que $1 {{PLURAL:$1|segundu|segundos}} seique nun s'amuesen nesta llista.",
        "lag-warn-high": "Pola mor d'un importante retrasu nel sirvidor de la base de datos, los cambios más nuevos que $1 {{PLURAL:$1|segundu|segundos}} seique nun s'amuesen nesta llista.",
-       "watchlistedit-normal-title": "Editar la llista de vixilancia",
-       "watchlistedit-normal-legend": "Eliminar títulos de la llista de vixilancia",
-       "watchlistedit-normal-explain": "Abaxo s'amuesen los títulos de la to llista de vixilancia.\nPa desaniciar un títulu, marca la caxella d'al llau d'él, y calca \"{{int:Watchlistedit-normal-submit}}\".\nTamién pues [[Special:EditWatchlist/raw|editar la llista en bruto]].",
+       "watchlistedit-normal-title": "Editar la llista de siguimientu",
+       "watchlistedit-normal-legend": "Quitar títulos de la llista de siguimientu",
+       "watchlistedit-normal-explain": "Abaxo s'amuesen los títulos de la to llista de siguimientu.\nPa desaniciar un títulu, marca la caxella cabo d'él, y calca \"{{int:Watchlistedit-normal-submit}}\".\nTamién pues [[Special:EditWatchlist/raw|editar la llista ensin formatu]].",
        "watchlistedit-normal-submit": "Desaniciar títulos",
-       "watchlistedit-normal-done": "{{PLURAL:$1|Eliminóse un títulu|Elimináronse $1 títulos}} de la to llista de vixilancia:",
-       "watchlistedit-raw-title": "Editar la llista de vixilancia en bruto",
-       "watchlistedit-raw-legend": "Editar la llista de vixilancia en bruto",
-       "watchlistedit-raw-explain": "Abaxo s'amuesen los títulos de la to llista de vixilancia, y puen editase amestándolos o desaniciándolos de la llista; un títulu per llinia.\nN'acabando, calca \"{{int:Watchlistedit-raw-submit}}\".\nTamién pues [[Special:EditWatchlist|usar l'editor estándar]].",
+       "watchlistedit-normal-done": "{{PLURAL:$1|Desanicióse un títulu|Desaniciáronse $1 títulos}} de la to llista de siguimientu:",
+       "watchlistedit-raw-title": "Editar la llista de siguimientu (ensin formatu)",
+       "watchlistedit-raw-legend": "Editar la llista de siguimientu (ensin formatu)",
+       "watchlistedit-raw-explain": "Abaxo s'amuesen los títulos de la to llista de siguimientu, y puen editase amestándolos o desaniciándolos de la llista;\nun títulu por llinia.\nN'acabando, calca \"{{int:Watchlistedit-raw-submit}}\".\nTamién pues [[Special:EditWatchlist|usar l'editor estándar]].",
        "watchlistedit-raw-titles": "Títulos:",
-       "watchlistedit-raw-submit": "Anovar llista de vixilancia",
-       "watchlistedit-raw-done": "La to llista de vixilancia foi actualizada.",
+       "watchlistedit-raw-submit": "Anovar la llista de siguimientu",
+       "watchlistedit-raw-done": "Anovóse la to llista de siguimientu.",
        "watchlistedit-raw-added": "{{PLURAL:$1|Añadióse un títulu|Añadiéronse $1 títulos}}:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|Eliminóse ún títulu|Elimináronse $1 títulos}}:",
+       "watchlistedit-clear-title": "Llimpióse la llista de siguimientu",
+       "watchlistedit-clear-legend": "Llimpiar la llista de siguimientu",
+       "watchlistedit-clear-explain": "Desaniciaránse tolos títulos de la to llista de siguimientu",
+       "watchlistedit-clear-titles": "Títulos:",
+       "watchlistedit-clear-submit": "Llimpiar la llista de siguimientu (¡Esto ye permanente!)",
+       "watchlistedit-clear-done": "Llimpióse la to llista de siguimientu.",
+       "watchlistedit-clear-removed": "{{PLURAL:$1|Desanicióse 1 títulu|Desaniciáronse $1 títulos}}:",
+       "watchlistedit-too-many": "Hai demasiaes páxines p'amosales equí.",
+       "watchlisttools-clear": "Llimpiar la llista de siguimientu",
        "watchlisttools-view": "Ver cambios relevantes",
-       "watchlisttools-edit": "Ver y editar la llista de vixilancia",
-       "watchlisttools-raw": "Editar la llista de vixilancia (en bruto)",
+       "watchlisttools-edit": "Ver y editar la llista de siguimientu",
+       "watchlisttools-raw": "Editar la llista de siguimientu (ensin formatu)",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|alderique]])",
        "unknown_extension_tag": "Etiqueta d'estensión \"$1\" desconocida",
        "duplicate-defaultsort": "Avisu: La clave d'ordenación predeterminada \"$2\" anula la clave d'ordenación anterior \"$1\".",
        "htmlform-no": "Non",
        "htmlform-yes": "Sí",
        "htmlform-chosen-placeholder": "Seleicione una opción",
+       "htmlform-cloner-create": "Amestar más",
+       "htmlform-cloner-delete": "Desaniciar",
+       "htmlform-cloner-required": "Necesítase polo menos un valor.",
        "sqlite-has-fts": "$1 con sofitu pa busca de testu completu",
        "sqlite-no-fts": "$1 ensin sofitu pa busca de testu completu",
        "logentry-delete-delete": "$1 {{GENDER:$2|desanició}} la páxina $3",
index 502055f..a93e2de 100644 (file)
        "newimages-summary": "Batu aptafu bu va ironokaf kalvajayan iyeltakeem nedir.",
        "newimages-legend": "Espara",
        "newimages-label": "Iyeltak (ok ki) :",
-       "showhidebots": "($1 stiernik)",
        "noimages": "Mecoba rowina",
        "ilsubmit": "Aneyara",
        "bydate": "kan evla",
index 8f10133..bd8c2bf 100644 (file)
        "newimages": "Yeni faylların siyahısı",
        "newimages-legend": "Filtrlər",
        "newimages-label": "Faylın (və ya onun bir hissəsinin) adı:",
-       "showhidebots": "($1 bot redaktə)",
        "noimages": "Heç nəyi görməmək.",
        "ilsubmit": "Axtar",
        "bydate": "tarixə görə",
index ce002ab..b51d2b2 100644 (file)
                        "아라"
                ]
        },
-       "tog-underline": "باغلانتیلارین آلتینی خطله:",
-       "tog-hideminor": "سÙ\88Ù\86 Ø¯Û\8cÛ\8cØ´Û\8cÚ©Ù\84Û\8cÚ©Ù\84ردÙ\87 Ú©Û\8cÚ\86Û\8cÚ©â\80\8cلری گیزلت",
-       "tog-hidepatrolled": "نظارتلنمیش دَییشیکلیکلری سون دییشیکلیکلرده گیزلت",
-       "tog-newpageshidepatrolled": "نظارتلنمیش صحیفه‌لری یئنی صحیفه‌لر سیاهی‌سیندان گیزلت",
-       "tog-extendwatchlist": "ایزله‌دیکلری، بوتون دیشیکلیکلری گؤسترمک اوچون گئنیشلندیر",
+       "tog-underline": "باغلانتیلارین آلتینی خطله:",
+       "tog-hideminor": "سÙ\88Ù\92Ù\86 Ø¯Û\8cÛ\8cØ´Û\8cÚ©Ù\84Û\8cÚ©Ù\84ردÙ\87 Ú©Û\8cÚ\86Û\8cÚ©لری گیزلت",
+       "tog-hidepatrolled": "سوْن دییشیکلیکلرده نظارتلنمیش دَییشیکلیکلری گیزلت",
+       "tog-newpageshidepatrolled": "نظارتلنمیش صحیفه‌لری یئنی صحیفه‌لر لیستین‌دن گیزلت",
+       "tog-extendwatchlist": "گؤزله‌دیکلری، یالنیز یئنیلر اۆچون یوْخ، بۆتون دییشیکلیکلری گؤسترمک اۆچون، گئنیشلندیر.",
        "tog-usenewrc": "دَییشیکلیکلری سون دَییشیکلیکلر صحیفه‌سینده ایزله‌دیکلر صحیفه‌سینده گروپ‌لا (جاوااسکریپت لازیم‌دیر)",
-       "tog-numberheadings": "باشلیق‌لاری اوتوماتیک نومره‌له",
-       "tog-showtoolbar": "دَییشدیرمه آراج چوبوغونو گؤستر",
-       "tog-editondblclick": "صحیفه‌‌لری ایکی کلیک‌ده دَییشدیر",
-       "tog-editsectiononrightclick": "بؤلوم‌لرین دیشدیرمه‌سینی، باشلیقلارین اوزرینده ساغ‌کلیک ائتمک‌له ایجازه وئر",
-       "tog-watchcreations": "ياراتدیغیم صحیفه‌‌لری و يوکله‌دیگیم فايل‌لاری ایزله‌مه‌لریمه آرتیر",
-       "tog-watchdefault": "دَییشدیردیگیم صحیفه‌‌لری و فايل‌لاری ایزله‌دیکلریمه آرتیر",
-       "tog-watchmoves": "داشیدیغیم صحیفه‌‌لری و فايل‌لاری ایزله‌دیکلریمه آرتیر",
-       "tog-watchdeletion": "سیلدیگیم صحیفه‌‌لری و فايل‌لاری ایزله‌دیکلریمه آرتیر",
-       "tog-minordefault": "دیفالت اولاراق بوتون دَییشدیر‌مه‌لریمی کیچیک دَییشدیر کیمی نیشانلا",
-       "tog-previewontop": "اؤن‌گؤستریشی يازماق قوتوسوندان قاباق گؤستر",
+       "tog-numberheadings": "باشلیقلاری اوْتوماتیک نۆمره‌له",
+       "tog-showtoolbar": "دَییشدیرمک آراج-چۇبوغونو گؤستر",
+       "tog-editondblclick": "صحیفه‌‌لری ایکی کیلیک‌ده دَییشدیر",
+       "tog-editsectiononrightclick": "بؤلوم‌لرین دَییشدیرمه‌سینی، باشلیقلارین اۆزرینده ساغ‌کلیک ائتمک‌له ایجازه وئر",
+       "tog-watchcreations": "ياراتدیغیم صحیفه‌‌لری و يۆکله‌دیگیم فايل‌لاری، گؤزله‌دیکلریمه آرتیر",
+       "tog-watchdefault": "دَییشدیردیگیم صحیفه‌‌لری و فايل‌لاری، گؤزله‌دیکلریمه آرتیر",
+       "tog-watchmoves": "داشیدیغیم صحیفه‌‌لری و فايل‌لاری گؤزله‌دیکلریمه آرتیر",
+       "tog-watchdeletion": "سیلدیگیم صحیفه‌‌لری و فايل‌لاری گؤزله‌دیکلریمه آرتیر",
+       "tog-minordefault": "وارساییلان اوْلاراق، بۆتون دَییشدیر‌مه‌لری کیچیک کیمی نیشانلا",
+       "tog-previewontop": "اؤن‌گؤستریشی، يازماق قۇتوسوندان قاباق گؤستر",
        "tog-previewonfirst": "ایلک دَییشدیرمه‌ده اؤن‌گؤستریشی گؤستر",
-       "tog-enotifwatchlistpages": "ایزله‌دیکلریم‌ده اولان صحیفه یوخسا فایل دَییشدیریلنده، منه ایمیل گؤندر",
+       "tog-enotifwatchlistpages": "گؤزله‌دیکلریم‌ده اولان بیر صحیفه یا فایل دَییشدیریلنده، منه ایمیل گؤندر",
        "tog-enotifusertalkpages": "دانیشیق صحیفه‌‌م دَییشدیریلنده منه ایمیل گؤندر",
        "tog-enotifminoredits": "صحیفه‌لرده و فایل‌لاردا کیچیک دَییشیکلیکلر اولسا دا منه ایمیل گؤندر",
-       "tog-enotifrevealaddr": "Ù\85Ù\86Û\8cÙ\85 Ø§Û\8cÙ\85Û\8cÙ\84 Ø¢Ø¯Ø±Ø³Û\8cÙ\85Û\8c Ø®Ø¨Ø± Ù\88ئرÙ\85Ù\87 ایمیل‌لرینده گؤستر",
-       "tog-shownumberswatching": "ایزله‌ين ایستیفاده‌چیلرین سایینی گؤستر",
+       "tog-enotifrevealaddr": "Ù\85Ù\86Û\8cÙ\85 Ø§Û\8cÙ\85Û\8cÙ\84 Ø¢Ø¯Ø±Ø³Û\8cÙ\85Û\8c Ø¨Û\8cÙ\84دÛ\8cرÛ\8cØ´ ایمیل‌لرینده گؤستر",
+       "tog-shownumberswatching": "گؤزله‌ین ایستیفاده‌چیلرین سایینی گؤستر",
        "tog-oldsig": "ایندی‌کی ایمضا:",
-       "tog-fancysig": "ویکی متن کیمی ایمضا (اوتوماتیک باغلانتی‌سیز)",
-       "tog-uselivepreview": "دیری اؤن‌گؤستریش ایشلت (تست مرحله‌سینده)",
+       "tog-fancysig": "ایمضانی ویکی-متن کیمی نظره آل (اوْتوماتیک باغلانتی‌سیز)",
+       "tog-uselivepreview": "دیری اؤن‌گؤستریش ایشلت (تِست مرحله‌سینده)",
        "tog-forceeditsummary": "دَییشیکلیک قیساسی بوش قالاندا منی بیلدیر",
-       "tog-watchlisthideown": "منیم دَییشیکلیکلریمی ایزله‌دیکلردن گیزلت",
-       "tog-watchlisthidebots": "بوت دَییشیکلیکلرینی ایزله‌دیکلردن گیزلت",
-       "tog-watchlisthideminor": "کیچیک دَییشیکلیکلری ایزله‌دیکلردن گیزلت",
-       "tog-watchlisthideliu": "گیرمیش ایستیفاده‌چیلرین دَییشیکلیکلرینی ایزله‌دیکلردن گیزلت",
-       "tog-watchlisthideanons": "تانینمامیش ایستیفاده‌چیلرین دَییشیکلیکلرینی ایزله‌دیکلردن گیزلت",
-       "tog-watchlisthidepatrolled": "نظارتلنمیش دَییشیکلیکلری ایزله‌دیکلردن گیزلت",
-       "tog-ccmeonemails": "باشÙ\82ا Ø§Û\8cستÛ\8cÙ\81ادÙ\87â\80\8cÚ\86Û\8cÙ\84رÙ\87 Ú¯Ø¤Ù\86دردÛ\8cÚ¯Û\8cÙ\85 Ø§Û\8cÙ\85Û\8cÙ\84â\80\8cÙ\84رÛ\8cÙ\86 Ú©Ù\88پیلرینی منه گؤندر",
-       "tog-diffonly": "موقاییسه‌لر آلیتندا صحیفه‌لرین ایچینده‌کیلرینی گؤسترمه",
+       "tog-watchlisthideown": "منیم دَییشیکلیکلریمی گؤزله‌دیکلردن گیزلت",
+       "tog-watchlisthidebots": "بوْت دَییشیکلیکلرینی گؤزله‌دیکلردن گیزلت",
+       "tog-watchlisthideminor": "کیچیک دَییشیکلیکلری گؤزله‌دیکلردن گیزلت",
+       "tog-watchlisthideliu": "گیرمیش ایستیفاده‌چیلرین دَییشیکلیکلرینی گؤزله‌دیکلردن گیزلت",
+       "tog-watchlisthideanons": "تانینمامیش ایستیفاده‌چیلرین دَییشیکلیکلرینی گؤزله‌دیکلردن گیزلت",
+       "tog-watchlisthidepatrolled": "نظارتلنمیش دَییشیکلیکلری گؤزله‌دیکلردن گیزلت",
+       "tog-ccmeonemails": "Ø¢Û\8cرÛ\8c Ø§Û\8cستÛ\8cÙ\81ادÙ\87â\80\8cÚ\86Û\8cÙ\84رÙ\87 Ú¯Ø¤Ù\86دردÛ\8cÚ¯Û\8cÙ\85 Ø§Û\8cÙ\85Û\8cÙ\84â\80\8cÙ\84رÛ\8cÙ\86 Ú©Ù\88Ù\92پیلرینی منه گؤندر",
+       "tog-diffonly": "مۇقاییسه‌لر آلیتندا صحیفه‌لرین ایچینده‌کیلرینی گؤسترمه",
        "tog-showhiddencats": "گیزلی بؤلمه‌لری گؤستر",
        "tog-norollbackdiff": "قایتاراندان سونرا موقاییسه گؤسترمه",
-       "tog-useeditwarning": "دÙ\8eÛ\8cÛ\8cشدÛ\8cرÙ\85Ù\87 ØµØ­Û\8cÙ\81Ù\87â\80\8cسÛ\8cÙ\86دÙ\87 Ú\86Û\8cØ®Û\8cØ´ Ø²Ø§Ù\85اÙ\86Û\8cØ\8c Ø¢Ú\86Û\8cÙ\82 Ù\88 Ù\82ئÛ\8cد Ø§Ù\88Ù\84Ù\85اÛ\8cاÙ\86 Ø¯Ù\8eÛ\8cÛ\8cشدÛ\8cرÙ\85Ù\87 ØµØ­Û\8cÙ\81Ù\87 Ù\88ارسا Ù\85Ù\86Ù\87 Ù\87شدار Ù\88ئرÛ\8cÙ\84سÛ\8cÙ\86",
+       "tog-useeditwarning": "دÙ\8eÛ\8cÛ\8cشدÛ\8cرÙ\85Ù\87 ØµØ­Û\8cÙ\81Ù\87â\80\8cسÛ\8cÙ\86دÙ\86 Ú\86Û\8cخاÙ\86داØ\8c Ù\82ئÛ\8cد Ø§Ø¦Ø¯Û\8cÙ\84Ù\85Ù\87â\80\8cÙ\85Û\8cØ´ Ø¯Ù\8eÛ\8cÛ\8cشدÛ\8cرÙ\85Ù\87 Ø§Ù\88Ù\92Ù\84ساØ\8c Ù\85Ù\86Ù\87 Ù\87شدار Ù\88ئر",
        "tog-prefershttps": "هر زامان گیریش ائتمگه امن باغلانتی ایشلت",
-       "underline-always": "همیشه",
+       "underline-always": "هر زامان",
        "underline-never": "هئچ واخت",
-       "underline-default": "دیفالت قابیق یوخسا براوزر",
-       "editfont-style": "دَییشدیرمه قوتوطونون فونت نؤوعو:",
-       "editfont-default": "براوزر دیفالتی",
-       "editfont-monospace": "ثابیت آرالی فونت",
-       "editfont-sansserif": "بوجاق‌سیز فونت",
-       "editfont-serif": "بوجاق‌لی فونت",
-       "sunday": "سود گونو(یکشنبه)",
-       "monday": "دوزگونو(دوشنبه)",
-       "tuesday": "آرا گون(سه‌شنبه)",
-       "wednesday": "اوْدگونو(چهارشنبه)",
-       "thursday": "سوگونو(پنجشنبه)",
-       "friday": "جÙ\88Ù\85ا(Ø¢Û\8cÙ\86Û\8câ\80\8cÚ¯Ù\88Ù\86)",
-       "saturday": "يئل‌گونو(شنبه)",
-       "sun": "سود گونو(یکشنبه)",
-       "mon": "دوزگونو(دوشنبه)",
-       "tue": "سÙ\87â\80\8cØ´Ù\86بÙ\87(آرا Ú¯Ù\88Ù\86)",
+       "underline-default": "وارساییلان قابیق یا براوزِر",
+       "editfont-style": "دَییشدیرمه قۇتوسونون فوْنتی:",
+       "editfont-default": "براوزِر وارساییلانی",
+       "editfont-monospace": "ثابÛ\8cت Ø¢Ø±Ø§Ù\84Û\8c Ù\81Ù\88Ù\92Ù\86ت",
+       "editfont-sansserif": "بۇجاق‌سیز فوْنت",
+       "editfont-serif": "بۇجاق‌لی فوْنت",
+       "sunday": "سۆدگونو (یکشنبه)",
+       "monday": "دۇزگونو (دوشنبه)",
+       "tuesday": "آراگون (سه‌شنبه)",
+       "wednesday": "اوْدگونو (چهارشنبه)",
+       "thursday": "سۇگونو (پنجشنبه)",
+       "friday": "Ø¢Û\8cÙ\86Û\8câ\80\8cÚ¯Ù\88Ù\86 (جÛ\86Ù\85عÙ\87)",
+       "saturday": "يئل‌گونو (شنبه)",
+       "sun": "سۆدگونو (یکشنبه)",
+       "mon": "دۇزگونو (دوشنبه)",
+       "tue": "آراگÙ\88Ù\86 (سÙ\87â\80\8cØ´Ù\86بÙ\87)",
        "wed": "اوْدگونو (چهارشنبه)",
-       "thu": "سوگونو(پنجشنبه)",
-       "fri": "آینی‌گون(جوما)",
-       "sat": "يئل‌گونو(شنبه)",
+       "thu": "سۇگونو (پنجشنبه)",
+       "fri": "آینی‌گون (جۆمعه)",
+       "sat": "يئل‌گونو (شنبه)",
        "january": "ژانویه",
        "february": "فئوریه",
        "march": "مارس",
        "july": "ژولای",
        "august": "آقوست",
        "september": "سئپتامبر",
-       "october": "اوکتوبر",
-       "november": "نووامبر",
+       "october": "اوْکتوبر",
+       "november": "Ù\86Ù\88Ù\92Ù\88اÙ\85بر",
        "december": "دئسامبر",
        "january-gen": "ژانویه",
-       "february-gen": "فوریه",
+       "february-gen": "فئوریه",
        "march-gen": "مارس",
        "april-gen": "آوریل",
-       "may-gen": "مِی",
+       "may-gen": "مئی",
        "june-gen": "ژوئن",
        "july-gen": "جولای",
        "august-gen": "آقوست",
        "jul": "ژولای",
        "aug": "آقوست",
        "sep": "سئپتامبر",
-       "oct": "اوکتوبر",
-       "nov": "نووامبر",
+       "oct": "اوْکتوبر",
+       "nov": "Ù\86Ù\88Ù\92Ù\88اÙ\85بر",
        "dec": "دئسامبر",
        "january-date": "ژانویه‌نین $1-ی",
-       "february-date": "$1 فئوریه",
+       "february-date": "فئوریه‌نین $1-ی",
        "march-date": "مارسین $1-ی",
        "april-date": "آوریلین $1-ی",
-       "may-date": "$1 مئی",
+       "may-date": "مئیین $1-ی",
        "june-date": "ژوئنین $1-ی",
-       "july-date": "$1 ژولای",
-       "august-date": "$1 آقوست",
-       "september-date": "$1 سئپتامبر",
-       "october-date": "$1 اوکتوبر",
-       "november-date": "$1 نووامبر",
-       "december-date": "$1 دئسامبر",
+       "july-date": "ژولایین $1-ی",
+       "august-date": "آقوستون $1-ی",
+       "september-date": "سئپتامبرین $1-ی",
+       "october-date": "اوْکتوبرون $1-ی",
+       "november-date": "نوْوامبرین $1-ی",
+       "december-date": "دئسامبرین $1-ی",
        "pagecategories": "{{PLURAL:$1|بؤلمه|بؤلمه‌لر}}",
-       "category_header": "«$1» بؤلمه‌سین‌ده‌کی مقاله‌لر",
-       "subcategories": "آلت بؤلمه‌لر",
-       "category-media-header": "«$1» بؤلمه‌سینده مئدیا",
-       "category-empty": "''بو بؤلمه‌نین ایندی فایل یوخسا مئدیاسی یوخدور.''",
+       "category_header": "«$1» بؤلمه‌سین‌ده صحیفه‌لر",
+       "subcategories": "آلتبؤلمه‌لر",
+       "category-media-header": "«$1» بؤلمه‌سینده مئدیا",
+       "category-empty": "<em>بو بؤلمه‌ده ایندی فایل یا مئدیا یوْخدور.</em>",
        "hidden-categories": "{{PLURAL:$1|گیزلی بؤلمه|گیزلی بؤلمه‌لر}}",
        "hidden-category-category": "گیزلی بؤلمه‌لر",
-       "category-subcat-count": "بو بؤلمه‌ده {{PLURAL:$2|یالنیز|}} آشاغیداکی {{PLURAL:$1|بیر|$1}} آلت‌بؤلمه وار؛ بو بؤلمه‌نین جمعاً $2 آلت‌بؤلمه‌سی وار.",
-       "category-subcat-count-limited": "بو بؤلمه‌ده آشاغیداکی {{PLURAL:$1|آلت‌بؤلمه|$1 آلت‌بؤلمه}} واردیر.",
-       "category-article-count": "بو بؤلمه‌ده {{PLURAL:$2|یالنیز|}} آشاغیداکی {{PLURAL:$1|بیر|$1}} صحیفه وار؛ بو بؤلمه‌نین جمعاً $2 صحیفه‌سی وار.",
-       "category-article-count-limited": "بو بؤلمه‌ده، آشاغیداکی {{PLURAL:$1|یارپاق|$1 یارپاق}} واردیر.",
-       "category-file-count": "بو بؤلمه‌ده {{PLURAL:$2|یالنیز|}} آشاغیداکی {{PLURAL:$1|بیر|$1}} فایل وار؛ بو بؤلمه‌نین جمعاً $2 فایلی وار.",
-       "category-file-count-limited": "بؤلمه‌ده، بو {{PLURAL:$1|فایل|$1 فایل}} واردیر.",
+       "category-subcat-count": "{{PLURAL:$2|بۇ بؤلمه‌ده یالنیز آشاغیداکی آلت‌بؤلمه واردیر.|بۇ بؤلمه‌ده، توپلام $2-دن، آشاغیداکی {{PLURAL:$1|آلت‌بؤلمه|$1 آلت‌بؤلمه}} واردیر.}}",
+       "category-subcat-count-limited": "بۇ بؤلمه‌ده آشاغیداکی {{PLURAL:$1|آلت‌بؤلمه|$1 آلت‌بؤلمه}} واردیر.",
+       "category-article-count": "{{PLURAL:$2|بۇ بؤلمه‌ده یالنیز آشاغیداکی صحیفه واردیر.|بۇ بؤلمه‌ده توْپلام $2 صحیفه‌دن، آشاغیداکی {{PLURAL:$1|صحیفه|$1 صحیفه}} واردیر.}}",
+       "category-article-count-limited": "بۇ بؤلمه‌ده، آشاغیداکی {{PLURAL:$1|صحیفه|$1 صحیفه}} واردیر.",
+       "category-file-count": "{{PLURAL:$2|بۇ بؤلمه‌ده یالنیز آشاغیداکی فایل واردیر.|بۇ بؤلمه‌ده توْپلام $1-دن، آشاغیداکی {{PLURAL:$1|فایل|$1 فایل}} واردیر.}}",
+       "category-file-count-limited": "بۇ بؤلمه‌ده، آشاغیداکی {{PLURAL:$1|فایل|$1 فایل}} واردیر.",
        "listingcontinuesabbrev": "(قالانی)",
-       "index-category": "ایندئکس‌لشدیریلمیش یارپاقلار",
-       "noindex-category": "ایندئکس‌لشدیریلمه‌ین یارپاقلار",
-       "broken-file-category": "Ù\81اÛ\8cÙ\84â\80\8cÙ\84ارا Ù\82Û\8cرÛ\8cÙ\84Ù\85Û\8cØ´ Ø¨Ø§ØºÙ\84اÙ\86تÛ\8cÙ\84ارÛ\8c Ø§Ù\88Ù\84اÙ\86 Û\8cارپاÙ\82Ù\84ار",
-       "about": "گؤره",
-       "article": "ایچری‌لی یارپاق",
+       "index-category": "ایندئکس‌لشدیریلمیش صحیفه‌لر",
+       "noindex-category": "ایندئکس‌لشدیریلمه‌میش صحیفه‌لر",
+       "broken-file-category": "Ù\82Û\8cرÛ\8cÙ\84Ù\85Û\8cØ´ Ù\81اÛ\8cÙ\84 Ø¨Ø§ØºÙ\84اÙ\86تÛ\8cÙ\84ارÛ\8c Ø§Ù\88Ù\92Ù\84اÙ\86 ØµØ­Û\8cÙ\81Ù\87â\80\8cÙ\84ر",
+       "about": "حاقیندا",
+       "article": "ایچری‌لی صحیفه",
        "newwindow": "(یئنی پنجره‌ده آچیلیر)",
-       "cancel": "Ù\84غÙ\88 Ø§Ø¦Øª",
+       "cancel": "Ù\88ازگئÚ\86",
        "moredotdotdot": "داها...",
-       "morenotlisted": "بو لیست کامل دئییل.",
-       "mypage": "مقاله",
+       "morenotlisted": "بۇ لیست کامل دئییل.",
+       "mypage": "صحیفه",
        "mytalk": "دانیشیق",
        "anontalk": "بو آی‌پی آدرسینه دانیشیق",
-       "navigation": "دولانماق",
+       "navigation": "دÙ\88Ù\92Ù\84اÙ\86Ù\85اÙ\82",
        "and": "&#32;و",
        "qbfind": "تاپ",
-       "qbbrowse": "گؤزدÙ\86 Ú¯Ø¦Ú\86Û\8cد",
+       "qbbrowse": "گؤزدÙ\86 Ú¯Ø¦Ú\86Û\8cرت",
        "qbedit": "دَییشدیر",
-       "qbpageoptions": "بو صحیفه‌‌",
-       "qbmyoptions": "منیم صحیفه‌‌لریم",
-       "faq": "چوخ سوروشولان سواللار",
-       "faqpage": "Project:چوخلو سوروشولان سورغولار",
-       "vector-action-addsection": "قونو آرتیر",
+       "qbpageoptions": "بۇ صحیفه‌‌",
+       "qbmyoptions": "صحیفه‌‌لریم",
+       "faq": "چوْخ سوْروشولان سوْال‌لار",
+       "faqpage": "Project:چوْخ سوْروشولان سوْال‌لار",
+       "vector-action-addsection": "Ù\82Ù\88Ù\92Ù\86Ù\88 Ø¢Ø±ØªÛ\8cر",
        "vector-action-delete": "سیل",
-       "vector-action-move": "آدÛ\8cÙ\86Û\8c Ø¯Ù\8aÙ\8eÛ\8cشدÛ\8cر",
-       "vector-action-protect": "قورو",
+       "vector-action-move": "داشÛ\8c",
+       "vector-action-protect": "قوْرو",
        "vector-action-undelete": "سیلمگی قایتار",
-       "vector-action-unprotect": "قوروماغی دَییشدیر",
+       "vector-action-unprotect": "قوْروماغی دَییشدیر",
        "vector-view-create": "یارات",
        "vector-view-edit": "دَییشدیر",
        "vector-view-history": "گئچمیشه باخ",
-       "vector-view-view": "اوخو",
+       "vector-view-view": "اوْخو",
        "vector-view-viewsource": "قایناغا باخ",
-       "actions": "ایشلر",
-       "namespaces": "آدلار فضاسی",
+       "actions": "چالیشمالار",
+       "namespaces": "آد فضالاری",
        "variants": "واریانتلار",
-       "navigation-heading": "دولانماق مِنوسو",
+       "navigation-heading": "دÙ\88Ù\92Ù\84اÙ\86Ù\85اÙ\82 Ù\85Ù\90Ù\86Ù\88سÙ\88",
        "errorpagetitle": "خطا",
        "returnto": "$1-ه قاییت.",
        "tagline": "{{SITENAME}} سایتیندان",
        "searcharticle": "گئت",
        "history": "صحیفه‌‌نین گئچمیشی",
        "history_short": "گئچمیش",
-       "updatedmarker": "سÙ\88Ù\86 Ø¨Ø§Ø®Û\8cØ´Û\8cÙ\85داÙ\86 Ø¨Ù\88Û\8cاÙ\86اØ\8c Û\8cئÙ\86Û\8câ\80\8cÙ\84Ø´یب‌دیر",
-       "printableversion": "چاپ ائتمه‌لی نوسخه",
+       "updatedmarker": "سÙ\88Ù\92Ù\86 Ø¨Ø§Ø®Û\8cØ´Û\8cÙ\85داÙ\86 Ø³Ù\88Ù\92Ù\86را Û\8cئÙ\86Û\8câ\80\8cÙ\84Ù\86یب‌دیر",
+       "printableversion": "یازدیریرا بیلن نۆسخه",
        "permalink": "قالان باغلانتی",
        "print": "یازدیر",
        "view": "باخ",
        "edit": "دَییشدیر",
        "create": "یارات",
-       "editthispage": "بو صحیفه‌‌نی دَییشدیر",
-       "create-this-page": "بو صحیفه‌‌نی يارات",
+       "editthispage": "بۇ صحیفه‌‌نی دَییشدیر",
+       "create-this-page": "بۇ صحیفه‌‌نی يارات",
        "delete": "سیل",
-       "deletethispage": "بو صحیفه‌‌نی سیل",
-       "undeletethispage": "بو صحیفه‌نی دیریلت",
-       "undelete_short": "{{PLURAL:$1|بیر دَییشیکلیگی|$1 دَییشیکلیگی}} برپا ائت",
-       "viewdeleted_short": "{{PLURAL:$1|بیر|$1}} سیلینمیش دَییشیکلیگی گؤستر",
-       "protect": "قوروماق",
+       "deletethispage": "بۇ صحیفه‌‌نی سیل",
+       "undeletethispage": "بۇ صحیفه‌نی دیریلت",
+       "undelete_short": "{{PLURAL:$1|بیر دَییشیکلیگی|$1 دَییشیکلیگی}} قایتار",
+       "viewdeleted_short": "{{PLURAL:$1|بیر|$1}} سیلینمیش دَییشیکلیگه باخ",
+       "protect": "قوْرو",
        "protect_change": "ديَیشدیر",
-       "protectthispage": "بو صحیفه‌‌نی قورو",
-       "unprotect": "قوروماغی دَییشدیر",
-       "unprotectthispage": "بو یارپاغین قوروماسینی دَییشدیر",
+       "protectthispage": "بۇ صحیفه‌‌نی قوْرو",
+       "unprotect": "قوْروماغی دَییشدیر",
+       "unprotectthispage": "بۇ صحیفه‌نین قوْروماسینی دَییشدیر",
        "newpage": "يئنی صحیفه‌‌",
-       "talkpage": "بو صحیفه‌یه گؤره دانیشیق آپارین",
+       "talkpage": "بۇ صحیفه‌نی دانیش",
        "talkpagelinktext": "دانیشیق",
        "specialpage": "اؤزل صحیفه",
        "personaltools": "شخصی آراجلار",
        "postcomment": "يئنی بؤلوم",
-       "articlepage": "مقاله‌یه باخین",
+       "articlepage": "ایچری‌لی صحیفه‌یه باخ",
        "talk": "دانیشیق",
        "views": "گؤرونوشلر",
        "toolbox": "آراجلار",
-       "userpage": "ایستیفاده‌چی صحیفه‌‌سینی باخین",
-       "projectpage": "پروژه صحیفه‌سینه باخین",
-       "imagepage": "فایل صحیفه‌سینه باخین",
-       "mediawikipage": "مئساژ صحیفه‌سینه باخین",
-       "templatepage": "شابلون صحیفه‌سینه باخین",
-       "viewhelppage": "یاردیم صحیفه‌سینه باخین",
-       "categorypage": "بؤلمه صحیفه‌‌سینی گؤستر",
-       "viewtalkpage": "دانیشیغا باخین",
+       "userpage": "ایستیفاده‌چی صحیفه‌‌سینه باخ",
+       "projectpage": "پروژه صحیفه‌سینه باخ",
+       "imagepage": "فایل صحیفه‌سینه باخ",
+       "mediawikipage": "مئساژ صحیفه‌سینه باخ",
+       "templatepage": "شابلون صحیفه‌سینه باخ",
+       "viewhelppage": "یاردیم صحیفه‌سینه باخ",
+       "categorypage": "بؤلمه صحیفه‌‌سینه باخ",
+       "viewtalkpage": "دانیشیغا باخ",
        "otherlanguages": "آیری دیل‌لرده",
-       "redirectedfrom": "($1 صحیفه‌‌سیندن يؤنلن‌دیریلمیش‌دیر)",
-       "redirectpagesub": "Û\8cÙ\88Ù\84لاندیرما صحیفه‌سی",
-       "lastmodifiedat": "بو صحیفه‌‌ سون دفعه‌‌ $1، $2 چاغیندا دَییشیلیب‌دیر.",
-       "viewcount": "بو یارپاق {{PLURAL:$1|بیر|$1}} دفعه گؤرونوب‌دور.",
-       "protectedpage": "قورونموش یارپاق",
-       "jumpto": "آتلان:",
-       "jumptonavigation": "دولانماق",
+       "redirectedfrom": "($1-دن يوْل‌لاندیریلمیش)",
+       "redirectpagesub": "Û\8cÙ\88Ù\92Ù\84â\80\8cلاندیرما صحیفه‌سی",
+       "lastmodifiedat": "بۇ صحیفه‌‌ سوْن دفعه‌‌ $1، $2 چاغیندا دَییشیلمیشدیر.",
+       "viewcount": "بۇ صحیفه {{PLURAL:$1|بیر|$1}} دفعه گؤرولوبدور.",
+       "protectedpage": "قوْرونموش صحیفه",
+       "jumpto": "آتیل:",
+       "jumptonavigation": "دÙ\88Ù\92Ù\84اÙ\86Ù\85اÙ\82",
        "jumptosearch": "آختار",
-       "view-pool-error": "باغیشلایین، ایندی خیدمت‌چیلر آرتیق یوک آلتیندادیلار.\nچوخلو ایشلدنلر بو یارپاغی گؤرمک ایسته‌ییرلر.\nلوطفاً یئنی‌دن بو یارپاغا ال تاپماغا چالیشماقدان اؤنجه، بیر آز دؤزون.\n\n$1",
-       "pool-timeout": "قیفیلا دؤزمک واختی قورتاردی",
-       "pool-queuefull": "مخزن صفی دولودور",
-       "pool-errorunknown": "تاÙ\86Û\8cÙ\86Ù\85اÙ\85Û\8cØ´ خطا",
-       "aboutsite": "{{SITENAME}}-ا گؤره",
+       "view-pool-error": "باغیشلایین، ایندی خیدمت‌چیلر آرتیق یۆک آلتیندادیلار.\nچوْخلو ایستیفاده‌چیلر بۇ صحیفه‌نی گؤرمک ایسته‌ییرلر.\nلۆطفاً یئنی‌دن بۇ صحیفه‌یه ال تاپماغا چالیشماقدان اؤنجه، بیر آز دؤزون.\n\n$1",
+       "pool-timeout": "قیفیلا دؤزماغین واختی بیتیردی",
+       "pool-queuefull": "Ù\85خزÙ\86 ØµÙ\81Û\8c Ø¯Ù\88Ù\92Ù\84Ù\88دÙ\88ر",
+       "pool-errorunknown": "بÛ\8cÙ\84Û\8cÙ\86Ù\85Ù\87â\80\8cÛ\8cÙ\86 خطا",
+       "aboutsite": "{{SITENAME}} حاقیندا",
        "aboutpage": "Project:حاقیندا",
        "copyright": "ایچینده‌کیلر $1 لیسانسی احاطه‌سینده‌دیلر.",
-       "copyrightpage": "{{ns:project}}:Ú©Ù\88Ù¾Û\8c Ø­Ø§Ù\82ی",
+       "copyrightpage": "{{ns:project}}:Ú©Ù\88Ù\92Ù¾Û\8c Ø­Ø§Ù\82Ù\84اری",
        "currentevents": "ایندیکی اولایلار",
        "currentevents-url": "Project:ایندیکی اولایلار",
        "disclaimers": "رد ائتمک",
        "disclaimerpage": "Project:عمومی رد ائتمک",
-       "edithelp": "ديَیشیکلیک‌لر اوچون یاردیم",
+       "edithelp": "ديَیشتیرمک یاردیمی",
        "mainpage": "آنا صحیفه",
        "mainpage-description": "آنا صحیفه",
        "policy-url": "Project:قایدالار",
-       "portal": "تÙ\88Ù¾Ù\84Ù\88Ù\85 Ù¾Ù\88رتالی",
-       "portal-url": "Project:تÙ\88Ù¾Ù\84Ù\88Ù\85 Ù¾Ù\88رتالی",
+       "portal": "تÙ\88Ù\92Ù¾Ù\84Ù\88Ù\85 Ù¾Ù\88Ù\92رتالی",
+       "portal-url": "Project:تÙ\88Ù\92Ù¾Ù\84Ù\88Ù\85 Ù¾Ù\88Ù\92رتالی",
        "privacy": "گیزلیلیک سیاستی",
        "privacypage": "Project:گیزلیلیک سیاستی",
-       "badaccess": "یول وئرمه خطاسی",
-       "badaccess-group0": "ایسته‌دیگینیز ایشه ایجازه‌نیز یوخدور.",
-       "badaccess-groups": "ایسته‌دیگینیز ایشین ایجازه‌سی، تکجه بو {{PLURAL:$2|قروپ|قروپلار}}داکی ایشلدنلره وئریلیب‌دیر: $1.",
-       "versionrequired": "مدئدیاویکی یازیلیمینین $1 نوسخه‌سی لازیم‌دیر",
-       "versionrequiredtext": "بو یارپاغی ایشلتدماغا، مئدیاویکی یازیلیمینین $1 نوسخه‌سی لازیم‌دیر.\n[[Special:Version|نوسخه یارپاغینا]] باخین.",
-       "ok": "اÙ\88Ù\84دÙ\88",
+       "badaccess": "ایجازه خطاسی",
+       "badaccess-group0": "ایسته‌دیگینیز ایشه ایجازه‌نیز یوْخدور.",
+       "badaccess-groups": "ایسته‌دیگینیز ایشین ایجازه‌سی، یالنیز بۇ {{PLURAL:$2|قروپ‌داکی|قروپلارین بیرینده‌کی}} ایستیفاده‌چیلره وئریلیب‌دیر: $1.",
+       "versionrequired": "مِدیاویکی یازیلیمینین $1 نۆسخه‌سی لازیمدیر",
+       "versionrequiredtext": "بۇ صحیفه‌نی ایشلتمک اۆچون، مِدیاویکی یازیلیمینین $1 نۆسخه‌سی لازیم‌دیر.\n[[Special:Version|نۆسخه صحیفه‌سینه]] باخ.",
+       "ok": "اÙ\88Ù\92Ù\84سÙ\88Ù\86",
        "retrievedfrom": "«$1»-دن آلینمیشدیر",
        "youhavenewmessages": "سیزین $1 ($2) وارینیزدیر.",
        "youhavenewmessagesfromusers": "سیزین {{PLURAL:$3|بیر آیری ایستیفاده‌چی‌دن|$3 ایستیفاده‌چی‌دن}} $1 وارینیزدیر ($2).",
-       "youhavenewmessagesmanyusers": "سیزین چوخلو ایشلدنلردن $1 وارینیزدیر ($2).",
+       "youhavenewmessagesmanyusers": "سیزین چوْخلو ایستیفاده‌چیلردن $1 وارینیزدیر ($2).",
        "newmessageslinkplural": "{{PLURAL:$1|بیر یئنی مئساژ|999=یئنی مئساژلار}}",
        "newmessagesdifflinkplural": "سون {{PLURAL:$1|دَییشیکلیک|999=دَییشیکلیکلر}}",
-       "youhavenewmessagesmulti": "$1-دا یئنی بیلدیرینیز وار.",
+       "youhavenewmessagesmulti": "$1-ده یئنی مئساژینیز وار.",
        "editsection": "دَییشدیر",
        "editold": "دَییشدیر",
        "viewsourceold": "قایناغا باخ",
        "toc": "ایچینده‌کیلر",
        "showtoc": "گؤستر",
        "hidetoc": "گیزلت",
-       "collapsible-collapse": "گیزلت",
-       "collapsible-expand": "گئنیشلندیر",
-       "thisisdeleted": "$1-نا باخ یا اونو قایتار؟",
+       "collapsible-collapse": "ییغیشلات",
+       "collapsible-expand": "گئنیشلت",
+       "thisisdeleted": "$1-Ù\86ا Ø¨Ø§Ø® Û\8cا Ø§Ù\88Ù\92Ù\86Ù\88 Ù\82اÛ\8cتارØ\9f",
        "viewdeleted": "$1 گؤستریلسین؟",
-       "restorelink": "{{PLURAL:$1|بیر سیلینمیش دَییشیکلیک|$1 سیلینمیش دَییشیکلیکلر}}",
-       "feedlinks": "بسÙ\84Ù\85Ù\87",
-       "feed-invalid": "گئچرسیز آبونه کانال جورو.",
-       "feed-unavailable": "سیندیکاسیا خطلری ال‌ده دئییل‌لر",
+       "restorelink": "{{PLURAL:$1|بیر|$1}} سیلینمیش دَییشیکلیک",
+       "feedlinks": "بسÙ\84Ù\87â\80\8cÙ\85Ù\87:",
+       "feed-invalid": "گئچرسیز آبونه بسله‌مه جۆرو.",
+       "feed-unavailable": "سیندیکالاشما خطلری ال‌ده دئییل‌لر",
        "site-rss-feed": "$1 آراِس‌اِس فید",
        "site-atom-feed": "$1 آتوم فید",
        "page-rss-feed": "«$1» آراِس‌اِس فید",
        "page-atom-feed": "«$1» آتوم فید",
-       "red-link-title": "$1 (صحیفه یوخدور)",
+       "red-link-title": "$1 (صحیفه یوْخدور)",
        "sort-descending": "آزالان سیرالاماق",
-       "sort-ascending": "چوخالان سیرالاماق",
-       "nstab-main": "مقاله",
+       "sort-ascending": "چوْخالان سیرالاماق",
+       "nstab-main": "صحیفه",
        "nstab-user": "ایستیفاده‌چی صحیفه‌سی",
        "nstab-media": "مئدیا صحیفه‌سی",
        "nstab-special": "اؤزل صحیفه",
        "nstab-template": "شابلون",
        "nstab-help": "یاردیم صحیفه‌سی",
        "nstab-category": "بؤلمه",
-       "nosuchaction": "بئله چالیشما یوخدور",
-       "nosuchactiontext": "URL-ده گؤستریلن ایش گئچرسیزدیر.\nاولا بیلر کی URL-ی یانلیش یازیب یوخسا یانلیش باغلانتی‌لا گلمیشسینیز.\nهمده بو، {{SITENAME}} سایتی ایشلدن یازیلیمین خطاسینی گؤستره بیلر.",
-       "nosuchspecialpage": "بئله اؤزل یارپاق یوخدور",
-       "nospecialpagetext": "<strong>سیز بیر یانلیش اؤزل یارپاغینی ایسته‌میسینیز.</strong>\nدوزگون اؤزل یارپاق‌لارین سیاهی‌سینی [[Special:SpecialPages|{{int:specialpages}}]]-ده گؤره بیلرسینیز.",
+       "nosuchaction": "بئله چالیشما یوْخدور",
+       "nosuchactiontext": "URL طرفیندن بیلینن ایش گئچرسیزدیر.\nURL-ی یانلیش یازمیش، یا یانلیش بیر باغلانتی ایله گلمیش، اوْلابیلرسیز.\nهم‌ده بۇ، {{SITENAME}} سایتی ایشلدن یازیلیمین خطاسینی گؤستره بیلر.",
+       "nosuchspecialpage": "بئله اؤزل صحیفه یوْخدور",
+       "nospecialpagetext": "<strong>سیز بیر یانلیش اؤزل صحیفه ایسته‌میسینیز.</strong>\n\nدۆزگون اؤزل صحیفه‌لرین لیستینی [[Special:SpecialPages|{{int:specialpages}}]]-ده گؤره بیلرسینیز.",
        "error": "خطا",
-       "databaseerror": "دیتابیس خطاسی",
+       "databaseerror": "دِیتابِیس خطاسی",
        "laggedslavemode": "'''دیقت:''' یارپاق‌دا، سون دَییشیکلیکلرین اولماماسی ایمکانی وار.",
        "readonly": "دیتابیس باغلانیب",
        "enterlockreason": "باغلاما نَدَن‌لیگی و آچیلماغین تخمینی واختینی یازین",
        "prefs-emailconfirm-label": "ایمیل دوغرولاماسی:",
        "youremail": "ایمیل:",
        "username": "{{GENDER:$1|ایستیفاده‌چی آدی}}:",
-       "uid": "{{GENDER:$1|ایستیفاده‌چی}} ID:",
        "prefs-memberingroups": "{{PLURAL:$1|بیر|$1}} قروپ {{GENDER:$2|عوضو}}و:",
        "prefs-registration": "یازیلماق واختی:",
        "yourrealname": "دوغرو آد:",
        "action-viewmyprivateinfo": "گیزلی بیلگیلرینی گؤر",
        "action-editmyprivateinfo": "گیزلی بیلگیلرینی دَییشدیر",
        "nchanges": "$1 {{PLURAL:$1|دَییشیکلیک}}",
+       "enhancedrc-history": "گئچمیش",
        "recentchanges": "سون دَییشیکلیکلر",
        "recentchanges-legend": "سون دَییشیکلیکلر سئچمه‌لری",
        "recentchanges-summary": "بو صحیفه‌ده، بو ویکی‌ده وئریلن ان سون دَییشیکلیکلری ایزله‌یین.",
        "rcnotefrom": "آشاغیدا '''$2'''-دن ('''$1'''-ه قدر) ديَیشیکلیکلر گلیبلر.",
        "rclistfrom": "$3 $2 واختیندان باشلایاراق یئنی دییشیکلری گؤستر",
        "rcshowhideminor": "کیچیک دَییشیکلری $1",
+       "rcshowhideminor-show": "گؤستر",
+       "rcshowhideminor-hide": "گیزلت",
        "rcshowhidebots": "بوتلاری $1",
-       "rcshowhideliu": "ایچری گیرمیش ایستیفاده‌چیلری $1",
+       "rcshowhidebots-show": "گؤستر",
+       "rcshowhidebots-hide": "گیزلت",
+       "rcshowhideliu": "یازیلمیش ایستفاده‌چیلری $1",
+       "rcshowhideliu-show": "گؤستر",
+       "rcshowhideliu-hide": "گیزلت",
        "rcshowhideanons": "تانینمامیش ایستیفاده‌چیلری $1",
+       "rcshowhideanons-show": "گؤستر",
+       "rcshowhideanons-hide": "گیزلت",
        "rcshowhidepatr": "نظارت ائدیلن دَییشیکلیکلری $1",
+       "rcshowhidepatr-show": "گؤستر",
+       "rcshowhidepatr-hide": "گیزلت",
        "rcshowhidemine": "منیم دَییشیکلریمی $1",
+       "rcshowhidemine-show": "گؤستر",
+       "rcshowhidemine-hide": "گیزلت",
        "rclinks": "سون $2 گون عرضینده‌کی سون  $1 ديَیشیکلیگی گؤستر <br />$3",
        "diff": "فرق",
        "hist": "گئچمیش",
        "rc_categories_any": "هر",
        "rc-change-size-new": "دَییشیکلیک‌دن سونرا {{PLURAL:|بیر|$1}} بایت",
        "newsectionsummary": "/* $1 */ یئنی بؤلمه",
-       "rc-enhanced-expand": "تفصیلاتی گؤستر (جاوااسکریپت لازیم‌دیر)",
+       "rc-enhanced-expand": "تفصیل‌لری گؤستر",
        "rc-enhanced-hide": "تفصیل‌لری گیزلت",
        "rc-old-title": "ایلک‌جه «$1» آدی‌له یارانمیشدیر",
        "recentchangeslinked": "ایلگیلی دَییشیکلیکلر",
        "fileexists-shared-forbidden": "بو آددا بیر فايل اورتاق آمباردا مؤوجود دیر. \nفايلینیزی يئنه ده يوکله‌مک ایسته‌يیرسینیزسه، خاهیش ائدیریک گئری گئدیب يئنی بیر آد ایستیفاده ائدین. \n[[File:$1|thumb|center|$1]]",
        "file-exists-duplicate": "بو فایل آشاغی‌داکی {{PLURAL:$1 | فایلین | فایل‌لارین}} تکراری سی‌دیر:",
        "file-deleted-duplicate": "بو فایلین عینی اولان باشقا بیر فایل([[:$1]])داها اول‌دن سیلیندی. بو فای‌لی یئنی‌دن یوکلمه‌دن اول دیگر فایلین سیلینمه‌سی قئیدلرینی ایداره ائتملیسینیز.",
+       "file-deleted-duplicate-notitle": "قاباقجا بۇ فایلا عینی اولان بیر فایل سیلینمیشدیر، و بۇ فایل آدی قاداغان اوْلموشدور.\nاوْنی یئنی‌دن یۆکله‌مک‌دن اؤنجه، قاداغان اوْلونموش فایل‌لارا باخماق ایجازه‌سی اوْلان بیر ایستیفاده‌چی‌دن، وضعیتی گؤزدن گئچیرمگی ایسته‌مه‌لیسینیز.",
        "uploadwarning": "يوکله‌مه خبردارلیغی",
        "uploadwarning-text": "خاهیش ائدیریک آشاغی‌داکی فایل شرحینی دییش‌دیرین و یئنی‌دن جهد ائدین.",
        "savefile": "فايلی قئيد ائت",
        "uploaddisabledtext": "فايل يوکلنمه‌سی باش توتمادی.",
        "php-uploaddisabledtext": "پی اچ پی فایل یوکلملری دؤوره خاریجی‌دیر. خاهیش ائدیریک file_uploads تنظیم لرین یئنی دن بیر باخین.",
        "uploadscripted": "بو فایل بیر اینتئرنئت آختاریش برنامه سی طرفین‌دن سهو چئوریلبیلجک بیر HTML و یا ایسکریپت کودو عبارت‌دیر.",
+       "uploadscriptednamespace": "بۇ SVG فایلیندا بیر یاساق آدفضاسی ($1) واردیر.",
+       "uploadinvalidxml": "یۆکله‌نیلن فایل‌دا XML تحلیل اولونانمادی.",
        "uploadvirus": "فايلدا ویروس وار!  \nدئتاللار: $1",
        "uploadjava": "فایل، بیر جاوا. نوع ‎‎class ائهتیوا ائدن بیر زیپ فایلی‌دیر.\nجاوا فایل‌لارینین یوکلنمه‌سینه ایجازه وئریلمیر، چونکی تهلوکه‌سیزلیک محدودلاشدیرما‌لارینین آتلانماسینا سبب اولا بیلمکده‌دیرلر.",
        "upload-source": "قایناق فايلی",
        "license-nopreview": "(اؤن‌گؤستریش یوخدور)",
        "upload_source_url": "(بیر گئچرلی و عموم گؤره بیلن اینترنت آدرسی)",
        "upload_source_file": "(بیلگی‌سایارینیزدا بیر فایل)",
-       "listfiles-summary": "بو اؤزل صحیفه، بوتون یوکله‌نیلن فایل‌لاری گؤستریر.\nایستیفاده‌چیه فیلتر اولوناندا، یالنیز او ایستیفاده‌چی سون نوسخه‌لرینی یوکله‌ین فایل‌لار گؤستریلیر.",
+       "listfiles-summary": "بۇ اؤزل صحیفه، بۆتون یۆکله‌نیلن فایل‌لاری گؤستریر.",
        "listfiles_search_for": "مئدیا آدی اوچون آختار:",
        "imgfile": "فایل",
        "listfiles": "فایل لیستی",
        "listfiles_size": "اؤلچو",
        "listfiles_description": "شرح",
        "listfiles_count": "نوسخه‌لر",
+       "listfiles-show-all": "عکسلرین اسکی نۆسخه‌لرینی ایچینه آل.",
+       "listfiles-latestversion": "ایندیکی نۆسخه",
+       "listfiles-latestversion-yes": "بلی",
+       "listfiles-latestversion-no": "یوخ",
        "file-anchor-link": "فایل",
        "filehist": "فايل گئچمیشی",
        "filehist-help": "فايلین اول‌کی وئرسیياسینی گؤرمک اۆچون گۆن/تاریخ بؤلمه‌سینده‌کی تاریخلری تێقلايین.",
        "download": "اندیر",
        "unwatchedpages": "ایزلنمه‌میش صحیفه‌لر",
        "listredirects": "یول‌لاندیرمالارین لیستی",
+       "listduplicatedfiles": "کوْپی‌لری اولان فایل‌لاری لیستی",
+       "listduplicatedfiles-summary": "بۇرا، سوْن نۆسخه‌لری آیری بیر فایلین سوْن نۆسخه‌سی‌نین کوْپی‌سی اوْلان فایل‌لارین لیستیدیر. یالنیز یئرلی فایل‌لار گؤز آلتینا آلینیبلار.",
+       "listduplicatedfiles-entry": "[[:File:$1|$1]]-ین [[$3|{{PLURAL:$2|بیر کوْپی‌سی|$2 کوْپی‌سی}}]] واردیر.",
        "unusedtemplates": "ایشلدیلمه‌میش شابلونلار",
        "unusedtemplatestext": "بو صحیفه بوتون، {{ns:template}} آدفضاسیندا اولان و باشقا صحیفه‌لرده اولمایان صحیفه‌لری لیست ائدیر.\nشابلونلاری سیلمک‌دن اؤنجه، لوطفاً اونلارا اولان باشقا باغلانتیلاری یوخلایین.",
        "unusedtemplateswlh": "باشقا باغلانتیلار",
        "randompage": "راست‌گله صحیفه",
        "randompage-nopages": "بو {{PLURAL:$2|آدفضاسیندا|آدفضالاریندا}} هئچ صحیفه یوخدور: $1.",
+       "randomincategory": "بؤلمه‌ده راست‌گله صحیفه",
+       "randomincategory-invalidcategory": "«$1» بیر گئچرلی بؤلمه آدی دئییل.",
+       "randomincategory-nopages": "[[:Category:$1|$1]] بؤلمه‌سین‌ده، هئچ صحیفه یوخدور.",
+       "randomincategory-selectcategory": "بؤلمه‌دن آلیناجاق راست‌گله صحیفه: $1 $2.",
+       "randomincategory-selectcategory-submit": "گئت",
        "randomredirect": "راست‌گله یول‌لاندیرما",
        "randomredirect-nopages": "«$1» آدفضاسیندا هئچ بیر یول‌لاندیرما یوخدور.",
        "statistics": "آمارلار",
        "pageswithprop-text": "بو صحیفه‌ده، بیر خاص صحیفه اؤزل‌لیگی ایشلدن صحیفه‌لرین لیستی واردیر.",
        "pageswithprop-prop": "اؤزل‌لیک آدی:",
        "pageswithprop-submit": "گئت",
+       "pageswithprop-prophidden-long": "اۇزون یازی اؤزل‌لیک دَیَری گیزلی ($1)",
+       "pageswithprop-prophidden-binary": "ایکی‌لی اؤزل‌لیک دَیَری گیزلی ($1)",
        "doubleredirects": "ایکی‌قات یول‌لاندیرمالار",
        "doubleredirectstext": "بو صحیفه دیگر ایستیقامتلندیرمه صحیفه‌لرینه ایستیقامتلندیرمه ائدن صحیفه‌لری سیاهی‌لار.\nهر سطرین ائهتیوا ائتدیگی کئچیدلر؛ بیرینجی و ایکینجی ایستیقامتلندیرمه، هم‌چی‌نین ایکینجی ایستیقامتلن‌دیرمک هدفی، کی بو عمومیتله بیرینجی ایستیقامتلن‌دیرمک گؤسترمه‌سی لازیم اولان \"گئرچک\" هدف صحیفه‌سی‌دیر.\n<del> اوستو خط لنیب </del> دوزلمیش دیر.",
-       "double-redirect-fixed-move": "[[$1]] Ø¯Û\8cÛ\8cشدÛ\8cرÛ\8cÙ\84Û\8cب.\nحاضردا [[$2]]-Û\8cÙ\87 Ø§Û\8cستÛ\8cÙ\82اÙ\85تÙ\84Ù\86Û\8cب.",
-       "double-redirect-fixed-maintenance": "[[$1]]-دن [[$2]]-یه ایکی‌قات ایستیقامتلنمه دوزلدیلیر.",
+       "double-redirect-fixed-move": "[[$1]] Ø¢Ù¾Ø§Ø±Û\8cÙ\84Ù\85Û\8cØ´â\80\8cدÛ\8cر.\nاÙ\88Ù\92تÙ\88Ù\85اتÛ\8cÚ© Ø§Ù\88Ù\92Ù\84اراÙ\82 Ú¯Û\86Ù\86جÙ\84â\80\8cÙ\84Ù\87â\80\8cÙ\86Û\8cبدÛ\8cر Ù\88 Ø§Û\8cÙ\86دÛ\8c [[$2]]-Ù\87 Û\8cÙ\88Ù\92Ù\84â\80\8cÙ\84اÙ\86دÛ\8cرÛ\8cر.",
+       "double-redirect-fixed-maintenance": "[[$1]]-دن [[$2]]-ه ایکی‌قات یوْل‌لاندیرما، بیر ساخلاما ایشین‌ده، اوْتوماتیک اوْلاراق دۆزلدیلیر.",
        "double-redirect-fixer": "يؤنلندیرمه تعمیرجیسی",
        "brokenredirects": "خطالی ایستیقامتلندیرمه",
        "brokenredirectstext": "آشاغی‌داکی ایستیقامتلندیرمه‌لر مؤوجود اولمایان صحیفه‌لره کئچید وئریر:",
        "ninterwikis": "{{PLURAL:$1|بیر|$1}} ویکی‌آراسی",
        "nlinks": "{{PLURAL:$1|بیر|$1}} باغلانتی",
        "nmembers": "{{PLURAL:$1|بیر|$1}} عوضو",
+       "nmemberschanged": "$1 → $2 {{PLURAL:$2|عۆضو}}",
        "nrevisions": "{{PLURAL:$1|بیر|$1}} نوسخه",
        "nviews": "{{PLURAL:$1|بیر|$1}} گؤرونوش",
        "nimagelinks": "$1 ده{{PLURAL:$1|صحیفه‌ده}}ایستیفاده اولونمور",
        "mostrevisions": "ان چوخ نظردن کئچیریلمیش (وئرسیا‌لی) مقاله‌لر",
        "prefixindex": "بوتون اؤن‌اَکلی صحیفه‌لر",
        "prefixindex-namespace": "بوتون صفحه لر (آد فضاسی$1) قاباق دان یاپیشیقی وار",
+       "prefixindex-strip": "لیست‌ده، اؤن‌اَکی قوْپارت",
        "shortpages": "قیسا صحیفه‌‌لر",
        "longpages": "اوزون صحیفه‌‌لر",
        "deadendpages": "کئچید وئرمه‌ين صحیفه‌‌لر",
        "deadendpagestext": "آشاغیداکی صحیفه‌‌لردن بو ویکیپئدیياداکی دیگر صحیفه‌‌لره هئچ بیر کئچید يوخدور.",
        "protectedpages": "محافظه‌‌لی صحیفه‌‌لر",
        "protectedpages-indef": "يالنیز مدتسیز محافظه‌‌لر",
+       "protectedpages-summary": "بۇ صحیفه، ایندیکی قوْرونان موْجود اوْلان صحیفه‌لری لیست ائدیر. یارانماق‌دان قوْرونان باشلیقلارین لیستینی گؤرمک اۆچون [[{{#special:ProtectedTitles}}|{{int:protectedtitles}}]]-ه باخین.",
        "protectedpages-cascade": "یالنیز کاسکاد محافظه‌لر",
+       "protectedpages-noredirect": "یوْل‌لاندیرمالاری گیزلت",
        "protectedpagesempty": "حال-حاضردا بو پارامئتره اویغون هئچ بیر محافظه‌لی صحیفه یوخ‌دور",
+       "protectedpages-timestamp": "واخت دامغاسی",
+       "protectedpages-page": "صحیفه",
+       "protectedpages-expiry": "بیتمک تاریخی",
+       "protectedpages-performer": "قوْرویان ایستیفاده‌چی",
+       "protectedpages-params": "قوْروماق پارامئترلری",
+       "protectedpages-reason": "نَدَن‌لیگی",
+       "protectedpages-unknown-timestamp": "بیلینمه‌ین",
+       "protectedpages-unknown-performer": "بیلینمه‌ین ایستیفاده‌چی",
        "protectedtitles": "محافظه‌لی باش‌لیق‌لار",
+       "protectedtitles-summary": "بۇ صحیفه، ایندیکی یارانماق‌دان قوْرونان باشلیقلاری لیست ائدیر. ایندیکی قوْرونان موْجود اوْلان صحیفه‌لرین لیستینی گؤرمک اۆچون، [[{{#special:ProtectedPages}}|{{int:protectedpages}}]]-ه باخین.",
        "protectedtitlesempty": "حال-حاضردا، بو پارامئترلری قورونان هئچ بیر موضوع یوخ‌دور.",
        "listusers": "ایستیفاده‌چی سیياهیسی",
        "listusers-editsonly": "يالنیز دَییشدیرمه ائدن ایستیفاده‌چیلری گؤستر",
        "listusers-creationsort": "يارانما تاریخینه گؤره سیرالا",
+       "listusers-desc": "آزالان سیرادا سیرالا",
        "usereditcount": "$1 {{PLURAL:$1|دَییشدیرمه}}",
        "usercreated": "$1 تاریخینده، ساعات $2-ده {{GENDER:$3|یارانیب‌دیر}}",
        "newpages": "يئنی صحیفه‌‌‌لر",
        "log-title-wildcard": "بو متنله باشلایان باش‌لیق‌لاری آختار",
        "showhideselectedlogentries": "گؤستریش/گیزلمه سییاهه ده سئچیلمیش‌لر اوچون",
        "allpages": "بوتون صحیفه‌لر",
-       "alphaindexline": "$1-دن $2-یه",
        "nextpage": "سونراکی صحیفه‌‌ ($1)",
        "prevpage": "اولکی صحیفه ($1)",
        "allpagesfrom": "بو حرفله باشلایان صحیفه‌لری گؤستر:",
        "activeusers-noresult": "هئچ ایستیفاده‌چی تاپیلمادی.",
        "listgrouprights": "ایستیفاده‌چی قروپ حاقلاری",
        "listgrouprights-summary": "آشاغیدا، بو ویکی‌ده تانیلان ایستیفاده‌چی گروپلاری و اونلارین حاقلاری گؤستریلیر.\nتک حاقلار اوچون ده، [[{{MediaWiki:Listgrouprights-helppage}}|آرتیق بیلگیلر]] اولا بیلر.",
-       "listgrouprights-key": "* <span class=\"listgrouprights-granted\">وئریلمیش حاق</span>\n* <span class=\"listgrouprights-revoked\">قایتاریلمیش حاق</span>",
+       "listgrouprights-key": "یوْل گؤستری:\n* <span class=\"listgrouprights-granted\">وئریلمیش حاق</span>\n* <span class=\"listgrouprights-revoked\">قایتاریلمیش حاق</span>",
        "listgrouprights-group": "قروپ",
        "listgrouprights-rights": "حاقلار",
        "listgrouprights-helppage": "Help:قروپ حاقلاری",
        "listgrouprights-removegroup-self": "{{PLURAL:$2|گروپو|گروپلاری}} اؤز حسابیندان سیل: $1",
        "listgrouprights-addgroup-self-all": "بوتون گروپلاری اؤز حسابینا آرتیر",
        "listgrouprights-removegroup-self-all": "بوتون گروپلاری اؤز حسابیندان سیل",
+       "listgrouprights-namespaceprotection-header": "آدفضاسی محدودیتلری",
+       "listgrouprights-namespaceprotection-namespace": "آدفضاسی",
+       "listgrouprights-namespaceprotection-restrictedto": "ایستیفاده‌چی‌نین بۇنلاری دَییشدیرمک حاق(لار)ی",
+       "trackingcategories": "ایزله‌مک بؤلمه‌لری",
+       "trackingcategories-msg": "ایزله‌مک بؤلومو",
+       "trackingcategories-name": "مئساژ آدی",
+       "trackingcategories-desc": "بؤلمه ایچری آلماق معیارلاری",
        "mailnologin": "گؤندرمه آدرسی یوخدور",
        "mailnologintext": "باشقا ایستیفاده‌چیلره ایمیل گؤندرک اوچون، [[Special:UserLogin|گیریش]] ائدیب و [[Special:Preferences|ترجیحلر]]ینیزده گئچرلی ایمیل آدرسی وئرمه‌لیسینیز.",
        "emailuser": "بو ایستیفاده‌چی‌یه ایمیل گؤندر",
        "allmessages-prefix": "اؤنک ایله فیلترلی:",
        "allmessages-language": "دیل:",
        "allmessages-filter-submit": "گئت",
+       "allmessages-filter-translate": "چئویر",
        "thumbnail-more": "بؤیوت",
        "filemissing": "فایل تاپیلمادی",
        "thumbnail_error": "کیچیک شکیل یاراتما خطاسی: $1",
        "newimages-summary": "بو خصوصی صحیفه، ان سون یوک‌لنن فایل‌لاری گؤستریر.",
        "newimages-legend": "سۆزگَج",
        "newimages-label": "فایلین (و یا اونون بیر حیسه‌سی‌نین) آدی:",
-       "showhidebots": "($1 روبات دییشدیر)",
        "noimages": "هئچ نیی گؤرممک.",
        "ilsubmit": "آختار",
        "bydate": "تاریخین اوستوندن",
        "imgmultipagenext": "سونراکی صحیفه‌‌ &rarr;",
        "imgmultigo": "گئت!",
        "imgmultigoto": "$1 صحیفه‌‌يه گئت",
+       "img-lang-default": "(وارساییلان دیل)",
+       "img-lang-go": "گئت",
        "ascending_abbrev": "آرتما سیراسینا گؤره",
        "descending_abbrev": "آزالما سیراسینا گؤره",
        "table_pager_next": "سونراکی صحیفه",
        "version-hook-name": "چنگه‌لین آدی",
        "version-hook-subscribedby": "طرفیندن گیریش‌‌میش",
        "version-version": "(نسخه $1)",
-       "version-license": "لیسانس",
+       "version-license": "مِدیاویکی لیسانسی",
+       "version-ext-license": "لیسانس",
        "version-poweredby-credits": "بو wیکی ' ''[https://www.mediawiki.org/ مئدیاwیکی]'ع' پروقرامی ایستیفاده ائدیله‌رک يارادیلمیشدیر، یاازارلار © 2001-$1 $2.",
        "version-poweredby-others": "آیریلار",
        "version-credits-summary": "بو ایستفاده چیلر دییشدیر لرینه گوره [[Special:Version|مئدیاویکی]] تانیش ائدیرم.",
        "tags-tag": "یاپیشقان آدی",
        "tags-display-header": "ديَیشیکلیک لیستئلئریندئکی گؤرونوش",
        "tags-description-header": "آنلامینین تام آچیقلاماسی",
+       "tags-active-header": "چالیشقلان؟",
        "tags-hitcount-header": "یاپیشقانلی دییشیک‌لیک‌لر",
+       "tags-active-yes": "بلی",
+       "tags-active-no": "یوْخ",
        "tags-edit": "دَییشدیر",
        "tags-hitcount": "$1 {{PLURAL:$1|دییشیکلیک|دییشیک‌لیک}}",
        "comparepages": "صحیفه‌لری قارشی‌لاش‌دیر",
        "duration-decades": "{{PLURAL:$1|بیر|$1}} اون‌ایل",
        "duration-centuries": "{{PLURAL:$1|بیر|$1}} یوز-ایل",
        "duration-millennia": "{{PLURAL:$1|بیر|$1}} مین‌ایل",
-       "rotate-comment": "عکس $1 {{PLURAL:$1|درجه}} ساعات عقربه‌لری ایستیقامتینده فیرلاندیریلب‌دیر"
+       "rotate-comment": "عکس $1 {{PLURAL:$1|درجه}} ساعات عقربه‌لری ایستیقامتینده فیرلاندیریلب‌دیر",
+       "expand_templates_generate_rawhtml": "چیی اچ‌تی‌ام‌ال گؤستر",
+       "expand_templates_preview": "اؤن‌گؤستریش"
 }
index 16dafb1..65c22ab 100644 (file)
        "newimages-summary": "Был махсус бит һуңғы тейәлгән файлдарҙы күрһәтә.",
        "newimages-legend": "Һайлау",
        "newimages-label": "Файл исеме (йәки өлөшө):",
-       "showhidebots": "(боттарҙы $1)",
        "noimages": "Рәсемдәр юҡ.",
        "ilsubmit": "Эҙләү",
        "bydate": "булдырыу көнө буйынса",
index 9823fe4..f98f58a 100644 (file)
        "newimages-summary": "ای حاصین صفحه اهرین آپلود بوتگین فایلان پیشداریت",
        "newimages-legend": "فیلتر",
        "newimages-label": "نام فایل ( یا چنڈی چه آيی):",
-       "showhidebots": "(روباتان $1 )",
        "noimages": "هیچی په دیستن",
        "ilsubmit": "گردگ",
        "bydate": "گون تاریح",
index f2541e1..2a84873 100644 (file)
        "newimages-summary": "Ining espesyal na pahina minaphiling kan huring pinagkargang mga sagunson.",
        "newimages-legend": "An saraan",
        "newimages-label": "Ngaran nin sagunson (o sarong parte kaini):",
-       "showhidebots": "($1 na bots)",
        "noimages": "Mayong mahihilíng.",
        "ilsubmit": "Hanápon",
        "bydate": "sa petsa",
index afdbc1a..336c7bf 100644 (file)
        "badtitle": "Няслушная назва",
        "badtitletext": "Запытаная назва старонкі няслушная ці пустая, альбо няслушна ўказаная міжмоўная ці інтэрвікі-назва. Яна можа ўтрымліваць сымбалі, якія нельга ўжываць у назвах.",
        "perfcached": "Наступныя зьвесткі кэшаваныя і могуць быць састарэлымі. У кэшы {{PLURAL:$1|даступны|даступныя}} ня больш за $1 {{PLURAL:$1|вынік|вынікі|вынікаў}}.",
-       "perfcachedts": "Наступныя зьвесткі кэшаваныя і апошні раз былі абноўленыя $1. У кэшы {{PLURAL:$4|даступны|даступныя}} ня больш за $4 {{PLURAL:$4|вынік|вынікаў|вынікі}}.",
+       "perfcachedts": "Наступныя зьвесткі кэшаваныя і апошні раз былі абноўленыя $1. У кэшы {{PLURAL:$4|даступны|даступныя}} ня больш за $4 {{PLURAL:$4|вынік|вынікі|вынікаў}}.",
        "querypage-no-updates": "Абнаўленьні гэтай старонкі цяпер адключаныя. Зьвесткі ня будуць абнаўляцца.",
        "viewsource": "Паказаць крыніцу",
        "viewsource-title": "Прагляд крыніцы для $1",
        "parser-template-recursion-depth-warning": "Перавышана мяжа глыбіні рэкурсіі шаблёнаў ($1)",
        "language-converter-depth-warning": "Перавышанае абмежаваньне глыбіні канвэртару варыянтаў мовы ($1)",
        "node-count-exceeded-category": "Старонкі зь перавышанай колькасьцю вузлоў",
+       "node-count-exceeded-category-desc": "Катэгорыя для старонак, на якіх перавышаная колькасьць вузлоў.",
        "node-count-exceeded-warning": "Старонка перавысіла дазволеную колькасьць вузлоў",
        "expansion-depth-exceeded-category": "Старонкі зь перавышанай глыбінёй уключэньня",
+       "expansion-depth-exceeded-category-desc": "Гэта катэгорыя для старонак, дзе перавышаная глыбіня раскрыцьця.",
        "expansion-depth-exceeded-warning": "Старонка перавысіла дазволеную глыбіню ўключэньняў",
        "parser-unstrip-loop-warning": "Вызначаная незачыненая пятля",
        "parser-unstrip-recursion-limit": "Перавышанае абмежаваньне глыбіні рэкурсіі ($1)",
        "prefs-emailconfirm-label": "Пацьверджаньне адрасу электроннай пошты:",
        "youremail": "Адрас электроннай пошты:",
        "username": "Імя {{GENDER:$1|ўдзельніка|ўдзельніцы}}:",
-       "uid": "ID {{GENDER:$1|удзельніка|удзельніцы}}:",
        "prefs-memberingroups": "{{GENDER:$2|Удзельнік|Удзельніца}} {{PLURAL:$1|1=групы|групаў}}:",
        "prefs-registration": "Час рэгістрацыі:",
        "yourrealname": "Сапраўднае імя:",
        "right-move": "перанос старонак",
        "right-move-subpages": "перанос старонак разам зь іх падстаронкамі",
        "right-move-rootuserpages": "Перанос карэнных старонак удзельнікаў",
+       "right-move-categorypages": "перанос старонак катэгорыяў",
        "right-movefile": "перайменаваньне файлаў",
        "right-suppressredirect": "не ствараць перанакіраваньне са старой назвы пасьля пераносу старонкі",
        "right-upload": "загрузка файлаў",
        "action-move": "перанос гэтай старонкі",
        "action-move-subpages": "перанос гэтай старонкі і яе падстаронак",
        "action-move-rootuserpages": "перанос карэнных старонак удзельнікаў",
+       "action-move-categorypages": "перанос старонак катэгорыяў",
        "action-movefile": "перайменаваць гэты файл",
        "action-upload": "загрузку гэтага файла",
        "action-reupload": "перазапіс гэтага файла",
        "log-title-wildcard": "Шукаць назвы, якія пачынаюцца з гэтага тэксту",
        "showhideselectedlogentries": "Паказаць/схаваць выбраныя запісы ў журнале",
        "allpages": "Усе старонкі",
-       "alphaindexline": "ад $1 да $2",
        "nextpage": "Наступная старонка ($1)",
        "prevpage": "Папярэдняя старонка ($1)",
        "allpagesfrom": "Паказаць старонкі, пачынаючы з:",
        "post-expand-template-inclusion-category-desc": "Пасьля разгортваньня ўсіх шаблёнаў, памер старонкі перавысіў <code>$wgMaxArticleSize</code>, таму некаторыя шаблёны не былі паказаныя цалкам.",
        "post-expand-template-argument-category-desc": "Пасьля раскрыцьця аргумэнту шаблёну (нешта ў трайных дужках, напрыклад, <code>{{{Foo}}}</code>), старонка перавышае памер <code>$wgMaxArticleSize</code>.",
        "expensive-parserfunction-category-desc": "На старонцы ўжываецца зашмат рэсурсаёмістых функцыяў парсэру (такіх, як <code>#ifexist</code>). Глядзіце [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit].",
+       "broken-file-category-desc": "Катэгорыя дадаецца, калі старонка ўтрымлівае няслушную спасылку на файл (спасылку на файл, які не існуе).",
+       "hidden-category-category-desc": "Гэта катэгорыя з дададзенай меткай <code><nowiki>__HIDDENCAT__</nowiki></code> у ёй, што па змоўчаньні не адлюстроўвае яе на старонках у сьпісе катэгорыяў.",
+       "trackingcategories-nodesc": "Апісаньне адсутнічае.",
        "mailnologin": "Няма адрасу атрымальніка",
        "mailnologintext": "Вам неабходна [[Special:UserLogin|ўвайсьці ў сыстэму]] і мець пацьверджаны адрас электроннай пошты ў Вашых [[Special:Preferences|наладах]], каб дасылаць лісты іншым удзельнікам.",
        "emailuser": "Даслаць ліст",
        "newimages-summary": "Гэтая спэцыяльная старонка паказвае нядаўна загружаныя файлы.",
        "newimages-legend": "Фільтар",
        "newimages-label": "Назва файла (альбо яе частка):",
-       "showhidebots": "($1 робатаў)",
        "noimages": "Выявы адсутнічаюць.",
        "ilsubmit": "Шукаць",
        "bydate": "па даце",
index 6d9bce4..25f6b13 100644 (file)
        "newimages-summary": "Тут паказаныя нядаўна ўкладзеныя файлы.",
        "newimages-legend": "Фільтр",
        "newimages-label": "Назва файла (або яе частка):",
-       "showhidebots": "($1 робатаў)",
        "noimages": "Тут нічога няма.",
        "ilsubmit": "Знайсці",
        "bydate": "п. датаў",
index 568a00a..1763074 100644 (file)
        "newimages-summary": "Тази специална страница показва последно качените файлове.",
        "newimages-legend": "Име на файл",
        "newimages-label": "Име на файл (или част от него):",
-       "showhidebots": "($1 на ботове)",
        "noimages": "Няма нищо.",
        "ilsubmit": "Търсене",
        "bydate": "по дата",
index d4c14f3..290cdbb 100644 (file)
        "newimages-summary": "Tungkaran istimiwa ngini manampaikan babarakas nang hahanyar dihunggah.",
        "newimages-legend": "Saringan",
        "newimages-label": "Ngaran barakas (atawa sapalihnya):",
-       "showhidebots": "($1 bot)",
        "noimages": "Kadada nang dijanaki.",
        "ilsubmit": "Gagai",
        "bydate": "ulih tanggal",
index 3de126c..24510b8 100644 (file)
        "edit-gone-missing": "পাতাটি হালনাগাদ হয়নি।\nসম্ভবতঃ পাতাটি মুছে ফেলা হয়েছে।",
        "edit-conflict": "সম্পাদনা সংঘাত।",
        "edit-no-change": "আপনার সম্পাদনাটি উপেক্ষা করা হয়েছে, কারণ লেখাতে কোনো পরিবর্তন করা হয়নি।",
+       "postedit-confirmation-created": "পাতাটি তৈরি হয়েছে।",
+       "postedit-confirmation-restored": "পাতাটি পুনরুদ্ধার করা হয়েছে।",
        "postedit-confirmation-saved": "আপনার সম্পাদনা সংরক্ষিত হয়েছে।",
        "edit-already-exists": "নতুন পাতা সৃষ্টি করা যায়নি।\nপাতাটি ইতিমধ্যেই বিদ্যমান।",
        "defaultmessagetext": "আদি টেক্সট",
        "prefs-emailconfirm-label": "ই-মেইল নিশ্চিতকরণ:",
        "youremail": "ইমেইল *",
        "username": "{{GENDER:$1|ব্যবহারকারী নাম}}:",
-       "uid": "{{GENDER:$1|ব্যবহারকারী}} নং (ID):",
        "prefs-memberingroups": "{{PLURAL:$1|দলের|দলসমূহের}} {{GENDER:$2|সদস্য}}:",
        "prefs-registration": "নিবন্ধের সময়:",
        "yourrealname": "আসল নাম *",
        "log-title-wildcard": "এই টেক্সট দিয়ে শুরু হওয়া শিরোনামগুলি অনুসন্ধান করা হোক",
        "showhideselectedlogentries": "নির্বাচিত লগগুলো দেখাও/লুকাও",
        "allpages": "সব পাতা",
-       "alphaindexline": "$1 হতে $2",
        "nextpage": "পরবর্তী পাতা ($1)",
        "prevpage": "পূর্ববর্তী পাতা ($1)",
        "allpagesfrom": "এই অক্ষর দিয়ে শুরু হওয়া পাতাগুলো দেখাও:",
        "newimages-summary": "এই বিশেষ পাতা সর্বশেষ আপলোডকৃত ফাইল দেখাবে।",
        "newimages-legend": "ছাকনী",
        "newimages-label": "ফাইলের নাম (অথবা এর কোন অংশ):",
-       "showhidebots": "($1 বট)",
        "noimages": "দেখার মত কিছু নেই।",
        "ilsubmit": "অনুসন্ধান",
        "bydate": "তারিখ অনুযায়ী",
index 4c1c0dd..4a6d6ce 100644 (file)
        "edit-gone-missing": "Dibosupl hizivaat ar bajenn.\nDiverket eo bet evit doare.",
        "edit-conflict": "Tabut kemmañ.",
        "edit-no-change": "N'eo ket bet kemeret ho tegasadenn e kont rak ne oa ket bet kemmet netra en destenn.",
+       "postedit-confirmation-created": "Krouet eo bet ar bajenn.",
+       "postedit-confirmation-restored": "Adsavet eo bet ar bajenn.",
        "postedit-confirmation-saved": "Enrollet eo bet ho kemmoù.",
        "edit-already-exists": "N'eus ket bet gallet krouiñ ur bajenn nevez.\nKrouet e oa bet c'hoazh.",
        "defaultmessagetext": "Testenn dre ziouer",
        "prefs-emailconfirm-label": "Kadarnaat ar postel :",
        "youremail": "Postel :",
        "username": "{{GENDER:$1|Anv implijer|Anv implijerez}}:",
-       "uid": "{{GENDER:$1|Niv. identelezh an implijer|Niv. identelezh an implijerez}}:",
        "prefs-memberingroups": "{{GENDER:$2|Ezel}} eus {{PLURAL:$1|ar strollad|ar strolladoù}} :",
        "prefs-registration": "Deiziad enskrivañ :",
        "yourrealname": "Anv gwir*",
        "log-title-wildcard": "Klask an titloù a grog gant an destenn-mañ",
        "showhideselectedlogentries": "Diskouez/kuzhat penngerioù ar marilh bet diuzet",
        "allpages": "An holl bajennoù",
-       "alphaindexline": "$1 da $2",
        "nextpage": "Pajenn war-lerc'h ($1)",
        "prevpage": "Pajenn gent ($1)",
        "allpagesfrom": "Diskouez ar pajennoù adal :",
        "newimages-summary": "Diskouez a ra ar bajenn dibar-mañ roll ar restroù diwezhañ bet enporzhiet.",
        "newimages-legend": "Sil",
        "newimages-label": "Anv ar restr (pe darn anezhi) :",
-       "showhidebots": "($1 bot)",
        "noimages": "Netra da welet.",
        "ilsubmit": "Klask",
        "bydate": "dre an deiziad anezho",
        "htmlform-no": "Ket",
        "htmlform-yes": "Ya",
        "htmlform-chosen-placeholder": "Diuzañ un dibarzh",
+       "htmlform-cloner-create": "Ouzhpennañ muioc'h",
+       "htmlform-cloner-delete": "Dilemel",
+       "htmlform-cloner-required": "Un dalvoudenn a zo ret da vihanañ.",
        "sqlite-has-fts": "$1 gant enklask eus an destenn a-bezh embreget",
        "sqlite-no-fts": "$1 hep enklask eus an destenn a-bezh embreget",
        "logentry-delete-delete": "Diverket eo bet ar bajenn $3 gant $1",
index 0dd6da2..2310ae3 100644 (file)
        "newimages-summary": "Ova specijalna stranica prikazuje posljednje postavljene datoteke.",
        "newimages-legend": "Filter",
        "newimages-label": "Ime datoteke (ili dio imena):",
-       "showhidebots": "($1 botove)",
        "noimages": "Ništa za prikazati.",
        "ilsubmit": "Traži",
        "bydate": "po datumu",
index f89d77f..48922ec 100644 (file)
        "prefs-emailconfirm-label": "Confirmació de correu electrònic:",
        "youremail": "Correu electrònic:",
        "username": "{{GENDER:$1|Nom d'usuari}}:",
-       "uid": "{{GENDER:$1|Usuari}} Identificador d'usuari:",
        "prefs-memberingroups": "{{GENDER:$2|Membre}} {{PLURAL:$1|del grup|dels grups}}:",
        "prefs-registration": "Hora de registre:",
        "yourrealname": "Nom real *",
        "right-move": "Moure pàgines",
        "right-move-subpages": "Moure pàgines amb les seves subpàgines",
        "right-move-rootuserpages": "Reanomenar la pàgina principal d'un usuari",
+       "right-move-categorypages": "Mou les pàgines de categoria",
        "right-movefile": "Moure fitxers",
        "right-suppressredirect": "No crear redireccions quan es reanomena una pàgina",
        "right-upload": "Carregar fitxers",
        "action-createpage": "crear pàgines",
        "action-createtalk": "crear pàgines de discussió",
        "action-createaccount": "crear aquest compte d'usuari",
+       "action-history": "mostra l'historial de la pàgina",
        "action-minoredit": "marcar aquesta modificació com a menor",
        "action-move": "moure aquesta pàgina",
        "action-move-subpages": "moure aquesta pàgina, i llurs subpàgines",
        "action-move-rootuserpages": "reanomenar la pàgina principal d'un usuari",
+       "action-move-categorypages": "mou les pàgines de categoria",
        "action-movefile": "moure aquest fitxer",
        "action-upload": "carregar aquest fitxer",
        "action-reupload": "substituir aquest fitxer",
        "log-title-wildcard": "Cerca els títols que comencin amb aquest text",
        "showhideselectedlogentries": "Mostra/amaga les entrades de registre seleccionades",
        "allpages": "Totes les pàgines",
-       "alphaindexline": "$1 a $2",
        "nextpage": "Pàgina següent ($1)",
        "prevpage": "Pàgina anterior ($1)",
        "allpagesfrom": "Mostra les pàgines que comencin per:",
        "sp-contributions-blocklog": "Registre de bloquejos",
        "sp-contributions-suppresslog": "contribucions suprimides de l'usuari",
        "sp-contributions-deleted": "contribucions d'usuari esborrades",
-       "sp-contributions-uploads": "pujades",
+       "sp-contributions-uploads": "càrregues",
        "sp-contributions-logs": "registres",
        "sp-contributions-talk": "discussió",
        "sp-contributions-userrights": "gestió de drets d'usuari",
        "movepagetalktext": "La pàgina de discussió associada també serà traslladada automàticament '''tret que''':\n* Ja existeix una pàgina de discussió no buida amb el nou nom, o\n* Desactiveu la opció de més avall.\n\nEn aquests casos, haureu de traslladar o fusionar la pàgina manualment si ho desitgeu.",
        "movearticle": "Reanomena la pàgina",
        "moveuserpage-warning": "'''Atenció:''' Esteu a punt de moure una pàgina d'usuari. Tingueu en compte que només la pàgina es desplaçarà i que el compte d'usuari ''no'' canviarà de nom.",
+       "movecategorypage-warning": "<strong>Avís:</strong> Esteu a punt de moure una pàgina de categoria. Tingueu en compte que només es moure la pàgina i qualsevol de les pàgines a l'antiga categoria <em>no</em> es recategoritzarà automàticament en la nova.",
        "movenologintext": "Heu de ser un usuari registrat i estar [[Special:UserLogin|dintre d'una sessió]]\nper reanomenar una pàgina.",
        "movenotallowed": "No teniu permís per a moure pàgines.",
        "movenotallowedfile": "No teniu el permís per a moure fitxers.",
        "cant-move-user-page": "No teniu permís per a moure pàgines d'usuari (independentment de les subpàgines).",
        "cant-move-to-user-page": "No teniu permís per a moure una pàgina a una pàgina d'usuari (independentment de poder fer-ho cap a una subpàgina d'usuari).",
+       "cant-move-category-page": "No teniu permisos per a moure pàgines de categoria.",
+       "cant-move-to-category-page": "No teniu permisos per a moure una pàgina a una pàgina de categoria.",
        "newtitle": "A títol nou",
        "move-watch": "Vigila aquesta pàgina",
        "movepagebtn": "Reanomena la pàgina",
        "newimages-summary": "Aquesta pàgina especial mostra els darrers fitxers carregats.",
        "newimages-legend": "Nom del fitxer",
        "newimages-label": "Nom de fitxer (o part d'ell):",
-       "showhidebots": "($1 bots)",
+       "newimages-showbots": "Mostra les càrregues dels bots",
        "noimages": "Res per veure.",
        "ilsubmit": "Cerca",
        "bydate": "per data",
        "watchlistedit-raw-done": "S'ha actualitzat la vostra llista de seguiment.",
        "watchlistedit-raw-added": "{{PLURAL:$1|1 títol s'ha|$1 títols s'han}} afegit:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|1 títol s'ha|$1 títols s'han}} eliminat:",
+       "watchlistedit-clear-title": "S'ha netejat la llista de seguiment",
+       "watchlistedit-clear-legend": "Neteja la llista de seguiment",
+       "watchlistedit-clear-explain": "Se suprimiran tots els títols de la vostra llista de seguiment",
+       "watchlistedit-clear-titles": "Títols:",
+       "watchlistedit-clear-submit": "Neteja la llista de seguiment (això és permanent!)",
+       "watchlistedit-clear-done": "S'ha netejat la vostra llista de seguiment.",
+       "watchlistedit-clear-removed": "{{PLURAL:$1|S'ha suprimit 1 títol|S'han suprimit $1 títols}}:",
+       "watchlistedit-too-many": "Hi ha massa pàgines per mostrar-les aquí.",
+       "watchlisttools-clear": "Neteja la llista de seguiment",
        "watchlisttools-view": "Visualitza els canvis rellevants",
        "watchlisttools-edit": "Visualitza i edita la llista de seguiment",
        "watchlisttools-raw": "Edita la llista de seguiment sense format",
index 201ef6a..e0bc248 100644 (file)
        "listingcontinuesabbrev": "(кхин дlа)",
        "index-category": "Меттигтерахьйо агlонаш",
        "noindex-category": "ДӀахьушйоцу агӀонаш",
-       "broken-file-category": "{{#switch:{{NAMESPACE}}\n |{{ns:0}}=Ð\91олÑ\85 Ñ\86абеÑ\88 Ñ\84айлийн Ñ\85Ñ\8cажоÑ\80агаÑ\88 Ð¹Ð¾Ð»Ñ\83 Ð°Ð³Ó\80онаÑ\88}}",
+       "broken-file-category": "{{#switch:{{NAMESPACE}}\n |{{ns:0}}=Болх цабеш файлийн хьажоргаш йолу агӀонаш}}",
        "about": "Цуьнах лаьцна",
        "article": "Яззам",
        "newwindow": "(керлачу корехь)",
        "createacct-emailoptional": "Электронан почтан адрес (ца яздича мега)",
        "createacct-email-ph": "ДӀаязде электронан почтан адрес",
        "createacct-another-email-ph": "ДӀаязде электронан почтан адрес",
-       "createaccountmail": "хааман зӀене хула",
+       "createaccountmail": "Лела йе цахууш нисйина хана пароль, кхин язйинчу электронан адрес тӀе яийта и.",
        "createacct-realname": "Хьан цӀе (ца язйича мега)",
        "createaccountreason": "Бахьна:",
        "createacct-reason": "Бахьна",
        "createacct-submit": "Кхолла декъашхочун дӀаяздар",
        "createacct-another-submit": "Кхолла декъашхочун кхин дӀаяздар",
        "createacct-benefit-heading": "{{SITENAME}} кхолийна хьо санначу наха.",
-       "createacct-benefit-body1": "{{PLURAL:$1|1=нисдар|нисдарш}}",
-       "createacct-benefit-body2": "{{PLURAL:$1|1=яззам|яззамаш}}",
-       "createacct-benefit-body3": "{{PLURAL:$1|1=декъашхо|декъашхой}} тӀаьхьарачу хенахь",
+       "createacct-benefit-body1": "{{PLURAL:$1|нисдар|нисдарш}}",
+       "createacct-benefit-body2": "{{PLURAL:$1|яззам|яззамаш}}",
+       "createacct-benefit-body3": "{{PLURAL:$1|декъашхо|декъашхой}} тӀаьхьарчу хенахь",
        "badretype": "Ахьа язъен ишарш цхьатера яц",
        "userexists": "Ахьа язъен декъашхочун цӀе йолуш ю, дехар до кхин цӀе харжар.",
        "loginerror": "Гlалат ду декъашхо вовзарехь/йовзарехь",
        "login-userblocked": "ХӀара декъашхо блоктоьхна ву/ю. Системин чувала/яла магийна дац.",
        "wrongpassword": "Ахьа язйина йолу пароль нийса яц. Хьажа юху цхьаъз.",
        "wrongpasswordempty": "Дехар до, язъе еса йоцу пароль.",
-       "passwordtooshort": "Пароль хилла еза $1 {{PLURAL:$1|1=символ|символаш}} йолуш.",
+       "passwordtooshort": "Пароль хилла еза $1 {{PLURAL:$1|символ|символаш}} йолуш.",
        "password-name-match": "Язъен пароль декъашхочун дӀаяздарал башха хила еза.",
        "password-login-forbidden": "Иштта декъашхочун цӀе а пароль а лелаян цамаго.",
        "mailmypassword": "Пароль кхоссар",
        "edit-gone-missing": "АгӀо карлаяккха цатарло.\nИза дӀаяьккхина хила мега.",
        "edit-conflict": "Тадарна дойнаш.",
        "edit-no-change": "Хьан нисдар юхадаьккхина, ахьа хийцамаш бина цахилар бахьнехь.",
+       "postedit-confirmation-created": "АгӀо кхоьллина.",
+       "postedit-confirmation-restored": "АгӀо меттахӀотта йина.",
        "postedit-confirmation-saved": "Хьан нисдар дӀаяздина.",
        "edit-already-exists": "Керла агӀо кхолла цатарло.\nИза хӀинцале йолуш ю.",
        "defaultmessagetext": "Ӏад дитарца йоза",
        "undo-failure": "Юккъера хийцамаш бахьнехь нисдар юхадаккха йиш яц.",
        "undo-summary": "Юхадаьккхина {{GENDER:$2|декъашхочун}} [[Special:Contributions/$2|$2]] ([[User talk:$2|дийц.]]) нисдар $1",
        "undo-summary-username-hidden": "Юхадаьккхина декъашхочун нисдарш $1, цунна цӀе дӀахьулйина",
+       "cantcreateaccounttitle": "Декъашхочун дӀаяздар кхолла йиш яц",
        "viewpagelogs": "Гайта хlокху агlонан тептар",
        "nohistory": "ХӀокху агӀона хийцамаш бина хила бац.",
        "currentrev": "Карара верси",
        "rows": "МогӀанаш:",
        "columns": "БӀогӀамаш:",
        "searchresultshead": "Лаха",
-       "stub-threshold": "Ð\9aеÑ\87 Ñ\8fÑ\80ан Ð´Ð¾Ð·Ð° <a href=\"#\" class=\"stub\">коÑ\8cÑ\80Ñ\82амогÓ\80амна Ñ\85Ñ\8cажоÑ\80агаÑ\88</a> (байÑ\82аÑ\88каÑ\85):",
+       "stub-threshold": "Кеч яран доза <a href=\"#\" class=\"stub\">коьртамогӀамна хьажоргаш</a> (байташках):",
        "stub-threshold-disabled": "ДӀадайина",
        "recentchangesdays": "Керла нисдар гайта динахь:",
        "recentchangesdays-max": "Къезиг $1 {{PLURAL:$1|дена}}",
        "prefs-emailconfirm-label": "Бакъ яр электрони почт:",
        "youremail": "Электронан почта:",
        "username": "{{GENDER:$1|Декъашхочун цӀе}}:",
-       "uid": "Декъашхочун {{GENDER:$1|код}}:",
        "prefs-memberingroups": "{{GENDER:$1|Тобана|Тобаншан}} {{PLURAL:$2|декъашхо|декъашхой}}:",
        "prefs-registration": "ДӀаяздар кхолийна хан:",
        "yourrealname": "Хьан бакъ цӀе:",
        "randomincategory-selectcategory": "Категори чу цахууш нийса елла агӀона чу гӀо: $1 $2.",
        "randomincategory-selectcategory-submit": "Дехьа гӀо",
        "randomredirect": "Цахууш нисделла дIасахьажор",
-       "statistics": "Ð\91Ñ\83Ñ\85еÑ\85Ñ\8cдеÑ\80г",
+       "statistics": "СÑ\82аÑ\82иÑ\81Ñ\82ика",
        "statistics-header-pages": "АгӀонийн жамӀ",
        "statistics-header-edits": "Нисдаран жамӀ",
        "statistics-header-views": "Хьажаран статистика",
        "brokenredirectstext": "Лахара дӀасахьажийнарш ю йоцучу агӀонийн тӀе хьажийна:",
        "brokenredirects-edit": "нисъе",
        "brokenredirects-delete": "дӀаяккха",
-       "withoutinterwiki": "ЮкÑ\8aаÑ\80вики-Ñ\85Ñ\8cажоÑ\80агаÑ\88 Ð¹Ð¾Ñ\86Ñ\83 Ð°Ð³Ó\80онаÑ\88",
+       "withoutinterwiki": "Юкъарвики-хьажоргаш йоцу агӀонаш",
        "withoutinterwiki-summary": "Лахара агӀонийн юкъарвики-хьажоргаш яц:",
        "withoutinterwiki-submit": "Гайта",
        "fewestrevisions": "ЧIогIа кIезиг башхонаш йолу агIонаш",
        "log-title-wildcard": "ХӀокху символашца болалуш болу кортанаш карабе",
        "showhideselectedlogentries": "Гайта/къайлаяха хаьржина башхонаш",
        "allpages": "Массо агӀонаш",
-       "alphaindexline": "тӀера $1 $2 кхаччалц",
        "nextpage": "Тlаьхьа йогlу агlо ($1)",
        "prevpage": "Хьалхалера агlо ($1)",
        "allpagesfrom": "Гучé яха агӀонаш, йолалуш йолу оцу:",
        "whatlinkshere-hideredirs": "$1 дӀасахьажорш",
        "whatlinkshere-hidetrans": "$1 латораш",
        "whatlinkshere-hidelinks": "$1 хьажоргаш",
-       "whatlinkshere-hideimages": "$1 Ñ\84айлийн Ñ\85Ñ\8cажоÑ\80агаÑ\88",
+       "whatlinkshere-hideimages": "$1 файлийн хьажоргаш",
        "whatlinkshere-filters": "Литтарш",
        "autoblockid": "Ша блоккхетар #$1",
        "block": "Декъашхочун блоктохар",
        "newimages": "Керлачу файлийн галерей",
        "newimages-summary": "ХӀокху белхан агӀона чохь гойтуш ю дукха хан йоццуш чуйаьхна файлаш.",
        "newimages-legend": "Литтар",
-       "showhidebots": "$1 боташ",
        "noimages": "Суьрташ дац.",
        "ilsubmit": "Лаха",
        "bydate": "терахьашца",
        "api-error-unknown-warning": "Доьвзуш доцу дӀахьедар: $1",
        "api-error-unknownerror": "Доьвзуш доцу гӀалат: «$1».",
        "api-error-uploaddisabled": "ХӀокху вики чохь файлаш чуяхар дӀадайина ду.",
+       "api-error-verification-error": "ХӀара файл йоьхна я хила цаеза тайпан хила мега.",
        "duration-seconds": "$1 {{PLURAL:$1|секунд}}",
        "duration-minutes": "$1 {{PLURAL:$1|минут}}",
        "duration-hours": "$1 {{PLURAL:$1|сахьт}}",
index 5e1d51f..87822ac 100644 (file)
        "prefs-emailconfirm-label": "پشتڕاستکردنەوەی ئیمەیل:",
        "youremail": "ئیمەیل:",
        "username": "{{GENDER:$1|ناوی به‌کارھێنەر}}:",
-       "uid": "پێناسەی {{GENDER:$1|به‌کارھێنەر}}:",
        "prefs-memberingroups": "{{GENDER:$2|ئەندامی}} {{PLURAL:$1|گرووپی|گرووپەکانی}}:",
        "prefs-registration": "کاتی خۆتۆمارکردن:",
        "yourrealname": "ناوی ڕاستی:",
        "protectedpages": "پەڕە پارێزراوەکان",
        "protectedpages-indef": "تەنیا پاراستنە بێسنوورەکان",
        "protectedpages-cascade": "تەنیا پاراستنە زنجیرییەکان",
+       "protectedpages-noredirect": "ڕەوانەکەرەکان بشارەوە",
        "protectedpagesempty": "هیچ لاپەڕەیک ئێستا بەم دیاریکراوانە نەپارێزراوە.",
        "protectedpages-page": "پەڕە",
+       "protectedpages-params": "پارامەترەکانی پاراستن",
+       "protectedpages-reason": "ھۆکار",
        "protectedtitles": "سەرناوە پارێزراوەکان",
        "protectedtitlesempty": "ھیچ سەرناوێک بەم سنوورانەوە ئێستا نەپارێزراوە.",
        "listusers": "پێرستی بەکارھێنەران",
        "log-title-wildcard": "گەڕانی ئەو سەرناوانە بەم دەقەوە دەست پێدەکەن",
        "showhideselectedlogentries": "بابەتەکانی ھەڵبژێردراوی لۆگ نیشان بدە/بشارەوە",
        "allpages": "ھەموو پەڕەکان",
-       "alphaindexline": "$1 تا $2",
        "nextpage": "پەڕەی پاشەوە ($1)",
        "prevpage": "پەڕەی پێشەوە ($1)",
        "allpagesfrom": "نیشاندانی پەڕەکان بە دەستپێکردن لە:",
        "newimages-summary": "ئەم پەڕە تایبەتە دوایین پەڕگە بارکراوەکان نیشان دەدات.",
        "newimages-legend": "پاڵاوتن",
        "newimages-label": "ناوی پەڕگە (یان بەشێکیی):",
-       "showhidebots": "(بۆتەکان $1)",
        "noimages": "هیچ بۆ بینین نییە.",
        "ilsubmit": "بگەڕێ",
        "bydate": "بەپێی ڕێکەوت",
index 7a1d270..c3c0736 100644 (file)
        "log": "Righjistramenti",
        "all-logs-page": "Tutte l'azzioni",
        "allpages": "Tutte e pagine",
-       "alphaindexline": "da $1 à $2",
        "nextpage": "Pagina seguente ($1)",
        "prevpage": "Pagina precedente ($1)",
        "allpagesfrom": "Mustrà e pagine à parte da:",
        "whatlinkshere-links": "$1 ligami",
        "whatlinkshere-hidetrans": "inclusione",
        "whatlinkshere-hidelinks": "$1 ligami",
-       "ipadressorusername": "Adrizzu IP o nome di cuntributore",
+       "ipaddressorusername": "Adrizzu IP o nome di cuntributore",
        "ipbreason": "Mutivu:",
        "ipboptions": "2 ore:2 hours,1 ghjornu:1 day,3 ghjorni:3 days,1 sittimana:1 week,2 sittimane:2 weeks,1 mese:1 month,3 mesi:3 months,6 mesi:6 months,1 annu:1 year,infinitu:infinite",
        "ipblocklist": "Cuntributori bluccati",
        "file-nohires": "Una diversione incù una risoluzione più alta ùn hè micca dispunibile.",
        "show-big-image": "Schedariu originale",
        "show-big-image-other": "{{PLURAL:$2|Altra risuluzione|Altre risuluzioni}}: $1.",
-       "showhidebots": "($1 boti)",
        "noimages": "Nulla da vede.",
        "ilsubmit": "Ricerca",
        "bydate": "per data",
        "table_pager_limit_label": "Risultati per pagina:",
        "table_pager_limit_submit": "Invià",
        "table_pager_empty": "Micca risultati",
+       "autosumm-replace": "Pagina sustituita incù '$1'",
        "autoredircomment": "Reindirizzamentu à [[$1]]",
        "autosumm-new": "Pagina nova: $1",
        "watchlistedit-raw-titles": "Pagine:",
        "tags-edit": "mudificà",
        "logentry-delete-delete": "$1 ha cancellatu a pagina $3",
        "logentry-move-move": "$1 {{GENDER:$2|hà spustatu}} a pagina $3 à $4",
+       "logentry-newusers-create": "U participante $3 hè statu creatu da $1",
        "rightsnone": "(nessunu)",
        "expand_templates_output": "Risultatu"
 }
index 280e7e9..f3eb3bc 100644 (file)
        "newimages-summary": "Бу махсус саифе сонъки юкленген файлларны косьтере.",
        "newimages-legend": "Сюзгюч",
        "newimages-label": "Файл ады (я да онынъ бир парчасы):",
-       "showhidebots": "(ботларны $1)",
        "noimages": "Ресим ёкъ.",
        "ilsubmit": "Къыдыр",
        "bydate": "хронологик сыранен",
index 26ee352..1bc4ccf 100644 (file)
        "newimages-summary": "Bu mahsus saife soñki yüklengen fayllarnı köstere.",
        "newimages-legend": "Süzgüç",
        "newimages-label": "Fayl adı (ya da onıñ bir parçası):",
-       "showhidebots": "(botlarnı $1)",
        "noimages": "Resim yoq.",
        "ilsubmit": "Qıdır",
        "bydate": "hronologik sıranen",
index 3174f57..bff169d 100644 (file)
        "content-model-text": "čistý text",
        "content-model-javascript": "JavaScript",
        "content-model-css": "CSS",
-       "expensive-parserfunction-warning": "Varování: Tato stránka obsahuje příliš mnoho volání výkonnostně náročných funkcí parseru.\n\nPovolený limit je $2, v současné chvíli však {{PLURAL:$1|zde jedno volání je|zde jsou $2 volání|zde je $2 volání}}.",
-       "expensive-parserfunction-category": "Stránky s příliš mnoho voláními náročných funkcí parseru",
+       "expensive-parserfunction-warning": "Varování: Tato stránka obsahuje příliš mnoho volání výkonnostně náročných funkcí syntaktického analyzátoru.\n\nPovolený limit je $2, v současné chvíli však {{PLURAL:$1|zde jedno volání je|zde jsou $2 volání|zde je $2 volání}}.",
+       "expensive-parserfunction-category": "Stránky s příliš mnoho voláními náročných funkcí syntaktického analyzátoru",
        "post-expand-template-inclusion-warning": "Varování: Objem vkládaných šablon je příliš velký.\nNěkteré šablony nebudou vloženy.",
        "post-expand-template-inclusion-category": "Stránky překračující povolenou velikost vložených šablon",
        "post-expand-template-argument-warning": "Varování: Tato stránka obsahuje alespoň jeden argument šablony, který je po rozbalení příliš velký.\nTyto argumenty byly vynechány.",
        "parser-template-recursion-depth-warning": "Překročen limit hloubky rekurzivního vkládání šablon ($1)",
        "language-converter-depth-warning": "Překročen limit vnoření u jazykové konverze ($1)",
        "node-count-exceeded-category": "Stránky překračující počet uzlů",
+       "node-count-exceeded-category-desc": "Kategorie pro stránky, kde je překročen počet uzlů.",
        "node-count-exceeded-warning": "Stránka překročila počet uzlů",
        "expansion-depth-exceeded-category": "Stránky překračující hloubku expanze",
+       "expansion-depth-exceeded-category-desc": "Toto je kategorie pro stránky, ve kterých je překročena hloubka expanze.",
        "expansion-depth-exceeded-warning": "Stránka překročila hloubku expanze",
        "parser-unstrip-loop-warning": "Detekováno zacyklení unstrip",
        "parser-unstrip-recursion-limit": "Překročen limit rekurze unstrip ($1)",
        "prefs-emailconfirm-label": "Ověření e-mailu:",
        "youremail": "E-mail:",
        "username": "{{GENDER:$1|Uživatelské jméno}}:",
-       "uid": "{{GENDER:$1|Uživatelské}} ID:",
        "prefs-memberingroups": "{{GENDER:$2|Člen|Členka}} {{PLURAL:$1|skupiny|skupin}}:",
        "prefs-registration": "Čas registrace:",
        "yourrealname": "Vaše skutečné jméno:",
        "right-move": "Přesouvání stránek",
        "right-move-subpages": "Přesouvání stránek i s jejich podstránkami",
        "right-move-rootuserpages": "Přesouvání kořenových uživatelských stránek",
+       "right-move-categorypages": "Přesouvání stránek kategorií",
        "right-movefile": "Přesouvání souborů",
        "right-suppressredirect": "Nevytváření přesměrování po přesunu stránky",
        "right-upload": "Nahrávání souborů",
        "action-move": "přesunout tuto stránku",
        "action-move-subpages": "přesunout tuto stránku a její podstránky",
        "action-move-rootuserpages": "přesouvat kořenové uživatelské stránky",
+       "action-move-categorypages": "přesouvat stránky kategorií",
        "action-movefile": "přesunout tento soubor",
        "action-upload": "nahrát tento soubor",
        "action-reupload": "přepsat tento existující soubor",
        "log-title-wildcard": "Hledat názvy začínající na tento text",
        "showhideselectedlogentries": "Ukázat/skrýt vybrané záznamy",
        "allpages": "Všechny stránky",
-       "alphaindexline": "od $1 do $2",
        "nextpage": "Další stránka ($1)",
        "prevpage": "Předchozí stránka ($1)",
        "allpagesfrom": "Zobrazit stránky počínaje od:",
        "index-category-desc": "Stránka obsahuje kouzelné slovo <code><nowiki>__INDEX__</nowiki></code> (a je ve jmenném prostoru, ve kterém je tento příznak dovolen), takže je indexována roboty, přestože by normálně nebyla.",
        "post-expand-template-inclusion-category-desc": "Po rozbalení všech šablon je stránka větší než <code>$wgMaxArticleSize</code>, takže některé šablony rozbaleny nebyly.",
        "post-expand-template-argument-category-desc": "Po rozbalení argumentu šablony (něco v trojitých závorkách, např. <code>{{{Foo}}})</code> je stránka větší než <code>$wgMaxArticleSize</code>.",
-       "expensive-parserfunction-category-desc": "Na stránce je použito příliš mnoho náročných funkcí parseru (jako <code>#ifexist</code>). Vizte [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit].",
+       "expensive-parserfunction-category-desc": "Na stránce je použito příliš mnoho náročných funkcí syntaktického analyzátoru (jako <code>#ifexist</code>). Vizte [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit].",
        "broken-file-category-desc": "Kategorie přidaná pokud stránka obsahuje nefunkční odkaz na soubor (odkaz pro vložení souboru, který neexistuje).",
        "hidden-category-category-desc": "Toto je kategorie, která obsahuje <code><nowiki>__HIDDENCAT__</nowiki></code>, což způsobuje, že se na stránkách implicitně nezobrazuje v rámečku odkazů na kategorie.",
        "trackingcategories-nodesc": "Popis není k dispozici.",
        "movepagetalktext": "Přidružená diskusní stránka, existuje-li, bude automaticky přesunuta společně se stránkou, '''pokud:'''\n* dosud neexistuje neprázdná diskusní stránka pod novým jménem a\n* nezrušíte křížek ve formuláři.\n\nV těchto případech musíte přesunout nebo sloučit stránky manuálně, přejete-li si to.",
        "movearticle": "Přesunout stránku:",
        "moveuserpage-warning": "'''Upozornění:''' Chystáte se přesunout uživatelskou stránku. Uvědomte si prosím, že bude přesunuta pouze tato stránka, ale uživatel ''nebude'' přejmenován.",
+       "movecategorypage-warning": "<strong>Upozornění:</strong> Chystáte se přesunout stránku kategorie. Uvědomte si, že bude přesunuta pouze tato stránka a že žádné stránky v původní kategorii <em>nebudou</em> do nové překategorizovány.",
        "movenologintext": "Pro přesouvání stránek se musíte [[Special:UserLogin|přihlásit]].",
        "movenotallowed": "Nemáte oprávnění k přesunu stránek.",
        "movenotallowedfile": "Nemáte právo přesouvat soubory.",
        "cant-move-user-page": "Nemáte oprávnění přesouvat uživatelské stránky.",
        "cant-move-to-user-page": "Nemáte oprávnění přesouvat na uživatelskou stránku (pouze na podstránku uživatelské stránky).",
+       "cant-move-category-page": "Nemáte oprávnění přesouvat stránky kategorií.",
+       "cant-move-to-category-page": "Nemáte oprávnění přesunout stránku na stránku kategorie.",
        "newtitle": "Na nový název:",
        "move-watch": "Sledovat tuto stránku",
        "movepagebtn": "Přesunout stránku",
        "newimages-summary": "Na této speciální stránce se zobrazují poslední načtené soubory.",
        "newimages-legend": "Filtr",
        "newimages-label": "Název souboru (nebo jeho část):",
-       "showhidebots": "($1 roboty)",
+       "newimages-showbots": "Zobrazit soubory načtené boty",
        "noimages": "Není co zobrazit.",
        "ilsubmit": "Hledat",
        "bydate": "podle data",
        "watchlistedit-raw-done": "Seznam vašich sledovaných stránek byl aktualizován.",
        "watchlistedit-raw-added": "{{PLURAL:$1|Byla přidána 1 položka|Byly přidány $1 položky|Bylo přidáno $1 položek}}:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|Byla odstraněna položka|Byly odstraněny $1 položky|Bylo odstraněno $1 položek}}:",
+       "watchlistedit-clear-title": "Vyprázdnění seznamu sledovaných stránek",
+       "watchlistedit-clear-legend": "Vyprázdnit seznam sledovaných stránek",
+       "watchlistedit-clear-explain": "Z vašeho seznamu sledovaných stránek budou odstraněny všechny názvy",
+       "watchlistedit-clear-titles": "Názvy:",
+       "watchlistedit-clear-submit": "Vyprázdnit seznam sledovaných stránek (natrvalo!)",
+       "watchlistedit-clear-done": "Váš seznam sledovaných stránek byl vyprázdněn.",
+       "watchlistedit-clear-removed": "{{PLURAL:$1|Byl odstraněn 1 název|Byly odstraněny $1 názvy|Bylo odstraněno $1 názvů}}:",
+       "watchlistedit-too-many": "Seznam obsahuje příliš mnoho stránek, než aby se zde daly zobrazit.",
+       "watchlisttools-clear": "Vyprázdnit seznam sledovaných stránek",
        "watchlisttools-view": "Zobrazit změny sledovaných stránek",
        "watchlisttools-edit": "Zobrazit a editovat seznam sledovaných stránek",
        "watchlisttools-raw": "Editovat textový soubor sledovaných stránek",
        "version": "Verze",
        "version-extensions": "Nainstalovaná rozšíření",
        "version-specialpages": "Speciální stránky",
-       "version-parserhooks": "Přípojné body parseru",
+       "version-parserhooks": "Přípojné body syntaktického analyzátoru",
        "version-variables": "Proměnné",
        "version-antispam": "Ochrana proti spamu",
        "version-skins": "Vzhledy",
        "duration-centuries": "$1 {{PLURAL:$1|století}}",
        "duration-millennia": "$1 {{PLURAL:$1|tisíciletí}}",
        "rotate-comment": "Obrázek otočen o $1 {{PLURAL:$1|stupeň|stupně|stupňů}} po směru hodinových ručiček",
-       "limitreport-title": "Data profilování parseru:",
+       "limitreport-title": "Data profilování syntaktického analyzátoru:",
        "limitreport-cputime": "Využití času procesoru",
        "limitreport-cputime-value": "$1 {{PLURAL:$1|sekunda|sekundy|sekund}}",
        "limitreport-walltime": "Využití reálného času",
        "limitreport-templateargumentsize": "Velikost argumentů šablon",
        "limitreport-templateargumentsize-value": "$1/$2 {{PLURAL:$2|bajt|bajty|bajtů}}",
        "limitreport-expansiondepth": "Největší hloubka expanze",
-       "limitreport-expensivefunctioncount": "Počet náročných funkcí parseru",
+       "limitreport-expensivefunctioncount": "Počet náročných funkcí syntaktického analyzátoru",
        "expandtemplates": "Substituce šablon",
-       "expand_templates_intro": "Tato speciální stránka vezme text a rekurzivně rozbalí všechny použité šablony.\nTaké rozbalí podporované funkce parseru jako\n<code><nowiki>{{</nowiki>#language:…}}</code> a proměnné jako\n<code><nowiki>{{</nowiki>CURRENTDAY}}</code>.\nV podstatě rozbalí prakticky všechno v dvojitých složených závorkách.",
+       "expand_templates_intro": "Tato speciální stránka zpracuje text a rekurzivně rozbalí všechny použité šablony.\nTaké rozbalí podporované funkce syntaktického analyzátoru jako\n<code><nowiki>{{</nowiki>#language:…}}</code> a proměnné jako\n<code><nowiki>{{</nowiki>CURRENTDAY}}</code>.\nV podstatě rozbalí téměř všechno v dvojitých složených závorkách.",
        "expand_templates_title": "Název stránky kvůli kontextu pro {{FULLPAGENAME}} apod.:",
        "expand_templates_input": "Vstupní text:",
        "expand_templates_output": "Výstup",
index a76a0f4..9094b9c 100644 (file)
        "prefs-emailconfirm-label": "Cadarnhau'r e-bost:",
        "youremail": "Eich cyfeiriad e-bost",
        "username": "{{GENDER:$1|Enw defnyddiwr}}:",
-       "uid": "{{GENDER:$1|ID y defnyddiwr}}:",
        "prefs-memberingroups": "Yn {{GENDER:$2|aelod}} o'r {{PLURAL:$1|grŵp|grŵp|grwpiau}} canlynol:",
        "prefs-registration": "Amser dechrau'r cyfrif:",
        "yourrealname": "Eich enw cywir*",
        "log-title-wildcard": "Chwilio am deitlau'n dechrau gyda'r geiriau hyn",
        "showhideselectedlogentries": "Dewis dangos neu guddio cofnodion lòg",
        "allpages": "Pob tudalen",
-       "alphaindexline": "$1 i $2",
        "nextpage": "Y bloc nesaf gan ddechrau gyda ($1)",
        "prevpage": "Y bloc cynt gan ddechrau gyda ($1)",
        "allpagesfrom": "Dangos pob tudalen gan ddechrau o:",
        "newimages-summary": "Mae'r dudalen arbennig hon yn dangos y ffeiliau a uwchlwythwyd yn ddiweddar.",
        "newimages-legend": "Hidlo",
        "newimages-label": "Enw'r ffeil (neu ran ohono):",
-       "showhidebots": "($1 botiau)",
        "noimages": "Does dim byd i'w weld.",
        "ilsubmit": "Chwilio",
        "bydate": "yn ôl dyddiad",
index 0df3887..f4749fb 100644 (file)
        "newimages-summary": "Denne specialside viser de senest oplagte filer.",
        "newimages-legend": "Filter",
        "newimages-label": "Filnavn (eller en del af det):",
-       "showhidebots": "($1 botter)",
        "noimages": "Ingen filer fundet.",
        "ilsubmit": "Søg",
        "bydate": "efter dato",
index 33d4edb..4c89c45 100644 (file)
@@ -81,7 +81,7 @@
        "tog-hidepatrolled": "Kontrollierte Änderungen in den „Letzten Änderungen“ ausblenden",
        "tog-newpageshidepatrolled": "Kontrollierte Seiten bei den „Neuen Seiten“ ausblenden",
        "tog-extendwatchlist": "Beobachtungsliste erweitern, um statt nur der letzten Änderung alle Änderungen anzuzeigen.",
-       "tog-usenewrc": "Änderungen auf „Letzte Änderungen“ und Beobachtungsliste nach Seite gruppieren",
+       "tog-usenewrc": "Änderungen auf „Letzte Änderungen“ und der Beobachtungsliste nach Seite gruppieren",
        "tog-numberheadings": "Überschriften automatisch nummerieren",
        "tog-showtoolbar": "Bearbeiten-Werkzeugleiste anzeigen",
        "tog-editondblclick": "Seiten mit Doppelklick bearbeiten",
        "parser-template-recursion-depth-warning": "Vorlagenrekursionstiefengrenze überschritten ($1)",
        "language-converter-depth-warning": "Sprachkonvertertiefenlimit überschritten ($1)",
        "node-count-exceeded-category": "Seiten, die die Knotenanzahl überschritten haben",
+       "node-count-exceeded-category-desc": "Eine Kategorie für Seiten, bei denen die Knotenzahl überschritten wurde.",
        "node-count-exceeded-warning": "Die Seite hat die Knotenpunktanzahl überschritten.",
        "expansion-depth-exceeded-category": "Seiten, die die Expansionstiefe überschritten haben",
+       "expansion-depth-exceeded-category-desc": "Dies ist eine Kategorie für Seiten, bei denen die Expandierungstiefe überschritten wurde.",
        "expansion-depth-exceeded-warning": "Die Seite hat die Expansionstiefe überschritten.",
        "parser-unstrip-loop-warning": "Zirkelbezug festgestellt",
        "parser-unstrip-recursion-limit": "Rekursionsgrenze beim Auflösen überschritten ($1)",
        "recentchangesdays-max": "Maximal $1 {{PLURAL:$1|Tag|Tage}}",
        "recentchangescount": "Anzahl der standardmäßig angezeigten Bearbeitungen:",
        "prefs-help-recentchangescount": "Dies umfasst die Liste der letzten Änderungen, die Versionsgeschichte und die Logbücher.",
-       "prefs-help-watchlist-token2": "Dies ist der geheime Schlüssel zum Webfeed deiner Beobachtungsliste.\nJeder, der ihn kennt, kann deine Beobachtungsliste lesen. Teile ihn deshalb nicht.\n[[Special:ResetTokens|Klicke hier, wenn du ihn zurücksetzen musst]].",
+       "prefs-help-watchlist-token2": "Dies ist der geheime Schlüssel zum Webfeed deiner Beobachtungsliste.\nJeder, der ihn kennt, kann deine Beobachtungsliste lesen. Teile ihn deshalb nicht Anderen mit.\nSofern notwendig, [[Special:ResetTokens|kannst du ihn zurücksetzen]].",
        "savedprefs": "Deine Einstellungen wurden gespeichert.",
        "timezonelegend": "Zeitzone:",
        "localtime": "Ortszeit:",
        "prefs-emailconfirm-label": "E-Mail-Bestätigung:",
        "youremail": "E-Mail-Adresse:",
        "username": "{{GENDER:$1|Benutzername}}:",
-       "uid": "{{GENDER:$1|Benutzerkennung}}:",
        "prefs-memberingroups": "{{GENDER:$2|Mitglied}} der {{PLURAL:$1|Benutzergruppe|Benutzergruppen}}:",
        "prefs-memberingroups-type": "$2",
        "prefs-registration": "Anmeldezeitpunkt:",
        "right-move": "Seiten verschieben",
        "right-move-subpages": "Seiten inklusive Unterseiten verschieben",
        "right-move-rootuserpages": "Haupt-Benutzerseiten verschieben",
+       "right-move-categorypages": "Kategorieseiten verschieben",
        "right-movefile": "Dateien verschieben",
        "right-suppressredirect": "Beim Verschieben die Erstellung einer Weiterleitung unterdrücken",
        "right-upload": "Dateien hochladen",
        "action-move": "die Seite zu verschieben",
        "action-move-subpages": "diese Seite und zugehörige Unterseiten zu verschieben",
        "action-move-rootuserpages": "Haupt-Benutzerseiten zu verschieben",
+       "action-move-categorypages": "Kategorieseiten zu verschieben",
        "action-movefile": "Diese Datei verschieben",
        "action-upload": "Dateien hochzuladen",
        "action-reupload": "die vorhandene Datei zu überschreiben",
        "log-title-wildcard": "Titel beginnt mit …",
        "showhideselectedlogentries": "Ausgewählte Logbucheinträge anzeigen/verstecken",
        "allpages": "Alle Seiten",
-       "alphaindexline": "$1 bis $2",
        "nextpage": "Nächste Seite ($1)",
        "prevpage": "Vorherige Seite ($1)",
        "allpagesfrom": "Seiten anzeigen ab:",
        "movepagetalktext": "Die dazugehörige Diskussionsseite wird, sofern vorhanden, mitverschoben, '''es sei denn:'''\n*Es existiert bereits eine Diskussionsseite mit diesem Namen, oder\n*du wählst die unten stehende Option ab.\n\nIn diesen Fällen musst du, falls gewünscht, den Inhalt der Seite von Hand verschieben oder zusammenführen.\n\nBitte den '''neuen''' Titel unter '''Ziel''' eintragen, darunter die Umbenennung bitte '''begründen.'''",
        "movearticle": "Seite verschieben:",
        "moveuserpage-warning": "'''Warnung:''' Du bist dabei, eine Benutzerseite zu verschieben. Bitte bedenke, dass dadurch nur die Benutzerseite verschoben, '''nicht''' aber der Benutzer umbenannt wird.",
+       "movecategorypage-warning": "<strong>Warnung:</strong> Du bist gerade dabei, eine Kategorieseite zu verschieben. Bitte sei dir bewusst, dass nur die Seite verschoben wird. Alle Seiten in der alten Kategorie werden <em>nicht</em> neu kategorisiert.",
        "movenologintext": "Du musst ein registrierter Benutzer und [[Special:UserLogin|angemeldet]] sein, um eine Seite zu verschieben.",
        "movenotallowed": "Du hast nicht die erforderliche Berechtigung, um Seiten verschieben zu können.",
        "movenotallowedfile": "Du hast nicht die erforderliche Berechtigung, um Dateien verschieben zu können.",
        "cant-move-user-page": "Du hast nicht die erforderliche Berechtigung, Benutzerhauptseiten verschieben zu können.",
        "cant-move-to-user-page": "Du hast nicht die Berechtigung, Seiten auf eine Benutzerseite zu verschieben (mit Ausnahme von Benutzerunterseiten).",
+       "cant-move-category-page": "Du hast keine Berechtigung, um Kategorieseiten zu verschieben.",
+       "cant-move-to-category-page": "Du hast keine Berechtigung, um eine Seite zu einer Kategorieseite zu verschieben.",
        "newtitle": "Ziel:",
        "move-watch": "Quell- und Zielseite beobachten",
        "movepagebtn": "Seite verschieben",
        "newimages-summary": "Diese Spezialseite zeigt die zuletzt hochgeladenen Dateien an.",
        "newimages-legend": "Filter",
        "newimages-label": "Dateiname (oder ein Teil davon):",
-       "showhidebots": "(Bots $1)",
+       "newimages-showbots": "Uploads von Bots anzeigen",
        "noimages": "Keine Dateien gefunden.",
        "ilsubmit": "Suchen",
        "bydate": "nach Datum",
        "watchlistedit-raw-done": "Deine Beobachtungsliste wurde gespeichert.",
        "watchlistedit-raw-added": "{{PLURAL:$1|Ein Eintrag wurde|$1 Einträge wurden}} hinzugefügt:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|Ein Eintrag wurde|$1 Einträge wurden}} entfernt:",
+       "watchlistedit-clear-title": "Beobachtungsliste leeren",
+       "watchlistedit-clear-legend": "Beobachtungsliste leeren",
+       "watchlistedit-clear-explain": "Alle Seitennamen werden von deiner Beobachtungsliste entfernt.",
+       "watchlistedit-clear-titles": "Seitennamen:",
+       "watchlistedit-clear-submit": "Beobachtungsliste leeren (Dies ist dauerhaft!)",
+       "watchlistedit-clear-done": "Deine Beobachtungsliste wurde geleert.",
+       "watchlistedit-clear-removed": "{{PLURAL:$1|Ein Seitenname wurde|$1 Seitennamen wurden}} entfernt:",
+       "watchlistedit-too-many": "Es gibt hier zu viele Seiten zum Anzeigen.",
+       "watchlisttools-clear": "Beobachtungsliste leeren",
        "watchlisttools-view": "Beobachtungsliste: Änderungen",
        "watchlisttools-edit": "normal bearbeiten",
        "watchlisttools-raw": "im Listenformat bearbeiten (Import/Export)",
index 13b8c95..89e7472 100644 (file)
        "october-date": "Tışrino Verên $1",
        "november-date": "Tışrino Peyên $1",
        "december-date": "Kanun $1",
-       "pagecategories": "{{PLURAL:$1|Kategori|Kategoriy}}",
+       "pagecategories": "{{PLURAL:$1|Kategoriye|Kategoriy}}",
        "category_header": "Pelê ke kategoriya \"$1\" derê",
        "subcategories": "Kategoriyê bınêni",
        "category-media-header": "Dosyeyê ke kategoriya \"$1\" derê",
        "vector-action-unprotect": "Starkerdışi bıvurne",
        "vector-view-create": "Vıraze",
        "vector-view-edit": "Bıvurne",
-       "vector-view-history": "Verênan bıvêne",
+       "vector-view-history": "Tarixê pele bıvêne",
        "vector-view-view": "Bıwane",
        "vector-view-viewsource": "Çımey bıvêne",
        "actions": "Hereketi",
-       "namespaces": "Caynaman",
+       "namespaces": "Heruna nameyan",
        "variants": "Varyanti",
        "navigation-heading": "Menuyê navigasyoni",
        "errorpagetitle": "Xeta",
        "viewhelppage": "Pela peşti bıvêne",
        "categorypage": "Pela kategoriye bıvêne",
        "viewtalkpage": "Werênayışi bıvêne",
-       "otherlanguages": "Zıwanê bini",
+       "otherlanguages": "Zıwananê binan de",
        "redirectedfrom": "(Pele da $1 ra heteneyê)",
        "redirectpagesub": "Pela berdışi",
        "lastmodifiedat": "Ena pele tewr peyên roca $2, $1 de biya rocaniye.",
        "page-atom-feed": "\"$1\" Cıresnayışê atomi",
        "feed-atom": "Atom",
        "feed-rss": "RSS",
-       "red-link-title": "$1 (çınya)",
+       "red-link-title": "$1 (pele çıniya)",
        "sort-descending": "Rêzkerdışo kêmbiyaye",
        "sort-ascending": "Rêzkerdışo zêdiyaye",
        "nstab-main": "Wesiqe",
        "mergehistory-empty": "Revizyonî yew nibenê.",
        "mergehistory-success": "$3 {{PLURAL:$3|revizyonê|revizyonê}} [[:$1]] u [[:$2]] yew biyê.",
        "mergehistory-fail": "Tarixê pele yew nibeno, ma rica kenê ke pel u wext control bike.",
-       "mergehistory-no-source": "Pela çime $1 çini yo.",
+       "mergehistory-no-source": "Pela çımeyê $1 çıniya.",
        "mergehistory-no-destination": "Pela destinasyoni $1 çini yo.",
        "mergehistory-invalid-source": "Pela çime gani yew seroğê raşt biy.",
        "mergehistory-invalid-destination": "Pela destinasyonî gani yew seroğê raşt biy.",
        "recentchangescount": "Amarê vurnayışê ke hesıbyaye deye bımocneyê:",
        "prefs-help-recentchangescount": "Ney de vurnayışê peyêni, tarixê pelan u cıkewteni asenê.",
        "prefs-help-watchlist-token2": "Na pawıtış nımnayi kılta listada şımaya.\nOke kıliti zano şeno listeya tamaşann bıvino. Poğta coy ra kesiya me hesırne. \n[[Special:ResetTokens|Na kıliti reset kerdışi re tiyay bıploğne]].",
-       "savedprefs": "Tecihey şıma qeyd biyey.",
+       "savedprefs": "Tecihê şıma qeyd biy.",
        "timezonelegend": "Warey saete:",
        "localtime": "saeta mehelliye:",
        "timezoneuseserverdefault": "Zey karkerdışê Wiki ($1)",
        "timezoneregion-pacific": "Okyanuso Pasifik",
        "allowemail": "Karberê bini wa bışê mı rê e-posta bırışê.",
        "prefs-searchoptions": "Cı geyre",
-       "prefs-namespaces": "Caynaman",
+       "prefs-namespaces": "Heruna nameyan",
        "defaultns": "Eke heni, enê cayanê namey de cı geyre (sae ke):",
        "default": "qısur",
        "prefs-files": "Dosyey",
        "prefs-emailconfirm-label": "Tesdiqiya E-posta:",
        "youremail": "E-Mail (mecbur niyo) *:",
        "username": "{{GENDER:$1|Nameyê karberi}}:",
-       "uid": "Kamiya {{GENDER:$1|karberi}}:",
        "prefs-memberingroups": "{{GENDER:$2|Ezayê}} {{PLURAL:$1|grube|gruban}}:",
        "prefs-memberingroups-type": "$1",
        "prefs-registration": "Wextê qeydbiyayışi",
        "recentchanges-legend-newpage": "([[Special:NewPages|Lista pelanê neweyan]] zi bıvêne)",
        "recentchanges-legend-plusminus": "''(±123)''",
        "rcnotefrom": "Cêr de <strong>$2</strong> ra nata vurnayışiyê asenê (tewr vêşi <strong>$1</strong> asenê).",
-       "rclistfrom": "$3 $2 ra tepiya vurnayışanê newan bımocne",
+       "rclistfrom": "$3 $2 ra tepiya vurnayışanê neweyan bımocne",
        "rcshowhideminor": "Vurnayışanê werdiyan $1",
        "rcshowhideminor-show": "Bımocne",
        "rcshowhideminor-hide": "Bınımne",
        "filename-toolong": "Nameyê dosyayan 240 bayt ra derg do nêbo.",
        "badfilename": "Nameyanê dosyayî ''$1'' rê vurneyî biye.",
        "filetype-mime-mismatch": "Derg kerdıştê Dosyada \".$1\" u ($2) MIME tipiya cıya pêro nina.",
-       "filetype-badmime": "Dosyaya ke tipê MIME \"$1\"i de bar nêbena.",
+       "filetype-badmime": "Dosyeyê ke tipê MIME \"$1\" derê nêşenê bar bıbê.",
        "filetype-bad-ie-mime": "na dosya bar nebena çunke Internet Explorer na dosya \"$1\" zerarın vinena.",
        "filetype-unwanted-type": "'''\".$1\"''' na tewırê dosyayi nêwazyena. pêşniyaz biyaye {{PLURAL:$3|tewırê dosyayi|tewırê dosyayi}} $2.",
        "filetype-banned-type": "'''\".$1\"''' {{PLURAL:$4|Ena babeta dosya qebul ne vinena|Ena babeta dosya qebul ne vinena|Ena babeta dosya qebul ne vinena}}. Eke cırê izin deyayo $2. {{PLURAL:$3|Babatan dosyayan|babeta dosyayan}}",
        "uploadwarning-text": "Bînê de deskripyonê dosyayî bivurne u reyna qeyd bike.",
        "savefile": "Dosya qeyd ke",
        "uploadedimage": "\"[[$1]]\" bar bi",
-       "overwroteimage": "Newi versiyona resim da \"[[$1]]\"i bar biya",
+       "overwroteimage": "yew versiyonê \"$1\" newe bar bi",
        "uploaddisabled": "bar kerdişî iptal biyo",
        "copyuploaddisabled": "URL bar kerdiş kefiliyeyo.",
-       "uploaddisabledtext": "Barkerdışa dosyaya dewre ra veta.",
+       "uploaddisabledtext": "Barkerdışê dosya dewre ra veta.",
        "php-uploaddisabledtext": "barkerdışê dosyayê PHP nıka çino. kerem kere eyarê file_uploads korol bıkerê.",
        "uploadscripted": "Ena dosya de yew HTML ya zi kodê scriptî este ke belki browserê webî fam nikeno.",
        "uploadinvalidxml": "Dosyaya barkerdiye de XML nêgureniya.",
        "upload-copy-upload-invalid-domain": "Na domain ra kopyayê barkerdışanê nêbenê.",
        "backend-fail-stream": "$1 nê vırazeyê",
        "backend-fail-backup": "$1 nê wendeyê",
-       "backend-fail-notexists": "$1 name dı dosya çına.",
+       "backend-fail-notexists": "Dosyaya $1 çıniya.",
        "backend-fail-hashes": "Şınasiya dosyaya gırotışê cı nêgêriya.",
        "backend-fail-notsame": "Zey $1 ju dosya xora  esta.",
        "backend-fail-invalidpath": "$1 rayê da depo kerdışa raştay niya.",
        "img-auth-notindir": "Patikayê ke ti wazeno direktorê bar biyayişî de çin o.",
        "img-auth-badtitle": "\"$1\" ra nieşkeno yew seroğê raştî virazî.",
        "img-auth-nologinnWL": "Ti cikewte ni yo u \"$1\" listeyo sipê de çin o.",
-       "img-auth-nofile": "Dosyaya ''$1''i çıniya.",
+       "img-auth-nofile": "Dosyaya ''$1'' çıniya.",
        "img-auth-isdir": "\"$1\" şıma gêrenî bıresî tiya.\nşıma têna eşkenî bıresi dosya.",
        "img-auth-streaming": "\"$1\" stream keno.",
        "img-auth-public": "img_auth.php'nin fonksiyonê ney; wiki ra dosyaya xususiyan vetışo.\nno wiki bı umumi eyar biyo.\nqey pawıtışi, img_auth.php battal verdiyayo.",
        "filerevert-comment": "Sebeb:",
        "filerevert-defaultcomment": "Versiyonê $2, $1 rê reyna ard",
        "filerevert-submit": "Reyna biyere",
-       "filerevert-success": "'''[[Media:$1|$1]]''', [$4 versiyonê $3, $2]i peyser açarna.",
+       "filerevert-success": "'''[[Media:$1|$1]]''' peyser çarna ra [versiyonanê $4, $3, $2].",
        "filerevert-badversion": "Vesiyonê lokalê verniyê eno dosya pê ena pulêwext de çin o.",
        "filedelete": "$1 bestere",
        "filedelete-legend": "Dosya bestere",
        "filedelete-comment": "Sebeb:",
        "filedelete-submit": "Bestere",
        "filedelete-success": "'''$1'''  esteriyayo.",
-       "filedelete-success-old": "Versiyonê '''[[Media:$1|$1]]'''i $3, $2 esteriyaya.",
+       "filedelete-success-old": "Versiyonê '''[[Media:$1|$1]]''' be tarixê $3, $2 ra esteriya.",
        "filedelete-nofile": "'''$1''' çin o.",
        "filedelete-nofile-old": "Versiyonê arşivi ye '''$1'''î pê enê detayanê xasî çin o.",
        "filedelete-otherreason": "Sebebo bin/ilaweyın:",
        "unusedtemplatestext": "no pel, {{ns:template}} pelê ke pelê binan de nêaseni, ninan keno.",
        "unusedtemplateswlh": "linkanê binî",
        "randompage": "Pela raştameyiye",
-       "randompage-nopages": "Ena {{PLURAL:$2|cayêname|cayênameyî}} de enê pelan çin o: $1.",
+       "randompage-nopages": "Na {{PLURAL:$2|heruna namey|heruna nameyan}} de nê peli çıniyê: $1.",
        "randomincategory": "Ğoseri pera kategoriya",
        "randomincategory-invalidcategory": "\"$1\" yew nameyê kategoriya vêrdiye niyo.",
        "randomincategory-nopages": "Kategori da [[:Category:$1|$1]] de qet  per çıniya.",
        "randomincategory-selectcategory": "Pera ke cıra raşt ameye kategori do bıgéri yo: $1 $2.",
        "randomincategory-selectcategory-submit": "Şo",
        "randomredirect": "Serçarnayışo rastameye",
-       "randomredirect-nopages": "Ena cayênameyê \"$1\"i de serkırışten çıniya.",
+       "randomredirect-nopages": "Cayê nameyê \"$1\" de serşıkıtışi çıniyê.",
        "statistics": "İstatistiki",
        "statistics-header-pages": "İstatistikê pele",
        "statistics-header-edits": "Îstatistikê vurnayîşî",
        "withoutinterwiki-submit": "Bımocne",
        "fewestrevisions": "Pelê be senık çımraviyarnayışi",
        "nbytes": "$1 {{PLURAL:$1|bayt|bayti}}",
-       "ncategories": "$1 {{PLURAL:$1|Kategori|Kategoriy}}",
+       "ncategories": "$1 {{PLURAL:$1|Kategoriye|Kategoriy}}",
        "ninterwikis": "$1 {{PLURAL:$1|interwiki|interwikiy}}",
        "nlinks": "$1 {{PLURAL:$1|link|linkî}}",
        "nmembers": "$1 {{PLURAL:$1|eza|ezayan}}",
        "specialpage-empty": "Seba na rapore netice çıniyo.",
        "lonelypages": "Pelê seyi",
        "lonelypagestext": "Ena pelî link nibiyê ya zi pelanê binî {{SITENAME}} de transclude biy.",
-       "uncategorizedpages": "Pelayanê ke kategorî nibiye",
-       "uncategorizedcategories": "Kategoriyê ke bêkategoriyê",
+       "uncategorizedpages": "Pelê ke kategorize nêbiyê",
+       "uncategorizedcategories": "Kategoriyê ke kategorize nêbiyê",
        "uncategorizedimages": "Dosyayê ke bê kategoriyê",
        "uncategorizedtemplates": "Şablonê ke bêkategoriyê",
-       "unusedcategories": "Kategoriyê ke nê xebtênê",
+       "unusedcategories": "Kategoriyê ke nêgureniyê",
        "unusedimages": "Dosyeyê ke nê xebtênê",
        "popularpages": "Pelî ke populer o.",
-       "wantedcategories": "Kategoriye ke waziyayê",
+       "wantedcategories": "Kategoriyê ke waziyayê",
        "wantedpages": "Peleye ke waştênê",
        "wantedpages-badtitle": "sernuşte meqbul niyo: $1",
        "wantedfiles": "Dosyeyê cıgeyriyayey",
        "wantedfiletext-nocat": "Dosyeyê cêrêni estê lekin karnêvıstê. Dosyeyê xeribi liste benê. bo babeta dano <del>ateber</del>",
        "wantedtemplates": "Şablonê ke waziyenê",
        "mostlinked": "Pelî ke tewr zafî lînk bîy.",
-       "mostlinkedcategories": "Kategoriyê ke tewr zaf wesiqa rê gıreyê",
+       "mostlinkedcategories": "Kategoriyê ke tewr zehf meqaley tede estê",
        "mostlinkedtemplates": "Şablonê ke tewr zafî pela re gıre bîye.",
        "mostcategories": "Pelan ke tewr zaf kategorî estê.",
        "mostimages": "Dosyayan ke tewr zaf link estê.",
        "move": "Bere",
        "movethispage": "Ena pele bere",
        "unusedimagestext": "Enê dosyey estê, feqet zerrey yew pele de wedardey niyê.\nXo vira mekerê ke, sıteyê webiê bini şenê direkt ebe URLi yew dosya ra gırê bê, u wına şenê verba gurênayışo feal de tiya hewna lista bê.",
-       "unusedcategoriestext": "kategoriyê ke cêrdeyê estê lakin qet ju wesiqa yana kategori de nexebtênê.",
+       "unusedcategoriestext": "Kategoriyê ke cêr derê, nê bıbê zi, terefê qet madeyan ya zi kategoriyan ra nêgureniyenê.",
        "notargettitle": "Hedef çini yo",
        "notargettext": "qey xebıtnayişê ney fonksiyoni şıma yew hedef nişane nêkerd.",
        "nopagetitle": "wina yew pelê hedefi çin o.",
        "log-title-wildcard": "sername yê ke pê ney nuşteyi destkenêpê bıgêr.",
        "showhideselectedlogentries": "Qeydê weçinayışê bımocne/bınımne dekerê",
        "allpages": "Peli pêro",
-       "alphaindexline": "$1 ra $2ine",
        "nextpage": "Pela badê cû ($1)",
        "prevpage": "Pela verêne ($1)",
        "allpagesfrom": "Pelanê ke be ena herfe dest pêkenê bımocne",
        "sp-deletedcontributions-contribs": "iştıraqi",
        "linksearch": "Gıreyê teberi cı geyrê",
        "linksearch-pat": "bıgêr motif:",
-       "linksearch-ns": "Caynami:",
+       "linksearch-ns": "Heruna namey:",
        "linksearch-ok": "Cı geyre",
        "linksearch-text": "Jokeri ê zey \"*.wikipedia.org\"i benê ke bıgureniyê.\nTewr senık yew sewiya serêna cayê tesiri lazıma, mesela \"*.org\".<br />\nQeydeyê {{PLURAL:$2|protoqol|protoqoli}}:destegbiyayey: <code>$1</code> (qet yew qeydeyo hesabiyaye http:// ke name nêbiyo).",
        "linksearch-line": "$1, $2 ra link biya",
        "activeusers-count": "$1 peyni {{PLURAL:$3|roz de|$3 rozan de}} $1 {{PLURAL:$1|hereket|hereketi}} kerdê",
        "activeusers-from": "Enê karberi ra tepya bımocne:",
        "activeusers-hidebots": "Botan bınımne",
-       "activeusers-hidesysops": "İdarekerdoğan bınımne",
+       "activeusers-hidesysops": "İdarekaran bınımne",
        "activeusers-noresult": "Karberi nêdiyayê.",
        "listgrouprights": "heqê grubê karberi",
        "listgrouprights-summary": "wikiya cêrın a ke tede grubê karberi nişane biyê, listeya heqê cıresayişê inan o.\nqey heqê şexsi de [[{{MediaWiki:Listgrouprights-helppage}}|hema malumato ziyed]] belka esto.",
        "listgrouprights-removegroup-self": "Hesabê xo ra {{PLURAL:$2|grube|gruban}} bıvecê: $1",
        "listgrouprights-addgroup-self-all": "şıma eşkeni hesabê xo re heme gruban têare bıkerî",
        "listgrouprights-removegroup-self-all": "şıma hesabê xo ra eşkeni heme gruban bıveci",
-       "listgrouprights-namespaceprotection-namespace": "Caynami",
-       "trackingcategories": "Kategoriye taqiban",
-       "trackingcategories-msg": "Kategoriya taqibi",
+       "listgrouprights-namespaceprotection-namespace": "Heruna namey",
+       "trackingcategories": "Kategoriyê teqibi",
+       "trackingcategories-msg": "Kategoriya teqibi",
        "trackingcategories-name": "Namey mesaci",
        "trackingcategories-desc": "Kriterê definayışê kategoriye",
        "trackingcategories-disabled": "Kategoriya feal niya",
        "nowatchlist": "listeya temaşa kerdıişê şıma de yew madde zi çina.",
        "watchlistanontext": "qey vurnayişê maddeya listeya temaşakerdişi $1.",
        "watchnologin": "Şıma cıkewtış nêvıraşto",
-       "addwatch": "Listeyê seyri deke",
+       "addwatch": "Lista seyrkerdışi ke",
        "addedwatchtext": "Ma pele \"[[:$1]]\" zerri [[Special:Watchlist|watchlist]]ê tı kerd de.\nEna deme ra, ma qe vurnayışan ser ena pele tı haberdar keni.",
-       "removewatch": "Listedê mınê seyr kerdışi ra hewad",
+       "removewatch": "Lista seyrkerdışi ra wedare",
        "removedwatchtext": "Ena pela \"[[:$1]]\" biya wedariya [[Special:Watchlist|listeyê seyr-kerdışi şıma]].",
        "watch": "Seyr ke",
        "watchthispage": "Ena pele seyr ke",
        "undelete-error-long": "hewn a kerdışê na dosyayi wexta tepiya geriyenê xeta vıraziya:\n\n$1",
        "undelete-show-file-confirm": "\"<nowiki>$1</nowiki>\" şıma emin î dosyaya revizyonê no $2 $3 tarixi bıvini?",
        "undelete-show-file-submit": "E",
-       "namespace": "Caynami:",
+       "namespace": "Heruna namey:",
        "invert": "Weçinıtışi açarne",
        "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": "Heruna nameyanê elaqedaran",
        "import-comment": "Vatış:",
        "importtext": "Kerem ke dosyay, çımeyê wiki ra pê [[Special:Export|kırıştışê teberdayişi]] bıdê teber, Komputerê xo de qeyd kerê u bar kerê tiya.",
        "importstart": "Pelan împort kenî",
-       "import-revision-count": "$1 {{PLURAL:$1|revizyon|revizyon}}",
+       "import-revision-count": "$1 {{PLURAL:$1|çımraviyarnayış|çımraviyarnayışi}}",
        "importnopages": "Pel çino ke import bike",
        "imported-log-entries": " $1 {{PLURAL:$1|logê dekerdişi|loganê dekerdişan}} ard.",
        "importfailed": "Împort nebiy: <nowiki>$1</nowiki>",
        "import-logentry-upload": "dosyayê bar kerdişî ra [[$1]] împort biyo",
        "import-logentry-upload-detail": "$1 {{PLURAL:$1|çımraviyarnayış|çımraviyarnayışi}}",
        "import-logentry-interwiki": "$1 transwiki biyo",
-       "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|revizyon|revizyonî}} $2 ra",
+       "import-logentry-interwiki-detail": "$2 ra $1 {{PLURAL:$1|çımraviyarnayış|çımraviyarnayışi}}",
        "javascripttest": "Cerebnayışê JavaScripti",
        "javascripttest-title": "Testê $1 gurweyênê",
        "javascripttest-pagetext-noframework": "Na pela testanê JavaScripta gurweynayışi re abıryaya.",
        "tooltip-pt-watchlist": "Lista pelanê ke to gırewtê seyrkerdış",
        "tooltip-pt-mycontris": "Listeya dekerdışan de şıma",
        "tooltip-pt-login": "Mayê şıma ronıştış akerdışi rê dawet keme; labelê ronıştış mecburi niyo",
-       "tooltip-pt-logout": "Sistem ra vıcyayış",
+       "tooltip-pt-logout": "Bıveciye",
        "tooltip-ca-talk": "Zerrekê pele sero werênayış",
        "tooltip-ca-edit": "Tı şenay na pele bıvurnê. Kerem ke, qeydkerdış ra ver gocega verqayti bıgurene.",
        "tooltip-ca-addsection": "Zu bınnusteya newi ak",
        "tooltip-compareselectedversions": "Ena per de ferqê rewziyonan de dı weçinaya bıvinê",
        "tooltip-watch": "Ena pele lista xoya seyrkerdışi ke",
        "tooltip-watchlistedit-normal-submit": "Sernuşteyan wedare",
-       "tooltip-watchlistedit-raw-submit": "Listeyê seyri newen ke",
+       "tooltip-watchlistedit-raw-submit": "Lista seyrkerdışi newe ke",
        "tooltip-recreate": "pel hewn a bışiyo zi tepiya biya",
        "tooltip-upload": "Sergen de bari be",
        "tooltip-rollback": "\"Peyser bia\" be yew tık pela iştıraq(an)ê peyên|i(an) peyser ano.",
        "pageinfo-recent-edits": "Amariya vurnayışan ($1 ra nata)",
        "pageinfo-recent-authors": "Amarina nuştekaran pêro",
        "pageinfo-magic-words": "{{PLURAL:$1|Çekuya|Çekuyê}} ($1) sihırini",
-       "pageinfo-hidden-categories": "($1) {{PLURAL:$1|Kategoriyer|Kategoriyan}} bınımne",
+       "pageinfo-hidden-categories": "{{PLURAL:$1|Kategoriya nımıtiye|Kategoriyê nımıtey}} ($1)",
        "pageinfo-templates": "{{PLURAL:$1|Şablono|Şablonê}} ke mocniyenê ($1)",
        "pageinfo-transclusions": "{{PLURAL:$1|1 Pele|$1 Pelan}} de bestiya pıra",
        "pageinfo-toolboxlink": "Melumatê pele",
        "newimages-summary": "Ena pela xasi dosyayi ke peni de bar biyayeyi mocnane.",
        "newimages-legend": "Avrêc",
        "newimages-label": "Nameyê dosya ( ya zi parçe ey)",
-       "showhidebots": "(bota $1)",
        "noimages": "Çik çini yo.",
        "ilsubmit": "Cı geyre",
        "bydate": "goreyê zemani",
        "minutes": "{{PLURAL:$1|$1 deqa|$1 deqan}}",
        "hours": "{{PLURAL:$1|$1 saete|$1 saetan}}",
        "days": "{{PLURAL:$1|$1 roce|$1 roci}}",
-       "weeks": "{{PLURAL:$1|$1 hefte|$1 hefteyan}}",
+       "weeks": "{{PLURAL:$1|$1 hefte|$1 heftey}}",
        "months": "{{PLURAL:$1|aşme|$1 aşman}}",
-       "years": "{{PLURAL:$1|$1 serre|$1 serran}}",
+       "years": "{{PLURAL:$1|$1 serre|$1 serri}}",
        "ago": "Verê $1",
-       "just-now": "Hema newke",
-       "hours-ago": "Verê $1 {{PLURAL:$1|saete|saetan}}",
+       "just-now": "tafte nıka",
+       "hours-ago": "$1 {{PLURAL:$1|saete|saeti}} raver",
        "minutes-ago": "Verê $1 {{PLURAL:$1|deqa|deqan}}",
        "seconds-ago": "Verê $1 {{PLURAL:$1|saniya|saniyeyan}}",
        "monday-at": "Dışeme $1 de",
        "exif-languagecode": "Zıwan",
        "exif-iimversion": "Verqaydê IIM",
        "exif-iimcategory": "Kategoriye",
-       "exif-iimsupplementalcategory": "Kategoriyê temam kerdışi",
+       "exif-iimsupplementalcategory": "Kategoriyê temamkerdışi",
        "exif-datetimeexpires": "No peyra mekarênê",
        "exif-datetimereleased": "Bıroşe",
        "exif-originaltransmissionref": "Oricinal pusula da kodê açarnayışi",
        "bitrate-yottabits": "$1Ybps",
        "lag-warn-normal": "Vurnayîşî ke {{PLURAL:$1|seniye|seniyeyî}} ra newiyerî belki inan nimucneno.",
        "lag-warn-high": "Eka serverê databaseyî zaf hebitiyeno, ayra vurnayîşî ke {{PLURAL:$1|seniye|seniyeyî}} ra newiyerî belki inan nimucneno.",
-       "watchlistedit-normal-title": "Listeyê seyirkerdişi bivurne",
-       "watchlistedit-normal-legend": "Listeya seyri ra sername wedarne.",
+       "watchlistedit-normal-title": "Lista seyrkerdışi bıvurne",
+       "watchlistedit-normal-legend": "Lista seyrkerdışi ra sernameyan wedare",
        "watchlistedit-normal-explain": "Listeyê seyr kerdîşî ti de serogî cor de mucnayiyo.\nEka ti wazeno seroğ biwedarne, kuti ke kistê de, ay işaret bike u \"{{int:Watchlistedit-normal-submit}}\" klik bike.\nTi hem zi eşkeno [[Special:EditWatchlist/raw|edit the raw list]].",
        "watchlistedit-normal-submit": "Sernuşteyan wedare",
        "watchlistedit-normal-done": "{{PLURAL:$1|1 seroğ|$1 seroğî}} seyr kerdişê tu ra wedarno.",
-       "watchlistedit-raw-title": "Listeyê seyirkerdişi ye hami bivurne",
-       "watchlistedit-raw-legend": "Listeyê seyirkerdişi ye hami bivurne",
+       "watchlistedit-raw-title": "Lista seyrkerdışia xame bıvurne",
+       "watchlistedit-raw-legend": "Lista seyrkerdışia xame bıvurne",
        "watchlistedit-raw-explain": "Listeyê seyr kerdîşî ti de serogî cor de mucnayiyo u ti eşkeno pê dekerdiş u wedarnayîş liste bivurne.\nEka vurnayîşê ti qediyo, Listeyê Seyr Kerdişî Rocaniye Bike \"{{int:Watchlistedit-raw-submit}}\" klik bike.\nTi hem zi eşkeno [[Special:EditWatchlist|use the standard editor]].",
        "watchlistedit-raw-titles": "Seroğî:",
-       "watchlistedit-raw-submit": "Listeyê seyri newen ke",
+       "watchlistedit-raw-submit": "Lista seyrkerdışi newe ke",
        "watchlistedit-raw-done": "Listeyê tuyê seyrkerdişi rocaniye biyo",
        "watchlistedit-raw-added": "{{PLURAL:$1|1 seroğ|$1 seroğî}} de kerd:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|1 seroğ|$1 seroği}} besteriyaye:",
-       "watchlisttools-view": "vurnayışanê eleqadari bıvin",
-       "watchlisttools-edit": "Lista seyrkerdışi bıvênên u bıvurnên",
-       "watchlisttools-raw": "Listeyê seyr-kerdışi bıvin",
+       "watchlisttools-view": "Vurnayışanê elaqedaran bıvêne",
+       "watchlisttools-edit": "Lista seyrkerdışi bıvêne û bıvurne",
+       "watchlisttools-raw": "Lista seyrkerdışia xame bıvurne",
        "iranian-calendar-m1": "Farvardin",
        "iranian-calendar-m2": "Ordibeheşt",
        "iranian-calendar-m3": "Xordad",
        "hebrew-calendar-m12-gen": "Elul",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|mesac]])",
        "timezone-utc": "[[UTC]]",
-       "unknown_extension_tag": "Etiketê dekewteki \"$1\"i nêzanyeno",
+       "unknown_extension_tag": "Etiketê ilaweyo nêzanayey \"$1\"",
        "duplicate-defaultsort": "'''Tembe:''' Hesıbyaye sırmey ratnayış de \"$2\" sırmey ratnayış de \"$1\"i nêhesıbneno.",
        "version": "Versiyon",
        "version-extensions": "Ekstensiyonî ke ronaye",
        "tags-intro": "Eno pel de listeyê eyiketî este ke belki software pê ey edit kenî.",
        "tags-tag": "Nameyê etiketi",
        "tags-display-header": "Listeyê vurnayîşî de esayîş",
-       "tags-description-header": "Tam akerdena maney cı",
+       "tags-description-header": "Tam arezekerdışê maneyê cı",
        "tags-active-header": "Activ o?",
        "tags-hitcount-header": "Vurnayîşî ke etiket biyê",
        "tags-active-yes": "E",
        "htmlform-no": "Nê",
        "htmlform-yes": "Eya",
        "htmlform-chosen-placeholder": "Opsiyon weçine",
+       "htmlform-cloner-create": "Tayêna cı ke",
+       "htmlform-cloner-delete": "Wedare",
        "sqlite-has-fts": "$1 tam-metn destegê cı geyrayışiya piya",
        "sqlite-no-fts": "$1 tam-metn bê destegê cı geyrayışi",
        "logentry-delete-delete": "$1 pela $3 {{GENDER:$2|esterıte}}",
index 68327d6..0756701 100644 (file)
        "prefs-emailconfirm-label": "E-mailowe wobkšuśenje:",
        "youremail": "E-mail:",
        "username": "Mě {{GENDER:$1|wužywarja|wužywarki}}:",
-       "uid": "ID {{GENDER:$1|wužywarja|wužywarki}}:",
        "prefs-memberingroups": "{{GENDER:$2|Cłon|Cłonka}} {{PLURAL:$1|wužywarskeje kupki|wužiwarskeju kupkowu|wužywarskich kupkow}}:",
        "prefs-registration": "Cas registracije:",
        "yourrealname": "Realne mě *:",
        "log-title-wildcard": "Pytaś nadpismo, kótarež zachopijo z ...",
        "showhideselectedlogentries": "Wubrane protokolowe zapiski pokazaś/schowaś",
        "allpages": "Wšykne boki",
-       "alphaindexline": "$1 do $2",
        "nextpage": "Slědujucy bok ($1)",
        "prevpage": "Pśedchadny bok ($1)",
        "allpagesfrom": "Boki pokazaś wót:",
        "newimages-summary": "Toś ten specialny bok pokazujo dataje, kótarež su se ako slědne nagrali.",
        "newimages-legend": "Filter",
        "newimages-label": "Datajowe mě (abo źěl z togo):",
-       "showhidebots": "(awtomatiske programy (boty) $1)",
        "noimages": "Žedne dataje njejsu se namakali.",
        "ilsubmit": "Pytaś",
        "bydate": "pó datumje",
index db7a2ec..ad2e359 100644 (file)
        "edit-gone-missing": "Impusébil arnuvêr la pàgina. \nA sèmbra ch'la sìa stêda scanşlêda.",
        "edit-conflict": "Cuntrâst 'd edisiòun.",
        "edit-no-change": "La mudéfica an n'é mìa stêda cunsidrêda perchè an n'é mìa stê fât di cambiamèint al tèst.",
+       "postedit-confirmation-created": "La pàgina l'é stêda fâta",
+       "postedit-confirmation-restored": "La pàgina l'é stêda turnêda a mèter",
        "postedit-confirmation-saved": "La mudéfica l'é stêda salvêda.",
        "edit-already-exists": "L'é impusébil fêr 'na pàgina nōva.\nLa ghé bèle.",
        "defaultmessagetext": "Tèst pre-stabilî",
        "revdelete-text-text": "Al versiòun scanşlêdi as vèden incòra int la stòria 'd la pàgina, mó pcòun ed còl che gh'é dèinter al srà mìa vést dal póblich.",
        "revdelete-text-file": " Al versiòun di file scanşlê as vèden incòra int la stòria dal file, mó pcòun ed còl che gh'é dèinter al srà mìa vést dal póblich.",
        "logdelete-text": "I fât scanşlê as vèden incòra int la stòria 'd la pàgina, mó pcòun ed còl che gh'é dèinter al srà mìa vést dal póblich.",
+       "revdelete-text-others": "Êter aministradōr ed {{SITENAME}} a srân incòra bòun ed vèder j argomèint lughê e prân a turnêri a mèter incòra ed nōv per mèz ed cól canêl ché, se în mìa stê impustê di nōv lémit.",
+       "revdelete-confirm": "Per piaşèir cunfèirma che còst l'é còl ch'ét vō fêr, che t'é infurmê dal cunseguèinsi, e che t'é drē fêr còst int al rispèt dal [[{{MediaWiki:Policy-url}}|léni guîda]].",
+       "revdelete-suppress-text": "La scanşlêda la duvré èser druvêda <strong>sōl</strong> in chi chêş ché:\n* infurmasiòun che prén èser calónij \n* infurmasiòun personêli cme \n*: <em>indirés, nómer ed telèfon, côdis fischêl, e via acsé.</em>",
+       "revdelete-legend": "Impôsta i lémit seguèint al versiòun scanşlêdi:",
+       "revdelete-hide-text": "Tèst ed la versiòun",
+       "revdelete-hide-image": "Lōga j argumèint dal file",
+       "revdelete-hide-name": "Lōga l'asiòun e l'elemèint ed la 'stèsa",
+       "revdelete-hide-comment": "Elemèint ed la mudéfica o spiegasiòun ed l'asiòun",
+       "revdelete-hide-user": "Nòm o indirés IP ed l'avtōr",
+       "revdelete-hide-restricted": "Lōga al j infurmasiòun sgnêdi ânch a j aministradōr",
+       "revdelete-radio-same": "(an cambiêr mìa)",
        "revdelete-radio-set": "Nascònd",
        "revdelete-radio-unset": "Fà vèder",
+       "revdelete-suppress": "Lōga al j infurmasiòun sgnêdi ânch a j aministradōr",
+       "revdelete-unsuppress": "Tó via i lémit al revisiòun armési",
+       "revdelete-log": "Mutîv:",
+       "revdelete-submit": "Drōva {{PLURAL:$1|int la revisiòun sernîda|int al revisiòun sernîdi}}",
+       "revdelete-success": "<strong>Vésta ed la revisòun arnuvêda int al môd gióst.</strong>",
+       "revdelete-failure": "<strong>La vésta 'd la versiòun l'an pōl mìa èser arnuvêda:</strong>\n$1",
+       "logdelete-success": "<strong>Vésta dal fât impustêda int al môd gióst.</strong>",
+       "logdelete-failure": "<strong>La vésta dal fât l'an pōl mìa èser impustêda:</strong>\n$1",
        "revdel-restore": "Câmbia la vidûda.",
+       "pagehist": "Stòria 'd la pàgina",
+       "deletedhist": "Stòria scanşlêda",
        "revdelete-reasonotherlist": "Êtra ragiòun",
        "revertmerge": "Scanşèla l'uniòun",
        "history-title": "$1 stòria dal mudéfichi",
        "timezoneregion-pacific": "Ocèan Pacéfich",
        "youremail": "E-mail:",
        "username": "{{GENDER:$1|Nòm utèint}}",
-       "uid": "{{GENDER:$1|utèint}}",
        "prefs-memberingroups": "{{GENDER:$2|Elemèint}}{{PLURAL:$1|dal gróp|di gróp}}:",
        "yourrealname": "Nòm vèira:",
        "yourlanguage": "Léngua",
        "booksources-go": "Và",
        "log": "Regéster",
        "allpages": "Tót al pàgini.",
-       "alphaindexline": "da $1 a $2",
        "allarticles": "Tót al pàgini.",
        "allpagessubmit": "Và",
        "categories": "Categoréi",
        "file-info-gif-looped": "A ripetisiòun",
        "file-info-png-looped": "A ripetisiòun",
        "newimages-legend": "Fîltra",
-       "showhidebots": "($1 i bot)",
        "ilsubmit": "Sērca",
        "bydate": "per dâta",
        "ago": "$1 fa",
index 6c483f8..87fe5ba 100644 (file)
        "newimages-summary": "Αυτή η ειδική σελίδα δείχνει τα πιο πρόσφατα φορτωμένα αρχεία.",
        "newimages-legend": "Φίλτρο",
        "newimages-label": "Όνομα αρχείου (ή μέρος αυτού):",
-       "showhidebots": "($1 bots)",
        "noimages": "Δεν υπάρχουν εικόνες.",
        "ilsubmit": "Αναζήτηση",
        "bydate": "ημερομηνίας",
index 636a1f1..399c932 100644 (file)
 {
-    "@metadata": {
-        "authors": []
-    },
-    "sidebar": "\n* navigation\n** mainpage|mainpage-description\n** recentchanges-url|recentchanges\n** randompage-url|randompage\n** helppage|help\n* SEARCH\n* TOOLBOX\n* LANGUAGES",
-    "tog-underline": "Link underlining:",
-    "tog-hideminor": "Hide minor edits in recent changes",
-    "tog-hidepatrolled": "Hide patrolled edits in recent changes",
-    "tog-newpageshidepatrolled": "Hide patrolled pages from new page list",
-    "tog-extendwatchlist": "Expand watchlist to show all changes, not just the most recent",
-    "tog-usenewrc": "Group changes by page in recent changes and watchlist",
-    "tog-numberheadings": "Auto-number headings",
-    "tog-showtoolbar": "Show edit toolbar",
-    "tog-editondblclick": "Edit pages on double click",
-    "tog-editsectiononrightclick": "Enable section editing by right clicking on section titles",
-    "tog-watchcreations": "Add pages I create and files I upload to my watchlist",
-    "tog-watchdefault": "Add pages and files I edit to my watchlist",
-    "tog-watchmoves": "Add pages and files I move to my watchlist",
-    "tog-watchdeletion": "Add pages and files I delete to my watchlist",
-    "tog-minordefault": "Mark all edits minor by default",
-    "tog-previewontop": "Show preview before edit box",
-    "tog-previewonfirst": "Show preview on first edit",
-    "tog-enotifwatchlistpages": "Email me when a page or file on my watchlist is changed",
-    "tog-enotifusertalkpages": "Email me when my user talk page is changed",
-    "tog-enotifminoredits": "Email me also for minor edits of pages and files",
-    "tog-enotifrevealaddr": "Reveal my email address in notification emails",
-    "tog-shownumberswatching": "Show the number of watching users",
-    "tog-oldsig": "Existing signature:",
-    "tog-fancysig": "Treat signature as wikitext (without an automatic link)",
-    "tog-uselivepreview": "Use live preview (experimental)",
-    "tog-forceeditsummary": "Prompt me when entering a blank edit summary",
-    "tog-watchlisthideown": "Hide my edits from the watchlist",
-    "tog-watchlisthidebots": "Hide bot edits from the watchlist",
-    "tog-watchlisthideminor": "Hide minor edits from the watchlist",
-    "tog-watchlisthideliu": "Hide edits by logged in users from the watchlist",
-    "tog-watchlisthideanons": "Hide edits by anonymous users from the watchlist",
-    "tog-watchlisthidepatrolled": "Hide patrolled edits from the watchlist",
-    "tog-ccmeonemails": "Send me copies of emails I send to other users",
-    "tog-diffonly": "Do not show page content below diffs",
-    "tog-showhiddencats": "Show hidden categories",
-    "tog-norollbackdiff": "Omit diff after performing a rollback",
-    "tog-useeditwarning": "Warn me when I leave an edit page with unsaved changes",
-    "tog-prefershttps": "Always use a secure connection when logged in",
-    "underline-always": "Always",
-    "underline-never": "Never",
-    "underline-default": "Skin or browser default",
-    "editfont-style": "Edit area font style:",
-    "editfont-default": "Browser default",
-    "editfont-monospace": "Monospaced font",
-    "editfont-sansserif": "Sans-serif font",
-    "editfont-serif": "Serif font",
-    "sunday": "Sunday",
-    "monday": "Monday",
-    "tuesday": "Tuesday",
-    "wednesday": "Wednesday",
-    "thursday": "Thursday",
-    "friday": "Friday",
-    "saturday": "Saturday",
-    "sun": "Sun",
-    "mon": "Mon",
-    "tue": "Tue",
-    "wed": "Wed",
-    "thu": "Thu",
-    "fri": "Fri",
-    "sat": "Sat",
-    "january": "January",
-    "february": "February",
-    "march": "March",
-    "april": "April",
-    "may_long": "May",
-    "june": "June",
-    "july": "July",
-    "august": "August",
-    "september": "September",
-    "october": "October",
-    "november": "November",
-    "december": "December",
-    "january-gen": "January",
-    "february-gen": "February",
-    "march-gen": "March",
-    "april-gen": "April",
-    "may-gen": "May",
-    "june-gen": "June",
-    "july-gen": "July",
-    "august-gen": "August",
-    "september-gen": "September",
-    "october-gen": "October",
-    "november-gen": "November",
-    "december-gen": "December",
-    "jan": "Jan",
-    "feb": "Feb",
-    "mar": "Mar",
-    "apr": "Apr",
-    "may": "May",
-    "jun": "Jun",
-    "jul": "Jul",
-    "aug": "Aug",
-    "sep": "Sep",
-    "oct": "Oct",
-    "nov": "Nov",
-    "dec": "Dec",
-    "january-date": "January $1",
-    "february-date": "February $1",
-    "march-date": "March $1",
-    "april-date": "April $1",
-    "may-date": "May $1",
-    "june-date": "June $1",
-    "july-date": "July $1",
-    "august-date": "August $1",
-    "september-date": "September $1",
-    "october-date": "October $1",
-    "november-date": "November $1",
-    "december-date": "December $1",
-    "pagecategories": "{{PLURAL:$1|Category|Categories}}",
-    "pagecategorieslink": "Special:Categories",
-    "category_header": "Pages in category \"$1\"",
-    "subcategories": "Subcategories",
-    "category-media-header": "Media in category \"$1\"",
-    "category-empty": "<em>This category currently contains no pages or media.</em>",
-    "hidden-categories": "{{PLURAL:$1|Hidden category|Hidden categories}}",
-    "hidden-category-category": "Hidden categories",
-    "category-subcat-count": "{{PLURAL:$2|This category has only the following subcategory.|This category has the following {{PLURAL:$1|subcategory|$1 subcategories}}, out of $2 total.}}",
-    "category-subcat-count-limited": "This category has the following {{PLURAL:$1|subcategory|$1 subcategories}}.",
-    "category-article-count": "{{PLURAL:$2|This category contains only the following page.|The following {{PLURAL:$1|page is|$1 pages are}} in this category, out of $2 total.}}",
-    "category-article-count-limited": "The following {{PLURAL:$1|page is|$1 pages are}} in the current category.",
-    "category-file-count": "{{PLURAL:$2|This category contains only the following file.|The following {{PLURAL:$1|file is|$1 files are}} in this category, out of $2 total.}}",
-    "category-file-count-limited": "The following {{PLURAL:$1|file is|$1 files are}} in the current category.",
-    "listingcontinuesabbrev": "cont.",
-    "index-category": "Indexed pages",
-    "noindex-category": "Noindexed pages",
-    "broken-file-category": "Pages with broken file links",
-    "categoryviewer-pagedlinks": "($1) ($2)",
-    "about": "About",
-    "article": "Content page",
-    "newwindow": "(opens in new window)",
-    "cancel": "Cancel",
-    "moredotdotdot": "More...",
-    "morenotlisted": "This list is not complete.",
-    "mypage": "Page",
-    "mytalk": "Talk",
-    "anontalk": "Talk for this IP address",
-    "navigation": "Navigation",
-    "and": "&#32;and",
-    "qbfind": "Find",
-    "qbbrowse": "Browse",
-    "qbedit": "Edit",
-    "qbpageoptions": "This page",
-    "qbmyoptions": "My pages",
-    "faq": "FAQ",
-    "faqpage": "Project:FAQ",
-    "sitetitle": "{{SITENAME}}",
-    "sitesubtitle": "",
-    "vector-action-addsection": "Add topic",
-    "vector-action-delete": "Delete",
-    "vector-action-move": "Move",
-    "vector-action-protect": "Protect",
-    "vector-action-undelete": "Undelete",
-    "vector-action-unprotect": "Change protection",
-    "vector-view-create": "Create",
-    "vector-view-edit": "Edit",
-    "vector-view-history": "View history",
-    "vector-view-view": "Read",
-    "vector-view-viewsource": "View source",
-    "actions": "Actions",
-    "namespaces": "Namespaces",
-    "variants": "Variants",
-    "navigation-heading": "Navigation menu",
-    "errorpagetitle": "Error",
-    "returnto": "Return to $1.",
-    "tagline": "From {{SITENAME}}",
-    "help": "Help",
-    "search": "Search",
-    "searchbutton": "Search",
-    "go": "Go",
-    "searcharticle": "Go",
-    "history": "Page history",
-    "history_short": "History",
-    "updatedmarker": "updated since my last visit",
-    "printableversion": "Printable version",
-    "permalink": "Permanent link",
-    "print": "Print",
-    "view": "View",
-    "view-foreign": "View on $1",
-    "edit": "Edit",
-    "edit-local": "Edit local description",
-    "create": "Create",
-    "create-local": "Add local description",
-    "editthispage": "Edit this page",
-    "create-this-page": "Create this page",
-    "delete": "Delete",
-    "deletethispage": "Delete this page",
-    "undeletethispage": "Undelete this page",
-    "undelete_short": "Undelete {{PLURAL:$1|one edit|$1 edits}}",
-    "viewdeleted_short": "View {{PLURAL:$1|one deleted edit|$1 deleted edits}}",
-    "protect": "Protect",
-    "protect_change": "change",
-    "protectthispage": "Protect this page",
-    "unprotect": "Change protection",
-    "unprotectthispage": "Change protection of this page",
-    "newpage": "New page",
-    "talkpage": "Discuss this page",
-    "talkpagelinktext": "Talk",
-    "specialpage": "Special page",
-    "personaltools": "Personal tools",
-    "postcomment": "New section",
-    "addsection": "+",
-    "articlepage": "View content page",
-    "talk": "Discussion",
-    "views": "Views",
-    "toolbox": "Tools",
-    "userpage": "View user page",
-    "projectpage": "View project page",
-    "imagepage": "View file page",
-    "mediawikipage": "View message page",
-    "templatepage": "View template page",
-    "viewhelppage": "View help page",
-    "categorypage": "View category page",
-    "viewtalkpage": "View discussion",
-    "otherlanguages": "In other languages",
-    "redirectedfrom": "(Redirected from $1)",
-    "redirectpagesub": "Redirect page",
-    "talkpageheader": "-",
-    "lastmodifiedat": "This page was last modified on $1, at $2.",
-    "viewcount": "This page has been accessed {{PLURAL:$1|once|$1 times}}.",
-    "protectedpage": "Protected page",
-    "jumpto": "Jump to:",
-    "jumptonavigation": "navigation",
-    "jumptosearch": "search",
-    "view-pool-error": "Sorry, the servers are overloaded at the moment.\nToo many users are trying to view this page.\nPlease wait a while before you try to access this page again.\n\n$1",
-    "generic-pool-error": "Sorry, the servers are overloaded at the moment.\nToo many users are trying to view this resource.\nPlease wait a while before you try to access this resource again.",
-    "pool-timeout": "Timeout waiting for the lock",
-    "pool-queuefull": "Pool queue is full",
-    "pool-errorunknown": "Unknown error",
-    "pool-servererror": "The pool counter service is not available ($1).",
-    "aboutsite": "About {{SITENAME}}",
-    "aboutpage": "Project:About",
-    "copyright": "Content is available under $1 unless otherwise noted.",
-    "copyrightpage": "{{ns:project}}:Copyrights",
-    "currentevents": "Current events",
-    "currentevents-url": "Project:Current events",
-    "disclaimers": "Disclaimers",
-    "disclaimerpage": "Project:General disclaimer",
-    "edithelp": "Editing help",
-    "edithelppage": "https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Editing_pages",
-    "helppage": "https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents",
-    "mainpage": "Main Page",
-    "mainpage-description": "Main page",
-    "policy-url": "Project:Policy",
-    "portal": "Community portal",
-    "portal-url": "Project:Community portal",
-    "privacy": "Privacy policy",
-    "privacypage": "Project:Privacy policy",
-    "badaccess": "Permission error",
-    "badaccess-group0": "You are not allowed to execute the action you have requested.",
-    "badaccess-groups": "The action you have requested is limited to users in {{PLURAL:$2|the group|one of the groups}}: $1.",
-    "versionrequired": "Version $1 of MediaWiki required",
-    "versionrequiredtext": "Version $1 of MediaWiki is required to use this page.\nSee [[Special:Version|version page]].",
-    "ok": "OK",
-    "pagetitle": "$1 - {{SITENAME}}",
-    "pagetitle-view-mainpage": "{{SITENAME}}",
-    "backlinksubtitle": "← $1",
-    "retrievedfrom": "Retrieved from \"$1\"",
-    "youhavenewmessages": "{{PLURAL:$3|You have}} $1 ($2).",
-    "youhavenewmessagesfromusers": "{{PLURAL:$4|You have}} $1 from {{PLURAL:$3|another user|$3 users}} ($2).",
-    "youhavenewmessagesmanyusers": "You have $1 from many users ($2).",
-    "newmessageslinkplural": "{{PLURAL:$1|a new message|999=new messages}}",
-    "newmessagesdifflinkplural": "last {{PLURAL:$1|change|999=changes}}",
-    "youhavenewmessagesmulti": "You have new messages on $1",
-    "newtalkseparator": ",&#32;",
-    "editsection": "edit",
-    "editold": "edit",
-    "viewsourceold": "view source",
-    "editlink": "edit",
-    "viewsourcelink": "view source",
-    "editsectionhint": "Edit section: $1",
-    "toc": "Contents",
-    "showtoc": "show",
-    "hidetoc": "hide",
-    "collapsible-collapse": "Collapse",
-    "collapsible-expand": "Expand",
-    "thisisdeleted": "View or restore $1?",
-    "viewdeleted": "View $1?",
-    "restorelink": "{{PLURAL:$1|one deleted edit|$1 deleted edits}}",
-    "feedlinks": "Feed:",
-    "feed-invalid": "Invalid subscription feed type.",
-    "feed-unavailable": "Syndication feeds are not available",
-    "site-rss-feed": "$1 RSS feed",
-    "site-atom-feed": "$1 Atom feed",
-    "page-rss-feed": "\"$1\" RSS feed",
-    "page-atom-feed": "\"$1\" Atom feed",
-    "feed-atom": "Atom",
-    "feed-rss": "RSS",
-    "sitenotice": "-",
-    "anonnotice": "-",
-    "newsectionheaderdefaultlevel": "== $1 ==",
-    "red-link-title": "$1 (page does not exist)",
-    "sort-descending": "Sort descending",
-    "sort-ascending": "Sort ascending",
-    "nstab-main": "Page",
-    "nstab-user": "User page",
-    "nstab-media": "Media page",
-    "nstab-special": "Special page",
-    "nstab-project": "Project page",
-    "nstab-image": "File",
-    "nstab-mediawiki": "Message",
-    "nstab-template": "Template",
-    "nstab-help": "Help page",
-    "nstab-category": "Category",
-    "mainpage-nstab": "",
-    "nosuchaction": "No such action",
-    "nosuchactiontext": "The action specified by the URL is invalid.\nYou might have mistyped the URL, or followed an incorrect link.\nThis might also indicate a bug in the software used by {{SITENAME}}.",
-    "nosuchspecialpage": "No such special page",
-    "nospecialpagetext": "<strong>You have requested an invalid special page.</strong>\n\nA list of valid special pages can be found at [[Special:SpecialPages|{{int:specialpages}}]].",
-    "error": "Error",
-    "databaseerror": "Database error",
-    "databaseerror-text": "A database query error has occurred.\nThis may indicate a bug in the software.",
-    "databaseerror-textcl": "A database query error has occurred.",
-    "databaseerror-query": "Query: $1",
-    "databaseerror-function": "Function: $1",
-    "databaseerror-error": "Error: $1",
-    "laggedslavemode": "<strong>Warning:</strong> Page may not contain recent updates.",
-    "readonly": "Database locked",
-    "enterlockreason": "Enter a reason for the lock, including an estimate of when the lock will be released",
-    "readonlytext": "The database is currently locked to new entries and other modifications, probably for routine database maintenance, after which it will be back to normal.\n\nThe administrator who locked it offered this explanation: $1",
-    "missing-article": "The database did not find the text of a page that it should have found, named \"$1\" $2.\n\nThis is usually caused by following an outdated diff or history link to a page that has been deleted.\n\nIf this is not the case, you may have found a bug in the software.\nPlease report this to an [[Special:ListUsers/sysop|administrator]], making note of the URL.",
-    "missingarticle-rev": "(revision#: $1)",
-    "missingarticle-diff": "(Diff: $1, $2)",
-    "readonly_lag": "The database has been automatically locked while the slave database servers catch up to the master",
-    "internalerror": "Internal error",
-    "internalerror_info": "Internal error: $1",
-    "filecopyerror": "Could not copy file \"$1\" to \"$2\".",
-    "filerenameerror": "Could not rename file \"$1\" to \"$2\".",
-    "filedeleteerror": "Could not delete file \"$1\".",
-    "directorycreateerror": "Could not create directory \"$1\".",
-    "filenotfound": "Could not find file \"$1\".",
-    "unexpected": "Unexpected value: \"$1\"=\"$2\".",
-    "formerror": "Error: Could not submit form.",
-    "badarticleerror": "This action cannot be performed on this page.",
-    "cannotdelete": "The page or file \"$1\" could not be deleted.\nIt may have already been deleted by someone else.",
-    "cannotdelete-title": "Cannot delete page \"$1\"",
-    "delete-hook-aborted": "Deletion aborted by hook.\nIt gave no explanation.",
-    "no-null-revision": "Could not create new null revision for page \"$1\"",
-    "badtitle": "Bad title",
-    "badtitletext": "The requested page title was invalid, empty, or an incorrectly linked inter-language or inter-wiki title.\nIt may contain one or more characters that cannot be used in titles.",
-    "perfcached": "The following data is cached and may not be up to date. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.",
-    "perfcachedts": "The following data is cached, and was last updated $1. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.",
-    "querypage-no-updates": "Updates for this page are currently disabled.\nData here will not presently be refreshed.",
-    "viewsource": "View source",
-    "viewsource-title": "View source for $1",
-    "actionthrottled": "Action throttled",
-    "actionthrottledtext": "As an anti-spam measure, you are limited from performing this action too many times in a short space of time, and you have exceeded this limit.\nPlease try again in a few minutes.",
-    "protectedpagetext": "This page has been protected to prevent editing or other actions.",
-    "viewsourcetext": "You can view and copy the source of this page:",
-    "viewyourtext": "You can view and copy the source of <strong>your edits</strong> to this page:",
-    "protectedinterface": "This page provides interface text for the software on this wiki, and is protected to prevent abuse.\nTo add or change translations for all wikis, please use [//translatewiki.net/ translatewiki.net], the MediaWiki localisation project.",
-    "editinginterface": "<strong>Warning:</strong> You are editing a page that is used to provide interface text for the software.\nChanges to this page will affect the appearance of the user interface for other users on this wiki.\nTo add or change translations for all wikis, please use [//translatewiki.net/ translatewiki.net], the MediaWiki localisation project.",
-    "cascadeprotected": "This page has been protected from editing because it is included in the following {{PLURAL:$1|page, which is|pages, which are}} protected with the \"cascading\" option turned on:\n$2",
-    "namespaceprotected": "You do not have permission to edit pages in the <strong>$1</strong> namespace.",
-    "customcssprotected": "You do not have permission to edit this CSS page because it contains another user's personal settings.",
-    "customjsprotected": "You do not have permission to edit this JavaScript page because it contains another user's personal settings.",
-    "mycustomcssprotected": "You do not have permission to edit this CSS page.",
-    "mycustomjsprotected": "You do not have permission to edit this JavaScript page.",
-    "myprivateinfoprotected": "You do not have permission to edit your private information.",
-    "mypreferencesprotected": "You do not have permission to edit your preferences.",
-    "ns-specialprotected": "Special pages cannot be edited.",
-    "titleprotected": "This title has been protected from creation by [[User:$1|$1]].\nThe reason given is \"<em>$2</em>\".",
-    "filereadonlyerror": "Unable to modify the file \"$1\" because the file repository \"$2\" is in read-only mode.\n\nThe administrator who locked it offered this explanation: \"$3\".",
-    "invalidtitle-knownnamespace": "Invalid title with namespace \"$2\" and text \"$3\"",
-    "invalidtitle-unknownnamespace": "Invalid title with unknown namespace number $1 and text \"$2\"",
-    "exception-nologin": "Not logged in",
-    "exception-nologin-text": "Please [[Special:Userlogin|log in]] to be able to access this page or action.",
-    "exception-nologin-text-manual": "Please $1 to be able to access this page or action.",
-    "virus-badscanner": "Bad configuration: Unknown virus scanner: <em>$1</em>",
-    "virus-scanfailed": "scan failed (code $1)",
-    "virus-unknownscanner": "unknown antivirus:",
-    "logouttext": "<strong>You are now logged out.</strong>\n\nNote that some pages may continue to be displayed as if you were still logged in, until you clear your browser cache.",
-    "welcomeuser": "Welcome, $1!",
-    "welcomecreation-msg": "Your account has been created.\nYou can change your {{SITENAME}} [[Special:Preferences|preferences]] if you wish.",
-    "yourname": "Username:",
-    "userlogin-yourname": "Username",
-    "userlogin-yourname-ph": "Enter your username",
-    "createacct-another-username-ph": "Enter the username",
-    "createacct-helpusername": "",
-    "yourpassword": "Password:",
-    "userlogin-yourpassword": "Password",
-    "userlogin-yourpassword-ph": "Enter your password",
-    "createacct-yourpassword-ph": "Enter a password",
-    "yourpasswordagain": "Retype password:",
-    "createacct-yourpasswordagain": "Confirm password",
-    "createacct-yourpasswordagain-ph": "Enter password again",
-    "remembermypassword": "Remember my login on this browser (for a maximum of $1 {{PLURAL:$1|day|days}})",
-    "userlogin-remembermypassword": "Keep me logged in",
-    "userlogin-signwithsecure": "Use secure connection",
-    "yourdomainname": "Your domain:",
-    "password-change-forbidden": "You cannot change passwords on this wiki.",
-    "externaldberror": "There was either an authentication database error or you are not allowed to update your external account.",
-    "login": "Log in",
-    "nav-login-createaccount": "Log in / create account",
-    "loginprompt": "You must have cookies enabled to log in to {{SITENAME}}.",
-    "userlogin": "Log in / create account",
-    "userloginnocreate": "Log in",
-    "logout": "Log out",
-    "userlogout": "Log out",
-    "userlogout-summary": "",
-    "notloggedin": "Not logged in",
-    "userlogin-noaccount": "Don't have an account?",
-    "userlogin-joinproject": "Join {{SITENAME}}",
-    "nologin": "Don't have an account? $1.",
-    "nologinlink": "Create an account",
-    "createaccount": "Create account",
-    "gotaccount": "Already have an account? $1.",
-    "gotaccountlink": "Log in",
-    "userlogin-resetlink": "Forgotten your login details?",
-    "userlogin-resetpassword-link": "Forgot your password?",
-    "helplogin-url": "https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Logging_in",
-    "userlogin-helplink2": "Help with logging in",
-    "userlogin-loggedin": "You are already logged in as {{GENDER:$1|$1}}.\nUse the form below to log in as another user.",
-    "userlogin-createanother": "Create another account",
-    "createacct-emailrequired": "Email address",
-    "createacct-emailoptional": "Email address (optional)",
-    "createacct-email-ph": "Enter your email address",
-    "createacct-another-email-ph": "Enter email address",
-    "createaccountmail": "Use a temporary random password and send it to the specified email address",
-    "createacct-realname": "Real name (optional)",
-    "createaccountreason": "Reason:",
-    "createacct-reason": "Reason",
-    "createacct-reason-ph": "Why you are creating another account",
-    "createacct-captcha": "Security check",
-    "createacct-imgcaptcha-help": "",
-    "createacct-imgcaptcha-ph": "Enter the text you see above",
-    "createacct-submit": "Create your account",
-    "createacct-another-submit": "Create another account",
-    "createacct-benefit-heading": "{{SITENAME}} is made by people like you.",
-    "createacct-benefit-icon1": "icon-edits",
-    "createacct-benefit-head1": "{{NUMBEROFEDITS}}",
-    "createacct-benefit-body1": "{{PLURAL:$1|edit|edits}}",
-    "createacct-benefit-icon2": "icon-pages",
-    "createacct-benefit-head2": "{{NUMBEROFARTICLES}}",
-    "createacct-benefit-body2": "{{PLURAL:$1|page|pages}}",
-    "createacct-benefit-icon3": "icon-contributors",
-    "createacct-benefit-head3": "{{NUMBEROFACTIVEUSERS}}",
-    "createacct-benefit-body3": "recent {{PLURAL:$1|contributor|contributors}}",
-    "badretype": "The passwords you entered do not match.",
-    "userexists": "Username entered already in use.\nPlease choose a different name.",
-    "loginerror": "Login error",
-    "createacct-error": "Account creation error",
-    "createaccounterror": "Could not create account: $1",
-    "nocookiesnew": "The user account was created, but you are not logged in.\n{{SITENAME}} uses cookies to log in users.\nYou have cookies disabled.\nPlease enable them, then log in with your new username and password.",
-    "nocookieslogin": "{{SITENAME}} uses cookies to log in users.\nYou have cookies disabled.\nPlease enable them and try again.",
-    "nocookiesfornew": "The user account was not created, as we could not confirm its source.\nEnsure you have cookies enabled, reload this page and try again.",
-    "nocookiesforlogin": "{{int:nocookieslogin}}",
-    "noname": "You have not specified a valid username.",
-    "loginsuccesstitle": "Login successful",
-    "loginsuccess": "<strong>You are now logged in to {{SITENAME}} as \"$1\".</strong>",
-    "nosuchuser": "There is no user by the name \"$1\".\nUsernames are case sensitive.\nCheck your spelling, or [[Special:UserLogin/signup|create a new account]].",
-    "nosuchusershort": "There is no user by the name \"$1\".\nCheck your spelling.",
-    "nouserspecified": "You have to specify a username.",
-    "login-userblocked": "This user is blocked. Login not allowed.",
-    "wrongpassword": "Incorrect password entered.\nPlease try again.",
-    "wrongpasswordempty": "Password entered was blank.\nPlease try again.",
-    "passwordtooshort": "Passwords must be at least {{PLURAL:$1|1 character|$1 characters}}.",
-    "password-name-match": "Your password must be different from your username.",
-    "password-login-forbidden": "The use of this username and password has been forbidden.",
-    "mailmypassword": "Reset password",
-    "passwordremindertitle": "New temporary password for {{SITENAME}}",
-    "passwordremindertext": "Someone (probably you, from IP address $1) requested a new\npassword for {{SITENAME}} ($4). A temporary password for user\n\"$2\" has been created and was set to \"$3\". If this was your\nintent, you will need to log in and choose a new password now.\nYour temporary password will expire in {{PLURAL:$5|one day|$5 days}}.\n\nIf someone else made this request, or if you have remembered your password,\nand you no longer wish to change it, you may ignore this message and\ncontinue using your old password.",
-    "noemail": "There is no email address recorded for user \"$1\".",
-    "noemailcreate": "You need to provide a valid email address.",
-    "passwordsent": "A new password has been sent to the email address registered for \"$1\".\nPlease log in again after you receive it.",
-    "blocked-mailpassword": "Your IP address is blocked from editing, and so is not allowed to use the password recovery function to prevent abuse.",
-    "eauthentsent": "A confirmation email has been sent to the specified email address.\nBefore any other email is sent to the account, you will have to follow the instructions in the email, to confirm that the account is actually yours.",
-    "throttled-mailpassword": "A password reset email has already been sent, within the last {{PLURAL:$1|hour|$1 hours}}.\nTo prevent abuse, only one password reset email will be sent per {{PLURAL:$1|hour|$1 hours}}.",
-    "loginstart": "",
-    "loginend": "",
-    "loginend-https": "",
-    "signupstart": "{{int:loginstart}}",
-    "signupend": "{{int:loginend}}",
-    "signupend-https": "",
-    "mailerror": "Error sending mail: $1",
-    "acct_creation_throttle_hit": "Visitors to this wiki using your IP address have created {{PLURAL:$1|1 account|$1 accounts}} in the last day, which is the maximum allowed in this time period.\nAs a result, visitors using this IP address cannot create any more accounts at the moment.",
-    "emailauthenticated": "Your email address was confirmed on $2 at $3.",
-    "emailnotauthenticated": "Your email address is not yet confirmed.\nNo email will be sent for any of the following features.",
-    "noemailprefs": "Specify an email address in your preferences for these features to work.",
-    "emailconfirmlink": "Confirm your email address",
-    "invalidemailaddress": "The email address cannot be accepted as it appears to have an invalid format.\nPlease enter a well-formatted address or empty that field.",
-    "cannotchangeemail": "Account email addresses cannot be changed on this wiki.",
-    "emaildisabled": "This site cannot send emails.",
-    "emailsender": "{{SITENAME}}",
-    "accountcreated": "Account created",
-    "accountcreatedtext": "The user account for [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|talk]]) has been created.",
-    "createaccount-title": "Account creation for {{SITENAME}}",
-    "createaccount-text": "Someone created an account for your email address on {{SITENAME}} ($4) named \"$2\", with password \"$3\".\nYou should log in and change your password now.\n\nYou may ignore this message, if this account was created in error.",
-    "login-throttled": "You have made too many recent login attempts.\nPlease wait $1 before trying again.",
-    "login-abort-generic": "Your login was unsuccessful - Aborted",
-    "loginlanguagelabel": "Language: $1",
-    "loginlanguagelinks": "* {{#language:de}}|de\n* {{#language:en}}|en\n* {{#language:eo}}|eo\n* {{#language:fr}}|fr\n* {{#language:es}}|es\n* {{#language:it}}|it\n* {{#language:nl}}|nl",
-    "suspicious-userlogout": "Your request to log out was denied because it looks like it was sent by a broken browser or caching proxy.",
-    "createacct-another-realname-tip": "Real name is optional.\nIf you choose to provide it, this will be used for giving the user attribution for their work.",
-    "pt-login": "Log in",
-    "pt-login-button": "Log in",
-    "pt-createaccount": "Create account",
-    "pt-userlogout": "Log out",
-    "pear-mail-error": "$1",
-    "php-mail-error": "$1",
-    "php-mail-error-unknown": "Unknown error in PHP's mail() function.",
-    "user-mail-no-addy": "Tried to send email without an email address.",
-    "user-mail-no-body": "Tried to send email with an empty or unreasonably short body.",
-    "changepassword": "Change password",
-    "changepassword-summary": "",
-    "resetpass_announce": "To finish logging in, you must set a new password.",
-    "resetpass_text": "<!-- Add text here -->",
-    "resetpass_header": "Change account password",
-    "oldpassword": "Old password:",
-    "newpassword": "New password:",
-    "retypenew": "Retype new password:",
-    "resetpass_submit": "Set password and log in",
-    "changepassword-success": "Your password has been changed successfully!",
-    "changepassword-throttled": "You have made too many recent login attempts.\nPlease wait $1 before trying again.",
-    "resetpass_forbidden": "Passwords cannot be changed",
-    "resetpass-no-info": "You must be logged in to access this page directly.",
-    "resetpass-submit-loggedin": "Change password",
-    "resetpass-submit-cancel": "Cancel",
-    "resetpass-wrong-oldpass": "Invalid temporary or current password.\nYou may have already successfully changed your password or requested a new temporary password.",
-    "resetpass-recycled": "Please reset your password to something other than your current password.",
-    "resetpass-temp-emailed": "You logged in with a temporary emailed code.\nTo finish logging in, you must set a new password here:",
-    "resetpass-temp-password": "Temporary password:",
-    "resetpass-abort-generic": "Password change has been aborted by an extension.",
-    "resetpass-expired": "Your password has expired. Please set a new password to log in.",
-    "resetpass-expired-soft": "Your password has expired and needs to be reset. Please choose a new password now, or click \"{{int:resetpass-submit-cancel}}\" to reset it later.",
-    "resetpass-validity-soft": "Your password is not valid: $1\n\nPlease choose a new password now, or click \"{{int:resetpass-submit-cancel}}\" to reset it later.",
-    "passwordreset": "Reset password",
-    "passwordreset-text-one": "Complete this form to receive a temporary password via email.",
-    "passwordreset-text-many": "{{PLURAL:$1|Fill in one of the fields to receive a temporary password via email.}}",
-    "passwordreset-legend": "Reset password",
-    "passwordreset-disabled": "Password resets have been disabled on this wiki.",
-    "passwordreset-emaildisabled": "Email features have been disabled on this wiki.",
-    "passwordreset-username": "Username:",
-    "passwordreset-domain": "Domain:",
-    "passwordreset-capture": "View the resulting email?",
-    "passwordreset-capture-help": "If you check this box, the email (with the temporary password) will be shown to you as well as being sent to the user.",
-    "passwordreset-email": "Email address:",
-    "passwordreset-emailtitle": "Account details on {{SITENAME}}",
-    "passwordreset-emailtext-ip": "Someone (probably you, from IP address $1) requested a reset of your\npassword for {{SITENAME}} ($4). The following user {{PLURAL:$3|account is|accounts are}}\nassociated with this email address:\n\n$2\n\n{{PLURAL:$3|This temporary password|These temporary passwords}} will expire in {{PLURAL:$5|one day|$5 days}}.\nYou should log in and choose a new password now. If someone else made this\nrequest, or if you have remembered your original password, and you no longer\nwish to change it, you may ignore this message and continue using your old\npassword.",
-    "passwordreset-emailtext-user": "User $1 on {{SITENAME}} requested a reset of your password for {{SITENAME}}\n($4). The following user {{PLURAL:$3|account is|accounts are}} associated with this email address:\n\n$2\n\n{{PLURAL:$3|This temporary password|These temporary passwords}} will expire in {{PLURAL:$5|one day|$5 days}}.\nYou should log in and choose a new password now. If someone else made this\nrequest, or if you have remembered your original password, and you no longer\nwish to change it, you may ignore this message and continue using your old\npassword.",
-    "passwordreset-emailelement": "Username: $1\nTemporary password: $2",
-    "passwordreset-emailsent": "A password reset email has been sent.",
-    "passwordreset-emailsent-capture": "A password reset email has been sent, which is shown below.",
-    "passwordreset-emailerror-capture": "A password reset email was generated, which is shown below, but sending it to the {{GENDER:$2|user}} failed: $1",
-    "changeemail": "Change email address",
-    "changeemail-summary": "",
-    "changeemail-header": "Change account email address",
-    "changeemail-text": "Complete this form to change your email address. You will need to enter your password to confirm this change.",
-    "changeemail-no-info": "You must be logged in to access this page directly.",
-    "changeemail-oldemail": "Current email address:",
-    "changeemail-newemail": "New email address:",
-    "changeemail-none": "(none)",
-    "changeemail-password": "Your {{SITENAME}} password:",
-    "changeemail-submit": "Change email",
-    "changeemail-cancel": "Cancel",
-    "changeemail-throttled": "You have made too many login attempts.\nPlease wait $1 before trying again.",
-    "resettokens": "Reset tokens",
-    "resettokens-summary": "",
-    "resettokens-text": "You can reset tokens which allow access to certain private data associated with your account here.\n\nYou should do it if you accidentally shared them with someone or if your account has been compromised.",
-    "resettokens-no-tokens": "There are no tokens to reset.",
-    "resettokens-legend": "Reset tokens",
-    "resettokens-tokens": "Tokens:",
-    "resettokens-token-label": "$1 (current value: $2)",
-    "resettokens-watchlist-token": "Token for the web feed (Atom/RSS) of [[Special:Watchlist|changes to pages on your watchlist]]",
-    "resettokens-done": "Tokens reset.",
-    "resettokens-resetbutton": "Reset selected tokens",
-    "bold_sample": "Bold text",
-    "bold_tip": "Bold text",
-    "italic_sample": "Italic text",
-    "italic_tip": "Italic text",
-    "link_sample": "Link title",
-    "link_tip": "Internal link",
-    "extlink_sample": "http://www.example.com link title",
-    "extlink_tip": "External link (remember http:// prefix)",
-    "headline_sample": "Headline text",
-    "headline_tip": "Level 2 headline",
-    "nowiki_sample": "Insert non-formatted text here",
-    "nowiki_tip": "Ignore wiki formatting",
-    "image_sample": "Example.jpg",
-    "image_tip": "Embedded file",
-    "media_sample": "Example.ogg",
-    "media_tip": "File link",
-    "sig_tip": "Your signature with timestamp",
-    "hr_tip": "Horizontal line (use sparingly)",
-    "summary": "Summary:",
-    "subject": "Subject/headline:",
-    "minoredit": "This is a minor edit",
-    "watchthis": "Watch this page",
-    "savearticle": "Save page",
-    "preview": "Preview",
-    "showpreview": "Show preview",
-    "showdiff": "Show changes",
-    "anoneditwarning": "<strong>Warning:</strong> You are not logged in.\nYour IP address will be recorded in this page's edit history.",
-    "anonpreviewwarning": "<em>You are not logged in. Saving will record your IP address in this page's edit history.</em>",
-    "missingsummary": "<strong>Reminder:</strong> You have not provided an edit summary.\nIf you click \"{{int:savearticle}}\" again, your edit will be saved without one.",
-    "missingcommenttext": "Please enter a comment below.",
-    "missingcommentheader": "<strong>Reminder:</strong> You have not provided a subject/headline for this comment.\nIf you click \"{{int:savearticle}}\" again, your edit will be saved without one.",
-    "summary-preview": "Summary preview:",
-    "subject-preview": "Subject/headline preview:",
-    "blockedtitle": "User is blocked",
-    "blockedtext": "<strong>Your username or IP address has been blocked.</strong>\n\nThe block was made by $1.\nThe reason given is <em>$2</em>.\n\n* Start of block: $8\n* Expiry of block: $6\n* Intended blockee: $7\n\nYou can contact $1 or another [[{{MediaWiki:Grouppage-sysop}}|administrator]] to discuss the block.\nYou cannot use the \"email this user\" feature unless a valid email address is specified in your [[Special:Preferences|account preferences]] and you have not been blocked from using it.\nYour current IP address is $3, and the block ID is #$5.\nPlease include all above details in any queries you make.",
-    "autoblockedtext": "Your IP address has been automatically blocked because it was used by another user, who was blocked by $1.\nThe reason given is:\n\n:<em>$2</em>\n\n* Start of block: $8\n* Expiry of block: $6\n* Intended blockee: $7\n\nYou may contact $1 or one of the other [[{{MediaWiki:Grouppage-sysop}}|administrators]] to discuss the block.\n\nNote that you may not use the \"email this user\" feature unless you have a valid email address registered in your [[Special:Preferences|user preferences]] and you have not been blocked from using it.\n\nYour current IP address is $3, and the block ID is #$5.\nPlease include all above details in any queries you make.",
-    "blockednoreason": "no reason given",
-    "whitelistedittext": "Please $1 to edit pages.",
-    "confirmedittext": "You must confirm your email address before editing pages.\nPlease set and validate your email address through your [[Special:Preferences|user preferences]].",
-    "nosuchsectiontitle": "Cannot find section",
-    "nosuchsectiontext": "You tried to edit a section that does not exist.\nIt may have been moved or deleted while you were viewing the page.",
-    "loginreqtitle": "Login required",
-    "loginreqlink": "log in",
-    "loginreqpagetext": "Please $1 to view other pages.",
-    "accmailtitle": "Password sent",
-    "accmailtext": "A randomly generated password for [[User talk:$1|$1]] has been sent to $2. It can be changed on the <em>[[Special:ChangePassword|change password]]</em> page upon logging in.",
-    "newarticle": "(New)",
-    "newarticletext": "You have followed a link to a page that does not exist yet.\nTo create the page, start typing in the box below (see the [$1 help page] for more info).\nIf you are here by mistake, click your browser's <strong>back</strong> button.",
-    "newarticletextanon": "{{int:newarticletext|$1}}",
-    "talkpagetext": "<!-- MediaWiki:talkpagetext -->",
-    "anontalkpagetext": "----\n<em>This is the discussion page for an anonymous user who has not created an account yet, or who does not use it.</em>\nWe therefore have to use the numerical IP address to identify him/her.\nSuch an IP address can be shared by several users.\nIf you are an anonymous user and feel that irrelevant comments have been directed at you, please [[Special:UserLogin/signup|create an account]] or [[Special:UserLogin|log in]] to avoid future confusion with other anonymous users.",
-    "noarticletext": "There is currently no text in this page.\nYou can [[Special:Search/{{PAGENAME}}|search for this page title]] in other pages,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} search the related logs],\nor [{{fullurl:{{FULLPAGENAME}}|action=edit}} edit this page]</span>.",
-    "noarticletext-nopermission": "There is currently no text in this page.\nYou can [[Special:Search/{{PAGENAME}}|search for this page title]] in other pages, or <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} search the related logs]</span>, but you do not have permission to create this page.",
-    "noarticletextanon": "{{int:noarticletext}}",
-    "missing-revision": "The revision #$1 of the page named \"{{FULLPAGENAME}}\" does not exist.\n\nThis is usually caused by following an outdated history link to a page that has been deleted.\nDetails can be found in the [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log].",
-    "userpage-userdoesnotexist": "User account \"$1\" is not registered.\nPlease check if you want to create/edit this page.",
-    "userpage-userdoesnotexist-view": "User account \"$1\" is not registered.",
-    "blocked-notice-logextract": "This user is currently blocked.\nThe latest block log entry is provided below for reference:",
-    "clearyourcache": "<strong>Note:</strong> After saving, you may have to bypass your browser's cache to see the changes.\n* <strong>Firefox / Safari:</strong> Hold <em>Shift</em> while clicking <em>Reload</em>, or press either <em>Ctrl-F5</em> or <em>Ctrl-R</em> (<em>⌘-R</em> on a Mac)\n* <strong>Google Chrome:</strong> Press <em>Ctrl-Shift-R</em> (<em>⌘-Shift-R</em> on a Mac)\n* <strong>Internet Explorer:</strong> Hold <em>Ctrl</em> while clicking <em>Refresh</em>, or press <em>Ctrl-F5</em>\n* <strong>Opera:</strong> Clear the cache in <em>Tools → Preferences</em>",
-    "usercssyoucanpreview": "<strong>Tip:</strong> Use the \"{{int:showpreview}}\" button to test your new CSS before saving.",
-    "userjsyoucanpreview": "<strong>Tip:</strong> Use the \"{{int:showpreview}}\" button to test your new JavaScript before saving.",
-    "usercsspreview": "<strong>Remember that you are only previewing your user CSS.\nIt has not yet been saved!</strong>",
-    "userjspreview": "<strong>Remember that you are only testing/previewing your user JavaScript.\nIt has not yet been saved!</strong>",
-    "sitecsspreview": "<strong>Remember that you are only previewing this CSS.\nIt has not yet been saved!</strong>",
-    "sitejspreview": "<strong>Remember that you are only previewing this JavaScript code.\nIt has not yet been saved!</strong>",
-    "userinvalidcssjstitle": "<strong>Warning:</strong> There is no skin \"$1\".\nCustom .css and .js pages use a lowercase title, e.g. {{ns:user}}:Foo/vector.css as opposed to {{ns:user}}:Foo/Vector.css.",
-    "updated": "(Updated)",
-    "note": "<strong>Note:</strong>",
-    "previewnote": "<strong>Remember that this is only a preview.</strong>\nYour changes have not yet been saved!",
-    "continue-editing": "Go to editing area",
-    "previewconflict": "This preview reflects the text in the upper text editing area as it will appear if you choose to save.",
-    "session_fail_preview": "<strong>Sorry! We could not process your edit due to a loss of session data.</strong>\nPlease try again.\nIf it still does not work, try [[Special:UserLogout|logging out]] and logging back in.",
-    "session_fail_preview_html": "<strong>Sorry! We could not process your edit due to a loss of session data.</strong>\n\n<em>Because {{SITENAME}} has raw HTML enabled, the preview is hidden as a precaution against JavaScript attacks.</em>\n\n<strong>If this is a legitimate edit attempt, please try again.</strong>\nIf it still does not work, try [[Special:UserLogout|logging out]] and logging back in.",
-    "token_suffix_mismatch": "<strong>Your edit has been rejected because your client mangled the punctuation characters in the edit token.</strong>\nThe edit has been rejected to prevent corruption of the page text.\nThis sometimes happens when you are using a buggy web-based anonymous proxy service.",
-    "edit_form_incomplete": "<strong>Some parts of the edit form did not reach the server; double-check that your edits are intact and try again.</strong>",
-    "editing": "Editing $1",
-    "creating": "Creating $1",
-    "editingsection": "Editing $1 (section)",
-    "editingcomment": "Editing $1 (new section)",
-    "editconflict": "Edit conflict: $1",
-    "explainconflict": "Someone else has changed this page since you started editing it.\nThe upper text area contains the page text as it currently exists.\nYour changes are shown in the lower text area.\nYou will have to merge your changes into the existing text.\n<strong>Only</strong> the text in the upper text area will be saved when you press \"{{int:savearticle}}\".",
-    "yourtext": "Your text",
-    "storedversion": "Stored revision",
-    "nonunicodebrowser": "<strong>Warning: Your browser is not Unicode compliant.</strong>\nA workaround is in place to allow you to safely edit pages: Non-ASCII characters will appear in the edit box as hexadecimal codes.",
-    "editingold": "<strong>Warning: You are editing an out-of-date revision of this page.</strong>\nIf you save it, any changes made since this revision will be lost.",
-    "yourdiff": "Differences",
-    "copyrightwarning": "Please note that all contributions to {{SITENAME}} are considered to be released under the $2 (see $1 for details).\nIf you do not want your writing to be edited mercilessly and redistributed at will, then do not submit it here.<br />\nYou are also promising us that you wrote this yourself, or copied it from a public domain or similar free resource.\n<strong>Do not submit copyrighted work without permission!</strong>",
-    "copyrightwarning2": "Please note that all contributions to {{SITENAME}} may be edited, altered, or removed by other contributors.\nIf you do not want your writing to be edited mercilessly, then do not submit it here.<br />\nYou are also promising us that you wrote this yourself, or copied it from a public domain or similar free resource (see $1 for details).\n<strong>Do not submit copyrighted work without permission!</strong>",
-    "editpage-head-copy-warn": "-",
-    "editpage-tos-summary": "-",
-    "longpage-hint": "-",
-    "longpageerror": "<strong>Error: The text you have submitted is {{PLURAL:$1|one kilobyte|$1 kilobytes}} long, which is longer than the maximum of {{PLURAL:$2|one kilobyte|$2 kilobytes}}.</strong>\nIt cannot be saved.",
-    "readonlywarning": "<strong>Warning: The database has been locked for maintenance, so you will not be able to save your edits right now.</strong>\nYou may wish to copy and paste your text into a text file and save it for later.\n\nThe administrator who locked it offered this explanation: $1",
-    "protectedpagewarning": "<strong>Warning: This page has been protected so that only users with administrator privileges can edit it.</strong>\nThe latest log entry is provided below for reference:",
-    "semiprotectedpagewarning": "<strong>Note:</strong> This page has been protected so that only registered users can edit it.\nThe latest log entry is provided below for reference:",
-    "cascadeprotectedwarning": "<strong>Warning:</strong> This page has been protected so that only users with administrator privileges can edit it because it is included in the following cascade-protected {{PLURAL:$1|page|pages}}:",
-    "titleprotectedwarning": "<strong>Warning: This page has been protected so that [[Special:ListGroupRights|specific rights]] are needed to create it.</strong>\nThe latest log entry is provided below for reference:",
-    "templatesused": "{{PLURAL:$1|Template|Templates}} used on this page:",
-    "templatesusedpreview": "{{PLURAL:$1|Template|Templates}} used in this preview:",
-    "templatesusedsection": "{{PLURAL:$1|Template|Templates}} used in this section:",
-    "template-protected": "(protected)",
-    "template-semiprotected": "(semi-protected)",
-    "hiddencategories": "This page is a member of {{PLURAL:$1|1 hidden category|$1 hidden categories}}:",
-    "edittools": "<!-- Text here will be shown below edit and upload forms. -->",
-    "edittools-upload": "-",
-    "nocreatetext": "{{SITENAME}} has restricted the ability to create new pages.\nYou can go back and edit an existing page, or [[Special:UserLogin|log in or create an account]].",
-    "nocreate-loggedin": "You do not have permission to create new pages.",
-    "sectioneditnotsupported-title": "Section editing not supported",
-    "sectioneditnotsupported-text": "Section editing is not supported in this page.",
-    "permissionserrors": "Permission error",
-    "permissionserrorstext": "You do not have permission to do that, for the following {{PLURAL:$1|reason|reasons}}:",
-    "permissionserrorstext-withaction": "You do not have permission to $2, for the following {{PLURAL:$1|reason|reasons}}:",
-    "recreate-moveddeleted-warn": "<strong>Warning: You are recreating a page that was previously deleted.</strong>\n\nYou should consider whether it is appropriate to continue editing this page.\nThe deletion and move log for this page are provided here for convenience:",
-    "moveddeleted-notice": "This page has been deleted.\nThe deletion and move log for the page are provided below for reference.",
-    "log-fulllog": "View full log",
-    "edit-hook-aborted": "Edit aborted by hook.\nIt gave no explanation.",
-    "edit-gone-missing": "Could not update the page.\nIt appears to have been deleted.",
-    "edit-conflict": "Edit conflict.",
-    "edit-no-change": "Your edit was ignored because no change was made to the text.",
-    "postedit-confirmation-created": "The page has been created.",
-    "postedit-confirmation-restored": "The page has been restored.",
-    "postedit-confirmation-saved": "Your edit was saved.",
-    "edit-already-exists": "Could not create a new page.\nIt already exists.",
-    "addsection-preload": "",
-    "addsection-editintro": "",
-    "defaultmessagetext": "Default message text",
-    "content-failed-to-parse": "Failed to parse $2 content for $1 model: $3",
-    "invalid-content-data": "Invalid content data",
-    "content-not-allowed-here": "\"$1\" content is not allowed on page [[$2]]",
-    "editwarning-warning": "Leaving this page may cause you to lose any changes you have made.\nIf you are logged in, you can disable this warning in the \"{{int:prefs-editing}}\" section of your preferences.",
-    "editpage-notsupportedcontentformat-title": "Content format not supported",
-    "editpage-notsupportedcontentformat-text": "The content format $1 is not supported by the content model $2.",
-    "content-model-wikitext": "wikitext",
-    "content-model-text": "plain text",
-    "content-model-javascript": "JavaScript",
-    "content-model-css": "CSS",
-    "expensive-parserfunction-warning": "<strong>Warning:</strong> This page contains too many expensive parser function calls.\n\nIt should have less than $2 {{PLURAL:$2|call|calls}}, there {{PLURAL:$1|is now $1 call|are now $1 calls}}.",
-    "expensive-parserfunction-category": "Pages with too many expensive parser function calls",
-    "post-expand-template-inclusion-warning": "<strong>Warning:</strong> Template include size is too large.\nSome templates will not be included.",
-    "post-expand-template-inclusion-category": "Pages where template include size is exceeded",
-    "post-expand-template-argument-warning": "<strong>Warning:</strong> This page contains at least one template argument that has a too large expansion size.\nThese arguments have been omitted.",
-    "post-expand-template-argument-category": "Pages containing omitted template arguments",
-    "parser-template-loop-warning": "Template loop detected: [[$1]]",
-    "parser-template-recursion-depth-warning": "Template recursion depth limit exceeded ($1)",
-    "language-converter-depth-warning": "Language converter depth limit exceeded ($1)",
-    "node-count-exceeded-category": "Pages where node-count is exceeded",
-    "node-count-exceeded-warning": "Page exceeded the node-count",
-    "expansion-depth-exceeded-category": "Pages where expansion depth is exceeded",
-    "expansion-depth-exceeded-warning": "Page exceeded the expansion depth",
-    "parser-unstrip-loop-warning": "Unstrip loop detected",
-    "parser-unstrip-recursion-limit": "Unstrip recursion limit exceeded ($1)",
-    "converter-manual-rule-error": "Error detected in manual language conversion rule",
-    "undo-success": "The edit can be undone.\nPlease check the comparison below to verify that this is what you want to do, and then save the changes below to finish undoing the edit.",
-    "undo-failure": "The edit could not be undone due to conflicting intermediate edits.",
-    "undo-norev": "The edit could not be undone because it does not exist or was deleted.",
-    "undo-nochange": "The edit appears to have already been undone.",
-    "undo-summary": "Undo revision $1 by [[Special:Contributions/$2|$2]] ([[User talk:$2|talk]])",
-    "undo-summary-username-hidden": "Undo revision $1 by a hidden user",
-    "cantcreateaccounttitle": "Cannot create account",
-    "cantcreateaccount-text": "Account creation from this IP address (<strong>$1</strong>) has been blocked by [[User:$3|$3]].\n\nThe reason given by $3 is <em>$2</em>",
-    "cantcreateaccount-range-text": "Account creation from IP addresses in the range '''$1''', which includes your IP address ('''$4'''), has been blocked by [[User:$3|$3]].\n\nThe reason given by $3 is ''$2''",
-    "createaccount-hook-aborted": "$1",
-    "viewpagelogs": "View logs for this page",
-    "nohistory": "There is no edit history for this page.",
-    "currentrev": "Latest revision",
-    "currentrev-asof": "Latest revision as of $1",
-    "revisionasof": "Revision as of $1",
-    "revision-info": "Revision as of $1 by $2",
-    "revision-info-current": "-",
-    "revision-nav": "($1) $2{{int:pipe-separator}}$3 ($4){{int:pipe-separator}}$5 ($6)",
-    "previousrevision": "← Older revision",
-    "nextrevision": "Newer revision →",
-    "currentrevisionlink": "Latest revision",
-    "cur": "cur",
-    "next": "next",
-    "last": "prev",
-    "page_first": "first",
-    "page_last": "last",
-    "histlegend": "Diff selection: Mark the radio boxes of the revisions to compare and hit enter or the button at the bottom.<br />\nLegend: <strong>({{int:cur}})</strong> = difference with latest revision, <strong>({{int:last}})</strong> = difference with preceding revision, <strong>{{int:minoreditletter}}</strong> = minor edit.",
-    "history-fieldset-title": "Browse history",
-    "history-show-deleted": "Deleted only",
-    "history_copyright": "-",
-    "histfirst": "oldest",
-    "histlast": "newest",
-    "historysize": "({{PLURAL:$1|1 byte|$1 bytes}})",
-    "historyempty": "(empty)",
-    "history-feed-title": "Revision history",
-    "history-feed-description": "Revision history for this page on the wiki",
-    "history-feed-item-nocomment": "$1 at $2",
-    "history-feed-empty": "The requested page does not exist.\nIt may have been deleted from the wiki, or renamed.\nTry [[Special:Search|searching on the wiki]] for relevant new pages.",
-    "rev-deleted-comment": "(edit summary removed)",
-    "rev-deleted-user": "(username removed)",
-    "rev-deleted-event": "(log action removed)",
-    "rev-deleted-user-contribs": "[username or IP address removed - edit hidden from contributions]",
-    "rev-deleted-text-permission": "This page revision has been <strong>deleted</strong>.\nDetails can be found in the [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log].",
-    "rev-deleted-text-unhide": "This page revision has been <strong>deleted</strong>.\nDetails can be found in the [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log].\nYou can still [$1 view this revision] if you wish to proceed.",
-    "rev-suppressed-text-unhide": "This page revision has been <strong>suppressed</strong>.\nDetails can be found in the [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} suppression log].\nYou can still [$1 view this revision] if you wish to proceed.",
-    "rev-deleted-text-view": "This page revision has been <strong>deleted</strong>.\nYou can view it; details can be found in the [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log].",
-    "rev-suppressed-text-view": "This page revision has been <strong>suppressed</strong>.\nYou can view it; details can be found in the [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} suppression log].",
-    "rev-deleted-no-diff": "You cannot view this diff because one of the revisions has been <strong>deleted</strong>.\nDetails can be found in the [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log].",
-    "rev-suppressed-no-diff": "You cannot view this diff because one of the revisions has been <strong>deleted</strong>.",
-    "rev-deleted-unhide-diff": "One of the revisions of this diff has been <strong>deleted</strong>.\nDetails can be found in the [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log].\nYou can still [$1 view this diff] if you wish to proceed.",
-    "rev-suppressed-unhide-diff": "One of the revisions of this diff has been <strong>suppressed</strong>.\nDetails can be found in the [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} suppression log].\nYou can still [$1 view this diff] if you wish to proceed.",
-    "rev-deleted-diff-view": "One of the revisions of this diff has been <strong>deleted</strong>.\nYou can view this diff; details can be found in the [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log].",
-    "rev-suppressed-diff-view": "One of the revisions of this diff has been <strong>suppressed</strong>.\nYou can view this diff; details can be found in the [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} suppression log].",
-    "rev-delundel": "change visibility",
-    "rev-showdeleted": "show",
-    "revisiondelete": "Delete/undelete revisions",
-    "revdelete-nooldid-title": "Invalid target revision",
-    "revdelete-nooldid-text": "You have either not specified a target revision(s) to perform this\nfunction, the specified revision does not exist, or you are attempting to hide the current revision.",
-    "revdelete-no-file": "The file specified does not exist.",
-    "revdelete-show-file-confirm": "Are you sure you want to view a deleted revision of the file \"<nowiki>$1</nowiki>\" from $2 at $3?",
-    "revdelete-show-file-submit": "Yes",
-    "revdelete-selected-text": "{{PLURAL:$1|Selected revision|Selected revisions}} of [[:$2]]:",
-    "revdelete-selected-file": "{{PLURAL:$1|Selected file version|Selected file versions}} of [[:$2]]:",
-    "logdelete-selected": "{{PLURAL:$1|Selected log event|Selected log events}}:",
-    "revdelete-text-text": "Deleted revisions will still appear in the page history, but parts of their content will be inaccessible to the public.",
-    "revdelete-text-file": "Deleted file versions will still appear in the file history, but parts of their content will be inaccessible to the public.",
-    "logdelete-text": "Deleted log events will still appear in the logs, but parts of their content will be inaccessible to the public.",
-    "revdelete-text-others": "Other administrators on {{SITENAME}} will still be able to access the hidden content and can undelete it again through this same interface, unless additional restrictions are set.",
-    "revdelete-confirm": "Please confirm that you intend to do this, that you understand the consequences, and that you are doing this in accordance with [[{{MediaWiki:Policy-url}}|the policy]].",
-    "revdelete-suppress-text": "Suppression should <strong>only</strong> be used for the following cases:\n* potentially libelous information\n* inappropriate personal information\n*: <em>home addresses and telephone numbers, national identification numbers, etc.</em>",
-    "revdelete-legend": "Set visibility restrictions",
-    "revdelete-hide-text": "Revision text",
-    "revdelete-hide-image": "Hide file content",
-    "revdelete-hide-name": "Hide action and target",
-    "revdelete-hide-comment": "Edit summary",
-    "revdelete-hide-user": "Editor's username/IP address",
-    "revdelete-hide-restricted": "Suppress data from administrators as well as others",
-    "revdelete-radio-same": "(do not change)",
-    "revdelete-radio-set": "Hidden",
-    "revdelete-radio-unset": "Visible",
-    "revdelete-suppress": "Suppress data from administrators as well as others",
-    "revdelete-unsuppress": "Remove restrictions on restored revisions",
-    "revdelete-log": "Reason:",
-    "revdelete-submit": "Apply to selected {{PLURAL:$1|revision|revisions}}",
-    "revdelete-success": "<strong>Revision visibility successfully updated.</strong>",
-    "revdelete-failure": "<strong>Revision visibility could not be updated:</strong>\n$1",
-    "logdelete-success": "<strong>Log visibility successfully set.</strong>",
-    "logdelete-failure": "<strong>Log visibility could not be set:</strong>\n$1",
-    "revdel-restore": "change visibility",
-    "pagehist": "Page history",
-    "deletedhist": "Deleted history",
-    "revdelete-hide-current": "Error hiding the item dated $2, $1: This is the current revision.\nIt cannot be hidden.",
-    "revdelete-show-no-access": "Error showing the item dated $2, $1: This item has been marked \"restricted\".\nYou do not have access to it.",
-    "revdelete-modify-no-access": "Error modifying the item dated $2, $1: This item has been marked \"restricted\".\nYou do not have access to it.",
-    "revdelete-modify-missing": "Error modifying item ID $1: It is missing from the database!",
-    "revdelete-no-change": "<strong>Warning:</strong> The item dated $2, $1 already had the requested visibility settings.",
-    "revdelete-concurrent-change": "Error modifying the item dated $2, $1: Its status appears to have been changed by someone else while you attempted to modify it.\nPlease 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\n** Copyright violation\n** Inappropriate comment or personal information\n** Inappropriate username\n** Potentially libelous information",
-    "revdelete-otherreason": "Other/additional reason:",
-    "revdelete-reasonotherlist": "Other reason",
-    "revdelete-edit-reasonlist": "Edit delete reasons",
-    "revdelete-offender": "Revision author:",
-    "suppressionlog": "Suppression log",
-    "suppressionlogtext": "Below is a list of deletions and blocks involving content hidden from administrators.\nSee the [[Special:BlockList|block list]] for the list of currently operational bans and blocks.",
-    "mergehistory": "Merge page histories",
-    "mergehistory-header": "This page lets you merge revisions of the history of one source page into a newer page.\nMake sure that this change will maintain historical page continuity.",
-    "mergehistory-box": "Merge revisions of two pages:",
-    "mergehistory-from": "Source page:",
-    "mergehistory-into": "Destination page:",
-    "mergehistory-list": "Mergeable edit history",
-    "mergehistory-merge": "The following revisions of [[:$1]] can be merged into [[:$2]].\nUse the radio button column to merge in only the revisions created at and before the specified time.\nNote that using the navigation links will reset this column.",
-    "mergehistory-go": "Show mergeable edits",
-    "mergehistory-submit": "Merge revisions",
-    "mergehistory-empty": "No revisions can be merged.",
-    "mergehistory-success": "$3 {{PLURAL:$3|revision|revisions}} of [[:$1]] successfully merged into [[:$2]].",
-    "mergehistory-fail": "Unable to perform history merge, please recheck the page and time parameters.",
-    "mergehistory-no-source": "Source page $1 does not exist.",
-    "mergehistory-no-destination": "Destination page $1 does not exist.",
-    "mergehistory-invalid-source": "Source page must be a valid title.",
-    "mergehistory-invalid-destination": "Destination page must be a valid title.",
-    "mergehistory-autocomment": "Merged [[:$1]] into [[:$2]]",
-    "mergehistory-comment": "Merged [[:$1]] into [[:$2]]: $3",
-    "mergehistory-same-destination": "Source and destination pages cannot be the same",
-    "mergehistory-reason": "Reason:",
-    "mergehistory-revisionrow": "$1 ($2) $3 . . $4 $5 $6",
-    "mergelog": "Merge log",
-    "pagemerge-logentry": "merged [[$1]] into [[$2]] (revisions up to $3)",
-    "revertmerge": "Unmerge",
-    "mergelogpagetext": "Below is a list of the most recent merges of one page history into another.",
-    "history-title": "Revision history of \"$1\"",
-    "difference-title": "Difference between revisions of \"$1\"",
-    "difference-title-multipage": "Difference between pages \"$1\" and \"$2\"",
-    "difference-multipage": "(Difference between pages)",
-    "lineno": "Line $1:",
-    "compareselectedversions": "Compare selected revisions",
-    "showhideselectedversions": "Change visibility of selected revisions",
-    "editundo": "undo",
-    "diff-empty": "(No difference)",
-    "diff-multi-sameuser": "({{PLURAL:$1|One intermediate revision|$1 intermediate revisions}} by the same user not shown)",
-    "diff-multi-otherusers": "({{PLURAL:$1|One intermediate revision|$1 intermediate revisions}} by {{PLURAL:$2|one other user|$2 users}} not shown)",
-    "diff-multi-manyusers": "({{PLURAL:$1|One intermediate revision|$1 intermediate revisions}} by more than $2 {{PLURAL:$2|user|users}} not shown)",
-    "difference-missing-revision": "{{PLURAL:$2|One revision|$2 revisions}} of this difference ($1) {{PLURAL:$2|was|were}} not found.\n\nThis is usually caused by following an outdated diff link to a page that has been deleted.\nDetails can be found in the [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log].",
-    "search-summary": "",
-    "searchresults": "Search results",
-    "searchresults-title": "Search results for \"$1\"",
-    "toomanymatches": "Too many matches were returned, please try a different query",
-    "titlematches": "Page title matches",
-    "textmatches": "Page text matches",
-    "notextmatches": "No page text matches",
-    "prevn": "previous {{PLURAL:$1|$1}}",
-    "nextn": "next {{PLURAL:$1|$1}}",
-    "prevn-title": "Previous $1 {{PLURAL:$1|result|results}}",
-    "nextn-title": "Next $1 {{PLURAL:$1|result|results}}",
-    "shown-title": "Show $1 {{PLURAL:$1|result|results}} per page",
-    "viewprevnext": "View ($1 {{int:pipe-separator}} $2) ($3)",
-    "searchmenu-exists": "<strong>There is a page named \"[[:$1]]\" on this wiki.</strong> {{PLURAL:$2|0=|See also the other search results found.}}",
-    "searchmenu-new": "<strong>Create the page \"[[:$1]]\" on this wiki!</strong> {{PLURAL:$2|0=|See also the page found with your search.|See also the search results found.}}",
-    "searchmenu-new-nocreate": "",
-    "searchprofile-articles": "Content pages",
-    "searchprofile-project": "Help and Project pages",
-    "searchprofile-images": "Multimedia",
-    "searchprofile-everything": "Everything",
-    "searchprofile-advanced": "Advanced",
-    "searchprofile-articles-tooltip": "Search in $1",
-    "searchprofile-project-tooltip": "Search in $1",
-    "searchprofile-images-tooltip": "Search for files",
-    "searchprofile-everything-tooltip": "Search all of content (including talk pages)",
-    "searchprofile-advanced-tooltip": "Search in custom namespaces",
-    "search-result-size": "$1 ({{PLURAL:$2|1 word|$2 words}})",
-    "search-result-category-size": "{{PLURAL:$1|1 member|$1 members}} ({{PLURAL:$2|1 subcategory|$2 subcategories}}, {{PLURAL:$3|1 file|$3 files}})",
-    "search-result-score": "Relevance: $1%",
-    "search-redirect": "(redirect $1)",
-    "search-section": "(section $1)",
-    "search-file-match": "(matches file content)",
-    "search-suggest": "Did you mean: $1",
-    "search-interwiki-caption": "Sister projects",
-    "search-interwiki-default": "Results from $1:",
-    "search-interwiki-custom": "",
-    "search-interwiki-more": "(more)",
-    "search-relatedarticle": "Related",
-    "searcheverything-enable": "Search in all namespaces",
-    "searchrelated": "related",
-    "searchall": "all",
-    "showingresults": "Showing below up to {{PLURAL:$1|<strong>1</strong> result|<strong>$1</strong> results}} starting with #<strong>$2</strong>.",
-    "showingresultsinrange": "Showing below up to {{PLURAL:$1|<strong>1</strong> result|<strong>$1</strong> results}} in range #<strong>$2</strong> to #<strong>$3</strong>.",
-    "showingresultsnum": "Showing below {{PLURAL:$3|<strong>1</strong> result|<strong>$3</strong> results}} starting with #<strong>$2</strong>.",
-    "showingresultsheader": "{{PLURAL:$5|Result <strong>$1</strong> of <strong>$3</strong>|Results <strong>$1 - $2</strong> of <strong>$3</strong>}} for <strong>$4</strong>",
-    "search-nonefound": "There were no results matching the query.",
-    "powersearch-legend": "Advanced search",
-    "powersearch-ns": "Search in namespaces:",
-    "powersearch-togglelabel": "Check:",
-    "powersearch-toggleall": "All",
-    "powersearch-togglenone": "None",
-    "search-external": "External search",
-    "searchdisabled": "{{SITENAME}} search is disabled.\nYou can search via Google in the meantime.\nNote that their indexes of {{SITENAME}} content may be out of date.",
-    "googlesearch": "<form method=\"get\" action=\"//www.google.com/search\" id=\"googlesearch\">\n\t<input type=\"hidden\" name=\"domains\" value=\"{{SERVER}}\" />\n\t<input type=\"hidden\" name=\"num\" value=\"50\" />\n\t<input type=\"hidden\" name=\"ie\" value=\"$2\" />\n\t<input type=\"hidden\" name=\"oe\" value=\"$2\" />\n\n\t<input type=\"text\" name=\"q\" size=\"31\" maxlength=\"255\" value=\"$1\" />\n\t<input type=\"submit\" name=\"btnG\" value=\"$3\" />\n  <div>\n\t<input type=\"radio\" name=\"sitesearch\" id=\"gwiki\" value=\"{{SERVER}}\" checked=\"checked\" /><label for=\"gwiki\">{{SITENAME}}</label>\n\t<input type=\"radio\" name=\"sitesearch\" id=\"gWWW\" value=\"\" /><label for=\"gWWW\">WWW</label>\n  </div>\n</form>",
-    "search-error": "An error has occurred while searching: $1",
-    "opensearch-desc": "{{SITENAME}} ({{CONTENTLANGUAGE}})",
-    "preferences": "Preferences",
-    "preferences-summary": "",
-    "mypreferences": "Preferences",
-    "prefs-edits": "Number of edits:",
-    "prefsnologintext2": "Please $1 to change your preferences.",
-    "prefs-skin": "Skin",
-    "skin-preview": "Preview",
-    "datedefault": "No preference",
-    "prefs-labs": "Labs features",
-    "prefs-user-pages": "User pages",
-    "prefs-personal": "User profile",
-    "prefs-rc": "Recent changes",
-    "prefs-watchlist": "Watchlist",
-    "prefs-watchlist-days": "Days to show in watchlist:",
-    "prefs-watchlist-days-max": "Maximum $1 {{PLURAL:$1|day|days}}",
-    "prefs-watchlist-edits": "Maximum number of changes to show in expanded watchlist:",
-    "prefs-watchlist-edits-max": "Maximum number: 1000",
-    "prefs-watchlist-token": "Watchlist token:",
-    "prefs-misc": "Misc",
-    "prefs-resetpass": "Change password",
-    "prefs-changeemail": "Change email address",
-    "prefs-setemail": "Set an email address",
-    "prefs-email": "Email options",
-    "prefs-rendering": "Appearance",
-    "saveprefs": "Save",
-    "restoreprefs": "Restore all default settings (in all sections)",
-    "prefs-editing": "Editing",
-    "rows": "Rows:",
-    "columns": "Columns:",
-    "searchresultshead": "Search",
-    "stub-threshold": "Threshold for <a href=\"#\" class=\"stub\">stub link</a> formatting (bytes):",
-    "stub-threshold-disabled": "Disabled",
-    "recentchangesdays": "Days to show in recent changes:",
-    "recentchangesdays-max": "Maximum $1 {{PLURAL:$1|day|days}}",
-    "recentchangescount": "Number of edits to show by default:",
-    "prefs-help-recentchangescount": "This includes recent changes, page histories, and logs.",
-    "prefs-help-watchlist-token2": "This is the secret key to the web feed of your watchlist.\nAnyone who knows it will be able to read your watchlist, so do not share it.\nIf you need to, [[Special:ResetTokens|you can reset it]].",
-    "savedprefs": "Your preferences have been saved.",
-    "timezonelegend": "Time zone:",
-    "localtime": "Local time:",
-    "timezoneuseserverdefault": "Use wiki default ($1)",
-    "timezoneuseoffset": "Other (specify offset)",
-    "servertime": "Server time:",
-    "guesstimezone": "Fill in from browser",
-    "timezoneregion-africa": "Africa",
-    "timezoneregion-america": "America",
-    "timezoneregion-antarctica": "Antarctica",
-    "timezoneregion-arctic": "Arctic",
-    "timezoneregion-asia": "Asia",
-    "timezoneregion-atlantic": "Atlantic Ocean",
-    "timezoneregion-australia": "Australia",
-    "timezoneregion-europe": "Europe",
-    "timezoneregion-indian": "Indian Ocean",
-    "timezoneregion-pacific": "Pacific Ocean",
-    "allowemail": "Enable email from other users",
-    "prefs-searchoptions": "Search",
-    "prefs-namespaces": "Namespaces",
-    "defaultns": "Otherwise search in these namespaces:",
-    "default": "default",
-    "prefs-files": "Files",
-    "prefs-custom-css": "Custom CSS",
-    "prefs-custom-js": "Custom JavaScript",
-    "prefs-common-css-js": "Shared CSS/JavaScript for all skins:",
-    "prefs-reset-intro": "You can use this page to reset your preferences to the site defaults.\nThis cannot be undone.",
-    "prefs-emailconfirm-label": "Email confirmation:",
-    "youremail": "Email:",
-    "username": "{{GENDER:$1|Username}}:",
-    "uid": "{{GENDER:$1|User}} ID:",
-    "prefs-memberingroups": "{{GENDER:$2|Member}} of {{PLURAL:$1|group|groups}}:",
-    "prefs-memberingroups-type": "$1",
-    "prefs-registration": "Registration time:",
-    "prefs-registration-date-time": "$1",
-    "yourrealname": "Real name:",
-    "yourlanguage": "Language:",
-    "yourvariant": "Content language variant:",
-    "prefs-help-variant": "Your preferred variant or orthography to display the content pages of this wiki in.",
-    "yournick": "New signature:",
-    "prefs-help-signature": "Comments on talk pages should be signed with \"<nowiki>~~~~</nowiki>\", which will be converted into your signature and a timestamp.",
-    "badsig": "Invalid raw signature.\nCheck HTML tags.",
-    "badsiglength": "Your signature is too long.\nIt must not be more than $1 {{PLURAL:$1|character|characters}} long.",
-    "yourgender": "How do you prefer to be described?",
-    "gender-unknown": "I prefer not to say",
-    "gender-male": "He edits wiki pages",
-    "gender-female": "She edits wiki pages",
-    "prefs-help-gender": "Setting this preference is optional.\nThe software uses its value to address you and to mention you to others using the appropriate grammatical gender.\nThis information will be public.",
-    "email": "Email",
-    "prefs-help-realname": "Real name is optional.\nIf you choose to provide it, this will be used for giving you attribution for your work.",
-    "prefs-help-email": "Email address is optional, but is needed for password resets, should you forget your password.",
-    "prefs-help-email-others": "You can also choose to let others contact you by email through a link on your user or talk page.\nYour email address is not revealed when other users contact you.",
-    "prefs-help-email-required": "Email address is required.",
-    "prefs-info": "Basic information",
-    "prefs-i18n": "Internationalisation",
-    "prefs-signature": "Signature",
-    "prefs-dateformat": "Date format",
-    "prefs-timeoffset": "Time offset",
-    "prefs-advancedediting": "General options",
-    "prefs-editor": "Editor",
-    "prefs-preview": "Preview",
-    "prefs-advancedrc": "Advanced options",
-    "prefs-advancedrendering": "Advanced options",
-    "prefs-advancedsearchoptions": "Advanced options",
-    "prefs-advancedwatchlist": "Advanced options",
-    "prefs-displayrc": "Display options",
-    "prefs-displaywatchlist": "Display options",
-    "prefs-tokenwatchlist": "Token",
-    "prefs-diffs": "Diffs",
-    "prefs-help-prefershttps": "This preference will take effect on your next login.",
-    "prefs-tabs-navigation-hint": "Tip: You can use the left and right arrow keys to navigate between the tabs in the tabs list.",
-    "email-address-validity-valid": "Email address appears valid",
-    "email-address-validity-invalid": "Enter a valid email address",
-    "userrights": "User rights management",
-    "userrights-summary": "",
-    "userrights-lookup-user": "Manage user groups",
-    "userrights-user-editname": "Enter a username:",
-    "editusergroup": "Edit user groups",
-    "editinguser": "Changing user rights of user <strong>[[User:$1|$1]]</strong> $2",
-    "userrights-editusergroup": "Edit user groups",
-    "saveusergroups": "Save user groups",
-    "userrights-groupsmember": "Member of:",
-    "userrights-groupsmember-auto": "Implicit member of:",
-    "userrights-groupsmember-type": "$1",
-    "userrights-groups-help": "You may alter the groups this user is in:\n* A checked box means the user is in that group.\n* An unchecked box means the user is not in that group.\n* A * indicates that you cannot remove the group once you have added it, or vice versa.",
-    "userrights-reason": "Reason:",
-    "userrights-no-interwiki": "You do not have permission to edit user rights on other wikis.",
-    "userrights-nodatabase": "Database $1 does not exist or is not local.",
-    "userrights-nologin": "You must [[Special:UserLogin|log in]] with an administrator account to assign user rights.",
-    "userrights-notallowed": "You do not have permission to add or remove user rights.",
-    "userrights-changeable-col": "Groups you can change",
-    "userrights-unchangeable-col": "Groups you cannot change",
-    "userrights-irreversible-marker": "$1*",
-    "userrights-conflict": "Conflict of user rights changes! Please review and confirm your changes.",
-    "userrights-removed-self": "You successfully removed your own rights. As such, you are no longer able to access this page.",
-    "group": "Group:",
-    "group-user": "Users",
-    "group-autoconfirmed": "Autoconfirmed users",
-    "group-bot": "Bots",
-    "group-sysop": "Administrators",
-    "group-bureaucrat": "Bureaucrats",
-    "group-suppress": "Oversights",
-    "group-all": "(all)",
-    "group-user-member": "{{GENDER:$1|user}}",
-    "group-autoconfirmed-member": "{{GENDER:$1|autoconfirmed user}}",
-    "group-bot-member": "{{GENDER:$1|bot}}",
-    "group-sysop-member": "{{GENDER:$1|administrator}}",
-    "group-bureaucrat-member": "{{GENDER:$1|bureaucrat}}",
-    "group-suppress-member": "{{GENDER:$1|oversight}}",
-    "grouppage-user": "{{ns:project}}:Users",
-    "grouppage-autoconfirmed": "{{ns:project}}:Autoconfirmed users",
-    "grouppage-bot": "{{ns:project}}:Bots",
-    "grouppage-sysop": "{{ns:project}}:Administrators",
-    "grouppage-bureaucrat": "{{ns:project}}:Bureaucrats",
-    "grouppage-suppress": "{{ns:project}}:Oversight",
-    "right-read": "Read pages",
-    "right-edit": "Edit pages",
-    "right-createpage": "Create pages (which are not discussion pages)",
-    "right-createtalk": "Create discussion pages",
-    "right-createaccount": "Create new user accounts",
-    "right-minoredit": "Mark edits as minor",
-    "right-move": "Move pages",
-    "right-move-subpages": "Move pages with their subpages",
-    "right-move-rootuserpages": "Move root user pages",
-    "right-movefile": "Move files",
-    "right-suppressredirect": "Not create redirects from source pages when moving pages",
-    "right-upload": "Upload files",
-    "right-reupload": "Overwrite existing files",
-    "right-reupload-own": "Overwrite existing files uploaded by oneself",
-    "right-reupload-shared": "Override files on the shared media repository locally",
-    "right-upload_by_url": "Upload files from a URL",
-    "right-purge": "Purge the site cache for a page without confirmation",
-    "right-autoconfirmed": "Not be affected by IP-based rate limits",
-    "right-bot": "Be treated as an automated process",
-    "right-nominornewtalk": "Not have minor edits to discussion pages trigger the new messages prompt",
-    "right-apihighlimits": "Use higher limits in API queries",
-    "right-writeapi": "Use of the write API",
-    "right-delete": "Delete pages",
-    "right-bigdelete": "Delete pages with large histories",
-    "right-deletelogentry": "Delete and undelete specific log entries",
-    "right-deleterevision": "Delete and undelete specific revisions of pages",
-    "right-deletedhistory": "View deleted history entries, without their associated text",
-    "right-deletedtext": "View deleted text and changes between deleted revisions",
-    "right-browsearchive": "Search deleted pages",
-    "right-undelete": "Undelete a page",
-    "right-suppressrevision": "Review and restore revisions hidden from administrators",
-    "right-suppressionlog": "View private logs",
-    "right-block": "Block other users from editing",
-    "right-blockemail": "Block a user from sending email",
-    "right-hideuser": "Block a username, hiding it from the public",
-    "right-ipblock-exempt": "Bypass IP blocks, auto-blocks and range blocks",
-    "right-proxyunbannable": "Bypass automatic blocks of proxies",
-    "right-unblockself": "Unblock oneself",
-    "right-protect": "Change protection levels and edit cascade-protected pages",
-    "right-editprotected": "Edit pages protected as \"{{int:protect-level-sysop}}\"",
-    "right-editsemiprotected": "Edit pages protected as \"{{int:protect-level-autoconfirmed}}\"",
-    "right-editinterface": "Edit the user interface",
-    "right-editusercssjs": "Edit other users' CSS and JavaScript files",
-    "right-editusercss": "Edit other users' CSS files",
-    "right-edituserjs": "Edit other users' JavaScript files",
-    "right-editmyusercss": "Edit your own user CSS files",
-    "right-editmyuserjs": "Edit your own user JavaScript files",
-    "right-viewmywatchlist": "View your own watchlist",
-    "right-editmywatchlist": "Edit your own watchlist. Note some actions will still add pages even without this right.",
-    "right-viewmyprivateinfo": "View your own private data (e.g. email address, real name)",
-    "right-editmyprivateinfo": "Edit your own private data (e.g. email address, real name)",
-    "right-editmyoptions": "Edit your own preferences",
-    "right-rollback": "Quickly rollback the edits of the last user who edited a particular page",
-    "right-markbotedits": "Mark rolled-back edits as bot edits",
-    "right-noratelimit": "Not be affected by rate limits",
-    "right-import": "Import pages from other wikis",
-    "right-importupload": "Import pages from a file upload",
-    "right-patrol": "Mark others' edits as patrolled",
-    "right-autopatrol": "Have one's own edits automatically marked as patrolled",
-    "right-patrolmarks": "View recent changes patrol marks",
-    "right-unwatchedpages": "View a list of unwatched pages",
-    "right-mergehistory": "Merge the history of pages",
-    "right-userrights": "Edit all user rights",
-    "right-userrights-interwiki": "Edit user rights of users on other wikis",
-    "right-siteadmin": "Lock and unlock the database",
-    "right-override-export-depth": "Export pages including linked pages up to a depth of 5",
-    "right-sendemail": "Send email to other users",
-    "right-passwordreset": "View password reset emails",
-    "newuserlogpage": "User creation log",
-    "newuserlogpagetext": "This is a log of user creations.",
-    "rightslog": "User rights log",
-    "rightslogtext": "This is a log of changes to user rights.",
-    "action-read": "read this page",
-    "action-edit": "edit this page",
-    "action-createpage": "create pages",
-    "action-createtalk": "create discussion pages",
-    "action-createaccount": "create this user account",
-    "action-history": "view the history of this page",
-    "action-minoredit": "mark this edit as minor",
-    "action-move": "move this page",
-    "action-move-subpages": "move this page, and its subpages",
-    "action-move-rootuserpages": "move root user pages",
-    "action-movefile": "move this file",
-    "action-upload": "upload this file",
-    "action-reupload": "overwrite this existing file",
-    "action-reupload-shared": "override this file on a shared repository",
-    "action-upload_by_url": "upload this file from a URL",
-    "action-writeapi": "use the write API",
-    "action-delete": "delete this page",
-    "action-deleterevision": "delete this revision",
-    "action-deletedhistory": "view this page's deleted history",
-    "action-browsearchive": "search deleted pages",
-    "action-undelete": "undelete this page",
-    "action-suppressrevision": "review and restore this hidden revision",
-    "action-suppressionlog": "view this private log",
-    "action-block": "block this user from editing",
-    "action-protect": "change protection levels for this page",
-    "action-rollback": "quickly rollback the edits of the last user who edited a particular page",
-    "action-import": "import pages from another wiki",
-    "action-importupload": "import pages from a file upload",
-    "action-patrol": "mark others' edits as patrolled",
-    "action-autopatrol": "have your edit marked as patrolled",
-    "action-unwatchedpages": "view the list of unwatched pages",
-    "action-mergehistory": "merge the history of this page",
-    "action-userrights": "edit all user rights",
-    "action-userrights-interwiki": "edit user rights of users on other wikis",
-    "action-siteadmin": "lock or unlock the database",
-    "action-sendemail": "send emails",
-    "action-editmywatchlist": "edit your watchlist",
-    "action-viewmywatchlist": "view your watchlist",
-    "action-viewmyprivateinfo": "view your private information",
-    "action-editmyprivateinfo": "edit your private information",
-    "nchanges": "$1 {{PLURAL:$1|change|changes}}",
-    "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|since last visit}}",
-    "enhancedrc-history": "history",
-    "recentchanges": "Recent changes",
-    "recentchanges-url": "Special:RecentChanges",
-    "recentchanges-legend": "Recent changes options",
-    "recentchanges-summary": "Track the most recent changes to the wiki on this page.",
-    "recentchangestext": "-",
-    "recentchanges-noresult": "No changes during the given period matching these criteria.",
-    "recentchanges-feed-description": "Track the most recent changes to the wiki in this feed.",
-    "recentchanges-label-newpage": "This edit created a new page",
-    "recentchanges-label-minor": "This is a minor edit",
-    "recentchanges-label-bot": "This edit was performed by a bot",
-    "recentchanges-label-unpatrolled": "This edit has not yet been patrolled",
-    "recentchanges-label-plusminus": "The page size changed by this number of bytes",
-    "recentchanges-legend-heading": "'''Legend:'''",
-    "recentchanges-legend-newpage": "(also see [[Special:NewPages|list of new pages]])",
-    "recentchanges-legend-plusminus": "(<em>±123</em>)",
-    "rcnotefrom": "Below are the changes since <strong>$2</strong> (up to <strong>$1</strong> shown).",
-    "rclistfrom": "Show new changes starting from $2, $3",
-    "rcshowhideminor": "$1 minor edits",
-    "rcshowhideminor-show": "Show",
-    "rcshowhideminor-hide": "Hide",
-    "rcshowhidebots": "$1 bots",
-    "rcshowhidebots-show": "Show",
-    "rcshowhidebots-hide": "Hide",
-    "rcshowhideliu": "$1 registered users",
-    "rcshowhideliu-show": "Show",
-    "rcshowhideliu-hide": "Hide",
-    "rcshowhideanons": "$1 anonymous users",
-    "rcshowhideanons-show": "Show",
-    "rcshowhideanons-hide": "Hide",
-    "rcshowhidepatr": "$1 patrolled edits",
-    "rcshowhidepatr-show": "Show",
-    "rcshowhidepatr-hide": "Hide",
-    "rcshowhidemine": "$1 my edits",
-    "rcshowhidemine-show": "Show",
-    "rcshowhidemine-hide": "Hide",
-    "rclinks": "Show last $1 changes in last $2 days<br />$3",
-    "diff": "diff",
-    "hist": "hist",
-    "hide": "Hide",
-    "show": "Show",
-    "minoreditletter": "m",
-    "newpageletter": "N",
-    "boteditletter": "b",
-    "unpatrolledletter": "!",
-    "number_of_watching_users_RCview": "[$1]",
-    "number_of_watching_users_pageview": "[$1 watching {{PLURAL:$1|user|users}}]",
-    "rc_categories": "Limit to categories (separate with \"|\")",
-    "rc_categories_any": "Any",
-    "rc-change-size": "$1",
-    "rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} after change",
-    "newsectionsummary": "/* $1 */ new section",
-    "rc-enhanced-expand": "Show details",
-    "rc-enhanced-hide": "Hide details",
-    "rc-old-title": "originally created as \"$1\"",
-    "recentchangeslinked": "Related changes",
-    "recentchangeslinked-feed": "Related changes",
-    "recentchangeslinked-toolbox": "Related changes",
-    "recentchangeslinked-title": "Changes related to \"$1\"",
-    "recentchangeslinked-summary": "This is a list of changes made recently to pages linked from a specified page (or to members of a specified category).\nPages on [[Special:Watchlist|your watchlist]] are <strong>bold</strong>.",
-    "recentchangeslinked-page": "Page name:",
-    "recentchangeslinked-to": "Show changes to pages linked to the given page instead",
-    "upload": "Upload file",
-    "uploadbtn": "Upload file",
-    "reuploaddesc": "Cancel upload and return to the upload form",
-    "upload-tryagain": "Submit modified file description",
-    "uploadnologin": "Not logged in",
-    "uploadnologintext": "Please $1 to upload files.",
-    "upload_directory_missing": "The upload directory ($1) is missing and could not be created by the webserver.",
-    "upload_directory_read_only": "The upload directory ($1) is not writable by the webserver.",
-    "uploaderror": "Upload error",
-    "upload-summary": "",
-    "upload-recreate-warning": "<strong>Warning: A file by that name has been deleted or moved.</strong>\n\nThe deletion and move log for this page are provided here for convenience:",
-    "uploadtext": "Use the form below to upload files.\nTo view or search previously uploaded files go to the [[Special:FileList|list of uploaded files]], (re)uploads are also logged in the [[Special:Log/upload|upload log]], deletions in the [[Special:Log/delete|deletion log]].\n\nTo include a file in a page, use a link in one of the following forms:\n* <strong><code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code></strong> to use the full version of the file\n* <strong><code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|alt text]]</nowiki></code></strong> to use a 200 pixel wide rendition in a box in the left margin with \"alt text\" as description\n* <strong><code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code></strong> for directly linking to the file without displaying the file",
-    "upload-permitted": "Permitted file types: $1.",
-    "upload-preferred": "Preferred file types: $1.",
-    "upload-prohibited": "Prohibited file types: $1.",
-    "uploadfooter": "-",
-    "upload-default-description": "-",
-    "uploadlogpage": "Upload log",
-    "uploadlogpagetext": "Below is a list of the most recent file uploads.\nSee the [[Special:NewFiles|gallery of new files]] for a more visual overview.",
-    "filename": "Filename",
-    "filedesc": "Summary",
-    "fileuploadsummary": "Summary:",
-    "filereuploadsummary": "File changes:",
-    "filestatus": "Copyright status:",
-    "filesource": "Source:",
-    "ignorewarning": "Ignore warning and save file anyway",
-    "ignorewarnings": "Ignore any warnings",
-    "minlength1": "Filenames must be at least one letter.",
-    "illegalfilename": "The filename \"$1\" contains characters that are not allowed in page titles.\nPlease rename the file and try uploading it again.",
-    "filename-toolong": "Filenames may not be longer than 240 bytes.",
-    "badfilename": "Filename has been changed to \"$1\".",
-    "filetype-mime-mismatch": "File extension \".$1\" does not match the detected MIME type of the file ($2).",
-    "filetype-badmime": "Files of the MIME type \"$1\" are not allowed to be uploaded.",
-    "filetype-bad-ie-mime": "Cannot upload this file because Internet Explorer would detect it as \"$1\", which is a disallowed and potentially dangerous file type.",
-    "filetype-unwanted-type": "<strong>\".$1\"</strong> is an unwanted file type.\nPreferred {{PLURAL:$3|file type is|file types are}} $2.",
-    "filetype-banned-type": "<strong>\".$1\"</strong> {{PLURAL:$4|is not a permitted file type|are not permitted file types}}.\nPermitted {{PLURAL:$3|file type is|file types are}} $2.",
-    "filetype-missing": "The file has no extension (like \".jpg\").",
-    "empty-file": "The file you submitted was empty.",
-    "file-too-large": "The file you submitted was too large.",
-    "filename-tooshort": "The filename is too short.",
-    "filetype-banned": "This type of file is banned.",
-    "verification-error": "This file did not pass file verification.",
-    "hookaborted": "The modification you tried to make was aborted by an extension.",
-    "illegal-filename": "The filename is not allowed.",
-    "overwrite": "Overwriting an existing file is not allowed.",
-    "unknown-error": "An unknown error occurred.",
-    "tmp-create-error": "Could not create temporary file.",
-    "tmp-write-error": "Error writing temporary file.",
-    "large-file": "It is recommended that files are no larger than $1;\nthis file is $2.",
-    "largefileserver": "This file is bigger than the server is configured to allow.",
-    "emptyfile": "The file you uploaded seems to be empty.\nThis might be due to a typo in the filename.\nPlease check whether you really want to upload this file.",
-    "windows-nonascii-filename": "This wiki does not support filenames with special characters.",
-    "fileexists": "A file with this name exists already, please check <strong>[[:$1]]</strong> if you are not sure if you want to change it.\n[[$1|thumb]]",
-    "filepageexists": "The description page for this file has already been created at <strong>[[:$1]]</strong>, but no file with this name currently exists.\nThe summary you enter will not appear on the description page.\nTo make your summary appear there, you will need to manually edit it.\n[[$1|thumb]]",
-    "fileexists-extension": "A file with a similar name exists: [[$2|thumb]]\n* Name of the uploading file: <strong>[[:$1]]</strong>\n* Name of the existing file: <strong>[[:$2]]</strong>\nPlease choose a different name.",
-    "fileexists-thumbnail-yes": "The file seems to be an image of reduced size <em>(thumbnail)</em>.\n[[$1|thumb]]\nPlease check the file <strong>[[:$1]]</strong>.\nIf the checked file is the same image of original size it is not necessary to upload an extra thumbnail.",
-    "file-thumbnail-no": "The filename begins with <strong>$1</strong>.\nIt seems to be an image of reduced size <em>(thumbnail)</em>.\nIf you have this image in full resolution upload this one, otherwise change the filename please.",
-    "fileexists-forbidden": "A file with this name already exists, and cannot be overwritten.\nIf you still want to upload your file, please go back and use a new name.\n[[File:$1|thumb|center|$1]]",
-    "fileexists-shared-forbidden": "A file with this name exists already in the shared file repository.\nIf you still want to upload your file, please go back and use a new name.\n[[File:$1|thumb|center|$1]]",
-    "file-exists-duplicate": "This file is a duplicate of the following {{PLURAL:$1|file|files}}:",
-    "file-deleted-duplicate": "A file identical to this file ([[:$1]]) has previously been deleted.\nYou should check that file's deletion history before proceeding to re-upload it.",
-    "file-deleted-duplicate-notitle": "A file identical to this file has previously been deleted, and the title has been suppressed.\nYou should ask someone with the ability to view suppressed file data to review the situation before proceeding to re-upload it.",
-    "uploadwarning": "Upload warning",
-    "uploadwarning-text": "Please modify the file description below and try again.",
-    "savefile": "Save file",
-    "uploadedimage": "uploaded \"[[$1]]\"",
-    "overwroteimage": "uploaded a new version of \"[[$1]]\"",
-    "uploaddisabled": "Uploads disabled.",
-    "copyuploaddisabled": "Upload by URL disabled.",
-    "uploaddisabledtext": "File uploads are disabled.",
-    "php-uploaddisabledtext": "File uploads are disabled in PHP.\nPlease check the file_uploads setting.",
-    "uploadscripted": "This file contains HTML or script code that may be erroneously interpreted by a web browser.",
-    "uploadscriptednamespace": "This SVG file contains an illegal namespace \"$1\".",
-    "uploadinvalidxml": "The XML in the uploaded file could not be parsed.",
-    "uploadvirus": "The file contains a virus!\nDetails: $1",
-    "uploadjava": "The file is a ZIP file that contains a Java .class file.\nUploading Java files is not allowed because they can cause security restrictions to be bypassed.",
-    "upload-source": "Source file",
-    "sourcefilename": "Source filename:",
-    "sourceurl": "Source URL:",
-    "destfilename": "Destination filename:",
-    "upload-maxfilesize": "Maximum file size: $1",
-    "upload-description": "File description",
-    "upload-options": "Upload options",
-    "watchthisupload": "Watch this file",
-    "filewasdeleted": "A file of this name has been previously uploaded and subsequently deleted.\nYou should check the $1 before proceeding to upload it again.",
-    "filename-bad-prefix": "The name of the file you are uploading begins with <strong>\"$1\"</strong>, which is a non-descriptive name typically assigned automatically by digital cameras.\nPlease choose a more descriptive name for your file.",
-    "filename-prefix-blacklist": " #<!-- leave this line exactly as it is --> <pre>\n# Syntax is as follows:\n#   * Everything from a \"#\" character to the end of the line is a comment\n#   * Every non-blank line is a prefix for typical filenames assigned automatically by digital cameras\nCIMG # Casio\nDSC_ # Nikon\nDSCF # Fuji\nDSCN # Nikon\nDUW # some mobile phones\nIMG # generic\nJD # Jenoptik\nMGP # Pentax\nPICT # misc.\n #</pre> <!-- leave this line exactly as it is -->",
-    "upload-success-subj": "Successful upload",
-    "upload-success-msg": "Your upload from [$2] was successful. It is available here: [[:{{ns:file}}:$1]]",
-    "upload-failure-subj": "Upload problem",
-    "upload-failure-msg": "There was a problem with your upload from [$2]:\n\n$1",
-    "upload-warning-subj": "Upload warning",
-    "upload-warning-msg": "There was a problem with your upload from [$2]. You may return to the [[Special:Upload/stash/$1|upload form]] to correct this problem.",
-    "upload-proto-error": "Incorrect protocol",
-    "upload-proto-error-text": "Remote upload requires URLs beginning with <code>http://</code> or <code>ftp://</code>.",
-    "upload-file-error": "Internal error",
-    "upload-file-error-text": "An internal error occurred when attempting to create a temporary file on the server.\nPlease contact an [[Special:ListUsers/sysop|administrator]].",
-    "upload-misc-error": "Unknown upload error",
-    "upload-misc-error-text": "An unknown error occurred during the upload.\nPlease verify that the URL is valid and accessible and try again.\nIf the problem persists, contact an [[Special:ListUsers/sysop|administrator]].",
-    "upload-too-many-redirects": "The URL contained too many redirects",
-    "upload-http-error": "An HTTP error occurred: $1",
-    "upload-copy-upload-invalid-domain": "Copy uploads are not available from this domain.",
-    "backend-fail-stream": "Could not stream file \"$1\".",
-    "backend-fail-backup": "Could not backup file \"$1\".",
-    "backend-fail-notexists": "The file $1 does not exist.",
-    "backend-fail-hashes": "Could not get file hashes for comparison.",
-    "backend-fail-notsame": "A non-identical file already exists at \"$1\".",
-    "backend-fail-invalidpath": "\"$1\" is not a valid storage path.",
-    "backend-fail-delete": "Could not delete file \"$1\".",
-    "backend-fail-describe": "Could not change metadata for file \"$1\".",
-    "backend-fail-alreadyexists": "The file \"$1\" already exists.",
-    "backend-fail-store": "Could not store file \"$1\" at \"$2\".",
-    "backend-fail-copy": "Could not copy file \"$1\" to \"$2\".",
-    "backend-fail-move": "Could not move file \"$1\" to \"$2\".",
-    "backend-fail-opentemp": "Could not open temporary file.",
-    "backend-fail-writetemp": "Could not write to temporary file.",
-    "backend-fail-closetemp": "Could not close temporary file.",
-    "backend-fail-read": "Could not read file \"$1\".",
-    "backend-fail-create": "Could not write file \"$1\".",
-    "backend-fail-maxsize": "Could not write file \"$1\" because it is larger than {{PLURAL:$2|one byte|$2 bytes}}.",
-    "backend-fail-readonly": "The storage backend \"$1\" is currently read-only. The reason given is: \"<em>$2</em>\"",
-    "backend-fail-synced": "The file \"$1\" is in an inconsistent state within the internal storage backends",
-    "backend-fail-connect": "Could not connect to storage backend \"$1\".",
-    "backend-fail-internal": "An unknown error occurred in storage backend \"$1\".",
-    "backend-fail-contenttype": "Could not determine the content type of the file to store at \"$1\".",
-    "backend-fail-batchsize": "The storage backend was given a batch of $1 file {{PLURAL:$1|operation|operations}}; the limit is $2 {{PLURAL:$2|operation|operations}}.",
-    "backend-fail-usable": "Could not read or write file \"$1\" due to insufficient permissions or missing directories/containers.",
-    "filejournal-fail-dbconnect": "Could not connect to the journal database for storage backend \"$1\".",
-    "filejournal-fail-dbquery": "Could not update the journal database for storage backend \"$1\".",
-    "lockmanager-notlocked": "Could not unlock \"$1\"; it is not locked.",
-    "lockmanager-fail-closelock": "Could not close lock file for \"$1\".",
-    "lockmanager-fail-deletelock": "Could not delete lock file for \"$1\".",
-    "lockmanager-fail-acquirelock": "Could not acquire lock for \"$1\".",
-    "lockmanager-fail-openlock": "Could not open lock file for \"$1\".",
-    "lockmanager-fail-releaselock": "Could not release lock for \"$1\".",
-    "lockmanager-fail-db-bucket": "Could not contact enough lock databases in bucket $1.",
-    "lockmanager-fail-db-release": "Could not release locks on database $1.",
-    "lockmanager-fail-svr-acquire": "Could not acquire locks on server $1.",
-    "lockmanager-fail-svr-release": "Could not release locks on server $1.",
-    "zip-file-open-error": "An error was encountered when opening the file for ZIP checks.",
-    "zip-wrong-format": "The specified file was not a ZIP file.",
-    "zip-bad": "The file is a corrupt or otherwise unreadable ZIP file.\nIt cannot be properly checked for security.",
-    "zip-unsupported": "The file is a ZIP file that uses ZIP features not supported by MediaWiki.\nIt cannot be properly checked for security.",
-    "uploadstash": "Upload stash",
-    "uploadstash-summary": "This page provides access to files that are uploaded or in the process of uploading, but are not yet published to the wiki. These files are not visible to anyone but the user who uploaded them.",
-    "uploadstash-clear": "Clear stashed files",
-    "uploadstash-nofiles": "You have no stashed files.",
-    "uploadstash-badtoken": "Performing of that action was unsuccessful, perhaps because your editing credentials expired. Try again.",
-    "uploadstash-errclear": "Clearing the files was unsuccessful.",
-    "uploadstash-refresh": "Refresh the list of files",
-    "invalid-chunk-offset": "Invalid chunk offset",
-    "img-auth-accessdenied": "Access denied",
-    "img-auth-nopathinfo": "Missing PATH_INFO.\nYour server is not set up to pass this information.\nIt may be CGI-based and cannot support img_auth.\nSee https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization.",
-    "img-auth-notindir": "Requested path is not in the configured upload directory.",
-    "img-auth-badtitle": "Unable to construct a valid title from \"$1\".",
-    "img-auth-nologinnWL": "You are not logged in and \"$1\" is not in the whitelist.",
-    "img-auth-nofile": "File \"$1\" does not exist.",
-    "img-auth-isdir": "You are trying to access a directory \"$1\".\nOnly file access is allowed.",
-    "img-auth-streaming": "Streaming \"$1\".",
-    "img-auth-public": "The function of img_auth.php is to output files from a private wiki.\nThis wiki is configured as a public wiki.\nFor optimal security, img_auth.php is disabled.",
-    "img-auth-noread": "User does not have access to read \"$1\".",
-    "http-invalid-url": "Invalid URL: $1",
-    "http-invalid-scheme": "URLs with the \"$1\" scheme are not supported.",
-    "http-request-error": "HTTP request failed due to unknown error.",
-    "http-read-error": "HTTP read error.",
-    "http-timed-out": "HTTP request timed out.",
-    "http-curl-error": "Error fetching URL: $1",
-    "http-bad-status": "There was a problem during the HTTP request: $1 $2",
-    "upload-curl-error6": "Could not reach URL",
-    "upload-curl-error6-text": "The URL provided could not be reached.\nPlease double-check that the URL is correct and the site is up.",
-    "upload-curl-error28": "Upload timeout",
-    "upload-curl-error28-text": "The site took too long to respond.\nPlease check the site is up, wait a short while and try again.\nYou may want to try at a less busy time.",
-    "license": "Licensing:",
-    "license-header": "Licensing",
-    "nolicense": "None selected",
-    "licenses": "-",
-    "license-nopreview": "(Preview not available)",
-    "upload_source_url": "(a valid, publicly accessible URL)",
-    "upload_source_file": "(a file on your computer)",
-    "listfiles-summary": "This special page shows all uploaded files.",
-    "listfiles_search_for": "Search for media name:",
-    "imgfile": "file",
-    "listfiles": "File list",
-    "listfiles_thumb": "Thumbnail",
-    "listfiles_date": "Date",
-    "listfiles_name": "Name",
-    "listfiles_user": "User",
-    "listfiles_size": "Size",
-    "listfiles_description": "Description",
-    "listfiles_count": "Versions",
-    "listfiles-show-all": "Include old versions of images",
-    "listfiles-latestversion": "Current version",
-    "listfiles-latestversion-yes": "Yes",
-    "listfiles-latestversion-no": "No",
-    "file-anchor-link": "File",
-    "filehist": "File history",
-    "filehist-help": "Click on a date/time to view the file as it appeared at that time.",
-    "filehist-deleteall": "delete all",
-    "filehist-deleteone": "delete",
-    "filehist-revert": "revert",
-    "filehist-current": "current",
-    "filehist-datetime": "Date/Time",
-    "filehist-thumb": "Thumbnail",
-    "filehist-thumbtext": "Thumbnail for version as of $1",
-    "filehist-nothumb": "No thumbnail",
-    "filehist-user": "User",
-    "filehist-dimensions": "Dimensions",
-    "filehist-filesize": "File size",
-    "filehist-comment": "Comment",
-    "imagelinks": "File usage",
-    "linkstoimage": "The following {{PLURAL:$1|page links|$1 pages link}} to this file:",
-    "linkstoimage-more": "More than $1 {{PLURAL:$1|page links|pages link}} to this file.\nThe following list shows the {{PLURAL:$1|first page link|first $1 page links}} to this file only.\nA [[Special:WhatLinksHere/$2|full list]] is available.",
-    "nolinkstoimage": "There are no pages that link to this file.",
-    "morelinkstoimage": "View [[Special:WhatLinksHere/$1|more links]] to this file.",
-    "linkstoimage-redirect": "$1 (file redirect) $2",
-    "duplicatesoffile": "The following {{PLURAL:$1|file is a duplicate|$1 files are duplicates}} of this file ([[Special:FileDuplicateSearch/$2|more details]]):",
-    "sharedupload": "This file is from $1 and may be used by other projects.",
-    "sharedupload-desc-there": "This file is from $1 and may be used by other projects.\nPlease see the [$2 file description page] for further information.",
-    "sharedupload-desc-here": "This file is from $1 and may be used by other projects.\nThe description on its [$2 file description page] there is shown below.",
-    "sharedupload-desc-edit": "This file is from $1 and may be used by other projects.\nMaybe you want to edit the description on its [$2 file description page] there.",
-    "sharedupload-desc-create": "This file is from $1 and may be used by other projects.\nMaybe you want to edit the description on its [$2 file description page] there.",
-    "shareddescriptionfollows": "-",
-    "filepage-nofile": "No file by this name exists.",
-    "filepage-nofile-link": "No file by this name exists, but you can [$1 upload it].",
-    "uploadnewversion-linktext": "Upload a new version of this file",
-    "shared-repo-from": "from $1",
-    "shared-repo": "a shared repository",
-    "shared-repo-name-wikimediacommons": "Wikimedia Commons",
-    "filepage.css": "/* CSS placed here is included on the file description page, also included on foreign client wikis */",
-    "upload-disallowed-here": "You cannot overwrite this file.",
-    "filerevert": "Revert $1",
-    "filerevert-legend": "Revert file",
-    "filerevert-intro": "You are about to revert the file <strong>[[Media:$1|$1]]</strong> to the [$4 version as of $3, $2].",
-    "filerevert-comment": "Reason:",
-    "filerevert-defaultcomment": "Reverted to version as of $2, $1",
-    "filerevert-submit": "Revert",
-    "filerevert-success": "<strong>[[Media:$1|$1]]</strong> has been reverted to the [$4 version as of $3, $2].",
-    "filerevert-badversion": "There is no previous local version of this file with the provided timestamp.",
-    "filedelete": "Delete $1",
-    "filedelete-legend": "Delete file",
-    "filedelete-intro": "You are about to delete the file <strong>[[Media:$1|$1]]</strong> along with all of its history.",
-    "filedelete-intro-old": "You are deleting the version of <strong>[[Media:$1|$1]]</strong> as of [$4 $3, $2].",
-    "filedelete-comment": "Reason:",
-    "filedelete-submit": "Delete",
-    "filedelete-success": "<strong>$1</strong> has been deleted.",
-    "filedelete-success-old": "The version of <strong>[[Media:$1|$1]]</strong> as of $3, $2 has been deleted.",
-    "filedelete-nofile": "<strong>$1</strong> does not exist.",
-    "filedelete-nofile-old": "There is no archived version of <strong>$1</strong> with the specified attributes.",
-    "filedelete-otherreason": "Other/additional reason:",
-    "filedelete-reason-otherlist": "Other reason",
-    "filedelete-reason-dropdown": "*Common delete reasons\n** Copyright violation\n** Duplicated file",
-    "filedelete-edit-reasonlist": "Edit delete reasons",
-    "filedelete-maintenance": "Deletion and restoration of files temporarily disabled during maintenance.",
-    "filedelete-maintenance-title": "Cannot delete file",
-    "mimesearch": "MIME search",
-    "mimesearch-summary": "This page enables the filtering of files for their MIME type.\nInput: contenttype/subtype, e.g. <code>image/jpeg</code>.",
-    "mimetype": "MIME type:",
-    "download": "download",
-    "unwatchedpages": "Unwatched pages",
-    "unwatchedpages-summary": "",
-    "listredirects": "List of redirects",
-    "listredirects-summary": "",
-    "listduplicatedfiles": "List of files with duplicates",
-    "listduplicatedfiles-summary": "This is a list of files where the most recent version of the file is a duplicate of the most recent version of some other file. Only local files are considered.",
-    "listduplicatedfiles-entry": "[[:File:$1|$1]] has [[$3|{{PLURAL:$2|a duplicate|$2 duplicates}}]].",
-    "unusedtemplates": "Unused templates",
-    "unusedtemplates-summary": "",
-    "unusedtemplatestext": "This page lists all pages in the {{ns:template}} namespace that are not included in another page.\nRemember to check for other links to the templates before deleting them.",
-    "unusedtemplateswlh": "other links",
-    "randompage": "Random page",
-    "randompage-nopages": "There are no pages in the following {{PLURAL:$2|namespace|namespaces}}: $1.",
-    "randompage-url": "Special:Random",
-    "randomincategory": "Random page in category",
-    "randomincategory-invalidcategory": "\"$1\" is not a valid category name.",
-    "randomincategory-nopages": "There are no pages in the [[:Category:$1|$1]] category.",
-    "randomincategory-selectcategory": "Get random page from category: $1 $2.",
-    "randomincategory-selectcategory-submit": "Go",
-    "randomredirect": "Random redirect",
-    "randomredirect-nopages": "There are no redirects in the namespace \"$1\".",
-    "statistics": "Statistics",
-    "statistics-summary": "",
-    "statistics-header-pages": "Page statistics",
-    "statistics-header-edits": "Edit statistics",
-    "statistics-header-views": "View statistics",
-    "statistics-header-users": "User statistics",
-    "statistics-header-hooks": "Other statistics",
-    "statistics-articles": "Content pages",
-    "statistics-pages": "Pages",
-    "statistics-pages-desc": "All pages in the wiki, including talk pages, redirects, etc.",
-    "statistics-files": "Uploaded files",
-    "statistics-edits": "Page edits since {{SITENAME}} was set up",
-    "statistics-edits-average": "Average edits per page",
-    "statistics-views-total": "Views total",
-    "statistics-views-total-desc": "Views to non-existing pages and special pages are not included",
-    "statistics-views-peredit": "Views per edit",
-    "statistics-users": "Registered [[Special:ListUsers|users]]",
-    "statistics-users-active": "Active users",
-    "statistics-users-active-desc": "Users who have performed an action in the last {{PLURAL:$1|day|$1 days}}",
-    "statistics-mostpopular": "Most viewed pages",
-    "statistics-footer": "",
-    "pageswithprop": "Pages with a page property",
-    "pageswithprop-summary": "",
-    "pageswithprop-legend": "Pages with a page property",
-    "pageswithprop-text": "This page lists pages that use a particular page property.",
-    "pageswithprop-prop": "Property name:",
-    "pageswithprop-submit": "Go",
-    "pageswithprop-prophidden-long": "long text property value hidden ($1)",
-    "pageswithprop-prophidden-binary": "binary property value hidden ($1)",
-    "doubleredirects": "Double redirects",
-    "doubleredirects-summary": "",
-    "doubleredirectstext": "This page lists pages that redirect to other redirect pages.\nEach row contains links to the first and second redirect, as well as the target of the second redirect, which is usually the \"real\" target page to which the first redirect should point.\n<del>Crossed out</del> entries have been solved.",
-    "double-redirect-fixed-move": "[[$1]] has been moved.\nIt was automatically updated and now it redirects to [[$2]].",
-    "double-redirect-fixed-maintenance": "Automatically fixing double redirect from [[$1]] to [[$2]] in a maintenance job.",
-    "double-redirect-fixer": "Redirect fixer",
-    "brokenredirects": "Broken redirects",
-    "brokenredirects-summary": "",
-    "brokenredirectstext": "The following redirects link to non-existent pages:",
-    "brokenredirects-edit": "edit",
-    "brokenredirects-delete": "delete",
-    "withoutinterwiki": "Pages without language links",
-    "withoutinterwiki-summary": "The following pages do not link to other language versions.",
-    "withoutinterwiki-legend": "Prefix",
-    "withoutinterwiki-submit": "Show",
-    "fewestrevisions": "Pages with the fewest revisions",
-    "fewestrevisions-summary": "",
-    "nbytes": "$1 {{PLURAL:$1|byte|bytes}}",
-    "ncategories": "$1 {{PLURAL:$1|category|categories}}",
-    "ninterwikis": "$1 {{PLURAL:$1|interwiki|interwikis}}",
-    "nlinks": "$1 {{PLURAL:$1|link|links}}",
-    "nmembers": "$1 {{PLURAL:$1|member|members}}",
-    "nmemberschanged": "$1 → $2 {{PLURAL:$2|member|members}}",
-    "nrevisions": "$1 {{PLURAL:$1|revision|revisions}}",
-    "nviews": "$1 {{PLURAL:$1|view|views}}",
-    "nimagelinks": "Used on $1 {{PLURAL:$1|page|pages}}",
-    "ntransclusions": "used on $1 {{PLURAL:$1|page|pages}}",
-    "specialpage-empty": "There are no results for this report.",
-    "lonelypages": "Orphaned pages",
-    "lonelypages-summary": "",
-    "lonelypagestext": "The following pages are not linked from or transcluded into other pages in {{SITENAME}}.",
-    "uncategorizedpages": "Uncategorized pages",
-    "uncategorizedpages-summary": "",
-    "uncategorizedcategories": "Uncategorized categories",
-    "uncategorizedcategories-summary": "",
-    "uncategorizedimages": "Uncategorized files",
-    "uncategorizedimages-summary": "",
-    "uncategorizedtemplates": "Uncategorized templates",
-    "uncategorizedtemplates-summary": "",
-    "unusedcategories": "Unused categories",
-    "unusedcategories-summary": "",
-    "unusedimages": "Unused files",
-    "unusedimages-summary": "",
-    "popularpages": "Popular pages",
-    "popularpages-summary": "",
-    "wantedcategories": "Wanted categories",
-    "wantedcategories-summary": "",
-    "wantedpages": "Wanted pages",
-    "wantedpages-summary": "",
-    "wantedpages-badtitle": "Invalid title in result set: $1",
-    "wantedfiles": "Wanted files",
-    "wantedfiles-summary": "",
-    "wantedfiletext-cat": "The following files are used but do not exist. Files from foreign repositories may be listed despite existing. Any such false positives will be <del>struck out</del>. Additionally, pages that embed files that do not exist are listed in [[:$1]].",
-    "wantedfiletext-nocat": "The following files are used but do not exist. Files from foreign repositories may be listed despite existing. Any such false positives will be <del>struck out</del>.",
-    "wantedtemplates": "Wanted templates",
-    "wantedtemplates-summary": "",
-    "mostlinked": "Most linked-to pages",
-    "mostlinked-summary": "",
-    "mostlinkedcategories": "Most linked-to categories",
-    "mostlinkedcategories-summary": "",
-    "mostlinkedtemplates": "Most linked-to templates",
-    "mostlinkedtemplates-summary": "",
-    "mostcategories": "Pages with the most categories",
-    "mostcategories-summary": "",
-    "mostimages": "Most linked-to files",
-    "mostimages-summary": "",
-    "mostinterwikis": "Pages with the most interwikis",
-    "mostinterwikis-summary": "",
-    "mostrevisions": "Pages with the most revisions",
-    "mostrevisions-summary": "",
-    "prefixindex": "All pages with prefix",
-    "prefixindex-namespace": "All pages with prefix ($1 namespace)",
-    "prefixindex-summary": "",
-    "prefixindex-strip": "Strip prefix in list",
-    "shortpages": "Short pages",
-    "shortpages-summary": "",
-    "longpages": "Long pages",
-    "longpages-summary": "",
-    "deadendpages": "Dead-end pages",
-    "deadendpages-summary": "",
-    "deadendpagestext": "The following pages do not link to other pages in {{SITENAME}}.",
-    "protectedpages": "Protected pages",
-    "protectedpages-indef": "Indefinite protections only",
-    "protectedpages-summary": "This page lists existing pages that are currently protected. For a list of titles that are protected from creation, see [[{{#special:ProtectedTitles}}|{{int:protectedtitles}}]].",
-    "protectedpages-cascade": "Cascading protections only",
-    "protectedpages-noredirect": "Hide redirects",
-    "protectedpagesempty": "No pages are currently protected with these parameters.",
-    "protectedpages-timestamp": "Timestamp",
-    "protectedpages-page": "Page",
-    "protectedpages-expiry": "Expires",
-    "protectedpages-performer": "Protecting user",
-    "protectedpages-params": "Protection parameters",
-    "protectedpages-reason": "Reason",
-    "protectedpages-unknown-timestamp": "Unknown",
-    "protectedpages-unknown-performer": "Unknown user",
-    "protectedpages-unknown-reason": "—",
-    "protectedtitles": "Protected titles",
-    "protectedtitles-summary": "This page lists titles that are currently protected from creation. For a list of existing pages that are protected, see [[{{#special:ProtectedPages}}|{{int:protectedpages}}]].",
-    "protectedtitlesempty": "No titles are currently protected with these parameters.",
-    "listusers": "User list",
-    "listusers-summary": "",
-    "listusers-editsonly": "Show only users with edits",
-    "listusers-creationsort": "Sort by creation date",
-    "listusers-desc": "Sort in descending order",
-    "usereditcount": "$1 {{PLURAL:$1|edit|edits}}",
-    "usercreated": "{{GENDER:$3|Created}} on $1 at $2",
-    "newpages": "New pages",
-    "newpages-summary": "",
-    "newpages-username": "Username:",
-    "ancientpages": "Oldest pages",
-    "ancientpages-summary": "",
-    "move": "Move",
-    "movethispage": "Move this page",
-    "unusedimagestext": "The following files exist but are not embedded in any page.\nPlease note that other web sites may link to a file with a direct URL, and so may still be listed here despite being in active use.",
-    "unusedcategoriestext": "The following category pages exist, although no other page or category makes use of them.",
-    "notargettitle": "No target",
-    "notargettext": "You have not specified a target page or user to perform this function on.",
-    "nopagetitle": "No such target page",
-    "nopagetext": "The target page you have specified does not exist.",
-    "pager-newer-n": "{{PLURAL:$1|newer 1|newer $1}}",
-    "pager-older-n": "{{PLURAL:$1|older 1|older $1}}",
-    "suppress": "Oversight",
-    "querypage-disabled": "This special page is disabled for performance reasons.",
-    "booksources": "Book sources",
-    "booksources-summary": "",
-    "booksources-search-legend": "Search for book sources",
-    "booksources-isbn": "ISBN:",
-    "booksources-go": "Go",
-    "booksources-text": "Below is a list of links to other sites that sell new and used books, and may also have further information about books you are looking for:",
-    "booksources-invalid-isbn": "The given ISBN does not appear to be valid; check for errors copying from the original source.",
-    "rfcurl": "//tools.ietf.org/html/rfc$1",
-    "pubmedurl": "//www.ncbi.nlm.nih.gov/pubmed/$1?dopt=Abstract",
-    "specialloguserlabel": "Performer:",
-    "speciallogtitlelabel": "Target (title or user):",
-    "log": "Logs",
-    "all-logs-page": "All public logs",
-    "alllogstext": "Combined display of all available logs of {{SITENAME}}.\nYou can narrow down the view by selecting a log type, the username (case-sensitive), or the affected page (also case-sensitive).",
-    "logempty": "No matching items in log.",
-    "log-title-wildcard": "Search titles starting with this text",
-    "showhideselectedlogentries": "Change visibility of selected log entries",
-    "allpages": "All pages",
-    "allpages-summary": "",
-    "alphaindexline": "$1 to $2",
-    "nextpage": "Next page ($1)",
-    "prevpage": "Previous page ($1)",
-    "allpagesfrom": "Display pages starting at:",
-    "allpagesto": "Display pages ending at:",
-    "allarticles": "All pages",
-    "allinnamespace": "All pages ($1 namespace)",
-    "allpagessubmit": "Go",
-    "allpagesprefix": "Display pages with prefix:",
-    "allpagesbadtitle": "The given page title was invalid or had an inter-language or inter-wiki prefix.\nIt may contain one or more characters that cannot be used in titles.",
-    "allpages-bad-ns": "{{SITENAME}} does not have namespace \"$1\".",
-    "allpages-hide-redirects": "Hide redirects",
-    "cachedspecial-viewing-cached-ttl": "You are viewing a cached version of this page, which can be up to $1 old.",
-    "cachedspecial-viewing-cached-ts": "You are viewing a cached version of this page, which might not be completely actual.",
-    "cachedspecial-refresh-now": "View latest.",
-    "categories": "Categories",
-    "categories-summary": "",
-    "categoriespagetext": "The following {{PLURAL:$1|category contains|categories contain}} pages or media.\n[[Special:UnusedCategories|Unused categories]] are not shown here.\nAlso see [[Special:WantedCategories|wanted categories]].",
-    "categoriesfrom": "Display categories starting at:",
-    "special-categories-sort-count": "sort by count",
-    "special-categories-sort-abc": "sort alphabetically",
-    "deletedcontributions": "Deleted user contributions",
-    "deletedcontributions-summary": "",
-    "deletedcontributions-title": "Deleted user contributions",
-    "sp-deletedcontributions-contribs": "contributions",
-    "linksearch": "External links search",
-    "linksearch-summary": "",
-    "linksearch-pat": "Search pattern:",
-    "linksearch-ns": "Namespace:",
-    "linksearch-ok": "Search",
-    "linksearch-text": "Wildcards such as \"*.wikipedia.org\" may be used.\nNeeds at least a top-level domain, for example \"*.org\".<br />\nSupported {{PLURAL:$2|protocol|protocols}}: <code>$1</code> (defaults to http:// if no protocol is specified).",
-    "linksearch-line": "$1 is linked from $2",
-    "linksearch-error": "Wildcards may appear only at the start of the hostname.",
-    "listusersfrom": "Display users starting at:",
-    "listusers-submit": "Show",
-    "listusers-noresult": "No user found.",
-    "listusers-blocked": "(blocked)",
-    "activeusers": "Active users list",
-    "activeusers-summary": "",
-    "activeusers-intro": "This is a list of users who had some kind of activity within the last $1 {{PLURAL:$1|day|days}}.",
-    "activeusers-count": "$1 {{PLURAL:$1|action|actions}} in the last {{PLURAL:$3|day|$3 days}}",
-    "activeusers-from": "Display users starting at:",
-    "activeusers-hidebots": "Hide bots",
-    "activeusers-hidesysops": "Hide administrators",
-    "activeusers-noresult": "No users found.",
-    "listgrouprights": "User group rights",
-    "listgrouprights-summary": "The following is a list of user groups defined on this wiki, with their associated access rights.\nThere may be [[{{MediaWiki:Listgrouprights-helppage}}|additional information]] about individual rights.",
-    "listgrouprights-key": "Legend:\n* <span class=\"listgrouprights-granted\">Granted right</span>\n* <span class=\"listgrouprights-revoked\">Revoked right</span>",
-    "listgrouprights-group": "Group",
-    "listgrouprights-rights": "Rights",
-    "listgrouprights-helppage": "Help:Group rights",
-    "listgrouprights-members": "(list of members)",
-    "listgrouprights-right-display": "<span class=\"listgrouprights-granted\">$1 <code>($2)</code></span>",
-    "listgrouprights-right-revoked": "<span class=\"listgrouprights-revoked\">$1 <code>($2)</code></span>",
-    "listgrouprights-addgroup": "Add {{PLURAL:$2|group|groups}}: $1",
-    "listgrouprights-removegroup": "Remove {{PLURAL:$2|group|groups}}: $1",
-    "listgrouprights-addgroup-all": "Add all groups",
-    "listgrouprights-removegroup-all": "Remove all groups",
-    "listgrouprights-addgroup-self": "Add {{PLURAL:$2|group|groups}} to own account: $1",
-    "listgrouprights-removegroup-self": "Remove {{PLURAL:$2|group|groups}} from own account: $1",
-    "listgrouprights-addgroup-self-all": "Add all groups to own account",
-    "listgrouprights-removegroup-self-all": "Remove all groups from own account",
-    "listgrouprights-namespaceprotection-header": "Namespace restrictions",
-    "listgrouprights-namespaceprotection-namespace": "Namespace",
-    "listgrouprights-namespaceprotection-restrictedto": "Right(s) allowing user to edit",
-    "trackingcategories": "Tracking categories",
-    "trackingcategories-summary": "This page lists tracking categories which are automatically populated by the MediaWiki software. Their names can be changed by altering the relevant system messages in the {{ns:8}} namespace.",
-    "trackingcategories-msg": "Tracking category",
-    "trackingcategories-name": "Message name",
-    "trackingcategories-desc": "Category inclusion criteria",
-    "noindex-category-desc": "The page is not indexed by robots because it has the magic word <code><nowiki>__NOINDEX__</nowiki></code> on it and is in a namespace where that flag is allowed.",
-    "index-category-desc": "The page has a <code><nowiki>__INDEX__</nowiki></code> on it (and is in a namespace where that flag is allowed), and hence is indexed by robots where it normally wouldn't be.",
-    "post-expand-template-inclusion-category-desc": "After expanding all the templates, the page size is bigger than <code>$wgMaxArticleSize</code>, so some templates weren't expanded.",
-    "post-expand-template-argument-category-desc": "After expanding a template argument (something in triple braces, like <code>{{{Foo}}}</code>), the page is bigger than <code>$wgMaxArticleSize</code>.",
-    "expensive-parserfunction-category-desc": "Too many expensive parser functions (like <code>#ifexist</code>) included on a page. See [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit].",
-    "broken-file-category-desc": "Category added if the page contains a broken file link (a link to embed a file when the file does not exist).",
-    "hidden-category-category-desc": "This is a category with <code><nowiki>__HIDDENCAT__</nowiki></code> on it, which prevents it from showing up in the category links box on pages, by default.",
-    "trackingcategories-nodesc": "No description available.",
-    "trackingcategories-disabled": "Category is disabled",
-    "mailnologin": "No send address",
-    "mailnologintext": "You must be [[Special:UserLogin|logged in]] and have a valid email address in your [[Special:Preferences|preferences]] to send email to other users.",
-    "emailuser": "Email this user",
-    "emailuser-title-target": "Email this {{GENDER:$1|user}}",
-    "emailuser-title-notarget": "Email user",
-    "emailuser-summary": "",
-    "emailpage": "Email user",
-    "emailpagetext": "You can use the form below to send an email message to this {{GENDER:$1|user}}.\nThe email address you entered in [[Special:Preferences|your user preferences]] will appear as the \"From\" address of the email, so the recipient will be able to reply directly to you.",
-    "defemailsubject": "{{SITENAME}} email from user \"$1\"",
-    "usermaildisabled": "User email disabled",
-    "usermaildisabledtext": "You cannot send email to other users on this wiki",
-    "noemailtitle": "No email address",
-    "noemailtext": "This user has not specified a valid email address.",
-    "nowikiemailtext": "This user has chosen not to receive email from other users.",
-    "emailnotarget": "Non-existent or invalid username for recipient.",
-    "emailtarget": "Enter username of recipient",
-    "emailusername": "Username:",
-    "emailusernamesubmit": "Submit",
-    "email-legend": "Send an email to another {{SITENAME}} user",
-    "emailfrom": "From:",
-    "emailto": "To:",
-    "emailsubject": "Subject:",
-    "emailmessage": "Message:",
-    "emailsend": "Send",
-    "emailccme": "Email me a copy of my message.",
-    "emailccsubject": "Copy of your message to $1: $2",
-    "emailsent": "Email sent",
-    "emailsenttext": "Your email message has been sent.",
-    "emailuserfooter": "This email was sent by $1 to $2 by the \"Email user\" function at {{SITENAME}}.",
-    "usermessage-summary": "Leaving system message.",
-    "usermessage-editor": "System messenger",
-    "usermessage-template": "MediaWiki:UserMessage",
-    "watchlist": "Watchlist",
-    "watchlist-summary": "",
-    "mywatchlist": "Watchlist",
-    "watchlistfor2": "For $1 $2",
-    "nowatchlist": "You have no items on your watchlist.",
-    "watchlistanontext": "Please $1 to view or edit items on your watchlist.",
-    "watchnologin": "Not logged in",
-    "addwatch": "Add to watchlist",
-    "addedwatchtext": "The page \"[[:$1]]\" has been added to your [[Special:Watchlist|watchlist]].\nFuture changes to this page and its associated talk page will be listed there.",
-    "removewatch": "Remove from watchlist",
-    "removedwatchtext": "The page \"[[:$1]]\" has been removed from [[Special:Watchlist|your watchlist]].",
-    "watch": "Watch",
-    "watchthispage": "Watch this page",
-    "unwatch": "Unwatch",
-    "unwatchthispage": "Stop watching",
-    "notanarticle": "Not a content page",
-    "notvisiblerev": "The last revision by a different user has been deleted",
-    "watchlist-details": "{{PLURAL:$1|$1 page|$1 pages}} on your watchlist, not separately counting talk pages.",
-    "wlheader-enotif": "Email notification is enabled.",
-    "wlheader-showupdated": "Pages that have been changed since you last visited them are shown in <strong>bold</strong>.",
-    "wlnote2": "Below are the changes in the last {{PLURAL:$1|hour|<strong>$1</strong> hours}}, as of $2, $3.",
-    "wlshowlast": "Show last $1 hours $2 days $3",
-    "watchlist-options": "Watchlist options",
-    "watching": "Watching...",
-    "unwatching": "Unwatching...",
-    "watcherrortext": "An error occurred while changing your watchlist settings for \"$1\".",
-    "enotif_reset": "Mark all pages visited",
-    "enotif_impersonal_salutation": "{{SITENAME}} user",
-    "enotif_subject_deleted": "{{SITENAME}} page $1 has been {{GENDER:$2|deleted}} by $2",
-    "enotif_subject_created": "{{SITENAME}} page $1 has been {{GENDER:$2|created}} by $2",
-    "enotif_subject_moved": "{{SITENAME}} page $1 has been {{GENDER:$2|moved}} by $2",
-    "enotif_subject_restored": "{{SITENAME}} page $1 has been {{GENDER:$2|restored}} by $2",
-    "enotif_subject_changed": "{{SITENAME}} page $1 has been {{GENDER:$2|changed}} by $2",
-    "enotif_body_intro_deleted": "The {{SITENAME}} page $1 has been {{GENDER:$2|deleted}} on $PAGEEDITDATE by $2, see $3.",
-    "enotif_body_intro_created": "The {{SITENAME}} page $1 has been {{GENDER:$2|created}} on $PAGEEDITDATE by $2, see $3 for the current revision.",
-    "enotif_body_intro_moved": "The {{SITENAME}} page $1 has been {{GENDER:$2|moved}} on $PAGEEDITDATE by $2, see $3 for the current revision.",
-    "enotif_body_intro_restored": "The {{SITENAME}} page $1 has been {{GENDER:$2|restored}} on $PAGEEDITDATE by $2, see $3 for the current revision.",
-    "enotif_body_intro_changed": "The {{SITENAME}} page $1 has been {{GENDER:$2|changed}} on $PAGEEDITDATE by $2, see $3 for the current revision.",
-    "enotif_lastvisited": "See $1 for all changes since your last visit.",
-    "enotif_lastdiff": "See $1 to view this change.",
-    "enotif_anon_editor": "anonymous user $1",
-    "enotif_body": "Dear $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nEditor's summary: $PAGESUMMARY $PAGEMINOREDIT\n\nContact the editor:\nmail: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nThere will be no other notifications in case of further activity unless you visit this page while logged in. You could also reset the notification flags for all your watched pages on your watchlist.\n\nYour friendly {{SITENAME}} notification system\n\n--\nTo change your email notification settings, visit\n{{canonicalurl:{{#special:Preferences}}}}\n\nTo change your watchlist settings, visit\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nTo delete the page from your watchlist, visit\n$UNWATCHURL\n\nFeedback and further assistance:\n$HELPPAGE",
-    "created": "created",
-    "changed": "changed",
-    "deletepage": "Delete page",
-    "confirm": "Confirm",
-    "excontent": "content was: \"$1\"",
-    "excontentauthor": "content was: \"$1\" (and the only contributor was \"[[Special:Contributions/$2|$2]]\")",
-    "exbeforeblank": "content before blanking was: \"$1\"",
-    "delete-confirm": "Delete \"$1\"",
-    "delete-legend": "Delete",
-    "historywarning": "<strong>Warning:</strong> The page you are about to delete has a history with approximately $1 {{PLURAL:$1|revision|revisions}}:",
-    "confirmdeletetext": "You are about to delete a page along with all of its history.\nPlease confirm that you intend to do this, that you understand the consequences, and that you are doing this in accordance with [[{{MediaWiki:Policy-url}}|the policy]].",
-    "actioncomplete": "Action complete",
-    "actionfailed": "Action failed",
-    "deletedtext": "\"$1\" has been deleted.\nSee $2 for a record of recent deletions.",
-    "dellogpage": "Deletion log",
-    "dellogpagetext": "Below is a list of the most recent deletions.",
-    "deletionlog": "deletion log",
-    "reverted": "Reverted to earlier revision",
-    "deletecomment": "Reason:",
-    "deleteotherreason": "Other/additional reason:",
-    "deletereasonotherlist": "Other reason",
-    "deletereason-dropdown": "* Common delete reasons\n** Spam\n** Vandalism\n** Copyright violation\n** Author request\n** Broken redirect",
-    "delete-edit-reasonlist": "Edit deletion reasons",
-    "delete-toobig": "This page has a large edit history, over $1 {{PLURAL:$1|revision|revisions}}.\nDeletion of such pages has been restricted to prevent accidental disruption of {{SITENAME}}.",
-    "delete-warning-toobig": "This page has a large edit history, over $1 {{PLURAL:$1|revision|revisions}}.\nDeleting it may disrupt database operations of {{SITENAME}};\nproceed with caution.",
-    "deleting-backlinks-warning": "'''Warning:''' [[Special:WhatLinksHere/{{FULLPAGENAME}}|Other pages]] link to or transclude the page you are about to delete.",
-    "rollback": "Roll back edits",
-    "rollback_short": "Rollback",
-    "rollbacklink": "rollback",
-    "rollbacklinkcount": "rollback $1 {{PLURAL:$1|edit|edits}}",
-    "rollbacklinkcount-morethan": "rollback more than $1 {{PLURAL:$1|edit|edits}}",
-    "rollbackfailed": "Rollback failed",
-    "cantrollback": "Cannot revert edit;\nlast contributor is only author of this page.",
-    "alreadyrolled": "Cannot rollback last edit of [[:$1]] by [[User:$2|$2]] ([[User talk:$2|talk]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]);\nsomeone else has edited or rolled back the page already.\n\nThe last edit to the page was by [[User:$3|$3]] ([[User talk:$3|talk]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
-    "editcomment": "The edit summary was: \"''$1''\".",
-    "revertpage": "Reverted edits by [[Special:Contributions/$2|$2]] ([[User talk:$2|talk]]) to last revision by [[User:$1|$1]]",
-    "revertpage-nouser": "Reverted edits by a hidden user to last revision by {{GENDER:$1|[[User:$1|$1]]}}",
-    "rollback-success": "Reverted edits by $1;\nchanged back to last revision by $2.",
-    "sessionfailure-title": "Session failure",
-    "sessionfailure": "There seems to be a problem with your login session;\nthis action has been canceled as a precaution against session hijacking.\nGo back to the previous page, reload that page and then try again.",
-    "protectlogpage": "Protection log",
-    "protectlogtext": "Below is a list of changes to page protections.\nSee the [[Special:ProtectedPages|protected pages list]] for the list of currently operational page protections.",
-    "protectedarticle": "protected \"[[$1]]\"",
-    "modifiedarticleprotection": "changed protection level for \"[[$1]]\"",
-    "unprotectedarticle": "removed protection from \"[[$1]]\"",
-    "movedarticleprotection": "moved protection settings from \"[[$2]]\" to \"[[$1]]\"",
-    "protect-title": "Change protection level for \"$1\"",
-    "protect-title-notallowed": "View protection level of \"$1\"",
-    "prot_1movedto2": "[[$1]] moved to [[$2]]",
-    "protect-badnamespace-title": "Non-protectable namespace",
-    "protect-badnamespace-text": "Pages in this namespace cannot be protected.",
-    "protect-norestrictiontypes-text": "This page cannot be protected as there are no restriction types available.",
-    "protect-norestrictiontypes-title": "Non-protectable page",
-    "protect-legend": "Confirm protection",
-    "protectcomment": "Reason:",
-    "protectexpiry": "Expires:",
-    "protect_expiry_invalid": "Expiry time is invalid.",
-    "protect_expiry_old": "Expiry time is in the past.",
-    "protect-unchain-permissions": "Unlock further protect options",
-    "protect-text": "Here you may view and change the protection level for the page <strong>$1</strong>.",
-    "protect-locked-blocked": "You cannot change protection levels while blocked.\nHere are the current settings for the page <strong>$1</strong>:",
-    "protect-locked-dblock": "Protection levels cannot be changed due to an active database lock.\nHere are the current settings for the page <strong>$1</strong>:",
-    "protect-locked-access": "Your account does not have permission to change page protection levels.\nHere are the current settings for the page <strong>$1</strong>:",
-    "protect-cascadeon": "This page is currently protected because it is included in the following {{PLURAL:$1|page, which has|pages, which have}} cascading protection turned on.\nChanges to this page's protection level will not affect the cascading protection.",
-    "protect-default": "Allow all users",
-    "protect-fallback": "Allow only users with \"$1\" permission",
-    "protect-level-autoconfirmed": "Allow only autoconfirmed users",
-    "protect-level-sysop": "Allow only administrators",
-    "protect-summary-desc": "[$1=$2] ($3)",
-    "protect-summary-cascade": "cascading",
-    "protect-expiring": "expires $1 (UTC)",
-    "protect-expiring-local": "expires $1",
-    "protect-expiry-indefinite": "indefinite",
-    "protect-cascade": "Protect pages included in this page (cascading protection)",
-    "protect-cantedit": "You cannot change the protection levels of this page because you do not have permission to edit it.",
-    "protect-othertime": "Other time:",
-    "protect-othertime-op": "other time",
-    "protect-existing-expiry": "Existing expiry time: $3, $2",
-    "protect-otherreason": "Other/additional reason:",
-    "protect-otherreason-op": "Other reason",
-    "protect-dropdown": "*Common protection reasons\n** Excessive vandalism\n** Excessive spamming\n** Counter-productive edit warring\n** High traffic page",
-    "protect-edit-reasonlist": "Edit protection reasons",
-    "protect-expiry-options": "1 hour:1 hour,1 day:1 day,1 week:1 week,2 weeks:2 weeks,1 month:1 month,3 months:3 months,6 months:6 months,1 year:1 year,infinite:infinite",
-    "restriction-type": "Permission:",
-    "restriction-level": "Restriction level:",
-    "minimum-size": "Min size",
-    "maximum-size": "Max size:",
-    "pagesize": "(bytes)",
-    "restriction-edit": "Edit",
-    "restriction-move": "Move",
-    "restriction-create": "Create",
-    "restriction-upload": "Upload",
-    "restriction-level-sysop": "fully protected",
-    "restriction-level-autoconfirmed": "semi protected",
-    "restriction-level-all": "any level",
-    "undelete": "View deleted pages",
-    "undelete-summary": "",
-    "undeletepage": "View and restore deleted pages",
-    "undeletepagetitle": "<strong>The following consists of deleted revisions of [[:$1|$1]]</strong>.",
-    "viewdeletedpage": "View deleted pages",
-    "undeletepagetext": "The following {{PLURAL:$1|page has been deleted but is|$1 pages have been deleted but are}} still in the archive and can be restored.\nThe archive may be periodically cleaned out.",
-    "undelete-fieldset-title": "Restore revisions",
-    "undeleteextrahelp": "To restore the page's entire history, leave all checkboxes deselected and click <strong><em>{{int:undeletebtn}}</em></strong>.\nTo perform a selective restoration, check the boxes corresponding to the revisions to be restored, and click <strong><em>{{int:undeletebtn}}</em></strong>.",
-    "undeleterevisions": "$1 {{PLURAL:$1|revision|revisions}} archived",
-    "undeletehistory": "If you restore the page, all revisions will be restored to the history.\nIf a new page with the same name has been created since the deletion, the restored revisions will appear in the prior history.",
-    "undeleterevdel": "Undeletion will not be performed if it will result in the top page or file revision being partially deleted.\nIn such cases, you must uncheck or unhide the newest deleted revision.",
-    "undeletehistorynoadmin": "This page has been deleted.\nThe reason for deletion is shown in the summary below, along with details of the users who had edited this page before deletion.\nThe actual text of these deleted revisions is only available to administrators.",
-    "undelete-revision": "Deleted revision of $1 (as of $4, at $5) by $3:",
-    "undeleterevision-missing": "Invalid or missing revision.\nYou may have a bad link, or the revision may have been restored or removed from the archive.",
-    "undelete-nodiff": "No previous revision found.",
-    "undeletebtn": "Restore",
-    "undeletelink": "view/restore",
-    "undeleteviewlink": "view",
-    "undeleteinvert": "Invert selection",
-    "undeletecomment": "Reason:",
-    "undeletedrevisions": "{{PLURAL:$1|1 revision|$1 revisions}} restored",
-    "undeletedrevisions-files": "{{PLURAL:$1|1 revision|$1 revisions}} and {{PLURAL:$2|1 file|$2 files}} restored",
-    "undeletedfiles": "{{PLURAL:$1|1 file|$1 files}} restored",
-    "cannotundelete": "Undelete failed:\n$1",
-    "undeletedpage": "<strong>$1 has been restored</strong>\n\nConsult the [[Special:Log/delete|deletion log]] for a record of recent deletions and restorations.",
-    "undelete-header": "See [[Special:Log/delete|the deletion log]] for recently deleted pages.",
-    "undelete-search-title": "Search deleted pages",
-    "undelete-search-box": "Search deleted pages",
-    "undelete-search-prefix": "Show pages starting with:",
-    "undelete-search-submit": "Search",
-    "undelete-no-results": "No matching pages found in the deletion archive.",
-    "undelete-filename-mismatch": "Cannot undelete file revision with timestamp $1: Filename mismatch.",
-    "undelete-bad-store-key": "Cannot undelete file revision with timestamp $1: File was missing before deletion.",
-    "undelete-cleanup-error": "Error deleting unused archive file \"$1\".",
-    "undelete-missing-filearchive": "Unable to restore file archive ID $1 because it is not in the database.\nIt may have already been undeleted.",
-    "undelete-error": "Error undeleting page",
-    "undelete-error-short": "Error undeleting file: $1",
-    "undelete-error-long": "Errors were encountered while undeleting the file:\n\n$1",
-    "undelete-show-file-confirm": "Are you sure you want to view the deleted revision of the file \"<nowiki>$1</nowiki>\" from $2 at $3?",
-    "undelete-show-file-submit": "Yes",
-    "undelete-revision-row": "$1 $2 ($3) $4 . . $5 $6 $7 $8 $9",
-    "namespace": "Namespace:",
-    "invert": "Invert selection",
-    "tooltip-invert": "Check this box to hide changes to pages within the selected namespace (and the associated namespace if checked)",
-    "namespace_association": "Associated namespace",
-    "tooltip-namespace_association": "Check this box to also include the talk or subject namespace associated with the selected namespace",
-    "blanknamespace": "(Main)",
-    "contributions": "{{GENDER:$1|User}} contributions",
-    "contributions-summary": "",
-    "contributions-title": "User contributions for $1",
-    "mycontris": "Contributions",
-    "contribsub2": "For {{GENDER:$3|$1}} ($2)",
-    "contributions-userdoesnotexist": "User account \"$1\" is not registered.",
-    "nocontribs": "No changes were found matching these criteria.",
-    "uctop": "(current)",
-    "month": "From month (and earlier):",
-    "year": "From year (and earlier):",
-    "sp-contributions-newbies": "Show contributions of new accounts only",
-    "sp-contributions-newbies-sub": "For new accounts",
-    "sp-contributions-newbies-title": "User contributions for new accounts",
-    "sp-contributions-blocklog": "block log",
-    "sp-contributions-suppresslog": "suppressed user contributions",
-    "sp-contributions-deleted": "deleted user contributions",
-    "sp-contributions-uploads": "uploads",
-    "sp-contributions-logs": "logs",
-    "sp-contributions-talk": "talk",
-    "sp-contributions-userrights": "user rights management",
-    "sp-contributions-blocked-notice": "This user is currently blocked.\nThe latest block log entry is provided below for reference:",
-    "sp-contributions-blocked-notice-anon": "This IP address is currently blocked.\nThe latest block log entry is provided below for reference:",
-    "sp-contributions-search": "Search for contributions",
-    "sp-contributions-username": "IP address or username:",
-    "sp-contributions-toponly": "Only show edits that are latest revisions",
-    "sp-contributions-newonly": "Only show edits that are page creations",
-    "sp-contributions-submit": "Search",
-    "sp-contributions-explain": "",
-    "sp-contributions-footer": "-",
-    "sp-contributions-footer-anon": "-",
-    "sp-contributions-footer-newbies": "-",
-    "whatlinkshere": "What links here",
-    "whatlinkshere-title": "Pages that link to \"$1\"",
-    "whatlinkshere-summary": "",
-    "whatlinkshere-page": "Page:",
-    "linkshere": "The following pages link to <strong>[[:$1]]</strong>:",
-    "nolinkshere": "No pages link to <strong>[[:$1]]</strong>.",
-    "nolinkshere-ns": "No pages link to <strong>[[:$1]]</strong> in the chosen namespace.",
-    "isredirect": "redirect page",
-    "istemplate": "transclusion",
-    "isimage": "file link",
-    "whatlinkshere-prev": "{{PLURAL:$1|previous|previous $1}}",
-    "whatlinkshere-next": "{{PLURAL:$1|next|next $1}}",
-    "whatlinkshere-links": "← links",
-    "whatlinkshere-hideredirs": "$1 redirects",
-    "whatlinkshere-hidetrans": "$1 transclusions",
-    "whatlinkshere-hidelinks": "$1 links",
-    "whatlinkshere-hideimages": "$1 file links",
-    "whatlinkshere-filters": "Filters",
-    "autoblockid": "Autoblock #$1",
-    "block": "Block user",
-    "unblock": "Unblock user",
-    "unblock-summary": "",
-    "blockip": "Block user",
-    "blockip-legend": "Block user",
-    "blockiptext": "Use the form below to block write access from a specific IP address or username.\nThis should be done only to prevent vandalism, and in accordance with [[{{MediaWiki:Policy-url}}|policy]].\nFill in a specific reason below (for example, citing particular pages that were vandalized).",
-    "ipaddressorusername": "IP address or username:",
-    "ipbexpiry": "Expiry:",
-    "ipbreason": "Reason:",
-    "ipbreason-dropdown": "*Common block reasons\n** Inserting false information\n** Removing content from pages\n** Spamming links to external sites\n** Inserting nonsense/gibberish into pages\n** Intimidating behavior/harassment\n** Abusing multiple accounts\n** Unacceptable username",
-    "ipb-hardblock": "Prevent logged-in users from editing from this IP address",
-    "ipbcreateaccount": "Prevent account creation",
-    "ipbemailban": "Prevent user from sending email",
-    "ipbenableautoblock": "Automatically block the last IP address used by this user, and any subsequent IP addresses they try to edit from",
-    "ipbsubmit": "Block this user",
-    "ipbother": "Other time:",
-    "ipboptions": "2 hours:2 hours,1 day:1 day,3 days:3 days,1 week:1 week,2 weeks:2 weeks,1 month:1 month,3 months:3 months,6 months:6 months,1 year:1 year,indefinite:infinite",
-    "ipbhidename": "Hide username from edits and lists",
-    "ipbwatchuser": "Watch this user's user and talk pages",
-    "ipb-disableusertalk": "Prevent this user from editing their own talk page while blocked",
-    "ipb-change-block": "Re-block the user with these settings",
-    "ipb-confirm": "Confirm block",
-    "badipaddress": "Invalid IP address",
-    "blockipsuccesssub": "Block succeeded",
-    "blockipsuccesstext": "[[Special:Contributions/$1|$1]] has been blocked.<br />\nSee the [[Special:BlockList|block list]] to review blocks.",
-    "ipb-blockingself": "You are about to block yourself! Are you sure you want to do that?",
-    "ipb-confirmhideuser": "You are about to block a user with \"hide user\" enabled. This will suppress the user's name in all lists and log entries. Are you sure you want to do that?",
-    "ipb-confirmaction": "If you are sure you really want to do it, please check the \"{{int:ipb-confirm}}\" field at the bottom.",
-    "ipb-edit-dropdown": "Edit block reasons",
-    "ipb-unblock-addr": "Unblock $1",
-    "ipb-unblock": "Unblock a username or IP address",
-    "ipb-blocklist": "View existing blocks",
-    "ipb-blocklist-contribs": "Contributions for $1",
-    "unblockip": "Unblock user",
-    "unblockiptext": "Use the form below to restore write access to a previously blocked IP address or username.",
-    "ipusubmit": "Remove this block",
-    "unblocked": "[[User:$1|$1]] has been unblocked.",
-    "unblocked-range": "$1 has been unblocked.",
-    "unblocked-id": "Block $1 has been removed.",
-    "blocklist": "Blocked users",
-    "ipblocklist": "Blocked users",
-    "ipblocklist-legend": "Find a blocked user",
-    "blocklist-userblocks": "Hide account blocks",
-    "blocklist-tempblocks": "Hide temporary blocks",
-    "blocklist-addressblocks": "Hide single IP blocks",
-    "blocklist-rangeblocks": "Hide range blocks",
-    "blocklist-timestamp": "Timestamp",
-    "blocklist-target": "Target",
-    "blocklist-expiry": "Expires",
-    "blocklist-by": "Blocking admin",
-    "blocklist-params": "Block parameters",
-    "blocklist-reason": "Reason",
-    "blocklist-summary": "",
-    "ipblocklist-submit": "Search",
-    "ipblocklist-localblock": "Local block",
-    "ipblocklist-otherblocks": "Other {{PLURAL:$1|block|blocks}}",
-    "infiniteblock": "infinite",
-    "expiringblock": "expires on $1 at $2",
-    "anononlyblock": "anon. only",
-    "noautoblockblock": "autoblock disabled",
-    "createaccountblock": "account creation disabled",
-    "emailblock": "email disabled",
-    "blocklist-nousertalk": "cannot edit own talk page",
-    "ipblocklist-empty": "The block list is empty.",
-    "ipblocklist-no-results": "The requested IP address or username is not blocked.",
-    "blocklink": "block",
-    "unblocklink": "unblock",
-    "change-blocklink": "change block",
-    "contribslink": "contribs",
-    "emaillink": "send email",
-    "autoblocker": "Autoblocked because your IP address has been recently used by \"[[User:$1|$1]]\".\nThe reason given for $1's block is \"$2\"",
-    "blocklogpage": "Block log",
-    "blocklog-showlog": "This user has been blocked previously.\nThe block log is provided below for reference:",
-    "blocklog-showsuppresslog": "This user has been blocked and hidden previously.\nThe suppress log is provided below for reference:",
-    "blocklogentry": "blocked [[$1]] with an expiry time of $2 $3",
-    "reblock-logentry": "changed block settings for [[$1]] with an expiry time of $2 $3",
-    "blocklogtext": "This is a log of user blocking and unblocking actions.\nAutomatically blocked IP addresses are not listed.\nSee the [[Special:BlockList|block list]] for the list of currently operational bans and blocks.",
-    "unblocklogentry": "unblocked $1",
-    "block-log-flags-anononly": "anonymous users only",
-    "block-log-flags-nocreate": "account creation disabled",
-    "block-log-flags-noautoblock": "autoblock disabled",
-    "block-log-flags-noemail": "email disabled",
-    "block-log-flags-nousertalk": "cannot edit own talk page",
-    "block-log-flags-angry-autoblock": "enhanced autoblock enabled",
-    "block-log-flags-hiddenname": "username hidden",
-    "range_block_disabled": "The administrator ability to create range blocks is disabled.",
-    "ipb_expiry_invalid": "Expiry time invalid.",
-    "ipb_expiry_temp": "Hidden username blocks must be permanent.",
-    "ipb_hide_invalid": "Unable to suppress this account; it has more than {{PLURAL:$1|one edit|$1 edits}}.",
-    "ipb_already_blocked": "\"$1\" is already blocked.",
-    "ipb-needreblock": "$1 is already blocked. Do you want to change the settings?",
-    "ipb-otherblocks-header": "Other {{PLURAL:$1|block|blocks}}",
-    "unblock-hideuser": "You cannot unblock this user, as their username has been hidden.",
-    "ipb_cant_unblock": "Error: Block ID $1 not found. It may have been unblocked already.",
-    "ipb_blocked_as_range": "Error: The IP address $1 is not blocked directly and cannot be unblocked.\nIt is, however, blocked as part of the range $2, which can be unblocked.",
-    "ip_range_invalid": "Invalid IP range.",
-    "ip_range_toolarge": "Range blocks larger than /$1 are not allowed.",
-    "proxyblocker": "Proxy blocker",
-    "proxyblockreason": "Your IP address has been blocked because it is an open proxy.\nPlease contact your Internet service provider or technical support of your organization and inform them of this serious security problem.",
-    "sorbs": "DNSBL",
-    "sorbsreason": "Your IP address is listed as an open proxy in the DNSBL used by {{SITENAME}}.",
-    "sorbs_create_account_reason": "Your IP address is listed as an open proxy in the DNSBL used by {{SITENAME}}.\nYou cannot create an account.",
-    "xffblockreason": "An IP address present in the X-Forwarded-For header, either yours or that of a proxy server you are using, has been blocked. The original block reason was: $1",
-    "cant-see-hidden-user": "The user you are trying to block has already been blocked and hidden.\nSince you do not have the hideuser right, you cannot see or edit the user's block.",
-    "ipbblocked": "You cannot block or unblock other users because you are yourself blocked.",
-    "ipbnounblockself": "You are not allowed to unblock yourself.",
-    "ipb-default-expiry": "",
-    "lockdb": "Lock database",
-    "unlockdb": "Unlock database",
-    "lockdbtext": "Locking the database will suspend the ability of all users to edit pages, change their preferences, edit their watchlists, and other things requiring changes in the database.\nPlease confirm that this is what you intend to do, and that you will unlock the database when your maintenance is done.",
-    "unlockdbtext": "Unlocking the database will restore the ability of all users to edit pages, change their preferences, edit their watchlists, and other things requiring changes in the database.\nPlease confirm that this is what you intend to do.",
-    "lockconfirm": "Yes, I really want to lock the database.",
-    "unlockconfirm": "Yes, I really want to unlock the database.",
-    "lockbtn": "Lock database",
-    "unlockbtn": "Unlock database",
-    "locknoconfirm": "You did not check the confirmation box.",
-    "lockdbsuccesssub": "Database lock succeeded",
-    "unlockdbsuccesssub": "Database lock removed",
-    "lockdbsuccesstext": "The database has been locked.<br />\nRemember to [[Special:UnlockDB|remove the lock]] after your maintenance is complete.",
-    "unlockdbsuccesstext": "The database has been unlocked.",
-    "lockfilenotwritable": "The database lock file is not writable.\nTo lock or unlock the database, this needs to be writable by the web server.",
-    "databasenotlocked": "The database is not locked.",
-    "lockedbyandtime": "(by {{GENDER:$1|$1}} on $2 at $3)",
-    "move-page": "Move $1",
-    "movepage-summary": "",
-    "move-page-legend": "Move page",
-    "movepagetext": "Using the form below will rename a page, moving all of its history to the new name.\nThe old title will become a redirect page to the new title.\nYou can update redirects that point to the original title automatically.\nIf you choose not to, be sure to check for [[Special:DoubleRedirects|double]] or [[Special:BrokenRedirects|broken redirects]].\nYou are responsible for making sure that links continue to point where they are supposed to go.\n\nNote that the page will <strong>not</strong> be moved if there is already a page at the new title, unless the latter is a redirect and has no past edit history.\nThis means that you can rename a page back to where it was renamed from if you make a mistake, and you cannot overwrite an existing page.\n\n<strong>Warning!</strong>\nThis can be a drastic and unexpected change for a popular page;\nplease be sure you understand the consequences of this before proceeding.",
-    "movepagetext-noredirectfixer": "Using the form below will rename a page, moving all of its history to the new name.\nThe old title will become a redirect page to the new title.\nBe sure to check for [[Special:DoubleRedirects|double]] or [[Special:BrokenRedirects|broken redirects]].\nYou are responsible for making sure that links continue to point where they are supposed to go.\n\nNote that the page will <strong>not</strong> be moved if there is already a page at the new title, unless it is a redirect and has no past edit history.\nThis means that you can rename a page back to where it was renamed from if you make a mistake, and you cannot overwrite an existing page.\n\n<strong>Warning!</strong>\nThis can be a drastic and unexpected change for a popular page;\nplease be sure you understand the consequences of this before proceeding.",
-    "movepagetalktext": "The associated talk page will be automatically moved along with it <strong>unless:</strong>\n*A non-empty talk page already exists under the new name, or\n*You uncheck the box below.\n\nIn those cases, you will have to move or merge the page manually if desired.",
-    "movearticle": "Move page:",
-    "moveuserpage-warning": "<strong>Warning:</strong> You are about to move a user page. Please note that only the page will be moved and the user will <em>not</em> be renamed.",
-    "movenologintext": "You must be a registered user and [[Special:UserLogin|logged in]] to move a page.",
-    "movenotallowed": "You do not have permission to move pages.",
-    "movenotallowedfile": "You do not have permission to move files.",
-    "cant-move-user-page": "You do not have permission to move user pages (apart from subpages).",
-    "cant-move-to-user-page": "You do not have permission to move a page to a user page (except to a user subpage).",
-    "newtitle": "To new title:",
-    "move-watch": "Watch source page and target page",
-    "movepagebtn": "Move page",
-    "pagemovedsub": "Move succeeded",
-    "movepage-moved": "<strong>\"$1\" has been moved to \"$2\"</strong>",
-    "movepage-moved-redirect": "A redirect has been created.",
-    "movepage-moved-noredirect": "The creation of a redirect has been suppressed.",
-    "articleexists": "A page of that name already exists, or the name you have chosen is not valid.\nPlease choose another name.",
-    "cantmove-titleprotected": "You cannot move a page to this location because the new title has been protected from creation",
-    "movetalk": "Move associated talk page",
-    "move-subpages": "Move subpages (up to $1)",
-    "move-talk-subpages": "Move subpages of talk page (up to $1)",
-    "movepage-page-exists": "The page $1 already exists and cannot be automatically overwritten.",
-    "movepage-page-moved": "The page $1 has been moved to $2.",
-    "movepage-page-unmoved": "The page $1 could not be moved to $2.",
-    "movepage-max-pages": "The maximum of $1 {{PLURAL:$1|page|pages}} has been moved and no more will be moved automatically.",
-    "movelogpage": "Move log",
-    "movelogpagetext": "Below is a list of all page moves.",
-    "movesubpage": "{{PLURAL:$1|Subpage|Subpages}}",
-    "movesubpagetext": "This page has $1 {{PLURAL:$1|subpage|subpages}} shown below.",
-    "movenosubpage": "This page has no subpages.",
-    "movereason": "Reason:",
-    "move-redirect-text": "",
-    "revertmove": "revert",
-    "delete_and_move": "Delete and move",
-    "delete_and_move_text": "== Deletion required ==\nThe destination page \"[[:$1]]\" already exists.\nDo you want to delete it to make way for the move?",
-    "delete_and_move_confirm": "Yes, delete the page",
-    "delete_and_move_reason": "Deleted to make way for move from \"[[$1]]\"",
-    "selfmove": "Source and destination titles are the same;\ncannot move a page over itself.",
-    "immobile-source-namespace": "Cannot move pages in namespace \"$1\"",
-    "immobile-target-namespace": "Cannot move pages into namespace \"$1\"",
-    "immobile-target-namespace-iw": "Interwiki link is not a valid target for page move.",
-    "immobile-source-page": "This page is not movable.",
-    "immobile-target-page": "Cannot move to that destination title.",
-    "bad-target-model": "The desired destination uses a different content model. Cannot convert from $1 to $2.",
-    "imagenocrossnamespace": "Cannot move file to non-file namespace",
-    "nonfile-cannot-move-to-file": "Cannot move non-file to file namespace",
-    "imagetypemismatch": "The new file extension does not match its type",
-    "imageinvalidfilename": "The target filename is invalid",
-    "fix-double-redirects": "Update any redirects that point to the original title",
-    "move-leave-redirect": "Leave a redirect behind",
-    "protectedpagemovewarning": "<strong>Warning:</strong> This page has been protected so that only users with administrator privileges can move it.\nThe latest log entry is provided below for reference:",
-    "semiprotectedpagemovewarning": "<strong>Note:</strong> This page has been protected so that only registered users can move it.\nThe latest log entry is provided below for reference:",
-    "move-over-sharedrepo": "== File exists ==\n[[:$1]] exists on a shared repository. Moving a file to this title will override the shared file.",
-    "file-exists-sharedrepo": "The filename chosen is already in use on a shared repository.\nPlease choose another name.",
-    "export": "Export pages",
-    "export-summary": "",
-    "exporttext": "You can export the text and editing history of a particular page or set of pages wrapped in some XML.\nThis can be imported into another wiki using MediaWiki via the [[Special:Import|import page]].\n\nTo export pages, enter the titles in the text box below, one title per line, and select whether you want the current revision as well as all old revisions, with the page history lines, or the current revision with the info about the last edit.\n\nIn the latter case you can also use a link, for example [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] for the page \"[[{{MediaWiki:Mainpage}}]]\".",
-    "exportall": "Export all pages",
-    "exportcuronly": "Include only the current revision, not the full history",
-    "exportnohistory": "----\n<strong>Note:</strong> Exporting the full history of pages through this form has been disabled due to performance reasons.",
-    "exportlistauthors": "Include a full list of contributors for each page",
-    "export-submit": "Export",
-    "export-addcattext": "Add pages from category:",
-    "export-addcat": "Add",
-    "export-addnstext": "Add pages from namespace:",
-    "export-addns": "Add",
-    "export-download": "Save as file",
-    "export-templates": "Include templates",
-    "export-pagelinks": "Include linked pages to a depth of:",
-    "allmessages": "System messages",
-    "allmessagesname": "Name",
-    "allmessagesdefault": "Default message text",
-    "allmessagescurrent": "Current message text",
-    "allmessagestext": "This is a list of system messages available in the MediaWiki namespace.\nPlease visit [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki Localisation] and [//translatewiki.net translatewiki.net] if you wish to contribute to the generic MediaWiki localisation.",
-    "allmessagesnotsupportedDB": "This page cannot be used because <strong>$wgUseDatabaseMessages</strong> has been disabled.",
-    "allmessages-filter-legend": "Filter",
-    "allmessages-filter": "Filter by customization state:",
-    "allmessages-filter-unmodified": "Unmodified",
-    "allmessages-filter-all": "All",
-    "allmessages-filter-modified": "Modified",
-    "allmessages-prefix": "Filter by prefix:",
-    "allmessages-language": "Language:",
-    "allmessages-filter-submit": "Go",
-    "allmessages-filter-translate": "Translate",
-    "thumbnail-more": "Enlarge",
-    "filemissing": "File missing",
-    "thumbnail_error": "Error creating thumbnail: $1",
-    "thumbnail_error_remote": "Error message from $1:\n$2",
-    "djvu_page_error": "DjVu page out of range",
-    "djvu_no_xml": "Unable to fetch XML for DjVu file",
-    "thumbnail-temp-create": "Unable to create temporary thumbnail file",
-    "thumbnail-dest-create": "Unable to save thumbnail to destination",
-    "thumbnail_invalid_params": "Invalid thumbnail parameters",
-    "thumbnail_dest_directory": "Unable to create destination directory",
-    "thumbnail_image-type": "Image type not supported",
-    "thumbnail_gd-library": "Incomplete GD library configuration: Missing function $1",
-    "thumbnail_image-missing": "File seems to be missing: $1",
-    "thumbnail_image-failure-limit": "There have been too many recent failed attempts ($1 or more) to render this thumbnail. Please try again later.",
-    "import": "Import pages",
-    "import-summary": "",
-    "importinterwiki": "Transwiki import",
-    "import-interwiki-text": "Select a wiki and page title to import.\nRevision dates and editors' names will be preserved.\nAll transwiki import actions are logged at the [[Special:Log/import|import log]].",
-    "import-interwiki-source": "Source wiki/page:",
-    "import-interwiki-history": "Copy all history revisions for this page",
-    "import-interwiki-templates": "Include all templates",
-    "import-interwiki-submit": "Import",
-    "import-interwiki-namespace": "Destination namespace:",
-    "import-interwiki-rootpage": "Destination root page (optional):",
-    "import-upload-filename": "Filename:",
-    "import-comment": "Comment:",
-    "importtext": "Please export the file from the source wiki using the [[Special:Export|export utility]].\nSave it to your computer and upload it here.",
-    "importstart": "Importing pages...",
-    "import-revision-count": "$1 {{PLURAL:$1|revision|revisions}}",
-    "importnopages": "No pages to import.",
-    "imported-log-entries": "Imported $1 {{PLURAL:$1|log entry|log entries}}.",
-    "importfailed": "Import failed: <nowiki>$1</nowiki>",
-    "importunknownsource": "Unknown import source type",
-    "importcantopen": "Could not open import file",
-    "importbadinterwiki": "Bad interwiki link",
-    "importsuccess": "Import finished!",
-    "importnosources": "No transwiki import sources have been defined and direct history uploads are disabled.",
-    "importnofile": "No import file was uploaded.",
-    "importuploaderrorsize": "Upload of import file failed.\nThe file is bigger than the allowed upload size.",
-    "importuploaderrorpartial": "Upload of import file failed.\nThe file was only partially uploaded.",
-    "importuploaderrortemp": "Upload of import file failed.\nA temporary folder is missing.",
-    "import-parse-failure": "XML import parse failure",
-    "import-noarticle": "No page to import!",
-    "import-nonewrevisions": "No revisions imported (all were either already present, or skipped due to errors).",
-    "xml-error-string": "$1 at line $2, col $3 (byte $4): $5",
-    "import-upload": "Upload XML data",
-    "import-token-mismatch": "Loss of session data.\nPlease try again.",
-    "import-invalid-interwiki": "Cannot import from the specified wiki.",
-    "import-error-edit": "Page \"$1\" is not imported because you are not allowed to edit it.",
-    "import-error-create": "Page \"$1\" is not imported because you are not allowed to create it.",
-    "import-error-interwiki": "Page \"$1\" is not imported because its name is reserved for external linking (interwiki).",
-    "import-error-special": "Page \"$1\" is not imported because it belongs to a special namespace that does not allow pages.",
-    "import-error-invalid": "Page \"$1\" is not imported because its name is invalid.",
-    "import-error-unserialize": "Revision $2 of page \"$1\" could not be unserialized. The revision was reported to use content model $3 serialized as $4.",
-    "import-error-bad-location": "Revision $2 using content model $3 cannot be stored on \"$1\" on this wiki, since that model is not supported on that page.",
-    "import-options-wrong": "Wrong {{PLURAL:$2|option|options}}: <nowiki>$1</nowiki>",
-    "import-rootpage-invalid": "Given root page is an invalid title.",
-    "import-rootpage-nosubpage": "Namespace \"$1\" of the root page does not allow subpages.",
-    "importlogpage": "Import log",
-    "importlogpagetext": "Administrative imports of pages with edit history from other wikis.",
-    "import-logentry-upload": "imported [[$1]] by file upload",
-    "import-logentry-upload-detail": "$1 {{PLURAL:$1|revision|revisions}}",
-    "import-logentry-interwiki": "transwikied $1",
-    "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|revision|revisions}} from $2",
-    "javascripttest": "JavaScript testing",
-    "javascripttest-backlink": "< $1",
-    "javascripttest-title": "Running $1 tests",
-    "javascripttest-pagetext-noframework": "This page is reserved for running JavaScript tests.",
-    "javascripttest-pagetext-unknownframework": "Unknown testing framework \"$1\".",
-    "javascripttest-pagetext-frameworks": "Please choose one of the following testing frameworks: $1",
-    "javascripttest-pagetext-skins": "Choose a skin to run the tests with:",
-    "javascripttest-qunit-name": "QUnit",
-    "javascripttest-qunit-intro": "See [$1 testing documentation] on mediawiki.org.",
-    "javascripttest-qunit-heading": "MediaWiki JavaScript QUnit test suite",
-    "accesskey-pt-userpage": ".",
-    "accesskey-pt-anonuserpage": ".",
-    "accesskey-pt-mytalk": "n",
-    "accesskey-pt-anontalk": "n",
-    "accesskey-pt-preferences": "",
-    "accesskey-pt-watchlist": "l",
-    "accesskey-pt-mycontris": "y",
-    "accesskey-pt-login": "o",
-    "accesskey-pt-logout": "",
-    "accesskey-ca-talk": "t",
-    "accesskey-ca-edit": "e",
-    "accesskey-ca-addsection": "+",
-    "accesskey-ca-viewsource": "e",
-    "accesskey-ca-history": "h",
-    "accesskey-ca-protect": "=",
-    "accesskey-ca-unprotect": "=",
-    "accesskey-ca-delete": "d",
-    "accesskey-ca-undelete": "d",
-    "accesskey-ca-move": "m",
-    "accesskey-ca-watch": "w",
-    "accesskey-ca-unwatch": "w",
-    "accesskey-search": "f",
-    "accesskey-search-go": "",
-    "accesskey-search-fulltext": "",
-    "accesskey-p-logo": "",
-    "accesskey-n-mainpage": "z",
-    "accesskey-n-mainpage-description": "z",
-    "accesskey-n-portal": "",
-    "accesskey-n-currentevents": "",
-    "accesskey-n-recentchanges": "r",
-    "accesskey-n-randompage": "x",
-    "accesskey-n-help": "",
-    "accesskey-t-whatlinkshere": "j",
-    "accesskey-t-recentchangeslinked": "k",
-    "accesskey-feed-rss": "",
-    "accesskey-feed-atom": "",
-    "accesskey-t-contributions": "",
-    "accesskey-t-emailuser": "",
-    "accesskey-t-permalink": "",
-    "accesskey-t-print": "p",
-    "accesskey-t-upload": "u",
-    "accesskey-t-specialpages": "q",
-    "accesskey-ca-nstab-main": "c",
-    "accesskey-ca-nstab-user": "c",
-    "accesskey-ca-nstab-media": "c",
-    "accesskey-ca-nstab-special": "",
-    "accesskey-ca-nstab-project": "a",
-    "accesskey-ca-nstab-image": "c",
-    "accesskey-ca-nstab-mediawiki": "c",
-    "accesskey-ca-nstab-template": "c",
-    "accesskey-ca-nstab-help": "c",
-    "accesskey-ca-nstab-category": "c",
-    "accesskey-minoredit": "i",
-    "accesskey-save": "s",
-    "accesskey-preview": "p",
-    "accesskey-diff": "v",
-    "accesskey-compareselectedversions": "v",
-    "accesskey-watch": "w",
-    "accesskey-upload": "s",
-    "accesskey-preferences-save": "s",
-    "accesskey-summary": "b",
-    "accesskey-userrights-set": "s",
-    "accesskey-blockip-block": "s",
-    "accesskey-export": "s",
-    "accesskey-import": "s",
-    "accesskey-watchlistedit-normal-submit": "s",
-    "accesskey-watchlistedit-raw-submit": "s",
-    "tooltip-pt-userpage": "Your user page",
-    "tooltip-pt-anonuserpage": "The user page for the IP address you are editing as",
-    "tooltip-pt-mytalk": "Your talk page",
-    "tooltip-pt-anontalk": "Discussion about edits from this IP address",
-    "tooltip-pt-preferences": "Your preferences",
-    "tooltip-pt-watchlist": "A list of pages you are monitoring for changes",
-    "tooltip-pt-mycontris": "A list of your contributions",
-    "tooltip-pt-login": "You are encouraged to log in; however, it is not mandatory",
-    "tooltip-pt-logout": "Log out",
-    "tooltip-ca-talk": "Discussion about the content page",
-    "tooltip-ca-edit": "You can edit this page. Please use the preview button before saving",
-    "tooltip-ca-addsection": "Start a new section",
-    "tooltip-ca-viewsource": "This page is protected.\nYou can view its source",
-    "tooltip-ca-history": "Past revisions of this page",
-    "tooltip-ca-protect": "Protect this page",
-    "tooltip-ca-unprotect": "Change protection of this page",
-    "tooltip-ca-delete": "Delete this page",
-    "tooltip-ca-undelete": "Restore the edits done to this page before it was deleted",
-    "tooltip-ca-move": "Move this page",
-    "tooltip-ca-watch": "Add this page to your watchlist",
-    "tooltip-ca-unwatch": "Remove this page from your watchlist",
-    "tooltip-search": "Search {{SITENAME}}",
-    "tooltip-search-go": "Go to a page with this exact name if exists",
-    "tooltip-search-fulltext": "Search the pages for this text",
-    "tooltip-p-logo": "Visit the main page",
-    "tooltip-n-mainpage": "Visit the main page",
-    "tooltip-n-mainpage-description": "Visit the main page",
-    "tooltip-n-portal": "About the project, what you can do, where to find things",
-    "tooltip-n-currentevents": "Find background information on current events",
-    "tooltip-n-recentchanges": "A list of recent changes in the wiki",
-    "tooltip-n-randompage": "Load a random page",
-    "tooltip-n-help": "The place to find out",
-    "tooltip-t-whatlinkshere": "A list of all wiki pages that link here",
-    "tooltip-t-recentchangeslinked": "Recent changes in pages linked from this page",
-    "tooltip-feed-rss": "RSS feed for this page",
-    "tooltip-feed-atom": "Atom feed for this page",
-    "tooltip-t-contributions": "A list of contributions of this user",
-    "tooltip-t-emailuser": "Send an email to this user",
-    "tooltip-t-upload": "Upload files",
-    "tooltip-t-specialpages": "A list of all special pages",
-    "tooltip-t-print": "Printable version of this page",
-    "tooltip-t-permalink": "Permanent link to this revision of the page",
-    "tooltip-ca-nstab-main": "View the content page",
-    "tooltip-ca-nstab-user": "View the user page",
-    "tooltip-ca-nstab-media": "View the media page",
-    "tooltip-ca-nstab-special": "This is a special page, you cannot edit the page itself",
-    "tooltip-ca-nstab-project": "View the project page",
-    "tooltip-ca-nstab-image": "View the file page",
-    "tooltip-ca-nstab-mediawiki": "View the system message",
-    "tooltip-ca-nstab-template": "View the template",
-    "tooltip-ca-nstab-help": "View the help page",
-    "tooltip-ca-nstab-category": "View the category page",
-    "tooltip-minoredit": "Mark this as a minor edit",
-    "tooltip-save": "Save your changes",
-    "tooltip-preview": "Preview your changes, please use this before saving!",
-    "tooltip-diff": "Show which changes you made to the text",
-    "tooltip-compareselectedversions": "See the differences between the two selected revisions of this page",
-    "tooltip-watch": "Add this page to your watchlist",
-    "tooltip-watchlistedit-normal-submit": "Remove titles",
-    "tooltip-watchlistedit-raw-submit": "Update watchlist",
-    "tooltip-recreate": "Recreate the page even though it has been deleted",
-    "tooltip-upload": "Start upload",
-    "tooltip-rollback": "\"Rollback\" reverts edit(s) to this page of the last contributor in one click",
-    "tooltip-undo": "\"Undo\" reverts this edit and opens the edit form in preview mode. It allows adding a reason in the summary.",
-    "tooltip-preferences-save": "Save preferences",
-    "tooltip-summary": "Enter a short summary",
-    "interlanguage-link-title": "$1 – $2",
-    "interlanguage-link-title-langonly": "$1",
-    "common.css": "/* CSS placed here will be applied to all skins */",
-    "cologneblue.css": "/* CSS placed here will affect users of the Cologne Blue skin */",
-    "monobook.css": "/* CSS placed here will affect users of the MonoBook skin */",
-    "modern.css": "/* CSS placed here will affect users of the Modern skin */",
-    "vector.css": "/* CSS placed here will affect users of the Vector skin */",
-    "print.css": "/* CSS placed here will affect the print output */",
-    "noscript.css": "/* CSS placed here will affect users with JavaScript disabled */",
-    "group-autoconfirmed.css": "/* CSS placed here will affect autoconfirmed users only */",
-    "group-user.css": "/* CSS placed here will affect registered users only */",
-    "group-bot.css": "/* CSS placed here will affect bots only */",
-    "group-sysop.css": "/* CSS placed here will affect sysops only */",
-    "group-bureaucrat.css": "/* CSS placed here will affect bureaucrats only */",
-    "common.js": "/* Any JavaScript here will be loaded for all users on every page load. */",
-    "cologneblue.js": "/* Any JavaScript here will be loaded for users using the Cologne Blue skin */",
-    "monobook.js": "/* Any JavaScript here will be loaded for users using the MonoBook skin */",
-    "modern.js": "/* Any JavaScript here will be loaded for users using the Modern skin */",
-    "vector.js": "/* Any JavaScript here will be loaded for users using the Vector skin */",
-    "group-autoconfirmed.js": "/* Any JavaScript here will be loaded for autoconfirmed users only */",
-    "group-user.js": "/* Any JavaScript here will be loaded for registered users only */",
-    "group-bot.js": "/* Any JavaScript here will be loaded for bots only */",
-    "group-sysop.js": "/* Any JavaScript here will be loaded for sysops only */",
-    "group-bureaucrat.js": "/* Any JavaScript here will be loaded for bureaucrats only */",
-    "anonymous": "Anonymous {{PLURAL:$1|user|users}} of {{SITENAME}}",
-    "siteuser": "{{SITENAME}} user $1",
-    "anonuser": "{{SITENAME}} anonymous user $1",
-    "lastmodifiedatby": "This page was last modified $2, $1 by $3.",
-    "othercontribs": "Based on work by $1.",
-    "others": "others",
-    "siteusers": "{{SITENAME}} {{PLURAL:$2|user|users}} $1",
-    "anonusers": "{{SITENAME}} anonymous {{PLURAL:$2|user|users}} $1",
-    "creditspage": "Page credits",
-    "nocredits": "There is no credits info available for this page.",
-    "spamprotectiontitle": "Spam protection filter",
-    "spamprotectiontext": "The text you wanted to save was blocked by the spam filter.\nThis is probably caused by a link to a blacklisted external site.",
-    "spamprotectionmatch": "The following text is what triggered our spam filter: $1",
-    "spambot_username": "MediaWiki spam cleanup",
-    "spam_reverting": "Reverting to last revision not containing links to $1",
-    "spam_blanking": "All revisions contained links to $1, blanking",
-    "spam_deleting": "All revisions contained links to $1, deleting",
-    "simpleantispam-label": "Anti-spam check.\nDo <strong>NOT</strong> fill this in!",
-    "pageinfo-header": "-",
-    "pageinfo-title": "Information for \"$1\"",
-    "pageinfo-not-current": "Sorry, it's impossible to provide this information for old revisions.",
-    "pageinfo-header-basic": "Basic information",
-    "pageinfo-header-edits": "Edit history",
-    "pageinfo-header-restrictions": "Page protection",
-    "pageinfo-header-properties": "Page properties",
-    "pageinfo-display-title": "Display title",
-    "pageinfo-default-sort": "Default sort key",
-    "pageinfo-length": "Page length (in bytes)",
-    "pageinfo-article-id": "Page ID",
-    "pageinfo-language": "Page content language",
-    "pageinfo-content-model": "Page content model",
-    "pageinfo-robot-policy": "Indexing by robots",
-    "pageinfo-robot-index": "Allowed",
-    "pageinfo-robot-noindex": "Disallowed",
-    "pageinfo-views": "Number of views",
-    "pageinfo-watchers": "Number of page watchers",
-    "pageinfo-few-watchers": "Fewer than $1 {{PLURAL:$1|watcher|watchers}}",
-    "pageinfo-redirects-name": "Number of redirects to this page",
-    "pageinfo-redirects-value": "$1",
-    "pageinfo-subpages-name": "Number of subpages of this page",
-    "pageinfo-subpages-value": "$1 ($2 {{PLURAL:$2|redirect|redirects}}; $3 {{PLURAL:$3|non-redirect|non-redirects}})",
-    "pageinfo-firstuser": "Page creator",
-    "pageinfo-firsttime": "Date of page creation",
-    "pageinfo-lastuser": "Latest editor",
-    "pageinfo-lasttime": "Date of latest edit",
-    "pageinfo-edits": "Total number of edits",
-    "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-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)",
-    "pageinfo-transclusions": "{{PLURAL:$1|Page|Pages}} transcluded on ($1)",
-    "pageinfo-footer": "-",
-    "pageinfo-toolboxlink": "Page information",
-    "pageinfo-redirectsto": "Redirects to",
-    "pageinfo-redirectsto-info": "info",
-    "pageinfo-contentpage": "Counted as a content page",
-    "pageinfo-contentpage-yes": "Yes",
-    "pageinfo-protect-cascading": "Protections are cascading from here",
-    "pageinfo-protect-cascading-yes": "Yes",
-    "pageinfo-protect-cascading-from": "Protections are cascading from",
-    "pageinfo-category-info": "Category information",
-    "pageinfo-category-pages": "Number of pages",
-    "pageinfo-category-subcats": "Number of subcategories",
-    "pageinfo-category-files": "Number of files",
-    "skinname-cologneblue": "Cologne Blue",
-    "skinname-monobook": "MonoBook",
-    "skinname-modern": "Modern",
-    "skinname-vector": "Vector",
-    "markaspatrolleddiff": "Mark as patrolled",
-    "markaspatrolledlink": "[$1]",
-    "markaspatrolledtext": "Mark this page as patrolled",
-    "markedaspatrolled": "Marked as patrolled",
-    "markedaspatrolledtext": "The selected revision of [[:$1]] has been marked as patrolled.",
-    "rcpatroldisabled": "Recent changes patrol disabled",
-    "rcpatroldisabledtext": "The recent changes patrol feature is currently disabled.",
-    "markedaspatrollederror": "Cannot mark as patrolled",
-    "markedaspatrollederrortext": "You need to specify a revision to mark as patrolled.",
-    "markedaspatrollederror-noautopatrol": "You are not allowed to mark your own changes as patrolled.",
-    "markedaspatrollednotify": "This change to $1 has been marked as patrolled.",
-    "markedaspatrollederrornotify": "Marking as patrolled failed.",
-    "patrol-log-page": "Patrol log",
-    "patrol-log-header": "This is a log of patrolled revisions.",
-    "log-show-hide-patrol": "$1 patrol log",
-    "deletedrevision": "Deleted old revision $1",
-    "filedeleteerror-short": "Error deleting file: $1",
-    "filedeleteerror-long": "Errors were encountered while deleting the file:\n\n$1",
-    "filedelete-missing": "The file \"$1\" cannot be deleted because it does not exist.",
-    "filedelete-old-unregistered": "The specified file revision \"$1\" is not in the database.",
-    "filedelete-current-unregistered": "The specified file \"$1\" is not in the database.",
-    "filedelete-archive-read-only": "The archive directory \"$1\" is not writable by the webserver.",
-    "previousdiff": "← Older edit",
-    "nextdiff": "Newer edit →",
-    "mediawarning": "<strong>Warning:</strong> This file type may contain malicious code.\nBy executing it, your system may be compromised.",
-    "imagemaxsize": "Image size limit:<br /><em>(for file description pages)</em>",
-    "thumbsize": "Thumbnail size:",
-    "widthheight": "$1 × $2",
-    "widthheightpage": "$1 × $2, $3 {{PLURAL:$3|page|pages}}",
-    "file-info": "file size: $1, MIME type: $2",
-    "file-info-size": "$1 × $2 pixels, file size: $3, MIME type: $4",
-    "file-info-size-pages": "$1 × $2 pixels, file size: $3, MIME type: $4, $5 {{PLURAL:$5|page|pages}}",
-    "file-nohires": "No higher resolution available.",
-    "svg-long-desc": "SVG file, nominally $1 × $2 pixels, file size: $3",
-    "svg-long-desc-animated": "Animated SVG file, nominally $1 × $2 pixels, file size: $3",
-    "svg-long-error": "Invalid SVG file: $1",
-    "show-big-image": "Original file",
-    "show-big-image-preview": "Size of this preview: $1.",
-    "show-big-image-other": "Other {{PLURAL:$2|resolution|resolutions}}: $1.",
-    "show-big-image-size": "$1 × $2 pixels",
-    "file-info-gif-looped": "looped",
-    "file-info-gif-frames": "$1 {{PLURAL:$1|frame|frames}}",
-    "file-info-png-looped": "looped",
-    "file-info-png-repeat": "played $1 {{PLURAL:$1|time|times}}",
-    "file-info-png-frames": "$1 {{PLURAL:$1|frame|frames}}",
-    "file-no-thumb-animation": "<strong>Note: Due to technical limitations, thumbnails of this file will not be animated.</strong>",
-    "file-no-thumb-animation-gif": "<strong>Note: Due to technical limitations, thumbnails of high resolution GIF images such as this one will not be animated.</strong>",
-    "newimages": "Gallery of new files",
-    "newimagestext": "-",
-    "imagelisttext": "Below is a list of <strong>$1</strong> {{PLURAL:$1|file|files}} sorted $2.",
-    "newimages-summary": "This special page shows the last uploaded files.",
-    "newimages-legend": "Filter",
-    "newimages-label": "Filename (or a part of it):",
-    "showhidebots": "($1 bots)",
-    "noimages": "Nothing to see.",
-    "ilsubmit": "Search",
-    "bydate": "by date",
-    "sp-newimages-showfrom": "Show new files starting from $2, $1",
-    "video-dims": "$1, $2 × $3",
-    "seconds-abbrev": "$1 s",
-    "minutes-abbrev": "$1 min",
-    "hours-abbrev": "$1 h",
-    "days-abbrev": "$1 d",
-    "seconds": "{{PLURAL:$1|$1 second|$1 seconds}}",
-    "minutes": "{{PLURAL:$1|$1 minute|$1 minutes}}",
-    "hours": "{{PLURAL:$1|$1 hour|$1 hours}}",
-    "days": "{{PLURAL:$1|$1 day|$1 days}}",
-    "weeks": "{{PLURAL:$1|$1 week|$1 weeks}}",
-    "months": "{{PLURAL:$1|$1 month|$1 months}}",
-    "years": "{{PLURAL:$1|$1 year|$1 years}}",
-    "ago": "$1 ago",
-    "just-now": "just now",
-    "hours-ago": "$1 {{PLURAL:$1|hour|hours}} ago",
-    "minutes-ago": "$1 {{PLURAL:$1|minute|minutes}} ago",
-    "seconds-ago": "$1 {{PLURAL:$1|second|seconds}} ago",
-    "monday-at": "Monday at $1",
-    "tuesday-at": "Tuesday at $1",
-    "wednesday-at": "Wednesday at $1",
-    "thursday-at": "Thursday at $1",
-    "friday-at": "Friday at $1",
-    "saturday-at": "Saturday at $1",
-    "sunday-at": "Sunday at $1",
-    "today-at": "$1",
-    "yesterday-at": "Yesterday at $1",
-    "bad_image_list": "The format is as follows:\n\nOnly list items (lines starting with *) are considered.\nThe first link on a line must be a link to a bad file.\nAny subsequent links on the same line are considered to be exceptions, i.e. pages where the file may occur inline.",
-    "variantname-zh-hans": "hans",
-    "variantname-zh-hant": "hant",
-    "variantname-zh-cn": "cn",
-    "variantname-zh-tw": "tw",
-    "variantname-zh-hk": "hk",
-    "variantname-zh-mo": "mo",
-    "variantname-zh-sg": "sg",
-    "variantname-zh-my": "my",
-    "variantname-zh": "zh",
-    "variantname-gan-hans": "hans",
-    "variantname-gan-hant": "hant",
-    "variantname-gan": "gan",
-    "variantname-sr-ec": "sr-ec",
-    "variantname-sr-el": "sr-el",
-    "variantname-sr": "sr",
-    "variantname-kk-kz": "kk-kz",
-    "variantname-kk-tr": "kk-tr",
-    "variantname-kk-cn": "kk-cn",
-    "variantname-kk-cyrl": "kk-cyrl",
-    "variantname-kk-latn": "kk-latn",
-    "variantname-kk-arab": "kk-arab",
-    "variantname-kk": "kk",
-    "variantname-ku-arab": "ku-Arab",
-    "variantname-ku-latn": "ku-Latn",
-    "variantname-ku": "ku",
-    "variantname-tg-cyrl": "tg-Cyrl",
-    "variantname-tg-latn": "tg-Latn",
-    "variantname-tg": "tg",
-    "variantname-ike-cans": "ike-Cans",
-    "variantname-ike-latn": "ike-Latn",
-    "variantname-iu": "iu",
-    "variantname-shi-tfng": "shi-Tfng",
-    "variantname-shi-latn": "shi-Latn",
-    "variantname-shi": "shi",
-    "metadata": "Metadata",
-    "metadata-help": "This file contains additional information, probably added from the digital camera or scanner used to create or digitize it.\nIf the file has been modified from its original state, some details may not fully reflect the modified file.",
-    "metadata-expand": "Show extended details",
-    "metadata-collapse": "Hide extended details",
-    "metadata-fields": "Image metadata fields listed in this message will be included on image page display when the metadata table is collapsed.\nOthers will be hidden by default.\n* make\n* model\n* datetimeoriginal\n* exposuretime\n* fnumber\n* isospeedratings\n* focallength\n* artist\n* copyright\n* imagedescription\n* gpslatitude\n* gpslongitude\n* gpsaltitude",
-    "metadata-langitem": "<strong>$2:</strong> $1",
-    "metadata-langitem-default": "$1",
-    "exif-imagewidth": "Width",
-    "exif-imagelength": "Height",
-    "exif-bitspersample": "Bits per component",
-    "exif-compression": "Compression scheme",
-    "exif-photometricinterpretation": "Pixel composition",
-    "exif-orientation": "Orientation",
-    "exif-samplesperpixel": "Number of components",
-    "exif-planarconfiguration": "Data arrangement",
-    "exif-ycbcrsubsampling": "Subsampling ratio of Y to C",
-    "exif-ycbcrpositioning": "Y and C positioning",
-    "exif-xresolution": "Horizontal resolution",
-    "exif-yresolution": "Vertical resolution",
-    "exif-stripoffsets": "Image data location",
-    "exif-rowsperstrip": "Number of rows per strip",
-    "exif-stripbytecounts": "Bytes per compressed strip",
-    "exif-jpeginterchangeformat": "Offset to JPEG SOI",
-    "exif-jpeginterchangeformatlength": "Bytes of JPEG data",
-    "exif-whitepoint": "White point chromaticity",
-    "exif-primarychromaticities": "Chromaticities of primarities",
-    "exif-ycbcrcoefficients": "Color space transformation matrix coefficients",
-    "exif-referenceblackwhite": "Pair of black and white reference values",
-    "exif-datetime": "File change date and time",
-    "exif-imagedescription": "Image title",
-    "exif-make": "Camera manufacturer",
-    "exif-model": "Camera model",
-    "exif-software": "Software used",
-    "exif-artist": "Author",
-    "exif-copyright": "Copyright holder",
-    "exif-exifversion": "Exif version",
-    "exif-flashpixversion": "Supported Flashpix version",
-    "exif-colorspace": "Color space",
-    "exif-componentsconfiguration": "Meaning of each component",
-    "exif-compressedbitsperpixel": "Image compression mode",
-    "exif-pixelydimension": "Image width",
-    "exif-pixelxdimension": "Image height",
-    "exif-usercomment": "User comments",
-    "exif-relatedsoundfile": "Related audio file",
-    "exif-datetimeoriginal": "Date and time of data generation",
-    "exif-datetimedigitized": "Date and time of digitizing",
-    "exif-subsectime": "DateTime subseconds",
-    "exif-subsectimeoriginal": "DateTimeOriginal subseconds",
-    "exif-subsectimedigitized": "DateTimeDigitized subseconds",
-    "exif-exposuretime": "Exposure time",
-    "exif-exposuretime-format": "$1 sec ($2)",
-    "exif-fnumber": "F Number",
-    "exif-fnumber-format": "f/$1",
-    "exif-exposureprogram": "Exposure Program",
-    "exif-spectralsensitivity": "Spectral sensitivity",
-    "exif-isospeedratings": "ISO speed rating",
-    "exif-shutterspeedvalue": "APEX shutter speed",
-    "exif-aperturevalue": "APEX aperture",
-    "exif-brightnessvalue": "APEX brightness",
-    "exif-exposurebiasvalue": "APEX exposure bias",
-    "exif-maxaperturevalue": "Maximum land aperture",
-    "exif-subjectdistance": "Subject distance",
-    "exif-meteringmode": "Metering mode",
-    "exif-lightsource": "Light source",
-    "exif-flash": "Flash",
-    "exif-focallength": "Lens focal length",
-    "exif-focallength-format": "$1 mm",
-    "exif-subjectarea": "Subject area",
-    "exif-flashenergy": "Flash energy",
-    "exif-focalplanexresolution": "Focal plane X resolution",
-    "exif-focalplaneyresolution": "Focal plane Y resolution",
-    "exif-focalplaneresolutionunit": "Focal plane resolution unit",
-    "exif-subjectlocation": "Subject location",
-    "exif-exposureindex": "Exposure index",
-    "exif-sensingmethod": "Sensing method",
-    "exif-filesource": "File source",
-    "exif-scenetype": "Scene type",
-    "exif-customrendered": "Custom image processing",
-    "exif-exposuremode": "Exposure mode",
-    "exif-whitebalance": "White balance",
-    "exif-digitalzoomratio": "Digital zoom ratio",
-    "exif-focallengthin35mmfilm": "Focal length in 35 mm film",
-    "exif-scenecapturetype": "Scene capture type",
-    "exif-gaincontrol": "Scene control",
-    "exif-contrast": "Contrast",
-    "exif-saturation": "Saturation",
-    "exif-sharpness": "Sharpness",
-    "exif-devicesettingdescription": "Device settings description",
-    "exif-subjectdistancerange": "Subject distance range",
-    "exif-imageuniqueid": "Unique image ID",
-    "exif-gpsversionid": "GPS tag version",
-    "exif-gpslatituderef": "North or south latitude",
-    "exif-gpslatitude": "Latitude",
-    "exif-gpslongituderef": "East or west longitude",
-    "exif-gpslongitude": "Longitude",
-    "exif-gpsaltituderef": "Altitude reference",
-    "exif-gpsaltitude": "Altitude",
-    "exif-gpstimestamp": "GPS time (atomic clock)",
-    "exif-gpssatellites": "Satellites used for measurement",
-    "exif-gpsstatus": "Receiver status",
-    "exif-gpsmeasuremode": "Measurement mode",
-    "exif-gpsdop": "Measurement precision",
-    "exif-gpsspeedref": "Speed unit",
-    "exif-gpsspeed": "Speed of GPS receiver",
-    "exif-gpstrackref": "Reference for direction of movement",
-    "exif-gpstrack": "Direction of movement",
-    "exif-gpsimgdirectionref": "Reference for direction of image",
-    "exif-gpsimgdirection": "Direction of image",
-    "exif-gpsmapdatum": "Geodetic survey data used",
-    "exif-gpsdestlatituderef": "Reference for latitude of destination",
-    "exif-gpsdestlatitude": "Latitude destination",
-    "exif-gpsdestlongituderef": "Reference for longitude of destination",
-    "exif-gpsdestlongitude": "Longitude of destination",
-    "exif-gpsdestbearingref": "Reference for bearing of destination",
-    "exif-gpsdestbearing": "Bearing of destination",
-    "exif-gpsdestdistanceref": "Reference for distance to destination",
-    "exif-gpsdestdistance": "Distance to destination",
-    "exif-gpsprocessingmethod": "Name of GPS processing method",
-    "exif-gpsareainformation": "Name of GPS area",
-    "exif-gpsdatestamp": "GPS date",
-    "exif-gpsdifferential": "GPS differential correction",
-    "exif-coordinate-format": "$1° $2′ $3″ $4",
-    "exif-jpegfilecomment": "JPEG file comment",
-    "exif-keywords": "Keywords",
-    "exif-worldregioncreated": "World region that the picture was taken in",
-    "exif-countrycreated": "Country that the picture was taken in",
-    "exif-countrycodecreated": "Code for the country that the picture was taken in",
-    "exif-provinceorstatecreated": "Province or state that the picture was taken in",
-    "exif-citycreated": "City that the picture was taken in",
-    "exif-sublocationcreated": "Sublocation of the city that the picture was taken in",
-    "exif-worldregiondest": "World region shown",
-    "exif-countrydest": "Country shown",
-    "exif-countrycodedest": "Code for country shown",
-    "exif-provinceorstatedest": "Province or state shown",
-    "exif-citydest": "City shown",
-    "exif-sublocationdest": "Sublocation of city shown",
-    "exif-objectname": "Short title",
-    "exif-specialinstructions": "Special instructions",
-    "exif-headline": "Headline",
-    "exif-credit": "Credit/Provider",
-    "exif-source": "Source",
-    "exif-editstatus": "Editorial status of image",
-    "exif-urgency": "Urgency",
-    "exif-fixtureidentifier": "Fixture name",
-    "exif-locationdest": "Location depicted",
-    "exif-locationdestcode": "Code of location depicted",
-    "exif-objectcycle": "Time of day that media is intended for",
-    "exif-contact": "Contact information",
-    "exif-writer": "Writer",
-    "exif-languagecode": "Language",
-    "exif-iimversion": "IIM version",
-    "exif-iimcategory": "Category",
-    "exif-iimsupplementalcategory": "Supplemental categories",
-    "exif-datetimeexpires": "Do not use after",
-    "exif-datetimereleased": "Released on",
-    "exif-originaltransmissionref": "Original transmission location code",
-    "exif-identifier": "Identifier",
-    "exif-lens": "Lens used",
-    "exif-serialnumber": "Serial number of camera",
-    "exif-cameraownername": "Owner of camera",
-    "exif-label": "Label",
-    "exif-datetimemetadata": "Date metadata was last modified",
-    "exif-nickname": "Informal name of image",
-    "exif-rating": "Rating (out of 5)",
-    "exif-rightscertificate": "Rights management certificate",
-    "exif-copyrighted": "Copyright status",
-    "exif-copyrightowner": "Copyright owner",
-    "exif-usageterms": "Usage terms",
-    "exif-webstatement": "Online copyright statement",
-    "exif-originaldocumentid": "Unique ID of original document",
-    "exif-licenseurl": "URL for copyright license",
-    "exif-morepermissionsurl": "Alternative licensing information",
-    "exif-attributionurl": "When re-using this work, please link to",
-    "exif-preferredattributionname": "When re-using this work, please credit",
-    "exif-pngfilecomment": "PNG file comment",
-    "exif-disclaimer": "Disclaimer",
-    "exif-contentwarning": "Content warning",
-    "exif-giffilecomment": "GIF file comment",
-    "exif-intellectualgenre": "Type of item",
-    "exif-subjectnewscode": "Subject code",
-    "exif-scenecode": "IPTC scene code",
-    "exif-event": "Event depicted",
-    "exif-organisationinimage": "Organization depicted",
-    "exif-personinimage": "Person depicted",
-    "exif-originalimageheight": "Height of image before it was cropped",
-    "exif-originalimagewidth": "Width of image before it was cropped",
-    "exif-make-value": "$1",
-    "exif-model-value": "$1",
-    "exif-software-value": "$1",
-    "exif-software-version-value": "$1 (Version $2)",
-    "exif-contact-value": "$1\n\n$2\n<div class=\"adr\">\n$3\n\n$4, $5, $6 $7\n</div>\n$8",
-    "exif-subjectnewscode-value": "$2 ($1)",
-    "exif-compression-1": "Uncompressed",
-    "exif-compression-2": "CCITT Group 3 1-Dimensional Modified Huffman run length encoding",
-    "exif-compression-3": "CCITT Group 3 fax encoding",
-    "exif-compression-4": "CCITT Group 4 fax encoding",
-    "exif-compression-5": "LZW",
-    "exif-compression-6": "JPEG (old)",
-    "exif-compression-7": "JPEG",
-    "exif-compression-8": "Deflate (Adobe)",
-    "exif-compression-32773": "PackBits (Macintosh RLE)",
-    "exif-compression-32946": "Deflate (PKZIP)",
-    "exif-compression-34712": "JPEG2000",
-    "exif-copyrighted-true": "Copyrighted",
-    "exif-copyrighted-false": "Copyright status not set",
-    "exif-photometricinterpretation-2": "RGB",
-    "exif-photometricinterpretation-6": "YCbCr",
-    "exif-unknowndate": "Unknown date",
-    "exif-orientation-1": "Normal",
-    "exif-orientation-2": "Flipped horizontally",
-    "exif-orientation-3": "Rotated 180°",
-    "exif-orientation-4": "Flipped vertically",
-    "exif-orientation-5": "Rotated 90° CCW and flipped vertically",
-    "exif-orientation-6": "Rotated 90° CCW",
-    "exif-orientation-7": "Rotated 90° CW and flipped vertically",
-    "exif-orientation-8": "Rotated 90° CW",
-    "exif-planarconfiguration-1": "chunky format",
-    "exif-planarconfiguration-2": "planar format",
-    "exif-xyresolution-i": "$1 dpi",
-    "exif-xyresolution-c": "$1 dpc",
-    "exif-colorspace-1": "sRGB",
-    "exif-colorspace-65535": "Uncalibrated",
-    "exif-componentsconfiguration-0": "does not exist",
-    "exif-componentsconfiguration-1": "Y",
-    "exif-componentsconfiguration-2": "Cb",
-    "exif-componentsconfiguration-3": "Cr",
-    "exif-componentsconfiguration-4": "R",
-    "exif-componentsconfiguration-5": "G",
-    "exif-componentsconfiguration-6": "B",
-    "exif-exposureprogram-0": "Not defined",
-    "exif-exposureprogram-1": "Manual",
-    "exif-exposureprogram-2": "Normal program",
-    "exif-exposureprogram-3": "Aperture priority",
-    "exif-exposureprogram-4": "Shutter priority",
-    "exif-exposureprogram-5": "Creative program (biased toward depth of field)",
-    "exif-exposureprogram-6": "Action program (biased toward fast shutter speed)",
-    "exif-exposureprogram-7": "Portrait mode (for closeup photos with the background out of focus)",
-    "exif-exposureprogram-8": "Landscape mode (for landscape photos with the background in focus)",
-    "exif-subjectdistance-value": "$1 meters",
-    "exif-meteringmode-0": "Unknown",
-    "exif-meteringmode-1": "Average",
-    "exif-meteringmode-2": "Center weighted average",
-    "exif-meteringmode-3": "Spot",
-    "exif-meteringmode-4": "Multi-Spot",
-    "exif-meteringmode-5": "Pattern",
-    "exif-meteringmode-6": "Partial",
-    "exif-meteringmode-255": "Other",
-    "exif-lightsource-0": "Unknown",
-    "exif-lightsource-1": "Daylight",
-    "exif-lightsource-2": "Fluorescent",
-    "exif-lightsource-3": "Tungsten (incandescent light)",
-    "exif-lightsource-4": "Flash",
-    "exif-lightsource-9": "Fine weather",
-    "exif-lightsource-10": "Cloudy weather",
-    "exif-lightsource-11": "Shade",
-    "exif-lightsource-12": "Daylight fluorescent (D 5700 – 7100K)",
-    "exif-lightsource-13": "Day white fluorescent (N 4600 – 5400K)",
-    "exif-lightsource-14": "Cool white fluorescent (W 3900 – 4500K)",
-    "exif-lightsource-15": "White fluorescent (WW 3200 – 3700K)",
-    "exif-lightsource-17": "Standard light A",
-    "exif-lightsource-18": "Standard light B",
-    "exif-lightsource-19": "Standard light C",
-    "exif-lightsource-20": "D55",
-    "exif-lightsource-21": "D65",
-    "exif-lightsource-22": "D75",
-    "exif-lightsource-23": "D50",
-    "exif-lightsource-24": "ISO studio tungsten",
-    "exif-lightsource-255": "Other light source",
-    "exif-flash-fired-0": "Flash did not fire",
-    "exif-flash-fired-1": "Flash fired",
-    "exif-flash-return-0": "no strobe return detection function",
-    "exif-flash-return-2": "strobe return light not detected",
-    "exif-flash-return-3": "strobe return light detected",
-    "exif-flash-mode-1": "compulsory flash firing",
-    "exif-flash-mode-2": "compulsory flash suppression",
-    "exif-flash-mode-3": "auto mode",
-    "exif-flash-function-1": "No flash function",
-    "exif-flash-redeye-1": "red-eye reduction mode",
-    "exif-focalplaneresolutionunit-2": "inches",
-    "exif-sensingmethod-1": "Undefined",
-    "exif-sensingmethod-2": "One-chip color area sensor",
-    "exif-sensingmethod-3": "Two-chip color area sensor",
-    "exif-sensingmethod-4": "Three-chip color area sensor",
-    "exif-sensingmethod-5": "Color sequential area sensor",
-    "exif-sensingmethod-7": "Trilinear sensor",
-    "exif-sensingmethod-8": "Color sequential linear sensor",
-    "exif-filesource-3": "Digital still camera",
-    "exif-scenetype-1": "A directly photographed image",
-    "exif-customrendered-0": "Normal process",
-    "exif-customrendered-1": "Custom process",
-    "exif-exposuremode-0": "Auto exposure",
-    "exif-exposuremode-1": "Manual exposure",
-    "exif-exposuremode-2": "Auto bracket",
-    "exif-whitebalance-0": "Auto white balance",
-    "exif-whitebalance-1": "Manual white balance",
-    "exif-scenecapturetype-0": "Standard",
-    "exif-scenecapturetype-1": "Landscape",
-    "exif-scenecapturetype-2": "Portrait",
-    "exif-scenecapturetype-3": "Night scene",
-    "exif-gaincontrol-0": "None",
-    "exif-gaincontrol-1": "Low gain up",
-    "exif-gaincontrol-2": "High gain up",
-    "exif-gaincontrol-3": "Low gain down",
-    "exif-gaincontrol-4": "High gain down",
-    "exif-contrast-0": "Normal",
-    "exif-contrast-1": "Soft",
-    "exif-contrast-2": "Hard",
-    "exif-saturation-0": "Normal",
-    "exif-saturation-1": "Low saturation",
-    "exif-saturation-2": "High saturation",
-    "exif-sharpness-0": "Normal",
-    "exif-sharpness-1": "Soft",
-    "exif-sharpness-2": "Hard",
-    "exif-subjectdistancerange-0": "Unknown",
-    "exif-subjectdistancerange-1": "Macro",
-    "exif-subjectdistancerange-2": "Close view",
-    "exif-subjectdistancerange-3": "Distant view",
-    "exif-gpslatitude-n": "North latitude",
-    "exif-gpslatitude-s": "South latitude",
-    "exif-gpslongitude-e": "East longitude",
-    "exif-gpslongitude-w": "West longitude",
-    "exif-gpsaltitude-above-sealevel": "$1 {{PLURAL:$1|meter|meters}} above sea level",
-    "exif-gpsaltitude-below-sealevel": "$1 {{PLURAL:$1|meter|meters}} below sea level",
-    "exif-gpsstatus-a": "Measurement in progress",
-    "exif-gpsstatus-v": "Measurement interoperability",
-    "exif-gpsmeasuremode-2": "2-dimensional measurement",
-    "exif-gpsmeasuremode-3": "3-dimensional measurement",
-    "exif-gpsspeed-k": "Kilometers per hour",
-    "exif-gpsspeed-m": "Miles per hour",
-    "exif-gpsspeed-n": "Knots",
-    "exif-gpsdestdistance-k": "Kilometers",
-    "exif-gpsdestdistance-m": "Miles",
-    "exif-gpsdestdistance-n": "Nautical miles",
-    "exif-gpsdop-excellent": "Excellent ($1)",
-    "exif-gpsdop-good": "Good ($1)",
-    "exif-gpsdop-moderate": "Moderate ($1)",
-    "exif-gpsdop-fair": "Fair ($1)",
-    "exif-gpsdop-poor": "Poor ($1)",
-    "exif-objectcycle-a": "Morning only",
-    "exif-objectcycle-p": "Evening only",
-    "exif-objectcycle-b": "Both morning and evening",
-    "exif-gpsdirection-t": "True direction",
-    "exif-gpsdirection-m": "Magnetic direction",
-    "exif-ycbcrpositioning-1": "Centered",
-    "exif-ycbcrpositioning-2": "Co-sited",
-    "exif-dc-contributor": "Contributors",
-    "exif-dc-coverage": "Spatial or temporal scope of media",
-    "exif-dc-date": "Date(s)",
-    "exif-dc-publisher": "Publisher",
-    "exif-dc-relation": "Related media",
-    "exif-dc-rights": "Rights",
-    "exif-dc-source": "Source media",
-    "exif-dc-type": "Type of media",
-    "exif-rating-rejected": "Rejected",
-    "exif-isospeedratings-overflow": "Greater than 65535",
-    "exif-maxaperturevalue-value": "$1 APEX (f/$2)",
-    "exif-iimcategory-ace": "Arts, culture and entertainment",
-    "exif-iimcategory-clj": "Crime and law",
-    "exif-iimcategory-dis": "Disasters and accidents",
-    "exif-iimcategory-fin": "Economy and business",
-    "exif-iimcategory-edu": "Education",
-    "exif-iimcategory-evn": "Environment",
-    "exif-iimcategory-hth": "Health",
-    "exif-iimcategory-hum": "Human interest",
-    "exif-iimcategory-lab": "Labor",
-    "exif-iimcategory-lif": "Lifestyle and leisure",
-    "exif-iimcategory-pol": "Politics",
-    "exif-iimcategory-rel": "Religion and belief",
-    "exif-iimcategory-sci": "Science and technology",
-    "exif-iimcategory-soi": "Social issues",
-    "exif-iimcategory-spo": "Sports",
-    "exif-iimcategory-war": "War, conflict and unrest",
-    "exif-iimcategory-wea": "Weather",
-    "exif-urgency-normal": "Normal ($1)",
-    "exif-urgency-low": "Low ($1)",
-    "exif-urgency-high": "High ($1)",
-    "exif-urgency-other": "User-defined priority ($1)",
-    "watchlistall2": "all",
-    "namespacesall": "all",
-    "monthsall": "all",
-    "confirmemail": "Confirm email address",
-    "confirmemail_noemail": "You do not have a valid email address set in your [[Special:Preferences|user preferences]].",
-    "confirmemail_text": "{{SITENAME}} requires that you validate your email address before using email features.\nActivate the button below to send a confirmation mail to your address.\nThe mail will include a link containing a code;\nload the link in your browser to confirm that your email address is valid.",
-    "confirmemail_pending": "A confirmation code has already been emailed to you;\nif you recently created your account, you may wish to wait a few minutes for it to arrive before trying to request a new code.",
-    "confirmemail_send": "Mail a confirmation code",
-    "confirmemail_sent": "Confirmation email sent.",
-    "confirmemail_oncreate": "A confirmation code was sent to your email address.\nThis code is not required to log in, but you will need to provide it before enabling any email-based features in the wiki.",
-    "confirmemail_sendfailed": "{{SITENAME}} could not send your confirmation mail.\nPlease check your email address for invalid characters.\n\nMailer returned: $1",
-    "confirmemail_invalid": "Invalid confirmation code.\nThe code may have expired.",
-    "confirmemail_needlogin": "Please $1 to confirm your email address.",
-    "confirmemail_success": "Your email address has been confirmed.\nYou may now [[Special:UserLogin|log in]] and enjoy the wiki.",
-    "confirmemail_loggedin": "Your email address has now been confirmed.",
-    "confirmemail_subject": "{{SITENAME}} email address confirmation",
-    "confirmemail_body": "Someone, probably you, from IP address $1,\nhas registered an account \"$2\" with this email address on {{SITENAME}}.\n\nTo confirm that this account really does belong to you and activate\nemail features on {{SITENAME}}, open this link in your browser:\n\n$3\n\nIf you did *not* register the account, follow this link\nto cancel the email address confirmation:\n\n$5\n\nThis confirmation code will expire at $4.",
-    "confirmemail_body_changed": "Someone, probably you, from IP address $1,\nhas changed the email address of the account \"$2\" to this address on {{SITENAME}}.\n\nTo confirm that this account really does belong to you and reactivate\nemail features on {{SITENAME}}, open this link in your browser:\n\n$3\n\nIf the account does *not* belong to you, follow this link\nto cancel the email address confirmation:\n\n$5\n\nThis confirmation code will expire at $4.",
-    "confirmemail_body_set": "Someone, probably you, from IP address $1,\nhas set the email address of the account \"$2\" to this address on {{SITENAME}}.\n\nTo confirm that this account really does belong to you and activate\nemail features on {{SITENAME}}, open this link in your browser:\n\n$3\n\nIf the account does *not* belong to you, follow this link\nto cancel the email address confirmation:\n\n$5\n\nThis confirmation code will expire at $4.",
-    "confirmemail_invalidated": "Email address confirmation canceled",
-    "invalidateemail": "Cancel email confirmation",
-    "scarytranscludedisabled": "[Interwiki transcluding is disabled]",
-    "scarytranscludefailed": "[Template fetch failed for $1]",
-    "scarytranscludefailed-httpstatus": "[Template fetch failed for $1: HTTP $2]",
-    "scarytranscludetoolong": "[URL is too long]",
-    "deletedwhileediting": "<strong>Warning:</strong> This page was deleted after you started editing!",
-    "confirmrecreate": "User [[User:$1|$1]] ([[User talk:$1|talk]]) deleted this page after you started editing with reason:\n: <em>$2</em>\nPlease confirm that you really want to recreate this page.",
-    "confirmrecreate-noreason": "User [[User:$1|$1]] ([[User talk:$1|talk]]) deleted this page after you started editing. Please confirm that you really want to recreate this page.",
-    "recreate": "Recreate",
-    "unit-pixel": "px",
-    "confirm_purge_button": "OK",
-    "confirm-purge-top": "Clear the cache of this page?",
-    "confirm-purge-bottom": "Purging a page clears the cache and forces the most current revision to appear.",
-    "confirm-watch-button": "OK",
-    "confirm-watch-top": "Add this page to your watchlist?",
-    "confirm-unwatch-button": "OK",
-    "confirm-unwatch-top": "Remove this page from your watchlist?",
-    "semicolon-separator": ";&#32;",
-    "comma-separator": ",&#32;",
-    "colon-separator": ":&#32;",
-    "autocomment-prefix": "",
-    "pipe-separator": "&#32;|&#32;",
-    "word-separator": "&#32;",
-    "ellipsis": "...",
-    "percent": "$1%",
-    "parentheses": "($1)",
-    "brackets": "[$1]",
-    "quotation-marks": "\"$1\"",
-    "imgmultipageprev": "← previous page",
-    "imgmultipagenext": "next page →",
-    "imgmultigo": "Go!",
-    "imgmultigoto": "Go to page $1",
-    "img-lang-opt": "$2 ($1)",
-    "img-lang-default": "(default language)",
-    "img-lang-info": "Render this image in $1. $2",
-    "img-lang-go": "Go",
-    "ascending_abbrev": "asc",
-    "descending_abbrev": "desc",
-    "table_pager_next": "Next page",
-    "table_pager_prev": "Previous page",
-    "table_pager_first": "First page",
-    "table_pager_last": "Last page",
-    "table_pager_limit": "Show $1 items per page",
-    "table_pager_limit_label": "Items per page:",
-    "table_pager_limit_submit": "Go",
-    "table_pager_empty": "No results",
-    "autosumm-blank": "Blanked the page",
-    "autosumm-replace": "Replaced content with \"$1\"",
-    "autoredircomment": "Redirected page to [[$1]]",
-    "autosumm-new": "Created page with \"$1\"",
-    "autoblock_whitelist": "AOL http://webmaster.info.aol.com/proxyinfo.html\n*64.12.96.0/19\n*149.174.160.0/20\n*152.163.240.0/21\n*152.163.248.0/22\n*152.163.252.0/23\n*152.163.96.0/22\n*152.163.100.0/23\n*195.93.32.0/22\n*195.93.48.0/22\n*195.93.64.0/19\n*195.93.96.0/19\n*195.93.16.0/20\n*198.81.0.0/22\n*198.81.16.0/20\n*198.81.8.0/23\n*202.67.64.128/25\n*205.188.192.0/20\n*205.188.208.0/23\n*205.188.112.0/20\n*205.188.146.144/30\n*207.200.112.0/21",
-    "size-bytes": "$1 B",
-    "size-kilobytes": "$1 KB",
-    "size-megabytes": "$1 MB",
-    "size-gigabytes": "$1 GB",
-    "size-terabytes": "$1 TB",
-    "size-petabytes": "$1 PB",
-    "size-exabytes": "$1 EB",
-    "size-zetabytes": "$1 ZB",
-    "size-yottabytes": "$1 YB",
-    "bitrate-bits": "$1 bps",
-    "bitrate-kilobits": "$1 kbps",
-    "bitrate-megabits": "$1 Mbps",
-    "bitrate-gigabits": "$1 Gbps",
-    "bitrate-terabits": "$1 Tbps",
-    "bitrate-petabits": "$1 Pbps",
-    "bitrate-exabits": "$1 Ebps",
-    "bitrate-zetabits": "$1 Zbps",
-    "bitrate-yottabits": "$1 Ybps",
-    "lag-warn-normal": "Changes newer than $1 {{PLURAL:$1|second|seconds}} may not be shown in this list.",
-    "lag-warn-high": "Due to high database server lag, changes newer than $1 {{PLURAL:$1|second|seconds}} may not be shown in this list.",
-    "editwatchlist-summary": "",
-    "watchlistedit-normal-title": "Edit watchlist",
-    "watchlistedit-normal-legend": "Remove titles from watchlist",
-    "watchlistedit-normal-explain": "Titles on your watchlist are shown below.\nTo remove a title, check the box next to it, and click \"{{int:Watchlistedit-normal-submit}}\".\nYou can also [[Special:EditWatchlist/raw|edit the raw list]].",
-    "watchlistedit-normal-submit": "Remove titles",
-    "watchlistedit-normal-done": "{{PLURAL:$1|1 title was|$1 titles were}} removed from your watchlist:",
-    "watchlistedit-raw-title": "Edit raw watchlist",
-    "watchlistedit-raw-legend": "Edit raw watchlist",
-    "watchlistedit-raw-explain": "Titles on your watchlist are shown below, and can be edited by adding to and removing from the list;\none title per line.\nWhen finished, click \"{{int:Watchlistedit-raw-submit}}\".\nYou can also [[Special:EditWatchlist|use the standard editor]].",
-    "watchlistedit-raw-titles": "Titles:",
-    "watchlistedit-raw-submit": "Update watchlist",
-    "watchlistedit-raw-done": "Your watchlist has been updated.",
-    "watchlistedit-raw-added": "{{PLURAL:$1|1 title was|$1 titles were}} added:",
-    "watchlistedit-raw-removed": "{{PLURAL:$1|1 title was|$1 titles were}} removed:",
-    "watchlisttools-view": "View relevant changes",
-    "watchlisttools-edit": "View and edit watchlist",
-    "watchlisttools-raw": "Edit raw watchlist",
-    "iranian-calendar-m1": "Farvardin",
-    "iranian-calendar-m2": "Ordibehesht",
-    "iranian-calendar-m3": "Khordad",
-    "iranian-calendar-m4": "Tir",
-    "iranian-calendar-m5": "Mordad",
-    "iranian-calendar-m6": "Shahrivar",
-    "iranian-calendar-m7": "Mehr",
-    "iranian-calendar-m8": "Aban",
-    "iranian-calendar-m9": "Azar",
-    "iranian-calendar-m10": "Dey",
-    "iranian-calendar-m11": "Bahman",
-    "iranian-calendar-m12": "Esfand",
-    "hijri-calendar-m1": "Muharram",
-    "hijri-calendar-m2": "Safar",
-    "hijri-calendar-m3": "Rabi' al-awwal",
-    "hijri-calendar-m4": "Rabi' al-thani",
-    "hijri-calendar-m5": "Jumada al-awwal",
-    "hijri-calendar-m6": "Jumada al-thani",
-    "hijri-calendar-m7": "Rajab",
-    "hijri-calendar-m8": "Sha'aban",
-    "hijri-calendar-m9": "Ramadan",
-    "hijri-calendar-m10": "Shawwal",
-    "hijri-calendar-m11": "Dhu al-Qi'dah",
-    "hijri-calendar-m12": "Dhu al-Hijjah",
-    "hebrew-calendar-m1": "Tishrei",
-    "hebrew-calendar-m2": "Cheshvan",
-    "hebrew-calendar-m3": "Kislev",
-    "hebrew-calendar-m4": "Tevet",
-    "hebrew-calendar-m5": "Shevat",
-    "hebrew-calendar-m6": "Adar",
-    "hebrew-calendar-m6a": "Adar I",
-    "hebrew-calendar-m6b": "Adar II",
-    "hebrew-calendar-m7": "Nisan",
-    "hebrew-calendar-m8": "Iyar",
-    "hebrew-calendar-m9": "Sivan",
-    "hebrew-calendar-m10": "Tamuz",
-    "hebrew-calendar-m11": "Av",
-    "hebrew-calendar-m12": "Elul",
-    "hebrew-calendar-m1-gen": "Tishrei",
-    "hebrew-calendar-m2-gen": "Cheshvan",
-    "hebrew-calendar-m3-gen": "Kislev",
-    "hebrew-calendar-m4-gen": "Tevet",
-    "hebrew-calendar-m5-gen": "Shevat",
-    "hebrew-calendar-m6-gen": "Adar",
-    "hebrew-calendar-m6a-gen": "Adar I",
-    "hebrew-calendar-m6b-gen": "Adar II",
-    "hebrew-calendar-m7-gen": "Nisan",
-    "hebrew-calendar-m8-gen": "Iyar",
-    "hebrew-calendar-m9-gen": "Sivan",
-    "hebrew-calendar-m10-gen": "Tamuz",
-    "hebrew-calendar-m11-gen": "Av",
-    "hebrew-calendar-m12-gen": "Elul",
-    "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|talk]])",
-    "signature-anon": "[[{{#special:Contributions}}/$1|$2]]",
-    "timezone-utc": "UTC",
-    "unknown_extension_tag": "Unknown extension tag \"$1\"",
-    "duplicate-defaultsort": "<strong>Warning:</strong> Default sort key \"$2\" overrides earlier default sort key \"$1\".",
-    "version": "Version",
-    "version-summary": "",
-    "version-extensions": "Installed extensions",
-    "version-specialpages": "Special pages",
-    "version-parserhooks": "Parser hooks",
-    "version-variables": "Variables",
-    "version-antispam": "Spam prevention",
-    "version-skins": "Skins",
-    "version-api": "API",
-    "version-other": "Other",
-    "version-mediahandlers": "Media handlers",
-    "version-hooks": "Hooks",
-    "version-parser-extensiontags": "Parser extension tags",
-    "version-parser-function-hooks": "Parser function hooks",
-    "version-hook-name": "Hook name",
-    "version-hook-subscribedby": "Subscribed by",
-    "version-version": "($1)",
-    "version-svn-revision": "r$1",
-    "version-license": "MediaWiki License",
-    "version-ext-license": "License",
-    "version-ext-colheader-name": "Extension",
-    "version-ext-colheader-version": "Version",
-    "version-ext-colheader-license": "License",
-    "version-ext-colheader-description": "Description",
-    "version-ext-colheader-credits": "Authors",
-    "version-license-title": "License for $1",
-    "version-license-not-found": "No detailed license information was found for this extension.",
-    "version-credits-title": "Credits for $1",
-    "version-credits-not-found": "No detailed credits information was found for this extension.",
-    "version-poweredby-credits": "This wiki is powered by <strong>[https://www.mediawiki.org/ MediaWiki]</strong>, copyright © 2001-$1 $2.",
-    "version-poweredby-others": "others",
-    "version-poweredby-translators": "translatewiki.net translators",
-    "version-credits-summary": "We would like to recognize the following persons for their contribution to [[Special:Version|MediaWiki]].",
-    "version-license-info": "MediaWiki 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.\n\nMediaWiki 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.\n\nYou should have received [{{SERVER}}{{SCRIPTPATH}}/COPYING 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 or [//www.gnu.org/licenses/old-licenses/gpl-2.0.html read it online].",
-    "version-software": "Installed software",
-    "version-software-product": "Product",
-    "version-software-version": "Version",
-    "version-db-mysql-url": "http://www.mysql.com/",
-    "version-db-mariadb-url": "http://mariadb.org/",
-    "version-db-percona-url": "http://www.percona.com/software/percona-server",
-    "version-db-postgres-url": "http://www.postgresql.org/",
-    "version-db-oracle-url": "http://www.oracle.com/database/",
-    "version-db-sqlite-url": "http://www.sqlite.org/",
-    "version-db-mssql-url": "http://www.microsoft.com/sql/",
-    "version-entrypoints": "Entry point URLs",
-    "version-entrypoints-header-entrypoint": "Entry point",
-    "version-entrypoints-header-url": "URL",
-    "version-entrypoints-articlepath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgArticlePath Article path]",
-    "version-entrypoints-scriptpath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgScriptPath Script path]",
-    "version-entrypoints-index-php": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:index.php index.php]",
-    "version-entrypoints-api-php": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:api.php api.php]",
-    "version-entrypoints-load-php": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:load.php load.php]",
-    "redirect": "Redirect by file, user, page or revision ID",
-    "redirect-legend": "Redirect to a file or page",
-    "redirect-text": "",
-    "redirect-summary": "This special page redirects to a file (given the file name), a page (given a revision ID or page ID), or a user page (given a numeric user ID). Usage: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], or [[{{#Special:Redirect}}/user/101]].",
-    "redirect-submit": "Go",
-    "redirect-lookup": "Lookup:",
-    "redirect-value": "Value:",
-    "redirect-user": "User ID",
-    "redirect-page": "Page ID",
-    "redirect-revision": "Page revision",
-    "redirect-file": "File name",
-    "redirect-not-exists": "Value not found",
-    "fileduplicatesearch": "Search for duplicate files",
-    "fileduplicatesearch-summary": "Search for duplicate files based on hash values.",
-    "fileduplicatesearch-legend": "Search for a duplicate",
-    "fileduplicatesearch-filename": "Filename:",
-    "fileduplicatesearch-submit": "Search",
-    "fileduplicatesearch-info": "$1 × $2 pixel<br />File size: $3<br />MIME type: $4",
-    "fileduplicatesearch-result-1": "The file \"$1\" has no identical duplication.",
-    "fileduplicatesearch-result-n": "The file \"$1\" has {{PLURAL:$2|1 identical duplication|$2 identical duplications}}.",
-    "fileduplicatesearch-noresults": "No file named \"$1\" found.",
-    "specialpages": "Special pages",
-    "specialpages-summary": "",
-    "specialpages-note-top": "Legend",
-    "specialpages-note": "* Normal special pages.\n* <span class=\"mw-specialpagerestricted\">Restricted special pages.</span>",
-    "specialpages-group-maintenance": "Maintenance reports",
-    "specialpages-group-other": "Other special pages",
-    "specialpages-group-login": "Login / create account",
-    "specialpages-group-changes": "Recent changes and logs",
-    "specialpages-group-media": "Media reports and uploads",
-    "specialpages-group-users": "Users and rights",
-    "specialpages-group-highuse": "High use pages",
-    "specialpages-group-pages": "Lists of pages",
-    "specialpages-group-pagetools": "Page tools",
-    "specialpages-group-wiki": "Data and tools",
-    "specialpages-group-redirects": "Redirecting special pages",
-    "specialpages-group-spam": "Spam tools",
-    "blankpage": "Blank page",
-    "intentionallyblankpage": "This page is intentionally left blank.",
-    "external_image_whitelist": " #Leave this line exactly as it is<pre>\n#Put regular expression fragments (just the part that goes between the //) below\n#These will be matched with the URLs of external (hotlinked) images\n#Those that match will be displayed as images, otherwise only a link to the image will be shown\n#Lines beginning with # are treated as comments\n#This is case-insensitive\n\n#Put all regex fragments above this line. Leave this line exactly as it is</pre>",
-    "tags": "Valid change tags",
-    "tags-summary": "",
-    "tag-filter": "[[Special:Tags|Tag]] filter:",
-    "tag-filter-submit": "Filter",
-    "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Tag|Tags}}]]: $2)",
-    "tags-title": "Tags",
-    "tags-intro": "This page lists the tags that the software may mark an edit with, and their meaning.",
-    "tags-tag": "Tag name",
-    "tags-display-header": "Appearance on change lists",
-    "tags-description-header": "Full description of meaning",
-    "tags-active-header": "Active?",
-    "tags-hitcount-header": "Tagged changes",
-    "tags-active-yes": "Yes",
-    "tags-active-no": "No",
-    "tags-edit": "edit",
-    "tags-hitcount": "$1 {{PLURAL:$1|change|changes}}",
-    "comparepages": "Compare pages",
-    "comparepages-summary": "",
-    "compare-page1": "Page 1",
-    "compare-page2": "Page 2",
-    "compare-rev1": "Revision 1",
-    "compare-rev2": "Revision 2",
-    "compare-submit": "Compare",
-    "compare-invalid-title": "The title you specified is invalid.",
-    "compare-title-not-exists": "The title you specified does not exist.",
-    "compare-revision-not-exists": "The revision you specified does not exist.",
-    "dberr-problems": "Sorry! This site is experiencing technical difficulties.",
-    "dberr-again": "Try waiting a few minutes and reloading.",
-    "dberr-info": "(Cannot contact the database server: $1)",
-    "dberr-info-hidden": "(Cannot contact the database server)",
-    "dberr-usegoogle": "You can try searching via Google in the meantime.",
-    "dberr-outofdate": "Note that their indexes of our content may be out of date.",
-    "dberr-cachederror": "This is a cached copy of the requested page, and may not be up to date.",
-    "htmlform-invalid-input": "There are problems with some of your input.",
-    "htmlform-select-badoption": "The value you specified is not a valid option.",
-    "htmlform-int-invalid": "The value you specified is not an integer.",
-    "htmlform-float-invalid": "The value you specified is not a number.",
-    "htmlform-int-toolow": "The value you specified is below the minimum of $1.",
-    "htmlform-int-toohigh": "The value you specified is above the maximum of $1.",
-    "htmlform-required": "This value is required.",
-    "htmlform-submit": "Submit",
-    "htmlform-reset": "Undo changes",
-    "htmlform-selectorother-other": "Other",
-    "htmlform-no": "No",
-    "htmlform-yes": "Yes",
-    "htmlform-chosen-placeholder": "Select an option",
+       "@metadata": {
+               "authors": []
+       },
+       "sidebar": "\n* navigation\n** mainpage|mainpage-description\n** recentchanges-url|recentchanges\n** randompage-url|randompage\n** helppage|help\n* SEARCH\n* TOOLBOX\n* LANGUAGES",
+       "tog-underline": "Link underlining:",
+       "tog-hideminor": "Hide minor edits in recent changes",
+       "tog-hidepatrolled": "Hide patrolled edits in recent changes",
+       "tog-newpageshidepatrolled": "Hide patrolled pages from new page list",
+       "tog-extendwatchlist": "Expand watchlist to show all changes, not just the most recent",
+       "tog-usenewrc": "Group changes by page in recent changes and watchlist",
+       "tog-numberheadings": "Auto-number headings",
+       "tog-showtoolbar": "Show edit toolbar",
+       "tog-editondblclick": "Edit pages on double click",
+       "tog-editsectiononrightclick": "Enable section editing by right clicking on section titles",
+       "tog-watchcreations": "Add pages I create and files I upload to my watchlist",
+       "tog-watchdefault": "Add pages and files I edit to my watchlist",
+       "tog-watchmoves": "Add pages and files I move to my watchlist",
+       "tog-watchdeletion": "Add pages and files I delete to my watchlist",
+       "tog-minordefault": "Mark all edits minor by default",
+       "tog-previewontop": "Show preview before edit box",
+       "tog-previewonfirst": "Show preview on first edit",
+       "tog-enotifwatchlistpages": "Email me when a page or file on my watchlist is changed",
+       "tog-enotifusertalkpages": "Email me when my user talk page is changed",
+       "tog-enotifminoredits": "Email me also for minor edits of pages and files",
+       "tog-enotifrevealaddr": "Reveal my email address in notification emails",
+       "tog-shownumberswatching": "Show the number of watching users",
+       "tog-oldsig": "Existing signature:",
+       "tog-fancysig": "Treat signature as wikitext (without an automatic link)",
+       "tog-uselivepreview": "Use live preview (experimental)",
+       "tog-forceeditsummary": "Prompt me when entering a blank edit summary",
+       "tog-watchlisthideown": "Hide my edits from the watchlist",
+       "tog-watchlisthidebots": "Hide bot edits from the watchlist",
+       "tog-watchlisthideminor": "Hide minor edits from the watchlist",
+       "tog-watchlisthideliu": "Hide edits by logged in users from the watchlist",
+       "tog-watchlisthideanons": "Hide edits by anonymous users from the watchlist",
+       "tog-watchlisthidepatrolled": "Hide patrolled edits from the watchlist",
+       "tog-ccmeonemails": "Send me copies of emails I send to other users",
+       "tog-diffonly": "Do not show page content below diffs",
+       "tog-showhiddencats": "Show hidden categories",
+       "tog-norollbackdiff": "Omit diff after performing a rollback",
+       "tog-useeditwarning": "Warn me when I leave an edit page with unsaved changes",
+       "tog-prefershttps": "Always use a secure connection when logged in",
+       "underline-always": "Always",
+       "underline-never": "Never",
+       "underline-default": "Skin or browser default",
+       "editfont-style": "Edit area font style:",
+       "editfont-default": "Browser default",
+       "editfont-monospace": "Monospaced font",
+       "editfont-sansserif": "Sans-serif font",
+       "editfont-serif": "Serif font",
+       "sunday": "Sunday",
+       "monday": "Monday",
+       "tuesday": "Tuesday",
+       "wednesday": "Wednesday",
+       "thursday": "Thursday",
+       "friday": "Friday",
+       "saturday": "Saturday",
+       "sun": "Sun",
+       "mon": "Mon",
+       "tue": "Tue",
+       "wed": "Wed",
+       "thu": "Thu",
+       "fri": "Fri",
+       "sat": "Sat",
+       "january": "January",
+       "february": "February",
+       "march": "March",
+       "april": "April",
+       "may_long": "May",
+       "june": "June",
+       "july": "July",
+       "august": "August",
+       "september": "September",
+       "october": "October",
+       "november": "November",
+       "december": "December",
+       "january-gen": "January",
+       "february-gen": "February",
+       "march-gen": "March",
+       "april-gen": "April",
+       "may-gen": "May",
+       "june-gen": "June",
+       "july-gen": "July",
+       "august-gen": "August",
+       "september-gen": "September",
+       "october-gen": "October",
+       "november-gen": "November",
+       "december-gen": "December",
+       "jan": "Jan",
+       "feb": "Feb",
+       "mar": "Mar",
+       "apr": "Apr",
+       "may": "May",
+       "jun": "Jun",
+       "jul": "Jul",
+       "aug": "Aug",
+       "sep": "Sep",
+       "oct": "Oct",
+       "nov": "Nov",
+       "dec": "Dec",
+       "january-date": "January $1",
+       "february-date": "February $1",
+       "march-date": "March $1",
+       "april-date": "April $1",
+       "may-date": "May $1",
+       "june-date": "June $1",
+       "july-date": "July $1",
+       "august-date": "August $1",
+       "september-date": "September $1",
+       "october-date": "October $1",
+       "november-date": "November $1",
+       "december-date": "December $1",
+       "pagecategories": "{{PLURAL:$1|Category|Categories}}",
+       "pagecategorieslink": "Special:Categories",
+       "category_header": "Pages in category \"$1\"",
+       "subcategories": "Subcategories",
+       "category-media-header": "Media in category \"$1\"",
+       "category-empty": "<em>This category currently contains no pages or media.</em>",
+       "hidden-categories": "{{PLURAL:$1|Hidden category|Hidden categories}}",
+       "hidden-category-category": "Hidden categories",
+       "category-subcat-count": "{{PLURAL:$2|This category has only the following subcategory.|This category has the following {{PLURAL:$1|subcategory|$1 subcategories}}, out of $2 total.}}",
+       "category-subcat-count-limited": "This category has the following {{PLURAL:$1|subcategory|$1 subcategories}}.",
+       "category-article-count": "{{PLURAL:$2|This category contains only the following page.|The following {{PLURAL:$1|page is|$1 pages are}} in this category, out of $2 total.}}",
+       "category-article-count-limited": "The following {{PLURAL:$1|page is|$1 pages are}} in the current category.",
+       "category-file-count": "{{PLURAL:$2|This category contains only the following file.|The following {{PLURAL:$1|file is|$1 files are}} in this category, out of $2 total.}}",
+       "category-file-count-limited": "The following {{PLURAL:$1|file is|$1 files are}} in the current category.",
+       "listingcontinuesabbrev": "cont.",
+       "index-category": "Indexed pages",
+       "noindex-category": "Noindexed pages",
+       "broken-file-category": "Pages with broken file links",
+       "categoryviewer-pagedlinks": "($1) ($2)",
+       "about": "About",
+       "article": "Content page",
+       "newwindow": "(opens in new window)",
+       "cancel": "Cancel",
+       "moredotdotdot": "More...",
+       "morenotlisted": "This list is not complete.",
+       "mypage": "Page",
+       "mytalk": "Talk",
+       "anontalk": "Talk for this IP address",
+       "navigation": "Navigation",
+       "and": "&#32;and",
+       "qbfind": "Find",
+       "qbbrowse": "Browse",
+       "qbedit": "Edit",
+       "qbpageoptions": "This page",
+       "qbmyoptions": "My pages",
+       "faq": "FAQ",
+       "faqpage": "Project:FAQ",
+       "sitetitle": "{{SITENAME}}",
+       "sitesubtitle": "",
+       "vector-action-addsection": "Add topic",
+       "vector-action-delete": "Delete",
+       "vector-action-move": "Move",
+       "vector-action-protect": "Protect",
+       "vector-action-undelete": "Undelete",
+       "vector-action-unprotect": "Change protection",
+       "vector-view-create": "Create",
+       "vector-view-edit": "Edit",
+       "vector-view-history": "View history",
+       "vector-view-view": "Read",
+       "vector-view-viewsource": "View source",
+       "actions": "Actions",
+       "namespaces": "Namespaces",
+       "variants": "Variants",
+       "navigation-heading": "Navigation menu",
+       "errorpagetitle": "Error",
+       "returnto": "Return to $1.",
+       "tagline": "From {{SITENAME}}",
+       "help": "Help",
+       "search": "Search",
+       "searchbutton": "Search",
+       "go": "Go",
+       "searcharticle": "Go",
+       "history": "Page history",
+       "history_short": "History",
+       "updatedmarker": "updated since my last visit",
+       "printableversion": "Printable version",
+       "permalink": "Permanent link",
+       "print": "Print",
+       "view": "View",
+       "view-foreign": "View on $1",
+       "edit": "Edit",
+       "edit-local": "Edit local description",
+       "create": "Create",
+       "create-local": "Add local description",
+       "editthispage": "Edit this page",
+       "create-this-page": "Create this page",
+       "delete": "Delete",
+       "deletethispage": "Delete this page",
+       "undeletethispage": "Undelete this page",
+       "undelete_short": "Undelete {{PLURAL:$1|one edit|$1 edits}}",
+       "viewdeleted_short": "View {{PLURAL:$1|one deleted edit|$1 deleted edits}}",
+       "protect": "Protect",
+       "protect_change": "change",
+       "protectthispage": "Protect this page",
+       "unprotect": "Change protection",
+       "unprotectthispage": "Change protection of this page",
+       "newpage": "New page",
+       "talkpage": "Discuss this page",
+       "talkpagelinktext": "Talk",
+       "specialpage": "Special page",
+       "personaltools": "Personal tools",
+       "postcomment": "New section",
+       "addsection": "+",
+       "articlepage": "View content page",
+       "talk": "Discussion",
+       "views": "Views",
+       "toolbox": "Tools",
+       "userpage": "View user page",
+       "projectpage": "View project page",
+       "imagepage": "View file page",
+       "mediawikipage": "View message page",
+       "templatepage": "View template page",
+       "viewhelppage": "View help page",
+       "categorypage": "View category page",
+       "viewtalkpage": "View discussion",
+       "otherlanguages": "In other languages",
+       "redirectedfrom": "(Redirected from $1)",
+       "redirectpagesub": "Redirect page",
+       "talkpageheader": "-",
+       "lastmodifiedat": "This page was last modified on $1, at $2.",
+       "viewcount": "This page has been accessed {{PLURAL:$1|once|$1 times}}.",
+       "protectedpage": "Protected page",
+       "jumpto": "Jump to:",
+       "jumptonavigation": "navigation",
+       "jumptosearch": "search",
+       "view-pool-error": "Sorry, the servers are overloaded at the moment.\nToo many users are trying to view this page.\nPlease wait a while before you try to access this page again.\n\n$1",
+       "generic-pool-error": "Sorry, the servers are overloaded at the moment.\nToo many users are trying to view this resource.\nPlease wait a while before you try to access this resource again.",
+       "pool-timeout": "Timeout waiting for the lock",
+       "pool-queuefull": "Pool queue is full",
+       "pool-errorunknown": "Unknown error",
+       "pool-servererror": "The pool counter service is not available ($1).",
+       "aboutsite": "About {{SITENAME}}",
+       "aboutpage": "Project:About",
+       "copyright": "Content is available under $1 unless otherwise noted.",
+       "copyrightpage": "{{ns:project}}:Copyrights",
+       "currentevents": "Current events",
+       "currentevents-url": "Project:Current events",
+       "disclaimers": "Disclaimers",
+       "disclaimerpage": "Project:General disclaimer",
+       "edithelp": "Editing help",
+       "edithelppage": "https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Editing_pages",
+       "helppage": "https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents",
+       "mainpage": "Main Page",
+       "mainpage-description": "Main page",
+       "policy-url": "Project:Policy",
+       "portal": "Community portal",
+       "portal-url": "Project:Community portal",
+       "privacy": "Privacy policy",
+       "privacypage": "Project:Privacy policy",
+       "badaccess": "Permission error",
+       "badaccess-group0": "You are not allowed to execute the action you have requested.",
+       "badaccess-groups": "The action you have requested is limited to users in {{PLURAL:$2|the group|one of the groups}}: $1.",
+       "versionrequired": "Version $1 of MediaWiki required",
+       "versionrequiredtext": "Version $1 of MediaWiki is required to use this page.\nSee [[Special:Version|version page]].",
+       "ok": "OK",
+       "pagetitle": "$1 - {{SITENAME}}",
+       "pagetitle-view-mainpage": "{{SITENAME}}",
+       "backlinksubtitle": "← $1",
+       "retrievedfrom": "Retrieved from \"$1\"",
+       "youhavenewmessages": "{{PLURAL:$3|You have}} $1 ($2).",
+       "youhavenewmessagesfromusers": "{{PLURAL:$4|You have}} $1 from {{PLURAL:$3|another user|$3 users}} ($2).",
+       "youhavenewmessagesmanyusers": "You have $1 from many users ($2).",
+       "newmessageslinkplural": "{{PLURAL:$1|a new message|999=new messages}}",
+       "newmessagesdifflinkplural": "last {{PLURAL:$1|change|999=changes}}",
+       "youhavenewmessagesmulti": "You have new messages on $1",
+       "newtalkseparator": ",&#32;",
+       "editsection": "edit",
+       "editold": "edit",
+       "viewsourceold": "view source",
+       "editlink": "edit",
+       "viewsourcelink": "view source",
+       "editsectionhint": "Edit section: $1",
+       "toc": "Contents",
+       "showtoc": "show",
+       "hidetoc": "hide",
+       "collapsible-collapse": "Collapse",
+       "collapsible-expand": "Expand",
+       "thisisdeleted": "View or restore $1?",
+       "viewdeleted": "View $1?",
+       "restorelink": "{{PLURAL:$1|one deleted edit|$1 deleted edits}}",
+       "feedlinks": "Feed:",
+       "feed-invalid": "Invalid subscription feed type.",
+       "feed-unavailable": "Syndication feeds are not available",
+       "site-rss-feed": "$1 RSS feed",
+       "site-atom-feed": "$1 Atom feed",
+       "page-rss-feed": "\"$1\" RSS feed",
+       "page-atom-feed": "\"$1\" Atom feed",
+       "feed-atom": "Atom",
+       "feed-rss": "RSS",
+       "sitenotice": "-",
+       "anonnotice": "-",
+       "newsectionheaderdefaultlevel": "== $1 ==",
+       "red-link-title": "$1 (page does not exist)",
+       "sort-descending": "Sort descending",
+       "sort-ascending": "Sort ascending",
+       "nstab-main": "Page",
+       "nstab-user": "User page",
+       "nstab-media": "Media page",
+       "nstab-special": "Special page",
+       "nstab-project": "Project page",
+       "nstab-image": "File",
+       "nstab-mediawiki": "Message",
+       "nstab-template": "Template",
+       "nstab-help": "Help page",
+       "nstab-category": "Category",
+       "mainpage-nstab": "",
+       "nosuchaction": "No such action",
+       "nosuchactiontext": "The action specified by the URL is invalid.\nYou might have mistyped the URL, or followed an incorrect link.\nThis might also indicate a bug in the software used by {{SITENAME}}.",
+       "nosuchspecialpage": "No such special page",
+       "nospecialpagetext": "<strong>You have requested an invalid special page.</strong>\n\nA list of valid special pages can be found at [[Special:SpecialPages|{{int:specialpages}}]].",
+       "error": "Error",
+       "databaseerror": "Database error",
+       "databaseerror-text": "A database query error has occurred.\nThis may indicate a bug in the software.",
+       "databaseerror-textcl": "A database query error has occurred.",
+       "databaseerror-query": "Query: $1",
+       "databaseerror-function": "Function: $1",
+       "databaseerror-error": "Error: $1",
+       "laggedslavemode": "<strong>Warning:</strong> Page may not contain recent updates.",
+       "readonly": "Database locked",
+       "enterlockreason": "Enter a reason for the lock, including an estimate of when the lock will be released",
+       "readonlytext": "The database is currently locked to new entries and other modifications, probably for routine database maintenance, after which it will be back to normal.\n\nThe administrator who locked it offered this explanation: $1",
+       "missing-article": "The database did not find the text of a page that it should have found, named \"$1\" $2.\n\nThis is usually caused by following an outdated diff or history link to a page that has been deleted.\n\nIf this is not the case, you may have found a bug in the software.\nPlease report this to an [[Special:ListUsers/sysop|administrator]], making note of the URL.",
+       "missingarticle-rev": "(revision#: $1)",
+       "missingarticle-diff": "(Diff: $1, $2)",
+       "readonly_lag": "The database has been automatically locked while the slave database servers catch up to the master",
+       "internalerror": "Internal error",
+       "internalerror_info": "Internal error: $1",
+       "filecopyerror": "Could not copy file \"$1\" to \"$2\".",
+       "filerenameerror": "Could not rename file \"$1\" to \"$2\".",
+       "filedeleteerror": "Could not delete file \"$1\".",
+       "directorycreateerror": "Could not create directory \"$1\".",
+       "filenotfound": "Could not find file \"$1\".",
+       "unexpected": "Unexpected value: \"$1\"=\"$2\".",
+       "formerror": "Error: Could not submit form.",
+       "badarticleerror": "This action cannot be performed on this page.",
+       "cannotdelete": "The page or file \"$1\" could not be deleted.\nIt may have already been deleted by someone else.",
+       "cannotdelete-title": "Cannot delete page \"$1\"",
+       "delete-hook-aborted": "Deletion aborted by hook.\nIt gave no explanation.",
+       "no-null-revision": "Could not create new null revision for page \"$1\"",
+       "badtitle": "Bad title",
+       "badtitletext": "The requested page title was invalid, empty, or an incorrectly linked inter-language or inter-wiki title.\nIt may contain one or more characters that cannot be used in titles.",
+       "perfcached": "The following data is cached and may not be up to date. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.",
+       "perfcachedts": "The following data is cached, and was last updated $1. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.",
+       "querypage-no-updates": "Updates for this page are currently disabled.\nData here will not presently be refreshed.",
+       "viewsource": "View source",
+       "viewsource-title": "View source for $1",
+       "actionthrottled": "Action throttled",
+       "actionthrottledtext": "As an anti-spam measure, you are limited from performing this action too many times in a short space of time, and you have exceeded this limit.\nPlease try again in a few minutes.",
+       "protectedpagetext": "This page has been protected to prevent editing or other actions.",
+       "viewsourcetext": "You can view and copy the source of this page:",
+       "viewyourtext": "You can view and copy the source of <strong>your edits</strong> to this page:",
+       "protectedinterface": "This page provides interface text for the software on this wiki, and is protected to prevent abuse.\nTo add or change translations for all wikis, please use [//translatewiki.net/ translatewiki.net], the MediaWiki localisation project.",
+       "editinginterface": "<strong>Warning:</strong> You are editing a page that is used to provide interface text for the software.\nChanges to this page will affect the appearance of the user interface for other users on this wiki.\nTo add or change translations for all wikis, please use [//translatewiki.net/ translatewiki.net], the MediaWiki localisation project.",
+       "cascadeprotected": "This page has been protected from editing because it is included in the following {{PLURAL:$1|page, which is|pages, which are}} protected with the \"cascading\" option turned on:\n$2",
+       "namespaceprotected": "You do not have permission to edit pages in the <strong>$1</strong> namespace.",
+       "customcssprotected": "You do not have permission to edit this CSS page because it contains another user's personal settings.",
+       "customjsprotected": "You do not have permission to edit this JavaScript page because it contains another user's personal settings.",
+       "mycustomcssprotected": "You do not have permission to edit this CSS page.",
+       "mycustomjsprotected": "You do not have permission to edit this JavaScript page.",
+       "myprivateinfoprotected": "You do not have permission to edit your private information.",
+       "mypreferencesprotected": "You do not have permission to edit your preferences.",
+       "ns-specialprotected": "Special pages cannot be edited.",
+       "titleprotected": "This title has been protected from creation by [[User:$1|$1]].\nThe reason given is \"<em>$2</em>\".",
+       "filereadonlyerror": "Unable to modify the file \"$1\" because the file repository \"$2\" is in read-only mode.\n\nThe administrator who locked it offered this explanation: \"$3\".",
+       "invalidtitle-knownnamespace": "Invalid title with namespace \"$2\" and text \"$3\"",
+       "invalidtitle-unknownnamespace": "Invalid title with unknown namespace number $1 and text \"$2\"",
+       "exception-nologin": "Not logged in",
+       "exception-nologin-text": "Please [[Special:Userlogin|log in]] to be able to access this page or action.",
+       "exception-nologin-text-manual": "Please $1 to be able to access this page or action.",
+       "virus-badscanner": "Bad configuration: Unknown virus scanner: <em>$1</em>",
+       "virus-scanfailed": "scan failed (code $1)",
+       "virus-unknownscanner": "unknown antivirus:",
+       "logouttext": "<strong>You are now logged out.</strong>\n\nNote that some pages may continue to be displayed as if you were still logged in, until you clear your browser cache.",
+       "welcomeuser": "Welcome, $1!",
+       "welcomecreation-msg": "Your account has been created.\nYou can change your {{SITENAME}} [[Special:Preferences|preferences]] if you wish.",
+       "yourname": "Username:",
+       "userlogin-yourname": "Username",
+       "userlogin-yourname-ph": "Enter your username",
+       "createacct-another-username-ph": "Enter the username",
+       "createacct-helpusername": "",
+       "yourpassword": "Password:",
+       "userlogin-yourpassword": "Password",
+       "userlogin-yourpassword-ph": "Enter your password",
+       "createacct-yourpassword-ph": "Enter a password",
+       "yourpasswordagain": "Retype password:",
+       "createacct-yourpasswordagain": "Confirm password",
+       "createacct-yourpasswordagain-ph": "Enter password again",
+       "remembermypassword": "Remember my login on this browser (for a maximum of $1 {{PLURAL:$1|day|days}})",
+       "userlogin-remembermypassword": "Keep me logged in",
+       "userlogin-signwithsecure": "Use secure connection",
+       "yourdomainname": "Your domain:",
+       "password-change-forbidden": "You cannot change passwords on this wiki.",
+       "externaldberror": "There was either an authentication database error or you are not allowed to update your external account.",
+       "login": "Log in",
+       "nav-login-createaccount": "Log in / create account",
+       "loginprompt": "You must have cookies enabled to log in to {{SITENAME}}.",
+       "userlogin": "Log in / create account",
+       "userloginnocreate": "Log in",
+       "logout": "Log out",
+       "userlogout": "Log out",
+       "userlogout-summary": "",
+       "notloggedin": "Not logged in",
+       "userlogin-noaccount": "Don't have an account?",
+       "userlogin-joinproject": "Join {{SITENAME}}",
+       "nologin": "Don't have an account? $1.",
+       "nologinlink": "Create an account",
+       "createaccount": "Create account",
+       "gotaccount": "Already have an account? $1.",
+       "gotaccountlink": "Log in",
+       "userlogin-resetlink": "Forgotten your login details?",
+       "userlogin-resetpassword-link": "Forgot your password?",
+       "helplogin-url": "https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Logging_in",
+       "userlogin-helplink2": "Help with logging in",
+       "userlogin-loggedin": "You are already logged in as {{GENDER:$1|$1}}.\nUse the form below to log in as another user.",
+       "userlogin-createanother": "Create another account",
+       "createacct-emailrequired": "Email address",
+       "createacct-emailoptional": "Email address (optional)",
+       "createacct-email-ph": "Enter your email address",
+       "createacct-another-email-ph": "Enter email address",
+       "createaccountmail": "Use a temporary random password and send it to the specified email address",
+       "createacct-realname": "Real name (optional)",
+       "createaccountreason": "Reason:",
+       "createacct-reason": "Reason",
+       "createacct-reason-ph": "Why you are creating another account",
+       "createacct-captcha": "Security check",
+       "createacct-imgcaptcha-help": "",
+       "createacct-imgcaptcha-ph": "Enter the text you see above",
+       "createacct-submit": "Create your account",
+       "createacct-another-submit": "Create another account",
+       "createacct-benefit-heading": "{{SITENAME}} is made by people like you.",
+       "createacct-benefit-icon1": "icon-edits",
+       "createacct-benefit-head1": "{{NUMBEROFEDITS}}",
+       "createacct-benefit-body1": "{{PLURAL:$1|edit|edits}}",
+       "createacct-benefit-icon2": "icon-pages",
+       "createacct-benefit-head2": "{{NUMBEROFARTICLES}}",
+       "createacct-benefit-body2": "{{PLURAL:$1|page|pages}}",
+       "createacct-benefit-icon3": "icon-contributors",
+       "createacct-benefit-head3": "{{NUMBEROFACTIVEUSERS}}",
+       "createacct-benefit-body3": "recent {{PLURAL:$1|contributor|contributors}}",
+       "badretype": "The passwords you entered do not match.",
+       "userexists": "Username entered already in use.\nPlease choose a different name.",
+       "loginerror": "Login error",
+       "createacct-error": "Account creation error",
+       "createaccounterror": "Could not create account: $1",
+       "nocookiesnew": "The user account was created, but you are not logged in.\n{{SITENAME}} uses cookies to log in users.\nYou have cookies disabled.\nPlease enable them, then log in with your new username and password.",
+       "nocookieslogin": "{{SITENAME}} uses cookies to log in users.\nYou have cookies disabled.\nPlease enable them and try again.",
+       "nocookiesfornew": "The user account was not created, as we could not confirm its source.\nEnsure you have cookies enabled, reload this page and try again.",
+       "nocookiesforlogin": "{{int:nocookieslogin}}",
+       "noname": "You have not specified a valid username.",
+       "loginsuccesstitle": "Login successful",
+       "loginsuccess": "<strong>You are now logged in to {{SITENAME}} as \"$1\".</strong>",
+       "nosuchuser": "There is no user by the name \"$1\".\nUsernames are case sensitive.\nCheck your spelling, or [[Special:UserLogin/signup|create a new account]].",
+       "nosuchusershort": "There is no user by the name \"$1\".\nCheck your spelling.",
+       "nouserspecified": "You have to specify a username.",
+       "login-userblocked": "This user is blocked. Login not allowed.",
+       "wrongpassword": "Incorrect password entered.\nPlease try again.",
+       "wrongpasswordempty": "Password entered was blank.\nPlease try again.",
+       "passwordtooshort": "Passwords must be at least {{PLURAL:$1|1 character|$1 characters}}.",
+       "password-name-match": "Your password must be different from your username.",
+       "password-login-forbidden": "The use of this username and password has been forbidden.",
+       "mailmypassword": "Reset password",
+       "passwordremindertitle": "New temporary password for {{SITENAME}}",
+       "passwordremindertext": "Someone (probably you, from IP address $1) requested a new\npassword for {{SITENAME}} ($4). A temporary password for user\n\"$2\" has been created and was set to \"$3\". If this was your\nintent, you will need to log in and choose a new password now.\nYour temporary password will expire in {{PLURAL:$5|one day|$5 days}}.\n\nIf someone else made this request, or if you have remembered your password,\nand you no longer wish to change it, you may ignore this message and\ncontinue using your old password.",
+       "noemail": "There is no email address recorded for user \"$1\".",
+       "noemailcreate": "You need to provide a valid email address.",
+       "passwordsent": "A new password has been sent to the email address registered for \"$1\".\nPlease log in again after you receive it.",
+       "blocked-mailpassword": "Your IP address is blocked from editing, and so is not allowed to use the password recovery function to prevent abuse.",
+       "eauthentsent": "A confirmation email has been sent to the specified email address.\nBefore any other email is sent to the account, you will have to follow the instructions in the email, to confirm that the account is actually yours.",
+       "throttled-mailpassword": "A password reset email has already been sent, within the last {{PLURAL:$1|hour|$1 hours}}.\nTo prevent abuse, only one password reset email will be sent per {{PLURAL:$1|hour|$1 hours}}.",
+       "loginstart": "",
+       "loginend": "",
+       "loginend-https": "",
+       "signupstart": "{{int:loginstart}}",
+       "signupend": "{{int:loginend}}",
+       "signupend-https": "",
+       "mailerror": "Error sending mail: $1",
+       "acct_creation_throttle_hit": "Visitors to this wiki using your IP address have created {{PLURAL:$1|1 account|$1 accounts}} in the last day, which is the maximum allowed in this time period.\nAs a result, visitors using this IP address cannot create any more accounts at the moment.",
+       "emailauthenticated": "Your email address was confirmed on $2 at $3.",
+       "emailnotauthenticated": "Your email address is not yet confirmed.\nNo email will be sent for any of the following features.",
+       "noemailprefs": "Specify an email address in your preferences for these features to work.",
+       "emailconfirmlink": "Confirm your email address",
+       "invalidemailaddress": "The email address cannot be accepted as it appears to have an invalid format.\nPlease enter a well-formatted address or empty that field.",
+       "cannotchangeemail": "Account email addresses cannot be changed on this wiki.",
+       "emaildisabled": "This site cannot send emails.",
+       "emailsender": "{{SITENAME}}",
+       "accountcreated": "Account created",
+       "accountcreatedtext": "The user account for [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|talk]]) has been created.",
+       "createaccount-title": "Account creation for {{SITENAME}}",
+       "createaccount-text": "Someone created an account for your email address on {{SITENAME}} ($4) named \"$2\", with password \"$3\".\nYou should log in and change your password now.\n\nYou may ignore this message, if this account was created in error.",
+       "login-throttled": "You have made too many recent login attempts.\nPlease wait $1 before trying again.",
+       "login-abort-generic": "Your login was unsuccessful - Aborted",
+       "loginlanguagelabel": "Language: $1",
+       "loginlanguagelinks": "* {{#language:de}}|de\n* {{#language:en}}|en\n* {{#language:eo}}|eo\n* {{#language:fr}}|fr\n* {{#language:es}}|es\n* {{#language:it}}|it\n* {{#language:nl}}|nl",
+       "suspicious-userlogout": "Your request to log out was denied because it looks like it was sent by a broken browser or caching proxy.",
+       "createacct-another-realname-tip": "Real name is optional.\nIf you choose to provide it, this will be used for giving the user attribution for their work.",
+       "pt-login": "Log in",
+       "pt-login-button": "Log in",
+       "pt-createaccount": "Create account",
+       "pt-userlogout": "Log out",
+       "pear-mail-error": "$1",
+       "php-mail-error": "$1",
+       "php-mail-error-unknown": "Unknown error in PHP's mail() function.",
+       "user-mail-no-addy": "Tried to send email without an email address.",
+       "user-mail-no-body": "Tried to send email with an empty or unreasonably short body.",
+       "changepassword": "Change password",
+       "changepassword-summary": "",
+       "resetpass_announce": "To finish logging in, you must set a new password.",
+       "resetpass_text": "<!-- Add text here -->",
+       "resetpass_header": "Change account password",
+       "oldpassword": "Old password:",
+       "newpassword": "New password:",
+       "retypenew": "Retype new password:",
+       "resetpass_submit": "Set password and log in",
+       "changepassword-success": "Your password has been changed successfully!",
+       "changepassword-throttled": "You have made too many recent login attempts.\nPlease wait $1 before trying again.",
+       "resetpass_forbidden": "Passwords cannot be changed",
+       "resetpass-no-info": "You must be logged in to access this page directly.",
+       "resetpass-submit-loggedin": "Change password",
+       "resetpass-submit-cancel": "Cancel",
+       "resetpass-wrong-oldpass": "Invalid temporary or current password.\nYou may have already successfully changed your password or requested a new temporary password.",
+       "resetpass-recycled": "Please reset your password to something other than your current password.",
+       "resetpass-temp-emailed": "You logged in with a temporary emailed code.\nTo finish logging in, you must set a new password here:",
+       "resetpass-temp-password": "Temporary password:",
+       "resetpass-abort-generic": "Password change has been aborted by an extension.",
+       "resetpass-expired": "Your password has expired. Please set a new password to log in.",
+       "resetpass-expired-soft": "Your password has expired and needs to be reset. Please choose a new password now, or click \"{{int:resetpass-submit-cancel}}\" to reset it later.",
+       "resetpass-validity-soft": "Your password is not valid: $1\n\nPlease choose a new password now, or click \"{{int:resetpass-submit-cancel}}\" to reset it later.",
+       "passwordreset": "Reset password",
+       "passwordreset-text-one": "Complete this form to receive a temporary password via email.",
+       "passwordreset-text-many": "{{PLURAL:$1|Fill in one of the fields to receive a temporary password via email.}}",
+       "passwordreset-legend": "Reset password",
+       "passwordreset-disabled": "Password resets have been disabled on this wiki.",
+       "passwordreset-emaildisabled": "Email features have been disabled on this wiki.",
+       "passwordreset-username": "Username:",
+       "passwordreset-domain": "Domain:",
+       "passwordreset-capture": "View the resulting email?",
+       "passwordreset-capture-help": "If you check this box, the email (with the temporary password) will be shown to you as well as being sent to the user.",
+       "passwordreset-email": "Email address:",
+       "passwordreset-emailtitle": "Account details on {{SITENAME}}",
+       "passwordreset-emailtext-ip": "Someone (probably you, from IP address $1) requested a reset of your\npassword for {{SITENAME}} ($4). The following user {{PLURAL:$3|account is|accounts are}}\nassociated with this email address:\n\n$2\n\n{{PLURAL:$3|This temporary password|These temporary passwords}} will expire in {{PLURAL:$5|one day|$5 days}}.\nYou should log in and choose a new password now. If someone else made this\nrequest, or if you have remembered your original password, and you no longer\nwish to change it, you may ignore this message and continue using your old\npassword.",
+       "passwordreset-emailtext-user": "User $1 on {{SITENAME}} requested a reset of your password for {{SITENAME}}\n($4). The following user {{PLURAL:$3|account is|accounts are}} associated with this email address:\n\n$2\n\n{{PLURAL:$3|This temporary password|These temporary passwords}} will expire in {{PLURAL:$5|one day|$5 days}}.\nYou should log in and choose a new password now. If someone else made this\nrequest, or if you have remembered your original password, and you no longer\nwish to change it, you may ignore this message and continue using your old\npassword.",
+       "passwordreset-emailelement": "Username: $1\nTemporary password: $2",
+       "passwordreset-emailsent": "A password reset email has been sent.",
+       "passwordreset-emailsent-capture": "A password reset email has been sent, which is shown below.",
+       "passwordreset-emailerror-capture": "A password reset email was generated, which is shown below, but sending it to the {{GENDER:$2|user}} failed: $1",
+       "changeemail": "Change email address",
+       "changeemail-summary": "",
+       "changeemail-header": "Change account email address",
+       "changeemail-text": "Complete this form to change your email address. You will need to enter your password to confirm this change.",
+       "changeemail-no-info": "You must be logged in to access this page directly.",
+       "changeemail-oldemail": "Current email address:",
+       "changeemail-newemail": "New email address:",
+       "changeemail-none": "(none)",
+       "changeemail-password": "Your {{SITENAME}} password:",
+       "changeemail-submit": "Change email",
+       "changeemail-cancel": "Cancel",
+       "changeemail-throttled": "You have made too many login attempts.\nPlease wait $1 before trying again.",
+       "resettokens": "Reset tokens",
+       "resettokens-summary": "",
+       "resettokens-text": "You can reset tokens which allow access to certain private data associated with your account here.\n\nYou should do it if you accidentally shared them with someone or if your account has been compromised.",
+       "resettokens-no-tokens": "There are no tokens to reset.",
+       "resettokens-legend": "Reset tokens",
+       "resettokens-tokens": "Tokens:",
+       "resettokens-token-label": "$1 (current value: $2)",
+       "resettokens-watchlist-token": "Token for the web feed (Atom/RSS) of [[Special:Watchlist|changes to pages on your watchlist]]",
+       "resettokens-done": "Tokens reset.",
+       "resettokens-resetbutton": "Reset selected tokens",
+       "bold_sample": "Bold text",
+       "bold_tip": "Bold text",
+       "italic_sample": "Italic text",
+       "italic_tip": "Italic text",
+       "link_sample": "Link title",
+       "link_tip": "Internal link",
+       "extlink_sample": "http://www.example.com link title",
+       "extlink_tip": "External link (remember http:// prefix)",
+       "headline_sample": "Headline text",
+       "headline_tip": "Level 2 headline",
+       "nowiki_sample": "Insert non-formatted text here",
+       "nowiki_tip": "Ignore wiki formatting",
+       "image_sample": "Example.jpg",
+       "image_tip": "Embedded file",
+       "media_sample": "Example.ogg",
+       "media_tip": "File link",
+       "sig_tip": "Your signature with timestamp",
+       "hr_tip": "Horizontal line (use sparingly)",
+       "summary": "Summary:",
+       "subject": "Subject/headline:",
+       "minoredit": "This is a minor edit",
+       "watchthis": "Watch this page",
+       "savearticle": "Save page",
+       "preview": "Preview",
+       "showpreview": "Show preview",
+       "showdiff": "Show changes",
+       "anoneditwarning": "<strong>Warning:</strong> You are not logged in.\nYour IP address will be recorded in this page's edit history.",
+       "anonpreviewwarning": "<em>You are not logged in. Saving will record your IP address in this page's edit history.</em>",
+       "missingsummary": "<strong>Reminder:</strong> You have not provided an edit summary.\nIf you click \"{{int:savearticle}}\" again, your edit will be saved without one.",
+       "missingcommenttext": "Please enter a comment below.",
+       "missingcommentheader": "<strong>Reminder:</strong> You have not provided a subject/headline for this comment.\nIf you click \"{{int:savearticle}}\" again, your edit will be saved without one.",
+       "summary-preview": "Summary preview:",
+       "subject-preview": "Subject/headline preview:",
+       "blockedtitle": "User is blocked",
+       "blockedtext": "<strong>Your username or IP address has been blocked.</strong>\n\nThe block was made by $1.\nThe reason given is <em>$2</em>.\n\n* Start of block: $8\n* Expiry of block: $6\n* Intended blockee: $7\n\nYou can contact $1 or another [[{{MediaWiki:Grouppage-sysop}}|administrator]] to discuss the block.\nYou cannot use the \"email this user\" feature unless a valid email address is specified in your [[Special:Preferences|account preferences]] and you have not been blocked from using it.\nYour current IP address is $3, and the block ID is #$5.\nPlease include all above details in any queries you make.",
+       "autoblockedtext": "Your IP address has been automatically blocked because it was used by another user, who was blocked by $1.\nThe reason given is:\n\n:<em>$2</em>\n\n* Start of block: $8\n* Expiry of block: $6\n* Intended blockee: $7\n\nYou may contact $1 or one of the other [[{{MediaWiki:Grouppage-sysop}}|administrators]] to discuss the block.\n\nNote that you may not use the \"email this user\" feature unless you have a valid email address registered in your [[Special:Preferences|user preferences]] and you have not been blocked from using it.\n\nYour current IP address is $3, and the block ID is #$5.\nPlease include all above details in any queries you make.",
+       "blockednoreason": "no reason given",
+       "whitelistedittext": "Please $1 to edit pages.",
+       "confirmedittext": "You must confirm your email address before editing pages.\nPlease set and validate your email address through your [[Special:Preferences|user preferences]].",
+       "nosuchsectiontitle": "Cannot find section",
+       "nosuchsectiontext": "You tried to edit a section that does not exist.\nIt may have been moved or deleted while you were viewing the page.",
+       "loginreqtitle": "Login required",
+       "loginreqlink": "log in",
+       "loginreqpagetext": "Please $1 to view other pages.",
+       "accmailtitle": "Password sent",
+       "accmailtext": "A randomly generated password for [[User talk:$1|$1]] has been sent to $2. It can be changed on the <em>[[Special:ChangePassword|change password]]</em> page upon logging in.",
+       "newarticle": "(New)",
+       "newarticletext": "You have followed a link to a page that does not exist yet.\nTo create the page, start typing in the box below (see the [$1 help page] for more info).\nIf you are here by mistake, click your browser's <strong>back</strong> button.",
+       "newarticletextanon": "{{int:newarticletext|$1}}",
+       "talkpagetext": "<!-- MediaWiki:talkpagetext -->",
+       "anontalkpagetext": "----\n<em>This is the discussion page for an anonymous user who has not created an account yet, or who does not use it.</em>\nWe therefore have to use the numerical IP address to identify him/her.\nSuch an IP address can be shared by several users.\nIf you are an anonymous user and feel that irrelevant comments have been directed at you, please [[Special:UserLogin/signup|create an account]] or [[Special:UserLogin|log in]] to avoid future confusion with other anonymous users.",
+       "noarticletext": "There is currently no text in this page.\nYou can [[Special:Search/{{PAGENAME}}|search for this page title]] in other pages,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} search the related logs],\nor [{{fullurl:{{FULLPAGENAME}}|action=edit}} edit this page]</span>.",
+       "noarticletext-nopermission": "There is currently no text in this page.\nYou can [[Special:Search/{{PAGENAME}}|search for this page title]] in other pages, or <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} search the related logs]</span>, but you do not have permission to create this page.",
+       "noarticletextanon": "{{int:noarticletext}}",
+       "missing-revision": "The revision #$1 of the page named \"{{FULLPAGENAME}}\" does not exist.\n\nThis is usually caused by following an outdated history link to a page that has been deleted.\nDetails can be found in the [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log].",
+       "userpage-userdoesnotexist": "User account \"$1\" is not registered.\nPlease check if you want to create/edit this page.",
+       "userpage-userdoesnotexist-view": "User account \"$1\" is not registered.",
+       "blocked-notice-logextract": "This user is currently blocked.\nThe latest block log entry is provided below for reference:",
+       "clearyourcache": "<strong>Note:</strong> After saving, you may have to bypass your browser's cache to see the changes.\n* <strong>Firefox / Safari:</strong> Hold <em>Shift</em> while clicking <em>Reload</em>, or press either <em>Ctrl-F5</em> or <em>Ctrl-R</em> (<em>⌘-R</em> on a Mac)\n* <strong>Google Chrome:</strong> Press <em>Ctrl-Shift-R</em> (<em>⌘-Shift-R</em> on a Mac)\n* <strong>Internet Explorer:</strong> Hold <em>Ctrl</em> while clicking <em>Refresh</em>, or press <em>Ctrl-F5</em>\n* <strong>Opera:</strong> Clear the cache in <em>Tools → Preferences</em>",
+       "usercssyoucanpreview": "<strong>Tip:</strong> Use the \"{{int:showpreview}}\" button to test your new CSS before saving.",
+       "userjsyoucanpreview": "<strong>Tip:</strong> Use the \"{{int:showpreview}}\" button to test your new JavaScript before saving.",
+       "usercsspreview": "<strong>Remember that you are only previewing your user CSS.\nIt has not yet been saved!</strong>",
+       "userjspreview": "<strong>Remember that you are only testing/previewing your user JavaScript.\nIt has not yet been saved!</strong>",
+       "sitecsspreview": "<strong>Remember that you are only previewing this CSS.\nIt has not yet been saved!</strong>",
+       "sitejspreview": "<strong>Remember that you are only previewing this JavaScript code.\nIt has not yet been saved!</strong>",
+       "userinvalidcssjstitle": "<strong>Warning:</strong> There is no skin \"$1\".\nCustom .css and .js pages use a lowercase title, e.g. {{ns:user}}:Foo/vector.css as opposed to {{ns:user}}:Foo/Vector.css.",
+       "updated": "(Updated)",
+       "note": "<strong>Note:</strong>",
+       "previewnote": "<strong>Remember that this is only a preview.</strong>\nYour changes have not yet been saved!",
+       "continue-editing": "Go to editing area",
+       "previewconflict": "This preview reflects the text in the upper text editing area as it will appear if you choose to save.",
+       "session_fail_preview": "<strong>Sorry! We could not process your edit due to a loss of session data.</strong>\nPlease try again.\nIf it still does not work, try [[Special:UserLogout|logging out]] and logging back in.",
+       "session_fail_preview_html": "<strong>Sorry! We could not process your edit due to a loss of session data.</strong>\n\n<em>Because {{SITENAME}} has raw HTML enabled, the preview is hidden as a precaution against JavaScript attacks.</em>\n\n<strong>If this is a legitimate edit attempt, please try again.</strong>\nIf it still does not work, try [[Special:UserLogout|logging out]] and logging back in.",
+       "token_suffix_mismatch": "<strong>Your edit has been rejected because your client mangled the punctuation characters in the edit token.</strong>\nThe edit has been rejected to prevent corruption of the page text.\nThis sometimes happens when you are using a buggy web-based anonymous proxy service.",
+       "edit_form_incomplete": "<strong>Some parts of the edit form did not reach the server; double-check that your edits are intact and try again.</strong>",
+       "editing": "Editing $1",
+       "creating": "Creating $1",
+       "editingsection": "Editing $1 (section)",
+       "editingcomment": "Editing $1 (new section)",
+       "editconflict": "Edit conflict: $1",
+       "explainconflict": "Someone else has changed this page since you started editing it.\nThe upper text area contains the page text as it currently exists.\nYour changes are shown in the lower text area.\nYou will have to merge your changes into the existing text.\n<strong>Only</strong> the text in the upper text area will be saved when you press \"{{int:savearticle}}\".",
+       "yourtext": "Your text",
+       "storedversion": "Stored revision",
+       "nonunicodebrowser": "<strong>Warning: Your browser is not Unicode compliant.</strong>\nA workaround is in place to allow you to safely edit pages: Non-ASCII characters will appear in the edit box as hexadecimal codes.",
+       "editingold": "<strong>Warning: You are editing an out-of-date revision of this page.</strong>\nIf you save it, any changes made since this revision will be lost.",
+       "yourdiff": "Differences",
+       "copyrightwarning": "Please note that all contributions to {{SITENAME}} are considered to be released under the $2 (see $1 for details).\nIf you do not want your writing to be edited mercilessly and redistributed at will, then do not submit it here.<br />\nYou are also promising us that you wrote this yourself, or copied it from a public domain or similar free resource.\n<strong>Do not submit copyrighted work without permission!</strong>",
+       "copyrightwarning2": "Please note that all contributions to {{SITENAME}} may be edited, altered, or removed by other contributors.\nIf you do not want your writing to be edited mercilessly, then do not submit it here.<br />\nYou are also promising us that you wrote this yourself, or copied it from a public domain or similar free resource (see $1 for details).\n<strong>Do not submit copyrighted work without permission!</strong>",
+       "editpage-head-copy-warn": "-",
+       "editpage-tos-summary": "-",
+       "longpage-hint": "-",
+       "longpageerror": "<strong>Error: The text you have submitted is {{PLURAL:$1|one kilobyte|$1 kilobytes}} long, which is longer than the maximum of {{PLURAL:$2|one kilobyte|$2 kilobytes}}.</strong>\nIt cannot be saved.",
+       "readonlywarning": "<strong>Warning: The database has been locked for maintenance, so you will not be able to save your edits right now.</strong>\nYou may wish to copy and paste your text into a text file and save it for later.\n\nThe administrator who locked it offered this explanation: $1",
+       "protectedpagewarning": "<strong>Warning: This page has been protected so that only users with administrator privileges can edit it.</strong>\nThe latest log entry is provided below for reference:",
+       "semiprotectedpagewarning": "<strong>Note:</strong> This page has been protected so that only registered users can edit it.\nThe latest log entry is provided below for reference:",
+       "cascadeprotectedwarning": "<strong>Warning:</strong> This page has been protected so that only users with administrator privileges can edit it because it is included in the following cascade-protected {{PLURAL:$1|page|pages}}:",
+       "titleprotectedwarning": "<strong>Warning: This page has been protected so that [[Special:ListGroupRights|specific rights]] are needed to create it.</strong>\nThe latest log entry is provided below for reference:",
+       "templatesused": "{{PLURAL:$1|Template|Templates}} used on this page:",
+       "templatesusedpreview": "{{PLURAL:$1|Template|Templates}} used in this preview:",
+       "templatesusedsection": "{{PLURAL:$1|Template|Templates}} used in this section:",
+       "template-protected": "(protected)",
+       "template-semiprotected": "(semi-protected)",
+       "hiddencategories": "This page is a member of {{PLURAL:$1|1 hidden category|$1 hidden categories}}:",
+       "edittools": "<!-- Text here will be shown below edit and upload forms. -->",
+       "edittools-upload": "-",
+       "nocreatetext": "{{SITENAME}} has restricted the ability to create new pages.\nYou can go back and edit an existing page, or [[Special:UserLogin|log in or create an account]].",
+       "nocreate-loggedin": "You do not have permission to create new pages.",
+       "sectioneditnotsupported-title": "Section editing not supported",
+       "sectioneditnotsupported-text": "Section editing is not supported in this page.",
+       "permissionserrors": "Permission error",
+       "permissionserrorstext": "You do not have permission to do that, for the following {{PLURAL:$1|reason|reasons}}:",
+       "permissionserrorstext-withaction": "You do not have permission to $2, for the following {{PLURAL:$1|reason|reasons}}:",
+       "recreate-moveddeleted-warn": "<strong>Warning: You are recreating a page that was previously deleted.</strong>\n\nYou should consider whether it is appropriate to continue editing this page.\nThe deletion and move log for this page are provided here for convenience:",
+       "moveddeleted-notice": "This page has been deleted.\nThe deletion and move log for the page are provided below for reference.",
+       "log-fulllog": "View full log",
+       "edit-hook-aborted": "Edit aborted by hook.\nIt gave no explanation.",
+       "edit-gone-missing": "Could not update the page.\nIt appears to have been deleted.",
+       "edit-conflict": "Edit conflict.",
+       "edit-no-change": "Your edit was ignored because no change was made to the text.",
+       "postedit-confirmation-created": "The page has been created.",
+       "postedit-confirmation-restored": "The page has been restored.",
+       "postedit-confirmation-saved": "Your edit was saved.",
+       "edit-already-exists": "Could not create a new page.\nIt already exists.",
+       "addsection-preload": "",
+       "addsection-editintro": "",
+       "defaultmessagetext": "Default message text",
+       "content-failed-to-parse": "Failed to parse $2 content for $1 model: $3",
+       "invalid-content-data": "Invalid content data",
+       "content-not-allowed-here": "\"$1\" content is not allowed on page [[$2]]",
+       "editwarning-warning": "Leaving this page may cause you to lose any changes you have made.\nIf you are logged in, you can disable this warning in the \"{{int:prefs-editing}}\" section of your preferences.",
+       "editpage-notsupportedcontentformat-title": "Content format not supported",
+       "editpage-notsupportedcontentformat-text": "The content format $1 is not supported by the content model $2.",
+       "content-model-wikitext": "wikitext",
+       "content-model-text": "plain text",
+       "content-model-javascript": "JavaScript",
+       "content-model-css": "CSS",
+       "expensive-parserfunction-warning": "<strong>Warning:</strong> This page contains too many expensive parser function calls.\n\nIt should have less than $2 {{PLURAL:$2|call|calls}}, there {{PLURAL:$1|is now $1 call|are now $1 calls}}.",
+       "expensive-parserfunction-category": "Pages with too many expensive parser function calls",
+       "post-expand-template-inclusion-warning": "<strong>Warning:</strong> Template include size is too large.\nSome templates will not be included.",
+       "post-expand-template-inclusion-category": "Pages where template include size is exceeded",
+       "post-expand-template-argument-warning": "<strong>Warning:</strong> This page contains at least one template argument that has a too large expansion size.\nThese arguments have been omitted.",
+       "post-expand-template-argument-category": "Pages containing omitted template arguments",
+       "parser-template-loop-warning": "Template loop detected: [[$1]]",
+       "parser-template-recursion-depth-warning": "Template recursion depth limit exceeded ($1)",
+       "language-converter-depth-warning": "Language converter depth limit exceeded ($1)",
+       "node-count-exceeded-category": "Pages where node-count is exceeded",
+       "node-count-exceeded-category-desc": "A category for pages where the node-count is exceeded.",
+       "node-count-exceeded-warning": "Page exceeded the node-count",
+       "expansion-depth-exceeded-category": "Pages where expansion depth is exceeded",
+       "expansion-depth-exceeded-category-desc": "This is a category for pages where the expansion depth is exceeded.",
+       "expansion-depth-exceeded-warning": "Page exceeded the expansion depth",
+       "parser-unstrip-loop-warning": "Unstrip loop detected",
+       "parser-unstrip-recursion-limit": "Unstrip recursion limit exceeded ($1)",
+       "converter-manual-rule-error": "Error detected in manual language conversion rule",
+       "undo-success": "The edit can be undone.\nPlease check the comparison below to verify that this is what you want to do, and then save the changes below to finish undoing the edit.",
+       "undo-failure": "The edit could not be undone due to conflicting intermediate edits.",
+       "undo-norev": "The edit could not be undone because it does not exist or was deleted.",
+       "undo-nochange": "The edit appears to have already been undone.",
+       "undo-summary": "Undo revision $1 by [[Special:Contributions/$2|$2]] ([[User talk:$2|talk]])",
+       "undo-summary-username-hidden": "Undo revision $1 by a hidden user",
+       "cantcreateaccounttitle": "Cannot create account",
+       "cantcreateaccount-text": "Account creation from this IP address (<strong>$1</strong>) has been blocked by [[User:$3|$3]].\n\nThe reason given by $3 is <em>$2</em>",
+       "cantcreateaccount-range-text": "Account creation from IP addresses in the range '''$1''', which includes your IP address ('''$4'''), has been blocked by [[User:$3|$3]].\n\nThe reason given by $3 is ''$2''",
+       "createaccount-hook-aborted": "$1",
+       "viewpagelogs": "View logs for this page",
+       "nohistory": "There is no edit history for this page.",
+       "currentrev": "Latest revision",
+       "currentrev-asof": "Latest revision as of $1",
+       "revisionasof": "Revision as of $1",
+       "revision-info": "Revision as of $1 by $2",
+       "revision-info-current": "-",
+       "revision-nav": "($1) $2{{int:pipe-separator}}$3 ($4){{int:pipe-separator}}$5 ($6)",
+       "previousrevision": "← Older revision",
+       "nextrevision": "Newer revision →",
+       "currentrevisionlink": "Latest revision",
+       "cur": "cur",
+       "next": "next",
+       "last": "prev",
+       "page_first": "first",
+       "page_last": "last",
+       "histlegend": "Diff selection: Mark the radio boxes of the revisions to compare and hit enter or the button at the bottom.<br />\nLegend: <strong>({{int:cur}})</strong> = difference with latest revision, <strong>({{int:last}})</strong> = difference with preceding revision, <strong>{{int:minoreditletter}}</strong> = minor edit.",
+       "history-fieldset-title": "Browse history",
+       "history-show-deleted": "Deleted only",
+       "history_copyright": "-",
+       "histfirst": "oldest",
+       "histlast": "newest",
+       "historysize": "({{PLURAL:$1|1 byte|$1 bytes}})",
+       "historyempty": "(empty)",
+       "history-feed-title": "Revision history",
+       "history-feed-description": "Revision history for this page on the wiki",
+       "history-feed-item-nocomment": "$1 at $2",
+       "history-feed-empty": "The requested page does not exist.\nIt may have been deleted from the wiki, or renamed.\nTry [[Special:Search|searching on the wiki]] for relevant new pages.",
+       "rev-deleted-comment": "(edit summary removed)",
+       "rev-deleted-user": "(username removed)",
+       "rev-deleted-event": "(log action removed)",
+       "rev-deleted-user-contribs": "[username or IP address removed - edit hidden from contributions]",
+       "rev-deleted-text-permission": "This page revision has been <strong>deleted</strong>.\nDetails can be found in the [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log].",
+       "rev-deleted-text-unhide": "This page revision has been <strong>deleted</strong>.\nDetails can be found in the [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log].\nYou can still [$1 view this revision] if you wish to proceed.",
+       "rev-suppressed-text-unhide": "This page revision has been <strong>suppressed</strong>.\nDetails can be found in the [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} suppression log].\nYou can still [$1 view this revision] if you wish to proceed.",
+       "rev-deleted-text-view": "This page revision has been <strong>deleted</strong>.\nYou can view it; details can be found in the [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log].",
+       "rev-suppressed-text-view": "This page revision has been <strong>suppressed</strong>.\nYou can view it; details can be found in the [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} suppression log].",
+       "rev-deleted-no-diff": "You cannot view this diff because one of the revisions has been <strong>deleted</strong>.\nDetails can be found in the [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log].",
+       "rev-suppressed-no-diff": "You cannot view this diff because one of the revisions has been <strong>deleted</strong>.",
+       "rev-deleted-unhide-diff": "One of the revisions of this diff has been <strong>deleted</strong>.\nDetails can be found in the [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log].\nYou can still [$1 view this diff] if you wish to proceed.",
+       "rev-suppressed-unhide-diff": "One of the revisions of this diff has been <strong>suppressed</strong>.\nDetails can be found in the [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} suppression log].\nYou can still [$1 view this diff] if you wish to proceed.",
+       "rev-deleted-diff-view": "One of the revisions of this diff has been <strong>deleted</strong>.\nYou can view this diff; details can be found in the [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log].",
+       "rev-suppressed-diff-view": "One of the revisions of this diff has been <strong>suppressed</strong>.\nYou can view this diff; details can be found in the [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} suppression log].",
+       "rev-delundel": "change visibility",
+       "rev-showdeleted": "show",
+       "revisiondelete": "Delete/undelete revisions",
+       "revdelete-nooldid-title": "Invalid target revision",
+       "revdelete-nooldid-text": "You have either not specified a target revision(s) to perform this\nfunction, the specified revision does not exist, or you are attempting to hide the current revision.",
+       "revdelete-no-file": "The file specified does not exist.",
+       "revdelete-show-file-confirm": "Are you sure you want to view a deleted revision of the file \"<nowiki>$1</nowiki>\" from $2 at $3?",
+       "revdelete-show-file-submit": "Yes",
+       "revdelete-selected-text": "{{PLURAL:$1|Selected revision|Selected revisions}} of [[:$2]]:",
+       "revdelete-selected-file": "{{PLURAL:$1|Selected file version|Selected file versions}} of [[:$2]]:",
+       "logdelete-selected": "{{PLURAL:$1|Selected log event|Selected log events}}:",
+       "revdelete-text-text": "Deleted revisions will still appear in the page history, but parts of their content will be inaccessible to the public.",
+       "revdelete-text-file": "Deleted file versions will still appear in the file history, but parts of their content will be inaccessible to the public.",
+       "logdelete-text": "Deleted log events will still appear in the logs, but parts of their content will be inaccessible to the public.",
+       "revdelete-text-others": "Other administrators on {{SITENAME}} will still be able to access the hidden content and can undelete it again through this same interface, unless additional restrictions are set.",
+       "revdelete-confirm": "Please confirm that you intend to do this, that you understand the consequences, and that you are doing this in accordance with [[{{MediaWiki:Policy-url}}|the policy]].",
+       "revdelete-suppress-text": "Suppression should <strong>only</strong> be used for the following cases:\n* potentially libelous information\n* inappropriate personal information\n*: <em>home addresses and telephone numbers, national identification numbers, etc.</em>",
+       "revdelete-legend": "Set visibility restrictions",
+       "revdelete-hide-text": "Revision text",
+       "revdelete-hide-image": "Hide file content",
+       "revdelete-hide-name": "Hide action and target",
+       "revdelete-hide-comment": "Edit summary",
+       "revdelete-hide-user": "Editor's username/IP address",
+       "revdelete-hide-restricted": "Suppress data from administrators as well as others",
+       "revdelete-radio-same": "(do not change)",
+       "revdelete-radio-set": "Hidden",
+       "revdelete-radio-unset": "Visible",
+       "revdelete-suppress": "Suppress data from administrators as well as others",
+       "revdelete-unsuppress": "Remove restrictions on restored revisions",
+       "revdelete-log": "Reason:",
+       "revdelete-submit": "Apply to selected {{PLURAL:$1|revision|revisions}}",
+       "revdelete-success": "<strong>Revision visibility successfully updated.</strong>",
+       "revdelete-failure": "<strong>Revision visibility could not be updated:</strong>\n$1",
+       "logdelete-success": "<strong>Log visibility successfully set.</strong>",
+       "logdelete-failure": "<strong>Log visibility could not be set:</strong>\n$1",
+       "revdel-restore": "change visibility",
+       "pagehist": "Page history",
+       "deletedhist": "Deleted history",
+       "revdelete-hide-current": "Error hiding the item dated $2, $1: This is the current revision.\nIt cannot be hidden.",
+       "revdelete-show-no-access": "Error showing the item dated $2, $1: This item has been marked \"restricted\".\nYou do not have access to it.",
+       "revdelete-modify-no-access": "Error modifying the item dated $2, $1: This item has been marked \"restricted\".\nYou do not have access to it.",
+       "revdelete-modify-missing": "Error modifying item ID $1: It is missing from the database!",
+       "revdelete-no-change": "<strong>Warning:</strong> The item dated $2, $1 already had the requested visibility settings.",
+       "revdelete-concurrent-change": "Error modifying the item dated $2, $1: Its status appears to have been changed by someone else while you attempted to modify it.\nPlease 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\n** Copyright violation\n** Inappropriate comment or personal information\n** Inappropriate username\n** Potentially libelous information",
+       "revdelete-otherreason": "Other/additional reason:",
+       "revdelete-reasonotherlist": "Other reason",
+       "revdelete-edit-reasonlist": "Edit delete reasons",
+       "revdelete-offender": "Revision author:",
+       "suppressionlog": "Suppression log",
+       "suppressionlogtext": "Below is a list of deletions and blocks involving content hidden from administrators.\nSee the [[Special:BlockList|block list]] for the list of currently operational bans and blocks.",
+       "mergehistory": "Merge page histories",
+       "mergehistory-header": "This page lets you merge revisions of the history of one source page into a newer page.\nMake sure that this change will maintain historical page continuity.",
+       "mergehistory-box": "Merge revisions of two pages:",
+       "mergehistory-from": "Source page:",
+       "mergehistory-into": "Destination page:",
+       "mergehistory-list": "Mergeable edit history",
+       "mergehistory-merge": "The following revisions of [[:$1]] can be merged into [[:$2]].\nUse the radio button column to merge in only the revisions created at and before the specified time.\nNote that using the navigation links will reset this column.",
+       "mergehistory-go": "Show mergeable edits",
+       "mergehistory-submit": "Merge revisions",
+       "mergehistory-empty": "No revisions can be merged.",
+       "mergehistory-success": "$3 {{PLURAL:$3|revision|revisions}} of [[:$1]] successfully merged into [[:$2]].",
+       "mergehistory-fail": "Unable to perform history merge, please recheck the page and time parameters.",
+       "mergehistory-no-source": "Source page $1 does not exist.",
+       "mergehistory-no-destination": "Destination page $1 does not exist.",
+       "mergehistory-invalid-source": "Source page must be a valid title.",
+       "mergehistory-invalid-destination": "Destination page must be a valid title.",
+       "mergehistory-autocomment": "Merged [[:$1]] into [[:$2]]",
+       "mergehistory-comment": "Merged [[:$1]] into [[:$2]]: $3",
+       "mergehistory-same-destination": "Source and destination pages cannot be the same",
+       "mergehistory-reason": "Reason:",
+       "mergehistory-revisionrow": "$1 ($2) $3 . . $4 $5 $6",
+       "mergelog": "Merge log",
+       "pagemerge-logentry": "merged [[$1]] into [[$2]] (revisions up to $3)",
+       "revertmerge": "Unmerge",
+       "mergelogpagetext": "Below is a list of the most recent merges of one page history into another.",
+       "history-title": "Revision history of \"$1\"",
+       "difference-title": "Difference between revisions of \"$1\"",
+       "difference-title-multipage": "Difference between pages \"$1\" and \"$2\"",
+       "difference-multipage": "(Difference between pages)",
+       "lineno": "Line $1:",
+       "compareselectedversions": "Compare selected revisions",
+       "showhideselectedversions": "Change visibility of selected revisions",
+       "editundo": "undo",
+       "diff-empty": "(No difference)",
+       "diff-multi-sameuser": "({{PLURAL:$1|One intermediate revision|$1 intermediate revisions}} by the same user not shown)",
+       "diff-multi-otherusers": "({{PLURAL:$1|One intermediate revision|$1 intermediate revisions}} by {{PLURAL:$2|one other user|$2 users}} not shown)",
+       "diff-multi-manyusers": "({{PLURAL:$1|One intermediate revision|$1 intermediate revisions}} by more than $2 {{PLURAL:$2|user|users}} not shown)",
+       "difference-missing-revision": "{{PLURAL:$2|One revision|$2 revisions}} of this difference ($1) {{PLURAL:$2|was|were}} not found.\n\nThis is usually caused by following an outdated diff link to a page that has been deleted.\nDetails can be found in the [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log].",
+       "search-summary": "",
+       "searchresults": "Search results",
+       "searchresults-title": "Search results for \"$1\"",
+       "toomanymatches": "Too many matches were returned, please try a different query",
+       "titlematches": "Page title matches",
+       "textmatches": "Page text matches",
+       "notextmatches": "No page text matches",
+       "prevn": "previous {{PLURAL:$1|$1}}",
+       "nextn": "next {{PLURAL:$1|$1}}",
+       "prevn-title": "Previous $1 {{PLURAL:$1|result|results}}",
+       "nextn-title": "Next $1 {{PLURAL:$1|result|results}}",
+       "shown-title": "Show $1 {{PLURAL:$1|result|results}} per page",
+       "viewprevnext": "View ($1 {{int:pipe-separator}} $2) ($3)",
+       "searchmenu-exists": "<strong>There is a page named \"[[:$1]]\" on this wiki.</strong> {{PLURAL:$2|0=|See also the other search results found.}}",
+       "searchmenu-new": "<strong>Create the page \"[[:$1]]\" on this wiki!</strong> {{PLURAL:$2|0=|See also the page found with your search.|See also the search results found.}}",
+       "searchmenu-new-nocreate": "",
+       "searchprofile-articles": "Content pages",
+       "searchprofile-project": "Help and Project pages",
+       "searchprofile-images": "Multimedia",
+       "searchprofile-everything": "Everything",
+       "searchprofile-advanced": "Advanced",
+       "searchprofile-articles-tooltip": "Search in $1",
+       "searchprofile-project-tooltip": "Search in $1",
+       "searchprofile-images-tooltip": "Search for files",
+       "searchprofile-everything-tooltip": "Search all of content (including talk pages)",
+       "searchprofile-advanced-tooltip": "Search in custom namespaces",
+       "search-result-size": "$1 ({{PLURAL:$2|1 word|$2 words}})",
+       "search-result-category-size": "{{PLURAL:$1|1 member|$1 members}} ({{PLURAL:$2|1 subcategory|$2 subcategories}}, {{PLURAL:$3|1 file|$3 files}})",
+       "search-result-score": "Relevance: $1%",
+       "search-redirect": "(redirect $1)",
+       "search-section": "(section $1)",
+       "search-file-match": "(matches file content)",
+       "search-suggest": "Did you mean: $1",
+       "search-interwiki-caption": "Sister projects",
+       "search-interwiki-default": "Results from $1:",
+       "search-interwiki-custom": "",
+       "search-interwiki-more": "(more)",
+       "search-relatedarticle": "Related",
+       "searcheverything-enable": "Search in all namespaces",
+       "searchrelated": "related",
+       "searchall": "all",
+       "showingresults": "Showing below up to {{PLURAL:$1|<strong>1</strong> result|<strong>$1</strong> results}} starting with #<strong>$2</strong>.",
+       "showingresultsinrange": "Showing below up to {{PLURAL:$1|<strong>1</strong> result|<strong>$1</strong> results}} in range #<strong>$2</strong> to #<strong>$3</strong>.",
+       "showingresultsnum": "Showing below {{PLURAL:$3|<strong>1</strong> result|<strong>$3</strong> results}} starting with #<strong>$2</strong>.",
+       "showingresultsheader": "{{PLURAL:$5|Result <strong>$1</strong> of <strong>$3</strong>|Results <strong>$1 - $2</strong> of <strong>$3</strong>}} for <strong>$4</strong>",
+       "search-nonefound": "There were no results matching the query.",
+       "powersearch-legend": "Advanced search",
+       "powersearch-ns": "Search in namespaces:",
+       "powersearch-togglelabel": "Check:",
+       "powersearch-toggleall": "All",
+       "powersearch-togglenone": "None",
+       "search-external": "External search",
+       "searchdisabled": "{{SITENAME}} search is disabled.\nYou can search via Google in the meantime.\nNote that their indexes of {{SITENAME}} content may be out of date.",
+       "googlesearch": "<form method=\"get\" action=\"//www.google.com/search\" id=\"googlesearch\">\n\t<input type=\"hidden\" name=\"domains\" value=\"{{SERVER}}\" />\n\t<input type=\"hidden\" name=\"num\" value=\"50\" />\n\t<input type=\"hidden\" name=\"ie\" value=\"$2\" />\n\t<input type=\"hidden\" name=\"oe\" value=\"$2\" />\n\n\t<input type=\"text\" name=\"q\" size=\"31\" maxlength=\"255\" value=\"$1\" />\n\t<input type=\"submit\" name=\"btnG\" value=\"$3\" />\n  <div>\n\t<input type=\"radio\" name=\"sitesearch\" id=\"gwiki\" value=\"{{SERVER}}\" checked=\"checked\" /><label for=\"gwiki\">{{SITENAME}}</label>\n\t<input type=\"radio\" name=\"sitesearch\" id=\"gWWW\" value=\"\" /><label for=\"gWWW\">WWW</label>\n  </div>\n</form>",
+       "search-error": "An error has occurred while searching: $1",
+       "opensearch-desc": "{{SITENAME}} ({{CONTENTLANGUAGE}})",
+       "preferences": "Preferences",
+       "preferences-summary": "",
+       "mypreferences": "Preferences",
+       "prefs-edits": "Number of edits:",
+       "prefsnologintext2": "Please $1 to change your preferences.",
+       "prefs-skin": "Skin",
+       "skin-preview": "Preview",
+       "datedefault": "No preference",
+       "prefs-labs": "Labs features",
+       "prefs-user-pages": "User pages",
+       "prefs-personal": "User profile",
+       "prefs-rc": "Recent changes",
+       "prefs-watchlist": "Watchlist",
+       "prefs-watchlist-days": "Days to show in watchlist:",
+       "prefs-watchlist-days-max": "Maximum $1 {{PLURAL:$1|day|days}}",
+       "prefs-watchlist-edits": "Maximum number of changes to show in expanded watchlist:",
+       "prefs-watchlist-edits-max": "Maximum number: 1000",
+       "prefs-watchlist-token": "Watchlist token:",
+       "prefs-misc": "Misc",
+       "prefs-resetpass": "Change password",
+       "prefs-changeemail": "Change email address",
+       "prefs-setemail": "Set an email address",
+       "prefs-email": "Email options",
+       "prefs-rendering": "Appearance",
+       "saveprefs": "Save",
+       "restoreprefs": "Restore all default settings (in all sections)",
+       "prefs-editing": "Editing",
+       "rows": "Rows:",
+       "columns": "Columns:",
+       "searchresultshead": "Search",
+       "stub-threshold": "Threshold for <a href=\"#\" class=\"stub\">stub link</a> formatting (bytes):",
+       "stub-threshold-disabled": "Disabled",
+       "recentchangesdays": "Days to show in recent changes:",
+       "recentchangesdays-max": "Maximum $1 {{PLURAL:$1|day|days}}",
+       "recentchangescount": "Number of edits to show by default:",
+       "prefs-help-recentchangescount": "This includes recent changes, page histories, and logs.",
+       "prefs-help-watchlist-token2": "This is the secret key to the web feed of your watchlist.\nAnyone who knows it will be able to read your watchlist, so do not share it.\nIf you need to, [[Special:ResetTokens|you can reset it]].",
+       "savedprefs": "Your preferences have been saved.",
+       "timezonelegend": "Time zone:",
+       "localtime": "Local time:",
+       "timezoneuseserverdefault": "Use wiki default ($1)",
+       "timezoneuseoffset": "Other (specify offset)",
+       "servertime": "Server time:",
+       "guesstimezone": "Fill in from browser",
+       "timezoneregion-africa": "Africa",
+       "timezoneregion-america": "America",
+       "timezoneregion-antarctica": "Antarctica",
+       "timezoneregion-arctic": "Arctic",
+       "timezoneregion-asia": "Asia",
+       "timezoneregion-atlantic": "Atlantic Ocean",
+       "timezoneregion-australia": "Australia",
+       "timezoneregion-europe": "Europe",
+       "timezoneregion-indian": "Indian Ocean",
+       "timezoneregion-pacific": "Pacific Ocean",
+       "allowemail": "Enable email from other users",
+       "prefs-searchoptions": "Search",
+       "prefs-namespaces": "Namespaces",
+       "defaultns": "Otherwise search in these namespaces:",
+       "default": "default",
+       "prefs-files": "Files",
+       "prefs-custom-css": "Custom CSS",
+       "prefs-custom-js": "Custom JavaScript",
+       "prefs-common-css-js": "Shared CSS/JavaScript for all skins:",
+       "prefs-reset-intro": "You can use this page to reset your preferences to the site defaults.\nThis cannot be undone.",
+       "prefs-emailconfirm-label": "Email confirmation:",
+       "youremail": "Email:",
+       "username": "{{GENDER:$1|Username}}:",
+       "prefs-memberingroups": "{{GENDER:$2|Member}} of {{PLURAL:$1|group|groups}}:",
+       "prefs-memberingroups-type": "$1",
+       "prefs-registration": "Registration time:",
+       "prefs-registration-date-time": "$1",
+       "yourrealname": "Real name:",
+       "yourlanguage": "Language:",
+       "yourvariant": "Content language variant:",
+       "prefs-help-variant": "Your preferred variant or orthography to display the content pages of this wiki in.",
+       "yournick": "New signature:",
+       "prefs-help-signature": "Comments on talk pages should be signed with \"<nowiki>~~~~</nowiki>\", which will be converted into your signature and a timestamp.",
+       "badsig": "Invalid raw signature.\nCheck HTML tags.",
+       "badsiglength": "Your signature is too long.\nIt must not be more than $1 {{PLURAL:$1|character|characters}} long.",
+       "yourgender": "How do you prefer to be described?",
+       "gender-unknown": "I prefer not to say",
+       "gender-male": "He edits wiki pages",
+       "gender-female": "She edits wiki pages",
+       "prefs-help-gender": "Setting this preference is optional.\nThe software uses its value to address you and to mention you to others using the appropriate grammatical gender.\nThis information will be public.",
+       "email": "Email",
+       "prefs-help-realname": "Real name is optional.\nIf you choose to provide it, this will be used for giving you attribution for your work.",
+       "prefs-help-email": "Email address is optional, but is needed for password resets, should you forget your password.",
+       "prefs-help-email-others": "You can also choose to let others contact you by email through a link on your user or talk page.\nYour email address is not revealed when other users contact you.",
+       "prefs-help-email-required": "Email address is required.",
+       "prefs-info": "Basic information",
+       "prefs-i18n": "Internationalisation",
+       "prefs-signature": "Signature",
+       "prefs-dateformat": "Date format",
+       "prefs-timeoffset": "Time offset",
+       "prefs-advancedediting": "General options",
+       "prefs-editor": "Editor",
+       "prefs-preview": "Preview",
+       "prefs-advancedrc": "Advanced options",
+       "prefs-advancedrendering": "Advanced options",
+       "prefs-advancedsearchoptions": "Advanced options",
+       "prefs-advancedwatchlist": "Advanced options",
+       "prefs-displayrc": "Display options",
+       "prefs-displaywatchlist": "Display options",
+       "prefs-tokenwatchlist": "Token",
+       "prefs-diffs": "Diffs",
+       "prefs-help-prefershttps": "This preference will take effect on your next login.",
+       "prefs-tabs-navigation-hint": "Tip: You can use the left and right arrow keys to navigate between the tabs in the tabs list.",
+       "email-address-validity-valid": "Email address appears valid",
+       "email-address-validity-invalid": "Enter a valid email address",
+       "userrights": "User rights management",
+       "userrights-summary": "",
+       "userrights-lookup-user": "Manage user groups",
+       "userrights-user-editname": "Enter a username:",
+       "editusergroup": "Edit user groups",
+       "editinguser": "Changing user rights of user <strong>[[User:$1|$1]]</strong> $2",
+       "userrights-editusergroup": "Edit user groups",
+       "saveusergroups": "Save user groups",
+       "userrights-groupsmember": "Member of:",
+       "userrights-groupsmember-auto": "Implicit member of:",
+       "userrights-groupsmember-type": "$1",
+       "userrights-groups-help": "You may alter the groups this user is in:\n* A checked box means the user is in that group.\n* An unchecked box means the user is not in that group.\n* A * indicates that you cannot remove the group once you have added it, or vice versa.",
+       "userrights-reason": "Reason:",
+       "userrights-no-interwiki": "You do not have permission to edit user rights on other wikis.",
+       "userrights-nodatabase": "Database $1 does not exist or is not local.",
+       "userrights-nologin": "You must [[Special:UserLogin|log in]] with an administrator account to assign user rights.",
+       "userrights-notallowed": "You do not have permission to add or remove user rights.",
+       "userrights-changeable-col": "Groups you can change",
+       "userrights-unchangeable-col": "Groups you cannot change",
+       "userrights-irreversible-marker": "$1*",
+       "userrights-conflict": "Conflict of user rights changes! Please review and confirm your changes.",
+       "userrights-removed-self": "You successfully removed your own rights. As such, you are no longer able to access this page.",
+       "group": "Group:",
+       "group-user": "Users",
+       "group-autoconfirmed": "Autoconfirmed users",
+       "group-bot": "Bots",
+       "group-sysop": "Administrators",
+       "group-bureaucrat": "Bureaucrats",
+       "group-suppress": "Oversights",
+       "group-all": "(all)",
+       "group-user-member": "{{GENDER:$1|user}}",
+       "group-autoconfirmed-member": "{{GENDER:$1|autoconfirmed user}}",
+       "group-bot-member": "{{GENDER:$1|bot}}",
+       "group-sysop-member": "{{GENDER:$1|administrator}}",
+       "group-bureaucrat-member": "{{GENDER:$1|bureaucrat}}",
+       "group-suppress-member": "{{GENDER:$1|oversight}}",
+       "grouppage-user": "{{ns:project}}:Users",
+       "grouppage-autoconfirmed": "{{ns:project}}:Autoconfirmed users",
+       "grouppage-bot": "{{ns:project}}:Bots",
+       "grouppage-sysop": "{{ns:project}}:Administrators",
+       "grouppage-bureaucrat": "{{ns:project}}:Bureaucrats",
+       "grouppage-suppress": "{{ns:project}}:Oversight",
+       "right-read": "Read pages",
+       "right-edit": "Edit pages",
+       "right-createpage": "Create pages (which are not discussion pages)",
+       "right-createtalk": "Create discussion pages",
+       "right-createaccount": "Create new user accounts",
+       "right-minoredit": "Mark edits as minor",
+       "right-move": "Move pages",
+       "right-move-subpages": "Move pages with their subpages",
+       "right-move-rootuserpages": "Move root user pages",
+       "right-move-categorypages": "Move category pages",
+       "right-movefile": "Move files",
+       "right-suppressredirect": "Not create redirects from source pages when moving pages",
+       "right-upload": "Upload files",
+       "right-reupload": "Overwrite existing files",
+       "right-reupload-own": "Overwrite existing files uploaded by oneself",
+       "right-reupload-shared": "Override files on the shared media repository locally",
+       "right-upload_by_url": "Upload files from a URL",
+       "right-purge": "Purge the site cache for a page without confirmation",
+       "right-autoconfirmed": "Not be affected by IP-based rate limits",
+       "right-bot": "Be treated as an automated process",
+       "right-nominornewtalk": "Not have minor edits to discussion pages trigger the new messages prompt",
+       "right-apihighlimits": "Use higher limits in API queries",
+       "right-writeapi": "Use of the write API",
+       "right-delete": "Delete pages",
+       "right-bigdelete": "Delete pages with large histories",
+       "right-deletelogentry": "Delete and undelete specific log entries",
+       "right-deleterevision": "Delete and undelete specific revisions of pages",
+       "right-deletedhistory": "View deleted history entries, without their associated text",
+       "right-deletedtext": "View deleted text and changes between deleted revisions",
+       "right-browsearchive": "Search deleted pages",
+       "right-undelete": "Undelete a page",
+       "right-suppressrevision": "Review and restore revisions hidden from administrators",
+       "right-suppressionlog": "View private logs",
+       "right-block": "Block other users from editing",
+       "right-blockemail": "Block a user from sending email",
+       "right-hideuser": "Block a username, hiding it from the public",
+       "right-ipblock-exempt": "Bypass IP blocks, auto-blocks and range blocks",
+       "right-proxyunbannable": "Bypass automatic blocks of proxies",
+       "right-unblockself": "Unblock oneself",
+       "right-protect": "Change protection levels and edit cascade-protected pages",
+       "right-editprotected": "Edit pages protected as \"{{int:protect-level-sysop}}\"",
+       "right-editsemiprotected": "Edit pages protected as \"{{int:protect-level-autoconfirmed}}\"",
+       "right-editinterface": "Edit the user interface",
+       "right-editusercssjs": "Edit other users' CSS and JavaScript files",
+       "right-editusercss": "Edit other users' CSS files",
+       "right-edituserjs": "Edit other users' JavaScript files",
+       "right-editmyusercss": "Edit your own user CSS files",
+       "right-editmyuserjs": "Edit your own user JavaScript files",
+       "right-viewmywatchlist": "View your own watchlist",
+       "right-editmywatchlist": "Edit your own watchlist. Note some actions will still add pages even without this right.",
+       "right-viewmyprivateinfo": "View your own private data (e.g. email address, real name)",
+       "right-editmyprivateinfo": "Edit your own private data (e.g. email address, real name)",
+       "right-editmyoptions": "Edit your own preferences",
+       "right-rollback": "Quickly rollback the edits of the last user who edited a particular page",
+       "right-markbotedits": "Mark rolled-back edits as bot edits",
+       "right-noratelimit": "Not be affected by rate limits",
+       "right-import": "Import pages from other wikis",
+       "right-importupload": "Import pages from a file upload",
+       "right-patrol": "Mark others' edits as patrolled",
+       "right-autopatrol": "Have one's own edits automatically marked as patrolled",
+       "right-patrolmarks": "View recent changes patrol marks",
+       "right-unwatchedpages": "View a list of unwatched pages",
+       "right-mergehistory": "Merge the history of pages",
+       "right-userrights": "Edit all user rights",
+       "right-userrights-interwiki": "Edit user rights of users on other wikis",
+       "right-siteadmin": "Lock and unlock the database",
+       "right-override-export-depth": "Export pages including linked pages up to a depth of 5",
+       "right-sendemail": "Send email to other users",
+       "right-passwordreset": "View password reset emails",
+       "newuserlogpage": "User creation log",
+       "newuserlogpagetext": "This is a log of user creations.",
+       "rightslog": "User rights log",
+       "rightslogtext": "This is a log of changes to user rights.",
+       "action-read": "read this page",
+       "action-edit": "edit this page",
+       "action-createpage": "create pages",
+       "action-createtalk": "create discussion pages",
+       "action-createaccount": "create this user account",
+       "action-history": "view the history of this page",
+       "action-minoredit": "mark this edit as minor",
+       "action-move": "move this page",
+       "action-move-subpages": "move this page, and its subpages",
+       "action-move-rootuserpages": "move root user pages",
+       "action-move-categorypages": "move category pages",
+       "action-movefile": "move this file",
+       "action-upload": "upload this file",
+       "action-reupload": "overwrite this existing file",
+       "action-reupload-shared": "override this file on a shared repository",
+       "action-upload_by_url": "upload this file from a URL",
+       "action-writeapi": "use the write API",
+       "action-delete": "delete this page",
+       "action-deleterevision": "delete this revision",
+       "action-deletedhistory": "view this page's deleted history",
+       "action-browsearchive": "search deleted pages",
+       "action-undelete": "undelete this page",
+       "action-suppressrevision": "review and restore this hidden revision",
+       "action-suppressionlog": "view this private log",
+       "action-block": "block this user from editing",
+       "action-protect": "change protection levels for this page",
+       "action-rollback": "quickly rollback the edits of the last user who edited a particular page",
+       "action-import": "import pages from another wiki",
+       "action-importupload": "import pages from a file upload",
+       "action-patrol": "mark others' edits as patrolled",
+       "action-autopatrol": "have your edit marked as patrolled",
+       "action-unwatchedpages": "view the list of unwatched pages",
+       "action-mergehistory": "merge the history of this page",
+       "action-userrights": "edit all user rights",
+       "action-userrights-interwiki": "edit user rights of users on other wikis",
+       "action-siteadmin": "lock or unlock the database",
+       "action-sendemail": "send emails",
+       "action-editmywatchlist": "edit your watchlist",
+       "action-viewmywatchlist": "view your watchlist",
+       "action-viewmyprivateinfo": "view your private information",
+       "action-editmyprivateinfo": "edit your private information",
+       "nchanges": "$1 {{PLURAL:$1|change|changes}}",
+       "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|since last visit}}",
+       "enhancedrc-history": "history",
+       "recentchanges": "Recent changes",
+       "recentchanges-url": "Special:RecentChanges",
+       "recentchanges-legend": "Recent changes options",
+       "recentchanges-summary": "Track the most recent changes to the wiki on this page.",
+       "recentchangestext": "-",
+       "recentchanges-noresult": "No changes during the given period matching these criteria.",
+       "recentchanges-feed-description": "Track the most recent changes to the wiki in this feed.",
+       "recentchanges-label-newpage": "This edit created a new page",
+       "recentchanges-label-minor": "This is a minor edit",
+       "recentchanges-label-bot": "This edit was performed by a bot",
+       "recentchanges-label-unpatrolled": "This edit has not yet been patrolled",
+       "recentchanges-label-plusminus": "The page size changed by this number of bytes",
+       "recentchanges-legend-heading": "'''Legend:'''",
+       "recentchanges-legend-newpage": "(also see [[Special:NewPages|list of new pages]])",
+       "recentchanges-legend-plusminus": "(<em>±123</em>)",
+       "rcnotefrom": "Below are the changes since <strong>$2</strong> (up to <strong>$1</strong> shown).",
+       "rclistfrom": "Show new changes starting from $2, $3",
+       "rcshowhideminor": "$1 minor edits",
+       "rcshowhideminor-show": "Show",
+       "rcshowhideminor-hide": "Hide",
+       "rcshowhidebots": "$1 bots",
+       "rcshowhidebots-show": "Show",
+       "rcshowhidebots-hide": "Hide",
+       "rcshowhideliu": "$1 registered users",
+       "rcshowhideliu-show": "Show",
+       "rcshowhideliu-hide": "Hide",
+       "rcshowhideanons": "$1 anonymous users",
+       "rcshowhideanons-show": "Show",
+       "rcshowhideanons-hide": "Hide",
+       "rcshowhidepatr": "$1 patrolled edits",
+       "rcshowhidepatr-show": "Show",
+       "rcshowhidepatr-hide": "Hide",
+       "rcshowhidemine": "$1 my edits",
+       "rcshowhidemine-show": "Show",
+       "rcshowhidemine-hide": "Hide",
+       "rclinks": "Show last $1 changes in last $2 days<br />$3",
+       "diff": "diff",
+       "hist": "hist",
+       "hide": "Hide",
+       "show": "Show",
+       "minoreditletter": "m",
+       "newpageletter": "N",
+       "boteditletter": "b",
+       "unpatrolledletter": "!",
+       "number_of_watching_users_RCview": "[$1]",
+       "number_of_watching_users_pageview": "[$1 watching {{PLURAL:$1|user|users}}]",
+       "rc_categories": "Limit to categories (separate with \"|\")",
+       "rc_categories_any": "Any",
+       "rc-change-size": "$1",
+       "rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} after change",
+       "newsectionsummary": "/* $1 */ new section",
+       "rc-enhanced-expand": "Show details",
+       "rc-enhanced-hide": "Hide details",
+       "rc-old-title": "originally created as \"$1\"",
+       "recentchangeslinked": "Related changes",
+       "recentchangeslinked-feed": "Related changes",
+       "recentchangeslinked-toolbox": "Related changes",
+       "recentchangeslinked-title": "Changes related to \"$1\"",
+       "recentchangeslinked-summary": "This is a list of changes made recently to pages linked from a specified page (or to members of a specified category).\nPages on [[Special:Watchlist|your watchlist]] are <strong>bold</strong>.",
+       "recentchangeslinked-page": "Page name:",
+       "recentchangeslinked-to": "Show changes to pages linked to the given page instead",
+       "upload": "Upload file",
+       "uploadbtn": "Upload file",
+       "reuploaddesc": "Cancel upload and return to the upload form",
+       "upload-tryagain": "Submit modified file description",
+       "uploadnologin": "Not logged in",
+       "uploadnologintext": "Please $1 to upload files.",
+       "upload_directory_missing": "The upload directory ($1) is missing and could not be created by the webserver.",
+       "upload_directory_read_only": "The upload directory ($1) is not writable by the webserver.",
+       "uploaderror": "Upload error",
+       "upload-summary": "",
+       "upload-recreate-warning": "<strong>Warning: A file by that name has been deleted or moved.</strong>\n\nThe deletion and move log for this page are provided here for convenience:",
+       "uploadtext": "Use the form below to upload files.\nTo view or search previously uploaded files go to the [[Special:FileList|list of uploaded files]], (re)uploads are also logged in the [[Special:Log/upload|upload log]], deletions in the [[Special:Log/delete|deletion log]].\n\nTo include a file in a page, use a link in one of the following forms:\n* <strong><code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code></strong> to use the full version of the file\n* <strong><code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|alt text]]</nowiki></code></strong> to use a 200 pixel wide rendition in a box in the left margin with \"alt text\" as description\n* <strong><code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code></strong> for directly linking to the file without displaying the file",
+       "upload-permitted": "Permitted file types: $1.",
+       "upload-preferred": "Preferred file types: $1.",
+       "upload-prohibited": "Prohibited file types: $1.",
+       "uploadfooter": "-",
+       "upload-default-description": "-",
+       "uploadlogpage": "Upload log",
+       "uploadlogpagetext": "Below is a list of the most recent file uploads.\nSee the [[Special:NewFiles|gallery of new files]] for a more visual overview.",
+       "filename": "Filename",
+       "filedesc": "Summary",
+       "fileuploadsummary": "Summary:",
+       "filereuploadsummary": "File changes:",
+       "filestatus": "Copyright status:",
+       "filesource": "Source:",
+       "ignorewarning": "Ignore warning and save file anyway",
+       "ignorewarnings": "Ignore any warnings",
+       "minlength1": "Filenames must be at least one letter.",
+       "illegalfilename": "The filename \"$1\" contains characters that are not allowed in page titles.\nPlease rename the file and try uploading it again.",
+       "filename-toolong": "Filenames may not be longer than 240 bytes.",
+       "badfilename": "Filename has been changed to \"$1\".",
+       "filetype-mime-mismatch": "File extension \".$1\" does not match the detected MIME type of the file ($2).",
+       "filetype-badmime": "Files of the MIME type \"$1\" are not allowed to be uploaded.",
+       "filetype-bad-ie-mime": "Cannot upload this file because Internet Explorer would detect it as \"$1\", which is a disallowed and potentially dangerous file type.",
+       "filetype-unwanted-type": "<strong>\".$1\"</strong> is an unwanted file type.\nPreferred {{PLURAL:$3|file type is|file types are}} $2.",
+       "filetype-banned-type": "<strong>\".$1\"</strong> {{PLURAL:$4|is not a permitted file type|are not permitted file types}}.\nPermitted {{PLURAL:$3|file type is|file types are}} $2.",
+       "filetype-missing": "The file has no extension (like \".jpg\").",
+       "empty-file": "The file you submitted was empty.",
+       "file-too-large": "The file you submitted was too large.",
+       "filename-tooshort": "The filename is too short.",
+       "filetype-banned": "This type of file is banned.",
+       "verification-error": "This file did not pass file verification.",
+       "hookaborted": "The modification you tried to make was aborted by an extension.",
+       "illegal-filename": "The filename is not allowed.",
+       "overwrite": "Overwriting an existing file is not allowed.",
+       "unknown-error": "An unknown error occurred.",
+       "tmp-create-error": "Could not create temporary file.",
+       "tmp-write-error": "Error writing temporary file.",
+       "large-file": "It is recommended that files are no larger than $1;\nthis file is $2.",
+       "largefileserver": "This file is bigger than the server is configured to allow.",
+       "emptyfile": "The file you uploaded seems to be empty.\nThis might be due to a typo in the filename.\nPlease check whether you really want to upload this file.",
+       "windows-nonascii-filename": "This wiki does not support filenames with special characters.",
+       "fileexists": "A file with this name exists already, please check <strong>[[:$1]]</strong> if you are not sure if you want to change it.\n[[$1|thumb]]",
+       "filepageexists": "The description page for this file has already been created at <strong>[[:$1]]</strong>, but no file with this name currently exists.\nThe summary you enter will not appear on the description page.\nTo make your summary appear there, you will need to manually edit it.\n[[$1|thumb]]",
+       "fileexists-extension": "A file with a similar name exists: [[$2|thumb]]\n* Name of the uploading file: <strong>[[:$1]]</strong>\n* Name of the existing file: <strong>[[:$2]]</strong>\nPlease choose a different name.",
+       "fileexists-thumbnail-yes": "The file seems to be an image of reduced size <em>(thumbnail)</em>.\n[[$1|thumb]]\nPlease check the file <strong>[[:$1]]</strong>.\nIf the checked file is the same image of original size it is not necessary to upload an extra thumbnail.",
+       "file-thumbnail-no": "The filename begins with <strong>$1</strong>.\nIt seems to be an image of reduced size <em>(thumbnail)</em>.\nIf you have this image in full resolution upload this one, otherwise change the filename please.",
+       "fileexists-forbidden": "A file with this name already exists, and cannot be overwritten.\nIf you still want to upload your file, please go back and use a new name.\n[[File:$1|thumb|center|$1]]",
+       "fileexists-shared-forbidden": "A file with this name exists already in the shared file repository.\nIf you still want to upload your file, please go back and use a new name.\n[[File:$1|thumb|center|$1]]",
+       "file-exists-duplicate": "This file is a duplicate of the following {{PLURAL:$1|file|files}}:",
+       "file-deleted-duplicate": "A file identical to this file ([[:$1]]) has previously been deleted.\nYou should check that file's deletion history before proceeding to re-upload it.",
+       "file-deleted-duplicate-notitle": "A file identical to this file has previously been deleted, and the title has been suppressed.\nYou should ask someone with the ability to view suppressed file data to review the situation before proceeding to re-upload it.",
+       "uploadwarning": "Upload warning",
+       "uploadwarning-text": "Please modify the file description below and try again.",
+       "savefile": "Save file",
+       "uploadedimage": "uploaded \"[[$1]]\"",
+       "overwroteimage": "uploaded a new version of \"[[$1]]\"",
+       "uploaddisabled": "Uploads disabled.",
+       "copyuploaddisabled": "Upload by URL disabled.",
+       "uploaddisabledtext": "File uploads are disabled.",
+       "php-uploaddisabledtext": "File uploads are disabled in PHP.\nPlease check the file_uploads setting.",
+       "uploadscripted": "This file contains HTML or script code that may be erroneously interpreted by a web browser.",
+       "uploadscriptednamespace": "This SVG file contains an illegal namespace \"$1\".",
+       "uploadinvalidxml": "The XML in the uploaded file could not be parsed.",
+       "uploadvirus": "The file contains a virus!\nDetails: $1",
+       "uploadjava": "The file is a ZIP file that contains a Java .class file.\nUploading Java files is not allowed because they can cause security restrictions to be bypassed.",
+       "upload-source": "Source file",
+       "sourcefilename": "Source filename:",
+       "sourceurl": "Source URL:",
+       "destfilename": "Destination filename:",
+       "upload-maxfilesize": "Maximum file size: $1",
+       "upload-description": "File description",
+       "upload-options": "Upload options",
+       "watchthisupload": "Watch this file",
+       "filewasdeleted": "A file of this name has been previously uploaded and subsequently deleted.\nYou should check the $1 before proceeding to upload it again.",
+       "filename-bad-prefix": "The name of the file you are uploading begins with <strong>\"$1\"</strong>, which is a non-descriptive name typically assigned automatically by digital cameras.\nPlease choose a more descriptive name for your file.",
+       "filename-prefix-blacklist": " #<!-- leave this line exactly as it is --> <pre>\n# Syntax is as follows:\n#   * Everything from a \"#\" character to the end of the line is a comment\n#   * Every non-blank line is a prefix for typical filenames assigned automatically by digital cameras\nCIMG # Casio\nDSC_ # Nikon\nDSCF # Fuji\nDSCN # Nikon\nDUW # some mobile phones\nIMG # generic\nJD # Jenoptik\nMGP # Pentax\nPICT # misc.\n #</pre> <!-- leave this line exactly as it is -->",
+       "upload-success-subj": "Successful upload",
+       "upload-success-msg": "Your upload from [$2] was successful. It is available here: [[:{{ns:file}}:$1]]",
+       "upload-failure-subj": "Upload problem",
+       "upload-failure-msg": "There was a problem with your upload from [$2]:\n\n$1",
+       "upload-warning-subj": "Upload warning",
+       "upload-warning-msg": "There was a problem with your upload from [$2]. You may return to the [[Special:Upload/stash/$1|upload form]] to correct this problem.",
+       "upload-proto-error": "Incorrect protocol",
+       "upload-proto-error-text": "Remote upload requires URLs beginning with <code>http://</code> or <code>ftp://</code>.",
+       "upload-file-error": "Internal error",
+       "upload-file-error-text": "An internal error occurred when attempting to create a temporary file on the server.\nPlease contact an [[Special:ListUsers/sysop|administrator]].",
+       "upload-misc-error": "Unknown upload error",
+       "upload-misc-error-text": "An unknown error occurred during the upload.\nPlease verify that the URL is valid and accessible and try again.\nIf the problem persists, contact an [[Special:ListUsers/sysop|administrator]].",
+       "upload-too-many-redirects": "The URL contained too many redirects",
+       "upload-http-error": "An HTTP error occurred: $1",
+       "upload-copy-upload-invalid-domain": "Copy uploads are not available from this domain.",
+       "backend-fail-stream": "Could not stream file \"$1\".",
+       "backend-fail-backup": "Could not backup file \"$1\".",
+       "backend-fail-notexists": "The file $1 does not exist.",
+       "backend-fail-hashes": "Could not get file hashes for comparison.",
+       "backend-fail-notsame": "A non-identical file already exists at \"$1\".",
+       "backend-fail-invalidpath": "\"$1\" is not a valid storage path.",
+       "backend-fail-delete": "Could not delete file \"$1\".",
+       "backend-fail-describe": "Could not change metadata for file \"$1\".",
+       "backend-fail-alreadyexists": "The file \"$1\" already exists.",
+       "backend-fail-store": "Could not store file \"$1\" at \"$2\".",
+       "backend-fail-copy": "Could not copy file \"$1\" to \"$2\".",
+       "backend-fail-move": "Could not move file \"$1\" to \"$2\".",
+       "backend-fail-opentemp": "Could not open temporary file.",
+       "backend-fail-writetemp": "Could not write to temporary file.",
+       "backend-fail-closetemp": "Could not close temporary file.",
+       "backend-fail-read": "Could not read file \"$1\".",
+       "backend-fail-create": "Could not write file \"$1\".",
+       "backend-fail-maxsize": "Could not write file \"$1\" because it is larger than {{PLURAL:$2|one byte|$2 bytes}}.",
+       "backend-fail-readonly": "The storage backend \"$1\" is currently read-only. The reason given is: \"<em>$2</em>\"",
+       "backend-fail-synced": "The file \"$1\" is in an inconsistent state within the internal storage backends",
+       "backend-fail-connect": "Could not connect to storage backend \"$1\".",
+       "backend-fail-internal": "An unknown error occurred in storage backend \"$1\".",
+       "backend-fail-contenttype": "Could not determine the content type of the file to store at \"$1\".",
+       "backend-fail-batchsize": "The storage backend was given a batch of $1 file {{PLURAL:$1|operation|operations}}; the limit is $2 {{PLURAL:$2|operation|operations}}.",
+       "backend-fail-usable": "Could not read or write file \"$1\" due to insufficient permissions or missing directories/containers.",
+       "filejournal-fail-dbconnect": "Could not connect to the journal database for storage backend \"$1\".",
+       "filejournal-fail-dbquery": "Could not update the journal database for storage backend \"$1\".",
+       "lockmanager-notlocked": "Could not unlock \"$1\"; it is not locked.",
+       "lockmanager-fail-closelock": "Could not close lock file for \"$1\".",
+       "lockmanager-fail-deletelock": "Could not delete lock file for \"$1\".",
+       "lockmanager-fail-acquirelock": "Could not acquire lock for \"$1\".",
+       "lockmanager-fail-openlock": "Could not open lock file for \"$1\".",
+       "lockmanager-fail-releaselock": "Could not release lock for \"$1\".",
+       "lockmanager-fail-db-bucket": "Could not contact enough lock databases in bucket $1.",
+       "lockmanager-fail-db-release": "Could not release locks on database $1.",
+       "lockmanager-fail-svr-acquire": "Could not acquire locks on server $1.",
+       "lockmanager-fail-svr-release": "Could not release locks on server $1.",
+       "zip-file-open-error": "An error was encountered when opening the file for ZIP checks.",
+       "zip-wrong-format": "The specified file was not a ZIP file.",
+       "zip-bad": "The file is a corrupt or otherwise unreadable ZIP file.\nIt cannot be properly checked for security.",
+       "zip-unsupported": "The file is a ZIP file that uses ZIP features not supported by MediaWiki.\nIt cannot be properly checked for security.",
+       "uploadstash": "Upload stash",
+       "uploadstash-summary": "This page provides access to files that are uploaded or in the process of uploading, but are not yet published to the wiki. These files are not visible to anyone but the user who uploaded them.",
+       "uploadstash-clear": "Clear stashed files",
+       "uploadstash-nofiles": "You have no stashed files.",
+       "uploadstash-badtoken": "Performing of that action was unsuccessful, perhaps because your editing credentials expired. Try again.",
+       "uploadstash-errclear": "Clearing the files was unsuccessful.",
+       "uploadstash-refresh": "Refresh the list of files",
+       "invalid-chunk-offset": "Invalid chunk offset",
+       "img-auth-accessdenied": "Access denied",
+       "img-auth-nopathinfo": "Missing PATH_INFO.\nYour server is not set up to pass this information.\nIt may be CGI-based and cannot support img_auth.\nSee https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization.",
+       "img-auth-notindir": "Requested path is not in the configured upload directory.",
+       "img-auth-badtitle": "Unable to construct a valid title from \"$1\".",
+       "img-auth-nologinnWL": "You are not logged in and \"$1\" is not in the whitelist.",
+       "img-auth-nofile": "File \"$1\" does not exist.",
+       "img-auth-isdir": "You are trying to access a directory \"$1\".\nOnly file access is allowed.",
+       "img-auth-streaming": "Streaming \"$1\".",
+       "img-auth-public": "The function of img_auth.php is to output files from a private wiki.\nThis wiki is configured as a public wiki.\nFor optimal security, img_auth.php is disabled.",
+       "img-auth-noread": "User does not have access to read \"$1\".",
+       "http-invalid-url": "Invalid URL: $1",
+       "http-invalid-scheme": "URLs with the \"$1\" scheme are not supported.",
+       "http-request-error": "HTTP request failed due to unknown error.",
+       "http-read-error": "HTTP read error.",
+       "http-timed-out": "HTTP request timed out.",
+       "http-curl-error": "Error fetching URL: $1",
+       "http-bad-status": "There was a problem during the HTTP request: $1 $2",
+       "upload-curl-error6": "Could not reach URL",
+       "upload-curl-error6-text": "The URL provided could not be reached.\nPlease double-check that the URL is correct and the site is up.",
+       "upload-curl-error28": "Upload timeout",
+       "upload-curl-error28-text": "The site took too long to respond.\nPlease check the site is up, wait a short while and try again.\nYou may want to try at a less busy time.",
+       "license": "Licensing:",
+       "license-header": "Licensing",
+       "nolicense": "None selected",
+       "licenses": "-",
+       "license-nopreview": "(Preview not available)",
+       "upload_source_url": "(a valid, publicly accessible URL)",
+       "upload_source_file": "(a file on your computer)",
+       "listfiles-summary": "This special page shows all uploaded files.",
+       "listfiles_search_for": "Search for media name:",
+       "imgfile": "file",
+       "listfiles": "File list",
+       "listfiles_thumb": "Thumbnail",
+       "listfiles_date": "Date",
+       "listfiles_name": "Name",
+       "listfiles_user": "User",
+       "listfiles_size": "Size",
+       "listfiles_description": "Description",
+       "listfiles_count": "Versions",
+       "listfiles-show-all": "Include old versions of images",
+       "listfiles-latestversion": "Current version",
+       "listfiles-latestversion-yes": "Yes",
+       "listfiles-latestversion-no": "No",
+       "file-anchor-link": "File",
+       "filehist": "File history",
+       "filehist-help": "Click on a date/time to view the file as it appeared at that time.",
+       "filehist-deleteall": "delete all",
+       "filehist-deleteone": "delete",
+       "filehist-revert": "revert",
+       "filehist-current": "current",
+       "filehist-datetime": "Date/Time",
+       "filehist-thumb": "Thumbnail",
+       "filehist-thumbtext": "Thumbnail for version as of $1",
+       "filehist-nothumb": "No thumbnail",
+       "filehist-user": "User",
+       "filehist-dimensions": "Dimensions",
+       "filehist-filesize": "File size",
+       "filehist-comment": "Comment",
+       "imagelinks": "File usage",
+       "linkstoimage": "The following {{PLURAL:$1|page links|$1 pages link}} to this file:",
+       "linkstoimage-more": "More than $1 {{PLURAL:$1|page links|pages link}} to this file.\nThe following list shows the {{PLURAL:$1|first page link|first $1 page links}} to this file only.\nA [[Special:WhatLinksHere/$2|full list]] is available.",
+       "nolinkstoimage": "There are no pages that link to this file.",
+       "morelinkstoimage": "View [[Special:WhatLinksHere/$1|more links]] to this file.",
+       "linkstoimage-redirect": "$1 (file redirect) $2",
+       "duplicatesoffile": "The following {{PLURAL:$1|file is a duplicate|$1 files are duplicates}} of this file ([[Special:FileDuplicateSearch/$2|more details]]):",
+       "sharedupload": "This file is from $1 and may be used by other projects.",
+       "sharedupload-desc-there": "This file is from $1 and may be used by other projects.\nPlease see the [$2 file description page] for further information.",
+       "sharedupload-desc-here": "This file is from $1 and may be used by other projects.\nThe description on its [$2 file description page] there is shown below.",
+       "sharedupload-desc-edit": "This file is from $1 and may be used by other projects.\nMaybe you want to edit the description on its [$2 file description page] there.",
+       "sharedupload-desc-create": "This file is from $1 and may be used by other projects.\nMaybe you want to edit the description on its [$2 file description page] there.",
+       "shareddescriptionfollows": "-",
+       "filepage-nofile": "No file by this name exists.",
+       "filepage-nofile-link": "No file by this name exists, but you can [$1 upload it].",
+       "uploadnewversion-linktext": "Upload a new version of this file",
+       "shared-repo-from": "from $1",
+       "shared-repo": "a shared repository",
+       "shared-repo-name-wikimediacommons": "Wikimedia Commons",
+       "filepage.css": "/* CSS placed here is included on the file description page, also included on foreign client wikis */",
+       "upload-disallowed-here": "You cannot overwrite this file.",
+       "filerevert": "Revert $1",
+       "filerevert-legend": "Revert file",
+       "filerevert-intro": "You are about to revert the file <strong>[[Media:$1|$1]]</strong> to the [$4 version as of $3, $2].",
+       "filerevert-comment": "Reason:",
+       "filerevert-defaultcomment": "Reverted to version as of $2, $1",
+       "filerevert-submit": "Revert",
+       "filerevert-success": "<strong>[[Media:$1|$1]]</strong> has been reverted to the [$4 version as of $3, $2].",
+       "filerevert-badversion": "There is no previous local version of this file with the provided timestamp.",
+       "filedelete": "Delete $1",
+       "filedelete-legend": "Delete file",
+       "filedelete-intro": "You are about to delete the file <strong>[[Media:$1|$1]]</strong> along with all of its history.",
+       "filedelete-intro-old": "You are deleting the version of <strong>[[Media:$1|$1]]</strong> as of [$4 $3, $2].",
+       "filedelete-comment": "Reason:",
+       "filedelete-submit": "Delete",
+       "filedelete-success": "<strong>$1</strong> has been deleted.",
+       "filedelete-success-old": "The version of <strong>[[Media:$1|$1]]</strong> as of $3, $2 has been deleted.",
+       "filedelete-nofile": "<strong>$1</strong> does not exist.",
+       "filedelete-nofile-old": "There is no archived version of <strong>$1</strong> with the specified attributes.",
+       "filedelete-otherreason": "Other/additional reason:",
+       "filedelete-reason-otherlist": "Other reason",
+       "filedelete-reason-dropdown": "*Common delete reasons\n** Copyright violation\n** Duplicated file",
+       "filedelete-edit-reasonlist": "Edit delete reasons",
+       "filedelete-maintenance": "Deletion and restoration of files temporarily disabled during maintenance.",
+       "filedelete-maintenance-title": "Cannot delete file",
+       "mimesearch": "MIME search",
+       "mimesearch-summary": "This page enables the filtering of files for their MIME type.\nInput: contenttype/subtype, e.g. <code>image/jpeg</code>.",
+       "mimetype": "MIME type:",
+       "download": "download",
+       "unwatchedpages": "Unwatched pages",
+       "unwatchedpages-summary": "",
+       "listredirects": "List of redirects",
+       "listredirects-summary": "",
+       "listduplicatedfiles": "List of files with duplicates",
+       "listduplicatedfiles-summary": "This is a list of files where the most recent version of the file is a duplicate of the most recent version of some other file. Only local files are considered.",
+       "listduplicatedfiles-entry": "[[:File:$1|$1]] has [[$3|{{PLURAL:$2|a duplicate|$2 duplicates}}]].",
+       "unusedtemplates": "Unused templates",
+       "unusedtemplates-summary": "",
+       "unusedtemplatestext": "This page lists all pages in the {{ns:template}} namespace that are not included in another page.\nRemember to check for other links to the templates before deleting them.",
+       "unusedtemplateswlh": "other links",
+       "randompage": "Random page",
+       "randompage-nopages": "There are no pages in the following {{PLURAL:$2|namespace|namespaces}}: $1.",
+       "randompage-url": "Special:Random",
+       "randomincategory": "Random page in category",
+       "randomincategory-invalidcategory": "\"$1\" is not a valid category name.",
+       "randomincategory-nopages": "There are no pages in the [[:Category:$1|$1]] category.",
+       "randomincategory-selectcategory": "Get random page from category: $1 $2.",
+       "randomincategory-selectcategory-submit": "Go",
+       "randomredirect": "Random redirect",
+       "randomredirect-nopages": "There are no redirects in the namespace \"$1\".",
+       "statistics": "Statistics",
+       "statistics-summary": "",
+       "statistics-header-pages": "Page statistics",
+       "statistics-header-edits": "Edit statistics",
+       "statistics-header-views": "View statistics",
+       "statistics-header-users": "User statistics",
+       "statistics-header-hooks": "Other statistics",
+       "statistics-articles": "Content pages",
+       "statistics-pages": "Pages",
+       "statistics-pages-desc": "All pages in the wiki, including talk pages, redirects, etc.",
+       "statistics-files": "Uploaded files",
+       "statistics-edits": "Page edits since {{SITENAME}} was set up",
+       "statistics-edits-average": "Average edits per page",
+       "statistics-views-total": "Views total",
+       "statistics-views-total-desc": "Views to non-existing pages and special pages are not included",
+       "statistics-views-peredit": "Views per edit",
+       "statistics-users": "Registered [[Special:ListUsers|users]]",
+       "statistics-users-active": "Active users",
+       "statistics-users-active-desc": "Users who have performed an action in the last {{PLURAL:$1|day|$1 days}}",
+       "statistics-mostpopular": "Most viewed pages",
+       "statistics-footer": "",
+       "pageswithprop": "Pages with a page property",
+       "pageswithprop-summary": "",
+       "pageswithprop-legend": "Pages with a page property",
+       "pageswithprop-text": "This page lists pages that use a particular page property.",
+       "pageswithprop-prop": "Property name:",
+       "pageswithprop-submit": "Go",
+       "pageswithprop-prophidden-long": "long text property value hidden ($1)",
+       "pageswithprop-prophidden-binary": "binary property value hidden ($1)",
+       "doubleredirects": "Double redirects",
+       "doubleredirects-summary": "",
+       "doubleredirectstext": "This page lists pages that redirect to other redirect pages.\nEach row contains links to the first and second redirect, as well as the target of the second redirect, which is usually the \"real\" target page to which the first redirect should point.\n<del>Crossed out</del> entries have been solved.",
+       "double-redirect-fixed-move": "[[$1]] has been moved.\nIt was automatically updated and now it redirects to [[$2]].",
+       "double-redirect-fixed-maintenance": "Automatically fixing double redirect from [[$1]] to [[$2]] in a maintenance job.",
+       "double-redirect-fixer": "Redirect fixer",
+       "brokenredirects": "Broken redirects",
+       "brokenredirects-summary": "",
+       "brokenredirectstext": "The following redirects link to non-existent pages:",
+       "brokenredirects-edit": "edit",
+       "brokenredirects-delete": "delete",
+       "withoutinterwiki": "Pages without language links",
+       "withoutinterwiki-summary": "The following pages do not link to other language versions.",
+       "withoutinterwiki-legend": "Prefix",
+       "withoutinterwiki-submit": "Show",
+       "fewestrevisions": "Pages with the fewest revisions",
+       "fewestrevisions-summary": "",
+       "nbytes": "$1 {{PLURAL:$1|byte|bytes}}",
+       "ncategories": "$1 {{PLURAL:$1|category|categories}}",
+       "ninterwikis": "$1 {{PLURAL:$1|interwiki|interwikis}}",
+       "nlinks": "$1 {{PLURAL:$1|link|links}}",
+       "nmembers": "$1 {{PLURAL:$1|member|members}}",
+       "nmemberschanged": "$1 → $2 {{PLURAL:$2|member|members}}",
+       "nrevisions": "$1 {{PLURAL:$1|revision|revisions}}",
+       "nviews": "$1 {{PLURAL:$1|view|views}}",
+       "nimagelinks": "Used on $1 {{PLURAL:$1|page|pages}}",
+       "ntransclusions": "used on $1 {{PLURAL:$1|page|pages}}",
+       "specialpage-empty": "There are no results for this report.",
+       "lonelypages": "Orphaned pages",
+       "lonelypages-summary": "",
+       "lonelypagestext": "The following pages are not linked from or transcluded into other pages in {{SITENAME}}.",
+       "uncategorizedpages": "Uncategorized pages",
+       "uncategorizedpages-summary": "",
+       "uncategorizedcategories": "Uncategorized categories",
+       "uncategorizedcategories-summary": "",
+       "uncategorizedimages": "Uncategorized files",
+       "uncategorizedimages-summary": "",
+       "uncategorizedtemplates": "Uncategorized templates",
+       "uncategorizedtemplates-summary": "",
+       "unusedcategories": "Unused categories",
+       "unusedcategories-summary": "",
+       "unusedimages": "Unused files",
+       "unusedimages-summary": "",
+       "popularpages": "Popular pages",
+       "popularpages-summary": "",
+       "wantedcategories": "Wanted categories",
+       "wantedcategories-summary": "",
+       "wantedpages": "Wanted pages",
+       "wantedpages-summary": "",
+       "wantedpages-badtitle": "Invalid title in result set: $1",
+       "wantedfiles": "Wanted files",
+       "wantedfiles-summary": "",
+       "wantedfiletext-cat": "The following files are used but do not exist. Files from foreign repositories may be listed despite existing. Any such false positives will be <del>struck out</del>. Additionally, pages that embed files that do not exist are listed in [[:$1]].",
+       "wantedfiletext-nocat": "The following files are used but do not exist. Files from foreign repositories may be listed despite existing. Any such false positives will be <del>struck out</del>.",
+       "wantedtemplates": "Wanted templates",
+       "wantedtemplates-summary": "",
+       "mostlinked": "Most linked-to pages",
+       "mostlinked-summary": "",
+       "mostlinkedcategories": "Most linked-to categories",
+       "mostlinkedcategories-summary": "",
+       "mostlinkedtemplates": "Most linked-to templates",
+       "mostlinkedtemplates-summary": "",
+       "mostcategories": "Pages with the most categories",
+       "mostcategories-summary": "",
+       "mostimages": "Most linked-to files",
+       "mostimages-summary": "",
+       "mostinterwikis": "Pages with the most interwikis",
+       "mostinterwikis-summary": "",
+       "mostrevisions": "Pages with the most revisions",
+       "mostrevisions-summary": "",
+       "prefixindex": "All pages with prefix",
+       "prefixindex-namespace": "All pages with prefix ($1 namespace)",
+       "prefixindex-summary": "",
+       "prefixindex-strip": "Strip prefix in list",
+       "shortpages": "Short pages",
+       "shortpages-summary": "",
+       "longpages": "Long pages",
+       "longpages-summary": "",
+       "deadendpages": "Dead-end pages",
+       "deadendpages-summary": "",
+       "deadendpagestext": "The following pages do not link to other pages in {{SITENAME}}.",
+       "protectedpages": "Protected pages",
+       "protectedpages-indef": "Indefinite protections only",
+       "protectedpages-summary": "This page lists existing pages that are currently protected. For a list of titles that are protected from creation, see [[{{#special:ProtectedTitles}}|{{int:protectedtitles}}]].",
+       "protectedpages-cascade": "Cascading protections only",
+       "protectedpages-noredirect": "Hide redirects",
+       "protectedpagesempty": "No pages are currently protected with these parameters.",
+       "protectedpages-timestamp": "Timestamp",
+       "protectedpages-page": "Page",
+       "protectedpages-expiry": "Expires",
+       "protectedpages-performer": "Protecting user",
+       "protectedpages-params": "Protection parameters",
+       "protectedpages-reason": "Reason",
+       "protectedpages-unknown-timestamp": "Unknown",
+       "protectedpages-unknown-performer": "Unknown user",
+       "protectedpages-unknown-reason": "—",
+       "protectedtitles": "Protected titles",
+       "protectedtitles-summary": "This page lists titles that are currently protected from creation. For a list of existing pages that are protected, see [[{{#special:ProtectedPages}}|{{int:protectedpages}}]].",
+       "protectedtitlesempty": "No titles are currently protected with these parameters.",
+       "listusers": "User list",
+       "listusers-summary": "",
+       "listusers-editsonly": "Show only users with edits",
+       "listusers-creationsort": "Sort by creation date",
+       "listusers-desc": "Sort in descending order",
+       "usereditcount": "$1 {{PLURAL:$1|edit|edits}}",
+       "usercreated": "{{GENDER:$3|Created}} on $1 at $2",
+       "newpages": "New pages",
+       "newpages-summary": "",
+       "newpages-username": "Username:",
+       "ancientpages": "Oldest pages",
+       "ancientpages-summary": "",
+       "move": "Move",
+       "movethispage": "Move this page",
+       "unusedimagestext": "The following files exist but are not embedded in any page.\nPlease note that other web sites may link to a file with a direct URL, and so may still be listed here despite being in active use.",
+       "unusedcategoriestext": "The following category pages exist, although no other page or category makes use of them.",
+       "notargettitle": "No target",
+       "notargettext": "You have not specified a target page or user to perform this function on.",
+       "nopagetitle": "No such target page",
+       "nopagetext": "The target page you have specified does not exist.",
+       "pager-newer-n": "{{PLURAL:$1|newer 1|newer $1}}",
+       "pager-older-n": "{{PLURAL:$1|older 1|older $1}}",
+       "suppress": "Oversight",
+       "querypage-disabled": "This special page is disabled for performance reasons.",
+       "booksources": "Book sources",
+       "booksources-summary": "",
+       "booksources-search-legend": "Search for book sources",
+       "booksources-isbn": "ISBN:",
+       "booksources-go": "Go",
+       "booksources-text": "Below is a list of links to other sites that sell new and used books, and may also have further information about books you are looking for:",
+       "booksources-invalid-isbn": "The given ISBN does not appear to be valid; check for errors copying from the original source.",
+       "rfcurl": "//tools.ietf.org/html/rfc$1",
+       "pubmedurl": "//www.ncbi.nlm.nih.gov/pubmed/$1?dopt=Abstract",
+       "specialloguserlabel": "Performer:",
+       "speciallogtitlelabel": "Target (title or user):",
+       "log": "Logs",
+       "all-logs-page": "All public logs",
+       "alllogstext": "Combined display of all available logs of {{SITENAME}}.\nYou can narrow down the view by selecting a log type, the username (case-sensitive), or the affected page (also case-sensitive).",
+       "logempty": "No matching items in log.",
+       "log-title-wildcard": "Search titles starting with this text",
+       "showhideselectedlogentries": "Change visibility of selected log entries",
+       "allpages": "All pages",
+       "allpages-summary": "",
+       "nextpage": "Next page ($1)",
+       "prevpage": "Previous page ($1)",
+       "allpagesfrom": "Display pages starting at:",
+       "allpagesto": "Display pages ending at:",
+       "allarticles": "All pages",
+       "allinnamespace": "All pages ($1 namespace)",
+       "allpagessubmit": "Go",
+       "allpagesprefix": "Display pages with prefix:",
+       "allpagesbadtitle": "The given page title was invalid or had an inter-language or inter-wiki prefix.\nIt may contain one or more characters that cannot be used in titles.",
+       "allpages-bad-ns": "{{SITENAME}} does not have namespace \"$1\".",
+       "allpages-hide-redirects": "Hide redirects",
+       "cachedspecial-viewing-cached-ttl": "You are viewing a cached version of this page, which can be up to $1 old.",
+       "cachedspecial-viewing-cached-ts": "You are viewing a cached version of this page, which might not be completely actual.",
+       "cachedspecial-refresh-now": "View latest.",
+       "categories": "Categories",
+       "categories-summary": "",
+       "categoriespagetext": "The following {{PLURAL:$1|category contains|categories contain}} pages or media.\n[[Special:UnusedCategories|Unused categories]] are not shown here.\nAlso see [[Special:WantedCategories|wanted categories]].",
+       "categoriesfrom": "Display categories starting at:",
+       "special-categories-sort-count": "sort by count",
+       "special-categories-sort-abc": "sort alphabetically",
+       "deletedcontributions": "Deleted user contributions",
+       "deletedcontributions-summary": "",
+       "deletedcontributions-title": "Deleted user contributions",
+       "sp-deletedcontributions-contribs": "contributions",
+       "linksearch": "External links search",
+       "linksearch-summary": "",
+       "linksearch-pat": "Search pattern:",
+       "linksearch-ns": "Namespace:",
+       "linksearch-ok": "Search",
+       "linksearch-text": "Wildcards such as \"*.wikipedia.org\" may be used.\nNeeds at least a top-level domain, for example \"*.org\".<br />\nSupported {{PLURAL:$2|protocol|protocols}}: <code>$1</code> (defaults to http:// if no protocol is specified).",
+       "linksearch-line": "$1 is linked from $2",
+       "linksearch-error": "Wildcards may appear only at the start of the hostname.",
+       "listusersfrom": "Display users starting at:",
+       "listusers-submit": "Show",
+       "listusers-noresult": "No user found.",
+       "listusers-blocked": "(blocked)",
+       "activeusers": "Active users list",
+       "activeusers-summary": "",
+       "activeusers-intro": "This is a list of users who had some kind of activity within the last $1 {{PLURAL:$1|day|days}}.",
+       "activeusers-count": "$1 {{PLURAL:$1|action|actions}} in the last {{PLURAL:$3|day|$3 days}}",
+       "activeusers-from": "Display users starting at:",
+       "activeusers-hidebots": "Hide bots",
+       "activeusers-hidesysops": "Hide administrators",
+       "activeusers-noresult": "No users found.",
+       "listgrouprights": "User group rights",
+       "listgrouprights-summary": "The following is a list of user groups defined on this wiki, with their associated access rights.\nThere may be [[{{MediaWiki:Listgrouprights-helppage}}|additional information]] about individual rights.",
+       "listgrouprights-key": "Legend:\n* <span class=\"listgrouprights-granted\">Granted right</span>\n* <span class=\"listgrouprights-revoked\">Revoked right</span>",
+       "listgrouprights-group": "Group",
+       "listgrouprights-rights": "Rights",
+       "listgrouprights-helppage": "Help:Group rights",
+       "listgrouprights-members": "(list of members)",
+       "listgrouprights-right-display": "<span class=\"listgrouprights-granted\">$1 <code>($2)</code></span>",
+       "listgrouprights-right-revoked": "<span class=\"listgrouprights-revoked\">$1 <code>($2)</code></span>",
+       "listgrouprights-addgroup": "Add {{PLURAL:$2|group|groups}}: $1",
+       "listgrouprights-removegroup": "Remove {{PLURAL:$2|group|groups}}: $1",
+       "listgrouprights-addgroup-all": "Add all groups",
+       "listgrouprights-removegroup-all": "Remove all groups",
+       "listgrouprights-addgroup-self": "Add {{PLURAL:$2|group|groups}} to own account: $1",
+       "listgrouprights-removegroup-self": "Remove {{PLURAL:$2|group|groups}} from own account: $1",
+       "listgrouprights-addgroup-self-all": "Add all groups to own account",
+       "listgrouprights-removegroup-self-all": "Remove all groups from own account",
+       "listgrouprights-namespaceprotection-header": "Namespace restrictions",
+       "listgrouprights-namespaceprotection-namespace": "Namespace",
+       "listgrouprights-namespaceprotection-restrictedto": "Right(s) allowing user to edit",
+       "trackingcategories": "Tracking categories",
+       "trackingcategories-summary": "This page lists tracking categories which are automatically populated by the MediaWiki software. Their names can be changed by altering the relevant system messages in the {{ns:8}} namespace.",
+       "trackingcategories-msg": "Tracking category",
+       "trackingcategories-name": "Message name",
+       "trackingcategories-desc": "Category inclusion criteria",
+       "noindex-category-desc": "The page is not indexed by robots because it has the magic word <code><nowiki>__NOINDEX__</nowiki></code> on it and is in a namespace where that flag is allowed.",
+       "index-category-desc": "The page has a <code><nowiki>__INDEX__</nowiki></code> on it (and is in a namespace where that flag is allowed), and hence is indexed by robots where it normally wouldn't be.",
+       "post-expand-template-inclusion-category-desc": "After expanding all the templates, the page size is bigger than <code>$wgMaxArticleSize</code>, so some templates weren't expanded.",
+       "post-expand-template-argument-category-desc": "After expanding a template argument (something in triple braces, like <code>{{{Foo}}}</code>), the page is bigger than <code>$wgMaxArticleSize</code>.",
+       "expensive-parserfunction-category-desc": "Too many expensive parser functions (like <code>#ifexist</code>) included on a page. See [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit].",
+       "broken-file-category-desc": "Category added if the page contains a broken file link (a link to embed a file when the file does not exist).",
+       "hidden-category-category-desc": "This is a category with <code><nowiki>__HIDDENCAT__</nowiki></code> on it, which prevents it from showing up in the category links box on pages, by default.",
+       "trackingcategories-nodesc": "No description available.",
+       "trackingcategories-disabled": "Category is disabled",
+       "mailnologin": "No send address",
+       "mailnologintext": "You must be [[Special:UserLogin|logged in]] and have a valid email address in your [[Special:Preferences|preferences]] to send email to other users.",
+       "emailuser": "Email this user",
+       "emailuser-title-target": "Email this {{GENDER:$1|user}}",
+       "emailuser-title-notarget": "Email user",
+       "emailuser-summary": "",
+       "emailpage": "Email user",
+       "emailpagetext": "You can use the form below to send an email message to this {{GENDER:$1|user}}.\nThe email address you entered in [[Special:Preferences|your user preferences]] will appear as the \"From\" address of the email, so the recipient will be able to reply directly to you.",
+       "defemailsubject": "{{SITENAME}} email from user \"$1\"",
+       "usermaildisabled": "User email disabled",
+       "usermaildisabledtext": "You cannot send email to other users on this wiki",
+       "noemailtitle": "No email address",
+       "noemailtext": "This user has not specified a valid email address.",
+       "nowikiemailtext": "This user has chosen not to receive email from other users.",
+       "emailnotarget": "Non-existent or invalid username for recipient.",
+       "emailtarget": "Enter username of recipient",
+       "emailusername": "Username:",
+       "emailusernamesubmit": "Submit",
+       "email-legend": "Send an email to another {{SITENAME}} user",
+       "emailfrom": "From:",
+       "emailto": "To:",
+       "emailsubject": "Subject:",
+       "emailmessage": "Message:",
+       "emailsend": "Send",
+       "emailccme": "Email me a copy of my message.",
+       "emailccsubject": "Copy of your message to $1: $2",
+       "emailsent": "Email sent",
+       "emailsenttext": "Your email message has been sent.",
+       "emailuserfooter": "This email was sent by $1 to $2 by the \"Email user\" function at {{SITENAME}}.",
+       "usermessage-summary": "Leaving system message.",
+       "usermessage-editor": "System messenger",
+       "usermessage-template": "MediaWiki:UserMessage",
+       "watchlist": "Watchlist",
+       "watchlist-summary": "",
+       "mywatchlist": "Watchlist",
+       "watchlistfor2": "For $1 $2",
+       "nowatchlist": "You have no items on your watchlist.",
+       "watchlistanontext": "Please $1 to view or edit items on your watchlist.",
+       "watchnologin": "Not logged in",
+       "addwatch": "Add to watchlist",
+       "addedwatchtext": "The page \"[[:$1]]\" has been added to your [[Special:Watchlist|watchlist]].\nFuture changes to this page and its associated talk page will be listed there.",
+       "removewatch": "Remove from watchlist",
+       "removedwatchtext": "The page \"[[:$1]]\" has been removed from [[Special:Watchlist|your watchlist]].",
+       "watch": "Watch",
+       "watchthispage": "Watch this page",
+       "unwatch": "Unwatch",
+       "unwatchthispage": "Stop watching",
+       "notanarticle": "Not a content page",
+       "notvisiblerev": "The last revision by a different user has been deleted",
+       "watchlist-details": "{{PLURAL:$1|$1 page|$1 pages}} on your watchlist, not separately counting talk pages.",
+       "wlheader-enotif": "Email notification is enabled.",
+       "wlheader-showupdated": "Pages that have been changed since you last visited them are shown in <strong>bold</strong>.",
+       "wlnote2": "Below are the changes in the last {{PLURAL:$1|hour|<strong>$1</strong> hours}}, as of $2, $3.",
+       "wlshowlast": "Show last $1 hours $2 days $3",
+       "watchlist-options": "Watchlist options",
+       "watching": "Watching...",
+       "unwatching": "Unwatching...",
+       "watcherrortext": "An error occurred while changing your watchlist settings for \"$1\".",
+       "enotif_reset": "Mark all pages visited",
+       "enotif_impersonal_salutation": "{{SITENAME}} user",
+       "enotif_subject_deleted": "{{SITENAME}} page $1 has been {{GENDER:$2|deleted}} by $2",
+       "enotif_subject_created": "{{SITENAME}} page $1 has been {{GENDER:$2|created}} by $2",
+       "enotif_subject_moved": "{{SITENAME}} page $1 has been {{GENDER:$2|moved}} by $2",
+       "enotif_subject_restored": "{{SITENAME}} page $1 has been {{GENDER:$2|restored}} by $2",
+       "enotif_subject_changed": "{{SITENAME}} page $1 has been {{GENDER:$2|changed}} by $2",
+       "enotif_body_intro_deleted": "The {{SITENAME}} page $1 has been {{GENDER:$2|deleted}} on $PAGEEDITDATE by $2, see $3.",
+       "enotif_body_intro_created": "The {{SITENAME}} page $1 has been {{GENDER:$2|created}} on $PAGEEDITDATE by $2, see $3 for the current revision.",
+       "enotif_body_intro_moved": "The {{SITENAME}} page $1 has been {{GENDER:$2|moved}} on $PAGEEDITDATE by $2, see $3 for the current revision.",
+       "enotif_body_intro_restored": "The {{SITENAME}} page $1 has been {{GENDER:$2|restored}} on $PAGEEDITDATE by $2, see $3 for the current revision.",
+       "enotif_body_intro_changed": "The {{SITENAME}} page $1 has been {{GENDER:$2|changed}} on $PAGEEDITDATE by $2, see $3 for the current revision.",
+       "enotif_lastvisited": "See $1 for all changes since your last visit.",
+       "enotif_lastdiff": "See $1 to view this change.",
+       "enotif_anon_editor": "anonymous user $1",
+       "enotif_body": "Dear $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nEditor's summary: $PAGESUMMARY $PAGEMINOREDIT\n\nContact the editor:\nmail: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nThere will be no other notifications in case of further activity unless you visit this page while logged in. You could also reset the notification flags for all your watched pages on your watchlist.\n\nYour friendly {{SITENAME}} notification system\n\n--\nTo change your email notification settings, visit\n{{canonicalurl:{{#special:Preferences}}}}\n\nTo change your watchlist settings, visit\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nTo delete the page from your watchlist, visit\n$UNWATCHURL\n\nFeedback and further assistance:\n$HELPPAGE",
+       "created": "created",
+       "changed": "changed",
+       "deletepage": "Delete page",
+       "confirm": "Confirm",
+       "excontent": "content was: \"$1\"",
+       "excontentauthor": "content was: \"$1\" (and the only contributor was \"[[Special:Contributions/$2|$2]]\")",
+       "exbeforeblank": "content before blanking was: \"$1\"",
+       "delete-confirm": "Delete \"$1\"",
+       "delete-legend": "Delete",
+       "historywarning": "<strong>Warning:</strong> The page you are about to delete has a history with approximately $1 {{PLURAL:$1|revision|revisions}}:",
+       "confirmdeletetext": "You are about to delete a page along with all of its history.\nPlease confirm that you intend to do this, that you understand the consequences, and that you are doing this in accordance with [[{{MediaWiki:Policy-url}}|the policy]].",
+       "actioncomplete": "Action complete",
+       "actionfailed": "Action failed",
+       "deletedtext": "\"$1\" has been deleted.\nSee $2 for a record of recent deletions.",
+       "dellogpage": "Deletion log",
+       "dellogpagetext": "Below is a list of the most recent deletions.",
+       "deletionlog": "deletion log",
+       "reverted": "Reverted to earlier revision",
+       "deletecomment": "Reason:",
+       "deleteotherreason": "Other/additional reason:",
+       "deletereasonotherlist": "Other reason",
+       "deletereason-dropdown": "* Common delete reasons\n** Spam\n** Vandalism\n** Copyright violation\n** Author request\n** Broken redirect",
+       "delete-edit-reasonlist": "Edit deletion reasons",
+       "delete-toobig": "This page has a large edit history, over $1 {{PLURAL:$1|revision|revisions}}.\nDeletion of such pages has been restricted to prevent accidental disruption of {{SITENAME}}.",
+       "delete-warning-toobig": "This page has a large edit history, over $1 {{PLURAL:$1|revision|revisions}}.\nDeleting it may disrupt database operations of {{SITENAME}};\nproceed with caution.",
+       "deleting-backlinks-warning": "'''Warning:''' [[Special:WhatLinksHere/{{FULLPAGENAME}}|Other pages]] link to or transclude the page you are about to delete.",
+       "rollback": "Roll back edits",
+       "rollback_short": "Rollback",
+       "rollbacklink": "rollback",
+       "rollbacklinkcount": "rollback $1 {{PLURAL:$1|edit|edits}}",
+       "rollbacklinkcount-morethan": "rollback more than $1 {{PLURAL:$1|edit|edits}}",
+       "rollbackfailed": "Rollback failed",
+       "cantrollback": "Cannot revert edit;\nlast contributor is only author of this page.",
+       "alreadyrolled": "Cannot rollback last edit of [[:$1]] by [[User:$2|$2]] ([[User talk:$2|talk]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]);\nsomeone else has edited or rolled back the page already.\n\nThe last edit to the page was by [[User:$3|$3]] ([[User talk:$3|talk]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
+       "editcomment": "The edit summary was: \"''$1''\".",
+       "revertpage": "Reverted edits by [[Special:Contributions/$2|$2]] ([[User talk:$2|talk]]) to last revision by [[User:$1|$1]]",
+       "revertpage-nouser": "Reverted edits by a hidden user to last revision by {{GENDER:$1|[[User:$1|$1]]}}",
+       "rollback-success": "Reverted edits by $1;\nchanged back to last revision by $2.",
+       "sessionfailure-title": "Session failure",
+       "sessionfailure": "There seems to be a problem with your login session;\nthis action has been canceled as a precaution against session hijacking.\nGo back to the previous page, reload that page and then try again.",
+       "protectlogpage": "Protection log",
+       "protectlogtext": "Below is a list of changes to page protections.\nSee the [[Special:ProtectedPages|protected pages list]] for the list of currently operational page protections.",
+       "protectedarticle": "protected \"[[$1]]\"",
+       "modifiedarticleprotection": "changed protection level for \"[[$1]]\"",
+       "unprotectedarticle": "removed protection from \"[[$1]]\"",
+       "movedarticleprotection": "moved protection settings from \"[[$2]]\" to \"[[$1]]\"",
+       "protect-title": "Change protection level for \"$1\"",
+       "protect-title-notallowed": "View protection level of \"$1\"",
+       "prot_1movedto2": "[[$1]] moved to [[$2]]",
+       "protect-badnamespace-title": "Non-protectable namespace",
+       "protect-badnamespace-text": "Pages in this namespace cannot be protected.",
+       "protect-norestrictiontypes-text": "This page cannot be protected as there are no restriction types available.",
+       "protect-norestrictiontypes-title": "Non-protectable page",
+       "protect-legend": "Confirm protection",
+       "protectcomment": "Reason:",
+       "protectexpiry": "Expires:",
+       "protect_expiry_invalid": "Expiry time is invalid.",
+       "protect_expiry_old": "Expiry time is in the past.",
+       "protect-unchain-permissions": "Unlock further protect options",
+       "protect-text": "Here you may view and change the protection level for the page <strong>$1</strong>.",
+       "protect-locked-blocked": "You cannot change protection levels while blocked.\nHere are the current settings for the page <strong>$1</strong>:",
+       "protect-locked-dblock": "Protection levels cannot be changed due to an active database lock.\nHere are the current settings for the page <strong>$1</strong>:",
+       "protect-locked-access": "Your account does not have permission to change page protection levels.\nHere are the current settings for the page <strong>$1</strong>:",
+       "protect-cascadeon": "This page is currently protected because it is included in the following {{PLURAL:$1|page, which has|pages, which have}} cascading protection turned on.\nChanges to this page's protection level will not affect the cascading protection.",
+       "protect-default": "Allow all users",
+       "protect-fallback": "Allow only users with \"$1\" permission",
+       "protect-level-autoconfirmed": "Allow only autoconfirmed users",
+       "protect-level-sysop": "Allow only administrators",
+       "protect-summary-desc": "[$1=$2] ($3)",
+       "protect-summary-cascade": "cascading",
+       "protect-expiring": "expires $1 (UTC)",
+       "protect-expiring-local": "expires $1",
+       "protect-expiry-indefinite": "indefinite",
+       "protect-cascade": "Protect pages included in this page (cascading protection)",
+       "protect-cantedit": "You cannot change the protection levels of this page because you do not have permission to edit it.",
+       "protect-othertime": "Other time:",
+       "protect-othertime-op": "other time",
+       "protect-existing-expiry": "Existing expiry time: $3, $2",
+       "protect-otherreason": "Other/additional reason:",
+       "protect-otherreason-op": "Other reason",
+       "protect-dropdown": "*Common protection reasons\n** Excessive vandalism\n** Excessive spamming\n** Counter-productive edit warring\n** High traffic page",
+       "protect-edit-reasonlist": "Edit protection reasons",
+       "protect-expiry-options": "1 hour:1 hour,1 day:1 day,1 week:1 week,2 weeks:2 weeks,1 month:1 month,3 months:3 months,6 months:6 months,1 year:1 year,infinite:infinite",
+       "restriction-type": "Permission:",
+       "restriction-level": "Restriction level:",
+       "minimum-size": "Min size",
+       "maximum-size": "Max size:",
+       "pagesize": "(bytes)",
+       "restriction-edit": "Edit",
+       "restriction-move": "Move",
+       "restriction-create": "Create",
+       "restriction-upload": "Upload",
+       "restriction-level-sysop": "fully protected",
+       "restriction-level-autoconfirmed": "semi protected",
+       "restriction-level-all": "any level",
+       "undelete": "View deleted pages",
+       "undelete-summary": "",
+       "undeletepage": "View and restore deleted pages",
+       "undeletepagetitle": "<strong>The following consists of deleted revisions of [[:$1|$1]]</strong>.",
+       "viewdeletedpage": "View deleted pages",
+       "undeletepagetext": "The following {{PLURAL:$1|page has been deleted but is|$1 pages have been deleted but are}} still in the archive and can be restored.\nThe archive may be periodically cleaned out.",
+       "undelete-fieldset-title": "Restore revisions",
+       "undeleteextrahelp": "To restore the page's entire history, leave all checkboxes deselected and click <strong><em>{{int:undeletebtn}}</em></strong>.\nTo perform a selective restoration, check the boxes corresponding to the revisions to be restored, and click <strong><em>{{int:undeletebtn}}</em></strong>.",
+       "undeleterevisions": "$1 {{PLURAL:$1|revision|revisions}} archived",
+       "undeletehistory": "If you restore the page, all revisions will be restored to the history.\nIf a new page with the same name has been created since the deletion, the restored revisions will appear in the prior history.",
+       "undeleterevdel": "Undeletion will not be performed if it will result in the top page or file revision being partially deleted.\nIn such cases, you must uncheck or unhide the newest deleted revision.",
+       "undeletehistorynoadmin": "This page has been deleted.\nThe reason for deletion is shown in the summary below, along with details of the users who had edited this page before deletion.\nThe actual text of these deleted revisions is only available to administrators.",
+       "undelete-revision": "Deleted revision of $1 (as of $4, at $5) by $3:",
+       "undeleterevision-missing": "Invalid or missing revision.\nYou may have a bad link, or the revision may have been restored or removed from the archive.",
+       "undelete-nodiff": "No previous revision found.",
+       "undeletebtn": "Restore",
+       "undeletelink": "view/restore",
+       "undeleteviewlink": "view",
+       "undeleteinvert": "Invert selection",
+       "undeletecomment": "Reason:",
+       "undeletedrevisions": "{{PLURAL:$1|1 revision|$1 revisions}} restored",
+       "undeletedrevisions-files": "{{PLURAL:$1|1 revision|$1 revisions}} and {{PLURAL:$2|1 file|$2 files}} restored",
+       "undeletedfiles": "{{PLURAL:$1|1 file|$1 files}} restored",
+       "cannotundelete": "Undelete failed:\n$1",
+       "undeletedpage": "<strong>$1 has been restored</strong>\n\nConsult the [[Special:Log/delete|deletion log]] for a record of recent deletions and restorations.",
+       "undelete-header": "See [[Special:Log/delete|the deletion log]] for recently deleted pages.",
+       "undelete-search-title": "Search deleted pages",
+       "undelete-search-box": "Search deleted pages",
+       "undelete-search-prefix": "Show pages starting with:",
+       "undelete-search-submit": "Search",
+       "undelete-no-results": "No matching pages found in the deletion archive.",
+       "undelete-filename-mismatch": "Cannot undelete file revision with timestamp $1: Filename mismatch.",
+       "undelete-bad-store-key": "Cannot undelete file revision with timestamp $1: File was missing before deletion.",
+       "undelete-cleanup-error": "Error deleting unused archive file \"$1\".",
+       "undelete-missing-filearchive": "Unable to restore file archive ID $1 because it is not in the database.\nIt may have already been undeleted.",
+       "undelete-error": "Error undeleting page",
+       "undelete-error-short": "Error undeleting file: $1",
+       "undelete-error-long": "Errors were encountered while undeleting the file:\n\n$1",
+       "undelete-show-file-confirm": "Are you sure you want to view the deleted revision of the file \"<nowiki>$1</nowiki>\" from $2 at $3?",
+       "undelete-show-file-submit": "Yes",
+       "undelete-revision-row": "$1 $2 ($3) $4 . . $5 $6 $7 $8 $9",
+       "namespace": "Namespace:",
+       "invert": "Invert selection",
+       "tooltip-invert": "Check this box to hide changes to pages within the selected namespace (and the associated namespace if checked)",
+       "namespace_association": "Associated namespace",
+       "tooltip-namespace_association": "Check this box to also include the talk or subject namespace associated with the selected namespace",
+       "blanknamespace": "(Main)",
+       "contributions": "{{GENDER:$1|User}} contributions",
+       "contributions-summary": "",
+       "contributions-title": "User contributions for $1",
+       "mycontris": "Contributions",
+       "contribsub2": "For {{GENDER:$3|$1}} ($2)",
+       "contributions-userdoesnotexist": "User account \"$1\" is not registered.",
+       "nocontribs": "No changes were found matching these criteria.",
+       "uctop": "(current)",
+       "month": "From month (and earlier):",
+       "year": "From year (and earlier):",
+       "sp-contributions-newbies": "Show contributions of new accounts only",
+       "sp-contributions-newbies-sub": "For new accounts",
+       "sp-contributions-newbies-title": "User contributions for new accounts",
+       "sp-contributions-blocklog": "block log",
+       "sp-contributions-suppresslog": "suppressed user contributions",
+       "sp-contributions-deleted": "deleted user contributions",
+       "sp-contributions-uploads": "uploads",
+       "sp-contributions-logs": "logs",
+       "sp-contributions-talk": "talk",
+       "sp-contributions-userrights": "user rights management",
+       "sp-contributions-blocked-notice": "This user is currently blocked.\nThe latest block log entry is provided below for reference:",
+       "sp-contributions-blocked-notice-anon": "This IP address is currently blocked.\nThe latest block log entry is provided below for reference:",
+       "sp-contributions-search": "Search for contributions",
+       "sp-contributions-username": "IP address or username:",
+       "sp-contributions-toponly": "Only show edits that are latest revisions",
+       "sp-contributions-newonly": "Only show edits that are page creations",
+       "sp-contributions-submit": "Search",
+       "sp-contributions-explain": "",
+       "sp-contributions-footer": "-",
+       "sp-contributions-footer-anon": "-",
+       "sp-contributions-footer-newbies": "-",
+       "whatlinkshere": "What links here",
+       "whatlinkshere-title": "Pages that link to \"$1\"",
+       "whatlinkshere-summary": "",
+       "whatlinkshere-page": "Page:",
+       "linkshere": "The following pages link to <strong>[[:$1]]</strong>:",
+       "nolinkshere": "No pages link to <strong>[[:$1]]</strong>.",
+       "nolinkshere-ns": "No pages link to <strong>[[:$1]]</strong> in the chosen namespace.",
+       "isredirect": "redirect page",
+       "istemplate": "transclusion",
+       "isimage": "file link",
+       "whatlinkshere-prev": "{{PLURAL:$1|previous|previous $1}}",
+       "whatlinkshere-next": "{{PLURAL:$1|next|next $1}}",
+       "whatlinkshere-links": "← links",
+       "whatlinkshere-hideredirs": "$1 redirects",
+       "whatlinkshere-hidetrans": "$1 transclusions",
+       "whatlinkshere-hidelinks": "$1 links",
+       "whatlinkshere-hideimages": "$1 file links",
+       "whatlinkshere-filters": "Filters",
+       "autoblockid": "Autoblock #$1",
+       "block": "Block user",
+       "unblock": "Unblock user",
+       "unblock-summary": "",
+       "blockip": "Block user",
+       "blockip-legend": "Block user",
+       "blockiptext": "Use the form below to block write access from a specific IP address or username.\nThis should be done only to prevent vandalism, and in accordance with [[{{MediaWiki:Policy-url}}|policy]].\nFill in a specific reason below (for example, citing particular pages that were vandalized).",
+       "ipaddressorusername": "IP address or username:",
+       "ipbexpiry": "Expiry:",
+       "ipbreason": "Reason:",
+       "ipbreason-dropdown": "*Common block reasons\n** Inserting false information\n** Removing content from pages\n** Spamming links to external sites\n** Inserting nonsense/gibberish into pages\n** Intimidating behavior/harassment\n** Abusing multiple accounts\n** Unacceptable username",
+       "ipb-hardblock": "Prevent logged-in users from editing from this IP address",
+       "ipbcreateaccount": "Prevent account creation",
+       "ipbemailban": "Prevent user from sending email",
+       "ipbenableautoblock": "Automatically block the last IP address used by this user, and any subsequent IP addresses they try to edit from",
+       "ipbsubmit": "Block this user",
+       "ipbother": "Other time:",
+       "ipboptions": "2 hours:2 hours,1 day:1 day,3 days:3 days,1 week:1 week,2 weeks:2 weeks,1 month:1 month,3 months:3 months,6 months:6 months,1 year:1 year,indefinite:infinite",
+       "ipbhidename": "Hide username from edits and lists",
+       "ipbwatchuser": "Watch this user's user and talk pages",
+       "ipb-disableusertalk": "Prevent this user from editing their own talk page while blocked",
+       "ipb-change-block": "Re-block the user with these settings",
+       "ipb-confirm": "Confirm block",
+       "badipaddress": "Invalid IP address",
+       "blockipsuccesssub": "Block succeeded",
+       "blockipsuccesstext": "[[Special:Contributions/$1|$1]] has been blocked.<br />\nSee the [[Special:BlockList|block list]] to review blocks.",
+       "ipb-blockingself": "You are about to block yourself! Are you sure you want to do that?",
+       "ipb-confirmhideuser": "You are about to block a user with \"hide user\" enabled. This will suppress the user's name in all lists and log entries. Are you sure you want to do that?",
+       "ipb-confirmaction": "If you are sure you really want to do it, please check the \"{{int:ipb-confirm}}\" field at the bottom.",
+       "ipb-edit-dropdown": "Edit block reasons",
+       "ipb-unblock-addr": "Unblock $1",
+       "ipb-unblock": "Unblock a username or IP address",
+       "ipb-blocklist": "View existing blocks",
+       "ipb-blocklist-contribs": "Contributions for $1",
+       "unblockip": "Unblock user",
+       "unblockiptext": "Use the form below to restore write access to a previously blocked IP address or username.",
+       "ipusubmit": "Remove this block",
+       "unblocked": "[[User:$1|$1]] has been unblocked.",
+       "unblocked-range": "$1 has been unblocked.",
+       "unblocked-id": "Block $1 has been removed.",
+       "blocklist": "Blocked users",
+       "ipblocklist": "Blocked users",
+       "ipblocklist-legend": "Find a blocked user",
+       "blocklist-userblocks": "Hide account blocks",
+       "blocklist-tempblocks": "Hide temporary blocks",
+       "blocklist-addressblocks": "Hide single IP blocks",
+       "blocklist-rangeblocks": "Hide range blocks",
+       "blocklist-timestamp": "Timestamp",
+       "blocklist-target": "Target",
+       "blocklist-expiry": "Expires",
+       "blocklist-by": "Blocking admin",
+       "blocklist-params": "Block parameters",
+       "blocklist-reason": "Reason",
+       "blocklist-summary": "",
+       "ipblocklist-submit": "Search",
+       "ipblocklist-localblock": "Local block",
+       "ipblocklist-otherblocks": "Other {{PLURAL:$1|block|blocks}}",
+       "infiniteblock": "infinite",
+       "expiringblock": "expires on $1 at $2",
+       "anononlyblock": "anon. only",
+       "noautoblockblock": "autoblock disabled",
+       "createaccountblock": "account creation disabled",
+       "emailblock": "email disabled",
+       "blocklist-nousertalk": "cannot edit own talk page",
+       "ipblocklist-empty": "The block list is empty.",
+       "ipblocklist-no-results": "The requested IP address or username is not blocked.",
+       "blocklink": "block",
+       "unblocklink": "unblock",
+       "change-blocklink": "change block",
+       "contribslink": "contribs",
+       "emaillink": "send email",
+       "autoblocker": "Autoblocked because your IP address has been recently used by \"[[User:$1|$1]]\".\nThe reason given for $1's block is \"$2\"",
+       "blocklogpage": "Block log",
+       "blocklog-showlog": "This user has been blocked previously.\nThe block log is provided below for reference:",
+       "blocklog-showsuppresslog": "This user has been blocked and hidden previously.\nThe suppress log is provided below for reference:",
+       "blocklogentry": "blocked [[$1]] with an expiry time of $2 $3",
+       "reblock-logentry": "changed block settings for [[$1]] with an expiry time of $2 $3",
+       "blocklogtext": "This is a log of user blocking and unblocking actions.\nAutomatically blocked IP addresses are not listed.\nSee the [[Special:BlockList|block list]] for the list of currently operational bans and blocks.",
+       "unblocklogentry": "unblocked $1",
+       "block-log-flags-anononly": "anonymous users only",
+       "block-log-flags-nocreate": "account creation disabled",
+       "block-log-flags-noautoblock": "autoblock disabled",
+       "block-log-flags-noemail": "email disabled",
+       "block-log-flags-nousertalk": "cannot edit own talk page",
+       "block-log-flags-angry-autoblock": "enhanced autoblock enabled",
+       "block-log-flags-hiddenname": "username hidden",
+       "range_block_disabled": "The administrator ability to create range blocks is disabled.",
+       "ipb_expiry_invalid": "Expiry time invalid.",
+       "ipb_expiry_temp": "Hidden username blocks must be permanent.",
+       "ipb_hide_invalid": "Unable to suppress this account; it has more than {{PLURAL:$1|one edit|$1 edits}}.",
+       "ipb_already_blocked": "\"$1\" is already blocked.",
+       "ipb-needreblock": "$1 is already blocked. Do you want to change the settings?",
+       "ipb-otherblocks-header": "Other {{PLURAL:$1|block|blocks}}",
+       "unblock-hideuser": "You cannot unblock this user, as their username has been hidden.",
+       "ipb_cant_unblock": "Error: Block ID $1 not found. It may have been unblocked already.",
+       "ipb_blocked_as_range": "Error: The IP address $1 is not blocked directly and cannot be unblocked.\nIt is, however, blocked as part of the range $2, which can be unblocked.",
+       "ip_range_invalid": "Invalid IP range.",
+       "ip_range_toolarge": "Range blocks larger than /$1 are not allowed.",
+       "proxyblocker": "Proxy blocker",
+       "proxyblockreason": "Your IP address has been blocked because it is an open proxy.\nPlease contact your Internet service provider or technical support of your organization and inform them of this serious security problem.",
+       "sorbs": "DNSBL",
+       "sorbsreason": "Your IP address is listed as an open proxy in the DNSBL used by {{SITENAME}}.",
+       "sorbs_create_account_reason": "Your IP address is listed as an open proxy in the DNSBL used by {{SITENAME}}.\nYou cannot create an account.",
+       "xffblockreason": "An IP address present in the X-Forwarded-For header, either yours or that of a proxy server you are using, has been blocked. The original block reason was: $1",
+       "cant-see-hidden-user": "The user you are trying to block has already been blocked and hidden.\nSince you do not have the hideuser right, you cannot see or edit the user's block.",
+       "ipbblocked": "You cannot block or unblock other users because you are yourself blocked.",
+       "ipbnounblockself": "You are not allowed to unblock yourself.",
+       "ipb-default-expiry": "",
+       "lockdb": "Lock database",
+       "unlockdb": "Unlock database",
+       "lockdbtext": "Locking the database will suspend the ability of all users to edit pages, change their preferences, edit their watchlists, and other things requiring changes in the database.\nPlease confirm that this is what you intend to do, and that you will unlock the database when your maintenance is done.",
+       "unlockdbtext": "Unlocking the database will restore the ability of all users to edit pages, change their preferences, edit their watchlists, and other things requiring changes in the database.\nPlease confirm that this is what you intend to do.",
+       "lockconfirm": "Yes, I really want to lock the database.",
+       "unlockconfirm": "Yes, I really want to unlock the database.",
+       "lockbtn": "Lock database",
+       "unlockbtn": "Unlock database",
+       "locknoconfirm": "You did not check the confirmation box.",
+       "lockdbsuccesssub": "Database lock succeeded",
+       "unlockdbsuccesssub": "Database lock removed",
+       "lockdbsuccesstext": "The database has been locked.<br />\nRemember to [[Special:UnlockDB|remove the lock]] after your maintenance is complete.",
+       "unlockdbsuccesstext": "The database has been unlocked.",
+       "lockfilenotwritable": "The database lock file is not writable.\nTo lock or unlock the database, this needs to be writable by the web server.",
+       "databasenotlocked": "The database is not locked.",
+       "lockedbyandtime": "(by {{GENDER:$1|$1}} on $2 at $3)",
+       "move-page": "Move $1",
+       "movepage-summary": "",
+       "move-page-legend": "Move page",
+       "movepagetext": "Using the form below will rename a page, moving all of its history to the new name.\nThe old title will become a redirect page to the new title.\nYou can update redirects that point to the original title automatically.\nIf you choose not to, be sure to check for [[Special:DoubleRedirects|double]] or [[Special:BrokenRedirects|broken redirects]].\nYou are responsible for making sure that links continue to point where they are supposed to go.\n\nNote that the page will <strong>not</strong> be moved if there is already a page at the new title, unless the latter is a redirect and has no past edit history.\nThis means that you can rename a page back to where it was renamed from if you make a mistake, and you cannot overwrite an existing page.\n\n<strong>Warning!</strong>\nThis can be a drastic and unexpected change for a popular page;\nplease be sure you understand the consequences of this before proceeding.",
+       "movepagetext-noredirectfixer": "Using the form below will rename a page, moving all of its history to the new name.\nThe old title will become a redirect page to the new title.\nBe sure to check for [[Special:DoubleRedirects|double]] or [[Special:BrokenRedirects|broken redirects]].\nYou are responsible for making sure that links continue to point where they are supposed to go.\n\nNote that the page will <strong>not</strong> be moved if there is already a page at the new title, unless it is a redirect and has no past edit history.\nThis means that you can rename a page back to where it was renamed from if you make a mistake, and you cannot overwrite an existing page.\n\n<strong>Warning!</strong>\nThis can be a drastic and unexpected change for a popular page;\nplease be sure you understand the consequences of this before proceeding.",
+       "movepagetalktext": "The associated talk page will be automatically moved along with it <strong>unless:</strong>\n*A non-empty talk page already exists under the new name, or\n*You uncheck the box below.\n\nIn those cases, you will have to move or merge the page manually if desired.",
+       "movearticle": "Move page:",
+       "moveuserpage-warning": "<strong>Warning:</strong> You are about to move a user page. Please note that only the page will be moved and the user will <em>not</em> be renamed.",
+       "movecategorypage-warning": "<strong>Warning:</strong> You are about to move a category page. Please note that only the page will be moved and any pages in the old category will <em>not</em> be recategorized into the new one.",
+       "movenologintext": "You must be a registered user and [[Special:UserLogin|logged in]] to move a page.",
+       "movenotallowed": "You do not have permission to move pages.",
+       "movenotallowedfile": "You do not have permission to move files.",
+       "cant-move-user-page": "You do not have permission to move user pages (apart from subpages).",
+       "cant-move-to-user-page": "You do not have permission to move a page to a user page (except to a user subpage).",
+       "cant-move-category-page": "You do not have permission to move category pages.",
+       "cant-move-to-category-page": "You do not have permission to move a page to a category page.",
+       "newtitle": "To new title:",
+       "move-watch": "Watch source page and target page",
+       "movepagebtn": "Move page",
+       "pagemovedsub": "Move succeeded",
+       "movepage-moved": "<strong>\"$1\" has been moved to \"$2\"</strong>",
+       "movepage-moved-redirect": "A redirect has been created.",
+       "movepage-moved-noredirect": "The creation of a redirect has been suppressed.",
+       "articleexists": "A page of that name already exists, or the name you have chosen is not valid.\nPlease choose another name.",
+       "cantmove-titleprotected": "You cannot move a page to this location because the new title has been protected from creation",
+       "movetalk": "Move associated talk page",
+       "move-subpages": "Move subpages (up to $1)",
+       "move-talk-subpages": "Move subpages of talk page (up to $1)",
+       "movepage-page-exists": "The page $1 already exists and cannot be automatically overwritten.",
+       "movepage-page-moved": "The page $1 has been moved to $2.",
+       "movepage-page-unmoved": "The page $1 could not be moved to $2.",
+       "movepage-max-pages": "The maximum of $1 {{PLURAL:$1|page|pages}} has been moved and no more will be moved automatically.",
+       "movelogpage": "Move log",
+       "movelogpagetext": "Below is a list of all page moves.",
+       "movesubpage": "{{PLURAL:$1|Subpage|Subpages}}",
+       "movesubpagetext": "This page has $1 {{PLURAL:$1|subpage|subpages}} shown below.",
+       "movenosubpage": "This page has no subpages.",
+       "movereason": "Reason:",
+       "move-redirect-text": "",
+       "category-move-redirect-override": "-",
+       "revertmove": "revert",
+       "delete_and_move": "Delete and move",
+       "delete_and_move_text": "== Deletion required ==\nThe destination page \"[[:$1]]\" already exists.\nDo you want to delete it to make way for the move?",
+       "delete_and_move_confirm": "Yes, delete the page",
+       "delete_and_move_reason": "Deleted to make way for move from \"[[$1]]\"",
+       "selfmove": "Source and destination titles are the same;\ncannot move a page over itself.",
+       "immobile-source-namespace": "Cannot move pages in namespace \"$1\"",
+       "immobile-target-namespace": "Cannot move pages into namespace \"$1\"",
+       "immobile-target-namespace-iw": "Interwiki link is not a valid target for page move.",
+       "immobile-source-page": "This page is not movable.",
+       "immobile-target-page": "Cannot move to that destination title.",
+       "bad-target-model": "The desired destination uses a different content model. Cannot convert from $1 to $2.",
+       "imagenocrossnamespace": "Cannot move file to non-file namespace",
+       "nonfile-cannot-move-to-file": "Cannot move non-file to file namespace",
+       "imagetypemismatch": "The new file extension does not match its type",
+       "imageinvalidfilename": "The target filename is invalid",
+       "fix-double-redirects": "Update any redirects that point to the original title",
+       "move-leave-redirect": "Leave a redirect behind",
+       "protectedpagemovewarning": "<strong>Warning:</strong> This page has been protected so that only users with administrator privileges can move it.\nThe latest log entry is provided below for reference:",
+       "semiprotectedpagemovewarning": "<strong>Note:</strong> This page has been protected so that only registered users can move it.\nThe latest log entry is provided below for reference:",
+       "move-over-sharedrepo": "== File exists ==\n[[:$1]] exists on a shared repository. Moving a file to this title will override the shared file.",
+       "file-exists-sharedrepo": "The filename chosen is already in use on a shared repository.\nPlease choose another name.",
+       "export": "Export pages",
+       "export-summary": "",
+       "exporttext": "You can export the text and editing history of a particular page or set of pages wrapped in some XML.\nThis can be imported into another wiki using MediaWiki via the [[Special:Import|import page]].\n\nTo export pages, enter the titles in the text box below, one title per line, and select whether you want the current revision as well as all old revisions, with the page history lines, or the current revision with the info about the last edit.\n\nIn the latter case you can also use a link, for example [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] for the page \"[[{{MediaWiki:Mainpage}}]]\".",
+       "exportall": "Export all pages",
+       "exportcuronly": "Include only the current revision, not the full history",
+       "exportnohistory": "----\n<strong>Note:</strong> Exporting the full history of pages through this form has been disabled due to performance reasons.",
+       "exportlistauthors": "Include a full list of contributors for each page",
+       "export-submit": "Export",
+       "export-addcattext": "Add pages from category:",
+       "export-addcat": "Add",
+       "export-addnstext": "Add pages from namespace:",
+       "export-addns": "Add",
+       "export-download": "Save as file",
+       "export-templates": "Include templates",
+       "export-pagelinks": "Include linked pages to a depth of:",
+       "allmessages": "System messages",
+       "allmessagesname": "Name",
+       "allmessagesdefault": "Default message text",
+       "allmessagescurrent": "Current message text",
+       "allmessagestext": "This is a list of system messages available in the MediaWiki namespace.\nPlease visit [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki Localisation] and [//translatewiki.net translatewiki.net] if you wish to contribute to the generic MediaWiki localisation.",
+       "allmessagesnotsupportedDB": "This page cannot be used because <strong>$wgUseDatabaseMessages</strong> has been disabled.",
+       "allmessages-filter-legend": "Filter",
+       "allmessages-filter": "Filter by customization state:",
+       "allmessages-filter-unmodified": "Unmodified",
+       "allmessages-filter-all": "All",
+       "allmessages-filter-modified": "Modified",
+       "allmessages-prefix": "Filter by prefix:",
+       "allmessages-language": "Language:",
+       "allmessages-filter-submit": "Go",
+       "allmessages-filter-translate": "Translate",
+       "thumbnail-more": "Enlarge",
+       "filemissing": "File missing",
+       "thumbnail_error": "Error creating thumbnail: $1",
+       "thumbnail_error_remote": "Error message from $1:\n$2",
+       "djvu_page_error": "DjVu page out of range",
+       "djvu_no_xml": "Unable to fetch XML for DjVu file",
+       "thumbnail-temp-create": "Unable to create temporary thumbnail file",
+       "thumbnail-dest-create": "Unable to save thumbnail to destination",
+       "thumbnail_invalid_params": "Invalid thumbnail parameters",
+       "thumbnail_dest_directory": "Unable to create destination directory",
+       "thumbnail_image-type": "Image type not supported",
+       "thumbnail_gd-library": "Incomplete GD library configuration: Missing function $1",
+       "thumbnail_image-missing": "File seems to be missing: $1",
+       "thumbnail_image-failure-limit": "There have been too many recent failed attempts ($1 or more) to render this thumbnail. Please try again later.",
+       "import": "Import pages",
+       "import-summary": "",
+       "importinterwiki": "Transwiki import",
+       "import-interwiki-text": "Select a wiki and page title to import.\nRevision dates and editors' names will be preserved.\nAll transwiki import actions are logged at the [[Special:Log/import|import log]].",
+       "import-interwiki-source": "Source wiki/page:",
+       "import-interwiki-history": "Copy all history revisions for this page",
+       "import-interwiki-templates": "Include all templates",
+       "import-interwiki-submit": "Import",
+       "import-interwiki-namespace": "Destination namespace:",
+       "import-interwiki-rootpage": "Destination root page (optional):",
+       "import-upload-filename": "Filename:",
+       "import-comment": "Comment:",
+       "importtext": "Please export the file from the source wiki using the [[Special:Export|export utility]].\nSave it to your computer and upload it here.",
+       "importstart": "Importing pages...",
+       "import-revision-count": "$1 {{PLURAL:$1|revision|revisions}}",
+       "importnopages": "No pages to import.",
+       "imported-log-entries": "Imported $1 {{PLURAL:$1|log entry|log entries}}.",
+       "importfailed": "Import failed: <nowiki>$1</nowiki>",
+       "importunknownsource": "Unknown import source type",
+       "importcantopen": "Could not open import file",
+       "importbadinterwiki": "Bad interwiki link",
+       "importsuccess": "Import finished!",
+       "importnosources": "No transwiki import sources have been defined and direct history uploads are disabled.",
+       "importnofile": "No import file was uploaded.",
+       "importuploaderrorsize": "Upload of import file failed.\nThe file is bigger than the allowed upload size.",
+       "importuploaderrorpartial": "Upload of import file failed.\nThe file was only partially uploaded.",
+       "importuploaderrortemp": "Upload of import file failed.\nA temporary folder is missing.",
+       "import-parse-failure": "XML import parse failure",
+       "import-noarticle": "No page to import!",
+       "import-nonewrevisions": "No revisions imported (all were either already present, or skipped due to errors).",
+       "xml-error-string": "$1 at line $2, col $3 (byte $4): $5",
+       "import-upload": "Upload XML data",
+       "import-token-mismatch": "Loss of session data.\nPlease try again.",
+       "import-invalid-interwiki": "Cannot import from the specified wiki.",
+       "import-error-edit": "Page \"$1\" is not imported because you are not allowed to edit it.",
+       "import-error-create": "Page \"$1\" is not imported because you are not allowed to create it.",
+       "import-error-interwiki": "Page \"$1\" is not imported because its name is reserved for external linking (interwiki).",
+       "import-error-special": "Page \"$1\" is not imported because it belongs to a special namespace that does not allow pages.",
+       "import-error-invalid": "Page \"$1\" is not imported because its name is invalid.",
+       "import-error-unserialize": "Revision $2 of page \"$1\" could not be unserialized. The revision was reported to use content model $3 serialized as $4.",
+       "import-error-bad-location": "Revision $2 using content model $3 cannot be stored on \"$1\" on this wiki, since that model is not supported on that page.",
+       "import-options-wrong": "Wrong {{PLURAL:$2|option|options}}: <nowiki>$1</nowiki>",
+       "import-rootpage-invalid": "Given root page is an invalid title.",
+       "import-rootpage-nosubpage": "Namespace \"$1\" of the root page does not allow subpages.",
+       "importlogpage": "Import log",
+       "importlogpagetext": "Administrative imports of pages with edit history from other wikis.",
+       "import-logentry-upload": "imported [[$1]] by file upload",
+       "import-logentry-upload-detail": "$1 {{PLURAL:$1|revision|revisions}}",
+       "import-logentry-interwiki": "transwikied $1",
+       "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|revision|revisions}} from $2",
+       "javascripttest": "JavaScript testing",
+       "javascripttest-backlink": "< $1",
+       "javascripttest-title": "Running $1 tests",
+       "javascripttest-pagetext-noframework": "This page is reserved for running JavaScript tests.",
+       "javascripttest-pagetext-unknownframework": "Unknown testing framework \"$1\".",
+       "javascripttest-pagetext-frameworks": "Please choose one of the following testing frameworks: $1",
+       "javascripttest-pagetext-skins": "Choose a skin to run the tests with:",
+       "javascripttest-qunit-name": "QUnit",
+       "javascripttest-qunit-intro": "See [$1 testing documentation] on mediawiki.org.",
+       "javascripttest-qunit-heading": "MediaWiki JavaScript QUnit test suite",
+       "accesskey-pt-userpage": ".",
+       "accesskey-pt-anonuserpage": ".",
+       "accesskey-pt-mytalk": "n",
+       "accesskey-pt-anontalk": "n",
+       "accesskey-pt-preferences": "",
+       "accesskey-pt-watchlist": "l",
+       "accesskey-pt-mycontris": "y",
+       "accesskey-pt-login": "o",
+       "accesskey-pt-logout": "",
+       "accesskey-ca-talk": "t",
+       "accesskey-ca-edit": "e",
+       "accesskey-ca-addsection": "+",
+       "accesskey-ca-viewsource": "e",
+       "accesskey-ca-history": "h",
+       "accesskey-ca-protect": "=",
+       "accesskey-ca-unprotect": "=",
+       "accesskey-ca-delete": "d",
+       "accesskey-ca-undelete": "d",
+       "accesskey-ca-move": "m",
+       "accesskey-ca-watch": "w",
+       "accesskey-ca-unwatch": "w",
+       "accesskey-search": "f",
+       "accesskey-search-go": "",
+       "accesskey-search-fulltext": "",
+       "accesskey-p-logo": "",
+       "accesskey-n-mainpage": "z",
+       "accesskey-n-mainpage-description": "z",
+       "accesskey-n-portal": "",
+       "accesskey-n-currentevents": "",
+       "accesskey-n-recentchanges": "r",
+       "accesskey-n-randompage": "x",
+       "accesskey-n-help": "",
+       "accesskey-t-whatlinkshere": "j",
+       "accesskey-t-recentchangeslinked": "k",
+       "accesskey-feed-rss": "",
+       "accesskey-feed-atom": "",
+       "accesskey-t-contributions": "",
+       "accesskey-t-emailuser": "",
+       "accesskey-t-permalink": "",
+       "accesskey-t-print": "p",
+       "accesskey-t-upload": "u",
+       "accesskey-t-specialpages": "q",
+       "accesskey-ca-nstab-main": "c",
+       "accesskey-ca-nstab-user": "c",
+       "accesskey-ca-nstab-media": "c",
+       "accesskey-ca-nstab-special": "",
+       "accesskey-ca-nstab-project": "a",
+       "accesskey-ca-nstab-image": "c",
+       "accesskey-ca-nstab-mediawiki": "c",
+       "accesskey-ca-nstab-template": "c",
+       "accesskey-ca-nstab-help": "c",
+       "accesskey-ca-nstab-category": "c",
+       "accesskey-minoredit": "i",
+       "accesskey-save": "s",
+       "accesskey-preview": "p",
+       "accesskey-diff": "v",
+       "accesskey-compareselectedversions": "v",
+       "accesskey-watch": "w",
+       "accesskey-upload": "s",
+       "accesskey-preferences-save": "s",
+       "accesskey-summary": "b",
+       "accesskey-userrights-set": "s",
+       "accesskey-blockip-block": "s",
+       "accesskey-export": "s",
+       "accesskey-import": "s",
+       "accesskey-watchlistedit-normal-submit": "s",
+       "accesskey-watchlistedit-raw-submit": "s",
+       "tooltip-pt-userpage": "Your user page",
+       "tooltip-pt-anonuserpage": "The user page for the IP address you are editing as",
+       "tooltip-pt-mytalk": "Your talk page",
+       "tooltip-pt-anontalk": "Discussion about edits from this IP address",
+       "tooltip-pt-preferences": "Your preferences",
+       "tooltip-pt-watchlist": "A list of pages you are monitoring for changes",
+       "tooltip-pt-mycontris": "A list of your contributions",
+       "tooltip-pt-login": "You are encouraged to log in; however, it is not mandatory",
+       "tooltip-pt-logout": "Log out",
+       "tooltip-ca-talk": "Discussion about the content page",
+       "tooltip-ca-edit": "You can edit this page. Please use the preview button before saving",
+       "tooltip-ca-addsection": "Start a new section",
+       "tooltip-ca-viewsource": "This page is protected.\nYou can view its source",
+       "tooltip-ca-history": "Past revisions of this page",
+       "tooltip-ca-protect": "Protect this page",
+       "tooltip-ca-unprotect": "Change protection of this page",
+       "tooltip-ca-delete": "Delete this page",
+       "tooltip-ca-undelete": "Restore the edits done to this page before it was deleted",
+       "tooltip-ca-move": "Move this page",
+       "tooltip-ca-watch": "Add this page to your watchlist",
+       "tooltip-ca-unwatch": "Remove this page from your watchlist",
+       "tooltip-search": "Search {{SITENAME}}",
+       "tooltip-search-go": "Go to a page with this exact name if exists",
+       "tooltip-search-fulltext": "Search the pages for this text",
+       "tooltip-p-logo": "Visit the main page",
+       "tooltip-n-mainpage": "Visit the main page",
+       "tooltip-n-mainpage-description": "Visit the main page",
+       "tooltip-n-portal": "About the project, what you can do, where to find things",
+       "tooltip-n-currentevents": "Find background information on current events",
+       "tooltip-n-recentchanges": "A list of recent changes in the wiki",
+       "tooltip-n-randompage": "Load a random page",
+       "tooltip-n-help": "The place to find out",
+       "tooltip-t-whatlinkshere": "A list of all wiki pages that link here",
+       "tooltip-t-recentchangeslinked": "Recent changes in pages linked from this page",
+       "tooltip-feed-rss": "RSS feed for this page",
+       "tooltip-feed-atom": "Atom feed for this page",
+       "tooltip-t-contributions": "A list of contributions of this user",
+       "tooltip-t-emailuser": "Send an email to this user",
+       "tooltip-t-upload": "Upload files",
+       "tooltip-t-specialpages": "A list of all special pages",
+       "tooltip-t-print": "Printable version of this page",
+       "tooltip-t-permalink": "Permanent link to this revision of the page",
+       "tooltip-ca-nstab-main": "View the content page",
+       "tooltip-ca-nstab-user": "View the user page",
+       "tooltip-ca-nstab-media": "View the media page",
+       "tooltip-ca-nstab-special": "This is a special page, you cannot edit the page itself",
+       "tooltip-ca-nstab-project": "View the project page",
+       "tooltip-ca-nstab-image": "View the file page",
+       "tooltip-ca-nstab-mediawiki": "View the system message",
+       "tooltip-ca-nstab-template": "View the template",
+       "tooltip-ca-nstab-help": "View the help page",
+       "tooltip-ca-nstab-category": "View the category page",
+       "tooltip-minoredit": "Mark this as a minor edit",
+       "tooltip-save": "Save your changes",
+       "tooltip-preview": "Preview your changes, please use this before saving!",
+       "tooltip-diff": "Show which changes you made to the text",
+       "tooltip-compareselectedversions": "See the differences between the two selected revisions of this page",
+       "tooltip-watch": "Add this page to your watchlist",
+       "tooltip-watchlistedit-normal-submit": "Remove titles",
+       "tooltip-watchlistedit-raw-submit": "Update watchlist",
+       "tooltip-recreate": "Recreate the page even though it has been deleted",
+       "tooltip-upload": "Start upload",
+       "tooltip-rollback": "\"Rollback\" reverts edit(s) to this page of the last contributor in one click",
+       "tooltip-undo": "\"Undo\" reverts this edit and opens the edit form in preview mode. It allows adding a reason in the summary.",
+       "tooltip-preferences-save": "Save preferences",
+       "tooltip-summary": "Enter a short summary",
+       "interlanguage-link-title": "$1 – $2",
+       "interlanguage-link-title-langonly": "$1",
+       "common.css": "/* CSS placed here will be applied to all skins */",
+       "cologneblue.css": "/* CSS placed here will affect users of the Cologne Blue skin */",
+       "monobook.css": "/* CSS placed here will affect users of the MonoBook skin */",
+       "modern.css": "/* CSS placed here will affect users of the Modern skin */",
+       "vector.css": "/* CSS placed here will affect users of the Vector skin */",
+       "print.css": "/* CSS placed here will affect the print output */",
+       "noscript.css": "/* CSS placed here will affect users with JavaScript disabled */",
+       "group-autoconfirmed.css": "/* CSS placed here will affect autoconfirmed users only */",
+       "group-user.css": "/* CSS placed here will affect registered users only */",
+       "group-bot.css": "/* CSS placed here will affect bots only */",
+       "group-sysop.css": "/* CSS placed here will affect sysops only */",
+       "group-bureaucrat.css": "/* CSS placed here will affect bureaucrats only */",
+       "common.js": "/* Any JavaScript here will be loaded for all users on every page load. */",
+       "cologneblue.js": "/* Any JavaScript here will be loaded for users using the Cologne Blue skin */",
+       "monobook.js": "/* Any JavaScript here will be loaded for users using the MonoBook skin */",
+       "modern.js": "/* Any JavaScript here will be loaded for users using the Modern skin */",
+       "vector.js": "/* Any JavaScript here will be loaded for users using the Vector skin */",
+       "group-autoconfirmed.js": "/* Any JavaScript here will be loaded for autoconfirmed users only */",
+       "group-user.js": "/* Any JavaScript here will be loaded for registered users only */",
+       "group-bot.js": "/* Any JavaScript here will be loaded for bots only */",
+       "group-sysop.js": "/* Any JavaScript here will be loaded for sysops only */",
+       "group-bureaucrat.js": "/* Any JavaScript here will be loaded for bureaucrats only */",
+       "anonymous": "Anonymous {{PLURAL:$1|user|users}} of {{SITENAME}}",
+       "siteuser": "{{SITENAME}} user $1",
+       "anonuser": "{{SITENAME}} anonymous user $1",
+       "lastmodifiedatby": "This page was last modified $2, $1 by $3.",
+       "othercontribs": "Based on work by $1.",
+       "others": "others",
+       "siteusers": "{{SITENAME}} {{PLURAL:$2|user|users}} $1",
+       "anonusers": "{{SITENAME}} anonymous {{PLURAL:$2|user|users}} $1",
+       "creditspage": "Page credits",
+       "nocredits": "There is no credits info available for this page.",
+       "spamprotectiontitle": "Spam protection filter",
+       "spamprotectiontext": "The text you wanted to save was blocked by the spam filter.\nThis is probably caused by a link to a blacklisted external site.",
+       "spamprotectionmatch": "The following text is what triggered our spam filter: $1",
+       "spambot_username": "MediaWiki spam cleanup",
+       "spam_reverting": "Reverting to last revision not containing links to $1",
+       "spam_blanking": "All revisions contained links to $1, blanking",
+       "spam_deleting": "All revisions contained links to $1, deleting",
+       "simpleantispam-label": "Anti-spam check.\nDo <strong>NOT</strong> fill this in!",
+       "pageinfo-header": "-",
+       "pageinfo-title": "Information for \"$1\"",
+       "pageinfo-not-current": "Sorry, it's impossible to provide this information for old revisions.",
+       "pageinfo-header-basic": "Basic information",
+       "pageinfo-header-edits": "Edit history",
+       "pageinfo-header-restrictions": "Page protection",
+       "pageinfo-header-properties": "Page properties",
+       "pageinfo-display-title": "Display title",
+       "pageinfo-default-sort": "Default sort key",
+       "pageinfo-length": "Page length (in bytes)",
+       "pageinfo-article-id": "Page ID",
+       "pageinfo-language": "Page content language",
+       "pageinfo-content-model": "Page content model",
+       "pageinfo-robot-policy": "Indexing by robots",
+       "pageinfo-robot-index": "Allowed",
+       "pageinfo-robot-noindex": "Disallowed",
+       "pageinfo-views": "Number of views",
+       "pageinfo-watchers": "Number of page watchers",
+       "pageinfo-few-watchers": "Fewer than $1 {{PLURAL:$1|watcher|watchers}}",
+       "pageinfo-redirects-name": "Number of redirects to this page",
+       "pageinfo-redirects-value": "$1",
+       "pageinfo-subpages-name": "Number of subpages of this page",
+       "pageinfo-subpages-value": "$1 ($2 {{PLURAL:$2|redirect|redirects}}; $3 {{PLURAL:$3|non-redirect|non-redirects}})",
+       "pageinfo-firstuser": "Page creator",
+       "pageinfo-firsttime": "Date of page creation",
+       "pageinfo-lastuser": "Latest editor",
+       "pageinfo-lasttime": "Date of latest edit",
+       "pageinfo-edits": "Total number of edits",
+       "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-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)",
+       "pageinfo-transclusions": "{{PLURAL:$1|Page|Pages}} transcluded on ($1)",
+       "pageinfo-footer": "-",
+       "pageinfo-toolboxlink": "Page information",
+       "pageinfo-redirectsto": "Redirects to",
+       "pageinfo-redirectsto-info": "info",
+       "pageinfo-contentpage": "Counted as a content page",
+       "pageinfo-contentpage-yes": "Yes",
+       "pageinfo-protect-cascading": "Protections are cascading from here",
+       "pageinfo-protect-cascading-yes": "Yes",
+       "pageinfo-protect-cascading-from": "Protections are cascading from",
+       "pageinfo-category-info": "Category information",
+       "pageinfo-category-pages": "Number of pages",
+       "pageinfo-category-subcats": "Number of subcategories",
+       "pageinfo-category-files": "Number of files",
+       "skinname-cologneblue": "Cologne Blue",
+       "skinname-monobook": "MonoBook",
+       "skinname-modern": "Modern",
+       "skinname-vector": "Vector",
+       "markaspatrolleddiff": "Mark as patrolled",
+       "markaspatrolledlink": "[$1]",
+       "markaspatrolledtext": "Mark this page as patrolled",
+       "markedaspatrolled": "Marked as patrolled",
+       "markedaspatrolledtext": "The selected revision of [[:$1]] has been marked as patrolled.",
+       "rcpatroldisabled": "Recent changes patrol disabled",
+       "rcpatroldisabledtext": "The recent changes patrol feature is currently disabled.",
+       "markedaspatrollederror": "Cannot mark as patrolled",
+       "markedaspatrollederrortext": "You need to specify a revision to mark as patrolled.",
+       "markedaspatrollederror-noautopatrol": "You are not allowed to mark your own changes as patrolled.",
+       "markedaspatrollednotify": "This change to $1 has been marked as patrolled.",
+       "markedaspatrollederrornotify": "Marking as patrolled failed.",
+       "patrol-log-page": "Patrol log",
+       "patrol-log-header": "This is a log of patrolled revisions.",
+       "log-show-hide-patrol": "$1 patrol log",
+       "deletedrevision": "Deleted old revision $1",
+       "filedeleteerror-short": "Error deleting file: $1",
+       "filedeleteerror-long": "Errors were encountered while deleting the file:\n\n$1",
+       "filedelete-missing": "The file \"$1\" cannot be deleted because it does not exist.",
+       "filedelete-old-unregistered": "The specified file revision \"$1\" is not in the database.",
+       "filedelete-current-unregistered": "The specified file \"$1\" is not in the database.",
+       "filedelete-archive-read-only": "The archive directory \"$1\" is not writable by the webserver.",
+       "previousdiff": "← Older edit",
+       "nextdiff": "Newer edit →",
+       "mediawarning": "<strong>Warning:</strong> This file type may contain malicious code.\nBy executing it, your system may be compromised.",
+       "imagemaxsize": "Image size limit:<br /><em>(for file description pages)</em>",
+       "thumbsize": "Thumbnail size:",
+       "widthheight": "$1 × $2",
+       "widthheightpage": "$1 × $2, $3 {{PLURAL:$3|page|pages}}",
+       "file-info": "file size: $1, MIME type: $2",
+       "file-info-size": "$1 × $2 pixels, file size: $3, MIME type: $4",
+       "file-info-size-pages": "$1 × $2 pixels, file size: $3, MIME type: $4, $5 {{PLURAL:$5|page|pages}}",
+       "file-nohires": "No higher resolution available.",
+       "svg-long-desc": "SVG file, nominally $1 × $2 pixels, file size: $3",
+       "svg-long-desc-animated": "Animated SVG file, nominally $1 × $2 pixels, file size: $3",
+       "svg-long-error": "Invalid SVG file: $1",
+       "show-big-image": "Original file",
+       "show-big-image-preview": "Size of this preview: $1.",
+       "show-big-image-other": "Other {{PLURAL:$2|resolution|resolutions}}: $1.",
+       "show-big-image-size": "$1 × $2 pixels",
+       "file-info-gif-looped": "looped",
+       "file-info-gif-frames": "$1 {{PLURAL:$1|frame|frames}}",
+       "file-info-png-looped": "looped",
+       "file-info-png-repeat": "played $1 {{PLURAL:$1|time|times}}",
+       "file-info-png-frames": "$1 {{PLURAL:$1|frame|frames}}",
+       "file-no-thumb-animation": "<strong>Note: Due to technical limitations, thumbnails of this file will not be animated.</strong>",
+       "file-no-thumb-animation-gif": "<strong>Note: Due to technical limitations, thumbnails of high resolution GIF images such as this one will not be animated.</strong>",
+       "newimages": "Gallery of new files",
+       "newimagestext": "-",
+       "imagelisttext": "Below is a list of <strong>$1</strong> {{PLURAL:$1|file|files}} sorted $2.",
+       "newimages-summary": "This special page shows the last uploaded files.",
+       "newimages-legend": "Filter",
+       "newimages-label": "Filename (or a part of it):",
+       "newimages-showbots": "Show uploads by bots",
+       "noimages": "Nothing to see.",
+       "ilsubmit": "Search",
+       "bydate": "by date",
+       "sp-newimages-showfrom": "Show new files starting from $2, $1",
+       "video-dims": "$1, $2 × $3",
+       "seconds-abbrev": "$1 s",
+       "minutes-abbrev": "$1 min",
+       "hours-abbrev": "$1 h",
+       "days-abbrev": "$1 d",
+       "seconds": "{{PLURAL:$1|$1 second|$1 seconds}}",
+       "minutes": "{{PLURAL:$1|$1 minute|$1 minutes}}",
+       "hours": "{{PLURAL:$1|$1 hour|$1 hours}}",
+       "days": "{{PLURAL:$1|$1 day|$1 days}}",
+       "weeks": "{{PLURAL:$1|$1 week|$1 weeks}}",
+       "months": "{{PLURAL:$1|$1 month|$1 months}}",
+       "years": "{{PLURAL:$1|$1 year|$1 years}}",
+       "ago": "$1 ago",
+       "just-now": "just now",
+       "hours-ago": "$1 {{PLURAL:$1|hour|hours}} ago",
+       "minutes-ago": "$1 {{PLURAL:$1|minute|minutes}} ago",
+       "seconds-ago": "$1 {{PLURAL:$1|second|seconds}} ago",
+       "monday-at": "Monday at $1",
+       "tuesday-at": "Tuesday at $1",
+       "wednesday-at": "Wednesday at $1",
+       "thursday-at": "Thursday at $1",
+       "friday-at": "Friday at $1",
+       "saturday-at": "Saturday at $1",
+       "sunday-at": "Sunday at $1",
+       "today-at": "$1",
+       "yesterday-at": "Yesterday at $1",
+       "bad_image_list": "The format is as follows:\n\nOnly list items (lines starting with *) are considered.\nThe first link on a line must be a link to a bad file.\nAny subsequent links on the same line are considered to be exceptions, i.e. pages where the file may occur inline.",
+       "variantname-zh-hans": "hans",
+       "variantname-zh-hant": "hant",
+       "variantname-zh-cn": "cn",
+       "variantname-zh-tw": "tw",
+       "variantname-zh-hk": "hk",
+       "variantname-zh-mo": "mo",
+       "variantname-zh-sg": "sg",
+       "variantname-zh-my": "my",
+       "variantname-zh": "zh",
+       "variantname-gan-hans": "hans",
+       "variantname-gan-hant": "hant",
+       "variantname-gan": "gan",
+       "variantname-sr-ec": "sr-ec",
+       "variantname-sr-el": "sr-el",
+       "variantname-sr": "sr",
+       "variantname-kk-kz": "kk-kz",
+       "variantname-kk-tr": "kk-tr",
+       "variantname-kk-cn": "kk-cn",
+       "variantname-kk-cyrl": "kk-cyrl",
+       "variantname-kk-latn": "kk-latn",
+       "variantname-kk-arab": "kk-arab",
+       "variantname-kk": "kk",
+       "variantname-ku-arab": "ku-Arab",
+       "variantname-ku-latn": "ku-Latn",
+       "variantname-ku": "ku",
+       "variantname-tg-cyrl": "tg-Cyrl",
+       "variantname-tg-latn": "tg-Latn",
+       "variantname-tg": "tg",
+       "variantname-ike-cans": "ike-Cans",
+       "variantname-ike-latn": "ike-Latn",
+       "variantname-iu": "iu",
+       "variantname-shi-tfng": "shi-Tfng",
+       "variantname-shi-latn": "shi-Latn",
+       "variantname-shi": "shi",
+       "variantname-uz": "uz",
+       "variantname-uz-latn": "uz-Latn",
+       "variantname-uz-cyrl": "uz-Cyrl",
+       "metadata": "Metadata",
+       "metadata-help": "This file contains additional information, probably added from the digital camera or scanner used to create or digitize it.\nIf the file has been modified from its original state, some details may not fully reflect the modified file.",
+       "metadata-expand": "Show extended details",
+       "metadata-collapse": "Hide extended details",
+       "metadata-fields": "Image metadata fields listed in this message will be included on image page display when the metadata table is collapsed.\nOthers will be hidden by default.\n* make\n* model\n* datetimeoriginal\n* exposuretime\n* fnumber\n* isospeedratings\n* focallength\n* artist\n* copyright\n* imagedescription\n* gpslatitude\n* gpslongitude\n* gpsaltitude",
+       "metadata-langitem": "<strong>$2:</strong> $1",
+       "metadata-langitem-default": "$1",
+       "exif-imagewidth": "Width",
+       "exif-imagelength": "Height",
+       "exif-bitspersample": "Bits per component",
+       "exif-compression": "Compression scheme",
+       "exif-photometricinterpretation": "Pixel composition",
+       "exif-orientation": "Orientation",
+       "exif-samplesperpixel": "Number of components",
+       "exif-planarconfiguration": "Data arrangement",
+       "exif-ycbcrsubsampling": "Subsampling ratio of Y to C",
+       "exif-ycbcrpositioning": "Y and C positioning",
+       "exif-xresolution": "Horizontal resolution",
+       "exif-yresolution": "Vertical resolution",
+       "exif-stripoffsets": "Image data location",
+       "exif-rowsperstrip": "Number of rows per strip",
+       "exif-stripbytecounts": "Bytes per compressed strip",
+       "exif-jpeginterchangeformat": "Offset to JPEG SOI",
+       "exif-jpeginterchangeformatlength": "Bytes of JPEG data",
+       "exif-whitepoint": "White point chromaticity",
+       "exif-primarychromaticities": "Chromaticities of primarities",
+       "exif-ycbcrcoefficients": "Color space transformation matrix coefficients",
+       "exif-referenceblackwhite": "Pair of black and white reference values",
+       "exif-datetime": "File change date and time",
+       "exif-imagedescription": "Image title",
+       "exif-make": "Camera manufacturer",
+       "exif-model": "Camera model",
+       "exif-software": "Software used",
+       "exif-artist": "Author",
+       "exif-copyright": "Copyright holder",
+       "exif-exifversion": "Exif version",
+       "exif-flashpixversion": "Supported Flashpix version",
+       "exif-colorspace": "Color space",
+       "exif-componentsconfiguration": "Meaning of each component",
+       "exif-compressedbitsperpixel": "Image compression mode",
+       "exif-pixelydimension": "Image width",
+       "exif-pixelxdimension": "Image height",
+       "exif-usercomment": "User comments",
+       "exif-relatedsoundfile": "Related audio file",
+       "exif-datetimeoriginal": "Date and time of data generation",
+       "exif-datetimedigitized": "Date and time of digitizing",
+       "exif-subsectime": "DateTime subseconds",
+       "exif-subsectimeoriginal": "DateTimeOriginal subseconds",
+       "exif-subsectimedigitized": "DateTimeDigitized subseconds",
+       "exif-exposuretime": "Exposure time",
+       "exif-exposuretime-format": "$1 sec ($2)",
+       "exif-fnumber": "F Number",
+       "exif-fnumber-format": "f/$1",
+       "exif-exposureprogram": "Exposure Program",
+       "exif-spectralsensitivity": "Spectral sensitivity",
+       "exif-isospeedratings": "ISO speed rating",
+       "exif-shutterspeedvalue": "APEX shutter speed",
+       "exif-aperturevalue": "APEX aperture",
+       "exif-brightnessvalue": "APEX brightness",
+       "exif-exposurebiasvalue": "APEX exposure bias",
+       "exif-maxaperturevalue": "Maximum land aperture",
+       "exif-subjectdistance": "Subject distance",
+       "exif-meteringmode": "Metering mode",
+       "exif-lightsource": "Light source",
+       "exif-flash": "Flash",
+       "exif-focallength": "Lens focal length",
+       "exif-focallength-format": "$1 mm",
+       "exif-subjectarea": "Subject area",
+       "exif-flashenergy": "Flash energy",
+       "exif-focalplanexresolution": "Focal plane X resolution",
+       "exif-focalplaneyresolution": "Focal plane Y resolution",
+       "exif-focalplaneresolutionunit": "Focal plane resolution unit",
+       "exif-subjectlocation": "Subject location",
+       "exif-exposureindex": "Exposure index",
+       "exif-sensingmethod": "Sensing method",
+       "exif-filesource": "File source",
+       "exif-scenetype": "Scene type",
+       "exif-customrendered": "Custom image processing",
+       "exif-exposuremode": "Exposure mode",
+       "exif-whitebalance": "White balance",
+       "exif-digitalzoomratio": "Digital zoom ratio",
+       "exif-focallengthin35mmfilm": "Focal length in 35 mm film",
+       "exif-scenecapturetype": "Scene capture type",
+       "exif-gaincontrol": "Scene control",
+       "exif-contrast": "Contrast",
+       "exif-saturation": "Saturation",
+       "exif-sharpness": "Sharpness",
+       "exif-devicesettingdescription": "Device settings description",
+       "exif-subjectdistancerange": "Subject distance range",
+       "exif-imageuniqueid": "Unique image ID",
+       "exif-gpsversionid": "GPS tag version",
+       "exif-gpslatituderef": "North or south latitude",
+       "exif-gpslatitude": "Latitude",
+       "exif-gpslongituderef": "East or west longitude",
+       "exif-gpslongitude": "Longitude",
+       "exif-gpsaltituderef": "Altitude reference",
+       "exif-gpsaltitude": "Altitude",
+       "exif-gpstimestamp": "GPS time (atomic clock)",
+       "exif-gpssatellites": "Satellites used for measurement",
+       "exif-gpsstatus": "Receiver status",
+       "exif-gpsmeasuremode": "Measurement mode",
+       "exif-gpsdop": "Measurement precision",
+       "exif-gpsspeedref": "Speed unit",
+       "exif-gpsspeed": "Speed of GPS receiver",
+       "exif-gpstrackref": "Reference for direction of movement",
+       "exif-gpstrack": "Direction of movement",
+       "exif-gpsimgdirectionref": "Reference for direction of image",
+       "exif-gpsimgdirection": "Direction of image",
+       "exif-gpsmapdatum": "Geodetic survey data used",
+       "exif-gpsdestlatituderef": "Reference for latitude of destination",
+       "exif-gpsdestlatitude": "Latitude destination",
+       "exif-gpsdestlongituderef": "Reference for longitude of destination",
+       "exif-gpsdestlongitude": "Longitude of destination",
+       "exif-gpsdestbearingref": "Reference for bearing of destination",
+       "exif-gpsdestbearing": "Bearing of destination",
+       "exif-gpsdestdistanceref": "Reference for distance to destination",
+       "exif-gpsdestdistance": "Distance to destination",
+       "exif-gpsprocessingmethod": "Name of GPS processing method",
+       "exif-gpsareainformation": "Name of GPS area",
+       "exif-gpsdatestamp": "GPS date",
+       "exif-gpsdifferential": "GPS differential correction",
+       "exif-coordinate-format": "$1° $2′ $3″ $4",
+       "exif-jpegfilecomment": "JPEG file comment",
+       "exif-keywords": "Keywords",
+       "exif-worldregioncreated": "World region that the picture was taken in",
+       "exif-countrycreated": "Country that the picture was taken in",
+       "exif-countrycodecreated": "Code for the country that the picture was taken in",
+       "exif-provinceorstatecreated": "Province or state that the picture was taken in",
+       "exif-citycreated": "City that the picture was taken in",
+       "exif-sublocationcreated": "Sublocation of the city that the picture was taken in",
+       "exif-worldregiondest": "World region shown",
+       "exif-countrydest": "Country shown",
+       "exif-countrycodedest": "Code for country shown",
+       "exif-provinceorstatedest": "Province or state shown",
+       "exif-citydest": "City shown",
+       "exif-sublocationdest": "Sublocation of city shown",
+       "exif-objectname": "Short title",
+       "exif-specialinstructions": "Special instructions",
+       "exif-headline": "Headline",
+       "exif-credit": "Credit/Provider",
+       "exif-source": "Source",
+       "exif-editstatus": "Editorial status of image",
+       "exif-urgency": "Urgency",
+       "exif-fixtureidentifier": "Fixture name",
+       "exif-locationdest": "Location depicted",
+       "exif-locationdestcode": "Code of location depicted",
+       "exif-objectcycle": "Time of day that media is intended for",
+       "exif-contact": "Contact information",
+       "exif-writer": "Writer",
+       "exif-languagecode": "Language",
+       "exif-iimversion": "IIM version",
+       "exif-iimcategory": "Category",
+       "exif-iimsupplementalcategory": "Supplemental categories",
+       "exif-datetimeexpires": "Do not use after",
+       "exif-datetimereleased": "Released on",
+       "exif-originaltransmissionref": "Original transmission location code",
+       "exif-identifier": "Identifier",
+       "exif-lens": "Lens used",
+       "exif-serialnumber": "Serial number of camera",
+       "exif-cameraownername": "Owner of camera",
+       "exif-label": "Label",
+       "exif-datetimemetadata": "Date metadata was last modified",
+       "exif-nickname": "Informal name of image",
+       "exif-rating": "Rating (out of 5)",
+       "exif-rightscertificate": "Rights management certificate",
+       "exif-copyrighted": "Copyright status",
+       "exif-copyrightowner": "Copyright owner",
+       "exif-usageterms": "Usage terms",
+       "exif-webstatement": "Online copyright statement",
+       "exif-originaldocumentid": "Unique ID of original document",
+       "exif-licenseurl": "URL for copyright license",
+       "exif-morepermissionsurl": "Alternative licensing information",
+       "exif-attributionurl": "When re-using this work, please link to",
+       "exif-preferredattributionname": "When re-using this work, please credit",
+       "exif-pngfilecomment": "PNG file comment",
+       "exif-disclaimer": "Disclaimer",
+       "exif-contentwarning": "Content warning",
+       "exif-giffilecomment": "GIF file comment",
+       "exif-intellectualgenre": "Type of item",
+       "exif-subjectnewscode": "Subject code",
+       "exif-scenecode": "IPTC scene code",
+       "exif-event": "Event depicted",
+       "exif-organisationinimage": "Organization depicted",
+       "exif-personinimage": "Person depicted",
+       "exif-originalimageheight": "Height of image before it was cropped",
+       "exif-originalimagewidth": "Width of image before it was cropped",
+       "exif-make-value": "$1",
+       "exif-model-value": "$1",
+       "exif-software-value": "$1",
+       "exif-software-version-value": "$1 (Version $2)",
+       "exif-contact-value": "$1\n\n$2\n<div class=\"adr\">\n$3\n\n$4, $5, $6 $7\n</div>\n$8",
+       "exif-subjectnewscode-value": "$2 ($1)",
+       "exif-compression-1": "Uncompressed",
+       "exif-compression-2": "CCITT Group 3 1-Dimensional Modified Huffman run length encoding",
+       "exif-compression-3": "CCITT Group 3 fax encoding",
+       "exif-compression-4": "CCITT Group 4 fax encoding",
+       "exif-compression-5": "LZW",
+       "exif-compression-6": "JPEG (old)",
+       "exif-compression-7": "JPEG",
+       "exif-compression-8": "Deflate (Adobe)",
+       "exif-compression-32773": "PackBits (Macintosh RLE)",
+       "exif-compression-32946": "Deflate (PKZIP)",
+       "exif-compression-34712": "JPEG2000",
+       "exif-copyrighted-true": "Copyrighted",
+       "exif-copyrighted-false": "Copyright status not set",
+       "exif-photometricinterpretation-2": "RGB",
+       "exif-photometricinterpretation-6": "YCbCr",
+       "exif-unknowndate": "Unknown date",
+       "exif-orientation-1": "Normal",
+       "exif-orientation-2": "Flipped horizontally",
+       "exif-orientation-3": "Rotated 180°",
+       "exif-orientation-4": "Flipped vertically",
+       "exif-orientation-5": "Rotated 90° CCW and flipped vertically",
+       "exif-orientation-6": "Rotated 90° CCW",
+       "exif-orientation-7": "Rotated 90° CW and flipped vertically",
+       "exif-orientation-8": "Rotated 90° CW",
+       "exif-planarconfiguration-1": "chunky format",
+       "exif-planarconfiguration-2": "planar format",
+       "exif-xyresolution-i": "$1 dpi",
+       "exif-xyresolution-c": "$1 dpc",
+       "exif-colorspace-1": "sRGB",
+       "exif-colorspace-65535": "Uncalibrated",
+       "exif-componentsconfiguration-0": "does not exist",
+       "exif-componentsconfiguration-1": "Y",
+       "exif-componentsconfiguration-2": "Cb",
+       "exif-componentsconfiguration-3": "Cr",
+       "exif-componentsconfiguration-4": "R",
+       "exif-componentsconfiguration-5": "G",
+       "exif-componentsconfiguration-6": "B",
+       "exif-exposureprogram-0": "Not defined",
+       "exif-exposureprogram-1": "Manual",
+       "exif-exposureprogram-2": "Normal program",
+       "exif-exposureprogram-3": "Aperture priority",
+       "exif-exposureprogram-4": "Shutter priority",
+       "exif-exposureprogram-5": "Creative program (biased toward depth of field)",
+       "exif-exposureprogram-6": "Action program (biased toward fast shutter speed)",
+       "exif-exposureprogram-7": "Portrait mode (for closeup photos with the background out of focus)",
+       "exif-exposureprogram-8": "Landscape mode (for landscape photos with the background in focus)",
+       "exif-subjectdistance-value": "$1 meters",
+       "exif-meteringmode-0": "Unknown",
+       "exif-meteringmode-1": "Average",
+       "exif-meteringmode-2": "Center weighted average",
+       "exif-meteringmode-3": "Spot",
+       "exif-meteringmode-4": "Multi-Spot",
+       "exif-meteringmode-5": "Pattern",
+       "exif-meteringmode-6": "Partial",
+       "exif-meteringmode-255": "Other",
+       "exif-lightsource-0": "Unknown",
+       "exif-lightsource-1": "Daylight",
+       "exif-lightsource-2": "Fluorescent",
+       "exif-lightsource-3": "Tungsten (incandescent light)",
+       "exif-lightsource-4": "Flash",
+       "exif-lightsource-9": "Fine weather",
+       "exif-lightsource-10": "Cloudy weather",
+       "exif-lightsource-11": "Shade",
+       "exif-lightsource-12": "Daylight fluorescent (D 5700 – 7100K)",
+       "exif-lightsource-13": "Day white fluorescent (N 4600 – 5400K)",
+       "exif-lightsource-14": "Cool white fluorescent (W 3900 – 4500K)",
+       "exif-lightsource-15": "White fluorescent (WW 3200 – 3700K)",
+       "exif-lightsource-17": "Standard light A",
+       "exif-lightsource-18": "Standard light B",
+       "exif-lightsource-19": "Standard light C",
+       "exif-lightsource-20": "D55",
+       "exif-lightsource-21": "D65",
+       "exif-lightsource-22": "D75",
+       "exif-lightsource-23": "D50",
+       "exif-lightsource-24": "ISO studio tungsten",
+       "exif-lightsource-255": "Other light source",
+       "exif-flash-fired-0": "Flash did not fire",
+       "exif-flash-fired-1": "Flash fired",
+       "exif-flash-return-0": "no strobe return detection function",
+       "exif-flash-return-2": "strobe return light not detected",
+       "exif-flash-return-3": "strobe return light detected",
+       "exif-flash-mode-1": "compulsory flash firing",
+       "exif-flash-mode-2": "compulsory flash suppression",
+       "exif-flash-mode-3": "auto mode",
+       "exif-flash-function-1": "No flash function",
+       "exif-flash-redeye-1": "red-eye reduction mode",
+       "exif-focalplaneresolutionunit-2": "inches",
+       "exif-sensingmethod-1": "Undefined",
+       "exif-sensingmethod-2": "One-chip color area sensor",
+       "exif-sensingmethod-3": "Two-chip color area sensor",
+       "exif-sensingmethod-4": "Three-chip color area sensor",
+       "exif-sensingmethod-5": "Color sequential area sensor",
+       "exif-sensingmethod-7": "Trilinear sensor",
+       "exif-sensingmethod-8": "Color sequential linear sensor",
+       "exif-filesource-3": "Digital still camera",
+       "exif-scenetype-1": "A directly photographed image",
+       "exif-customrendered-0": "Normal process",
+       "exif-customrendered-1": "Custom process",
+       "exif-exposuremode-0": "Auto exposure",
+       "exif-exposuremode-1": "Manual exposure",
+       "exif-exposuremode-2": "Auto bracket",
+       "exif-whitebalance-0": "Auto white balance",
+       "exif-whitebalance-1": "Manual white balance",
+       "exif-scenecapturetype-0": "Standard",
+       "exif-scenecapturetype-1": "Landscape",
+       "exif-scenecapturetype-2": "Portrait",
+       "exif-scenecapturetype-3": "Night scene",
+       "exif-gaincontrol-0": "None",
+       "exif-gaincontrol-1": "Low gain up",
+       "exif-gaincontrol-2": "High gain up",
+       "exif-gaincontrol-3": "Low gain down",
+       "exif-gaincontrol-4": "High gain down",
+       "exif-contrast-0": "Normal",
+       "exif-contrast-1": "Soft",
+       "exif-contrast-2": "Hard",
+       "exif-saturation-0": "Normal",
+       "exif-saturation-1": "Low saturation",
+       "exif-saturation-2": "High saturation",
+       "exif-sharpness-0": "Normal",
+       "exif-sharpness-1": "Soft",
+       "exif-sharpness-2": "Hard",
+       "exif-subjectdistancerange-0": "Unknown",
+       "exif-subjectdistancerange-1": "Macro",
+       "exif-subjectdistancerange-2": "Close view",
+       "exif-subjectdistancerange-3": "Distant view",
+       "exif-gpslatitude-n": "North latitude",
+       "exif-gpslatitude-s": "South latitude",
+       "exif-gpslongitude-e": "East longitude",
+       "exif-gpslongitude-w": "West longitude",
+       "exif-gpsaltitude-above-sealevel": "$1 {{PLURAL:$1|meter|meters}} above sea level",
+       "exif-gpsaltitude-below-sealevel": "$1 {{PLURAL:$1|meter|meters}} below sea level",
+       "exif-gpsstatus-a": "Measurement in progress",
+       "exif-gpsstatus-v": "Measurement interoperability",
+       "exif-gpsmeasuremode-2": "2-dimensional measurement",
+       "exif-gpsmeasuremode-3": "3-dimensional measurement",
+       "exif-gpsspeed-k": "Kilometers per hour",
+       "exif-gpsspeed-m": "Miles per hour",
+       "exif-gpsspeed-n": "Knots",
+       "exif-gpsdestdistance-k": "Kilometers",
+       "exif-gpsdestdistance-m": "Miles",
+       "exif-gpsdestdistance-n": "Nautical miles",
+       "exif-gpsdop-excellent": "Excellent ($1)",
+       "exif-gpsdop-good": "Good ($1)",
+       "exif-gpsdop-moderate": "Moderate ($1)",
+       "exif-gpsdop-fair": "Fair ($1)",
+       "exif-gpsdop-poor": "Poor ($1)",
+       "exif-objectcycle-a": "Morning only",
+       "exif-objectcycle-p": "Evening only",
+       "exif-objectcycle-b": "Both morning and evening",
+       "exif-gpsdirection-t": "True direction",
+       "exif-gpsdirection-m": "Magnetic direction",
+       "exif-ycbcrpositioning-1": "Centered",
+       "exif-ycbcrpositioning-2": "Co-sited",
+       "exif-dc-contributor": "Contributors",
+       "exif-dc-coverage": "Spatial or temporal scope of media",
+       "exif-dc-date": "Date(s)",
+       "exif-dc-publisher": "Publisher",
+       "exif-dc-relation": "Related media",
+       "exif-dc-rights": "Rights",
+       "exif-dc-source": "Source media",
+       "exif-dc-type": "Type of media",
+       "exif-rating-rejected": "Rejected",
+       "exif-isospeedratings-overflow": "Greater than 65535",
+       "exif-maxaperturevalue-value": "$1 APEX (f/$2)",
+       "exif-iimcategory-ace": "Arts, culture and entertainment",
+       "exif-iimcategory-clj": "Crime and law",
+       "exif-iimcategory-dis": "Disasters and accidents",
+       "exif-iimcategory-fin": "Economy and business",
+       "exif-iimcategory-edu": "Education",
+       "exif-iimcategory-evn": "Environment",
+       "exif-iimcategory-hth": "Health",
+       "exif-iimcategory-hum": "Human interest",
+       "exif-iimcategory-lab": "Labor",
+       "exif-iimcategory-lif": "Lifestyle and leisure",
+       "exif-iimcategory-pol": "Politics",
+       "exif-iimcategory-rel": "Religion and belief",
+       "exif-iimcategory-sci": "Science and technology",
+       "exif-iimcategory-soi": "Social issues",
+       "exif-iimcategory-spo": "Sports",
+       "exif-iimcategory-war": "War, conflict and unrest",
+       "exif-iimcategory-wea": "Weather",
+       "exif-urgency-normal": "Normal ($1)",
+       "exif-urgency-low": "Low ($1)",
+       "exif-urgency-high": "High ($1)",
+       "exif-urgency-other": "User-defined priority ($1)",
+       "watchlistall2": "all",
+       "namespacesall": "all",
+       "monthsall": "all",
+       "confirmemail": "Confirm email address",
+       "confirmemail_noemail": "You do not have a valid email address set in your [[Special:Preferences|user preferences]].",
+       "confirmemail_text": "{{SITENAME}} requires that you validate your email address before using email features.\nActivate the button below to send a confirmation mail to your address.\nThe mail will include a link containing a code;\nload the link in your browser to confirm that your email address is valid.",
+       "confirmemail_pending": "A confirmation code has already been emailed to you;\nif you recently created your account, you may wish to wait a few minutes for it to arrive before trying to request a new code.",
+       "confirmemail_send": "Mail a confirmation code",
+       "confirmemail_sent": "Confirmation email sent.",
+       "confirmemail_oncreate": "A confirmation code was sent to your email address.\nThis code is not required to log in, but you will need to provide it before enabling any email-based features in the wiki.",
+       "confirmemail_sendfailed": "{{SITENAME}} could not send your confirmation mail.\nPlease check your email address for invalid characters.\n\nMailer returned: $1",
+       "confirmemail_invalid": "Invalid confirmation code.\nThe code may have expired.",
+       "confirmemail_needlogin": "Please $1 to confirm your email address.",
+       "confirmemail_success": "Your email address has been confirmed.\nYou may now [[Special:UserLogin|log in]] and enjoy the wiki.",
+       "confirmemail_loggedin": "Your email address has now been confirmed.",
+       "confirmemail_subject": "{{SITENAME}} email address confirmation",
+       "confirmemail_body": "Someone, probably you, from IP address $1,\nhas registered an account \"$2\" with this email address on {{SITENAME}}.\n\nTo confirm that this account really does belong to you and activate\nemail features on {{SITENAME}}, open this link in your browser:\n\n$3\n\nIf you did *not* register the account, follow this link\nto cancel the email address confirmation:\n\n$5\n\nThis confirmation code will expire at $4.",
+       "confirmemail_body_changed": "Someone, probably you, from IP address $1,\nhas changed the email address of the account \"$2\" to this address on {{SITENAME}}.\n\nTo confirm that this account really does belong to you and reactivate\nemail features on {{SITENAME}}, open this link in your browser:\n\n$3\n\nIf the account does *not* belong to you, follow this link\nto cancel the email address confirmation:\n\n$5\n\nThis confirmation code will expire at $4.",
+       "confirmemail_body_set": "Someone, probably you, from IP address $1,\nhas set the email address of the account \"$2\" to this address on {{SITENAME}}.\n\nTo confirm that this account really does belong to you and activate\nemail features on {{SITENAME}}, open this link in your browser:\n\n$3\n\nIf the account does *not* belong to you, follow this link\nto cancel the email address confirmation:\n\n$5\n\nThis confirmation code will expire at $4.",
+       "confirmemail_invalidated": "Email address confirmation canceled",
+       "invalidateemail": "Cancel email confirmation",
+       "scarytranscludedisabled": "[Interwiki transcluding is disabled]",
+       "scarytranscludefailed": "[Template fetch failed for $1]",
+       "scarytranscludefailed-httpstatus": "[Template fetch failed for $1: HTTP $2]",
+       "scarytranscludetoolong": "[URL is too long]",
+       "deletedwhileediting": "<strong>Warning:</strong> This page was deleted after you started editing!",
+       "confirmrecreate": "User [[User:$1|$1]] ([[User talk:$1|talk]]) deleted this page after you started editing with reason:\n: <em>$2</em>\nPlease confirm that you really want to recreate this page.",
+       "confirmrecreate-noreason": "User [[User:$1|$1]] ([[User talk:$1|talk]]) deleted this page after you started editing. Please confirm that you really want to recreate this page.",
+       "recreate": "Recreate",
+       "unit-pixel": "px",
+       "confirm_purge_button": "OK",
+       "confirm-purge-top": "Clear the cache of this page?",
+       "confirm-purge-bottom": "Purging a page clears the cache and forces the most current revision to appear.",
+       "confirm-watch-button": "OK",
+       "confirm-watch-top": "Add this page to your watchlist?",
+       "confirm-unwatch-button": "OK",
+       "confirm-unwatch-top": "Remove this page from your watchlist?",
+       "semicolon-separator": ";&#32;",
+       "comma-separator": ",&#32;",
+       "colon-separator": ":&#32;",
+       "autocomment-prefix": "",
+       "pipe-separator": "&#32;|&#32;",
+       "word-separator": "&#32;",
+       "ellipsis": "...",
+       "percent": "$1%",
+       "parentheses": "($1)",
+       "brackets": "[$1]",
+       "quotation-marks": "\"$1\"",
+       "imgmultipageprev": "← previous page",
+       "imgmultipagenext": "next page →",
+       "imgmultigo": "Go!",
+       "imgmultigoto": "Go to page $1",
+       "img-lang-opt": "$2 ($1)",
+       "img-lang-default": "(default language)",
+       "img-lang-info": "Render this image in $1. $2",
+       "img-lang-go": "Go",
+       "ascending_abbrev": "asc",
+       "descending_abbrev": "desc",
+       "table_pager_next": "Next page",
+       "table_pager_prev": "Previous page",
+       "table_pager_first": "First page",
+       "table_pager_last": "Last page",
+       "table_pager_limit": "Show $1 items per page",
+       "table_pager_limit_label": "Items per page:",
+       "table_pager_limit_submit": "Go",
+       "table_pager_empty": "No results",
+       "autosumm-blank": "Blanked the page",
+       "autosumm-replace": "Replaced content with \"$1\"",
+       "autoredircomment": "Redirected page to [[$1]]",
+       "autosumm-new": "Created page with \"$1\"",
+       "autoblock_whitelist": "AOL http://webmaster.info.aol.com/proxyinfo.html\n*64.12.96.0/19\n*149.174.160.0/20\n*152.163.240.0/21\n*152.163.248.0/22\n*152.163.252.0/23\n*152.163.96.0/22\n*152.163.100.0/23\n*195.93.32.0/22\n*195.93.48.0/22\n*195.93.64.0/19\n*195.93.96.0/19\n*195.93.16.0/20\n*198.81.0.0/22\n*198.81.16.0/20\n*198.81.8.0/23\n*202.67.64.128/25\n*205.188.192.0/20\n*205.188.208.0/23\n*205.188.112.0/20\n*205.188.146.144/30\n*207.200.112.0/21",
+       "size-bytes": "$1 B",
+       "size-kilobytes": "$1 KB",
+       "size-megabytes": "$1 MB",
+       "size-gigabytes": "$1 GB",
+       "size-terabytes": "$1 TB",
+       "size-petabytes": "$1 PB",
+       "size-exabytes": "$1 EB",
+       "size-zetabytes": "$1 ZB",
+       "size-yottabytes": "$1 YB",
+       "bitrate-bits": "$1 bps",
+       "bitrate-kilobits": "$1 kbps",
+       "bitrate-megabits": "$1 Mbps",
+       "bitrate-gigabits": "$1 Gbps",
+       "bitrate-terabits": "$1 Tbps",
+       "bitrate-petabits": "$1 Pbps",
+       "bitrate-exabits": "$1 Ebps",
+       "bitrate-zetabits": "$1 Zbps",
+       "bitrate-yottabits": "$1 Ybps",
+       "lag-warn-normal": "Changes newer than $1 {{PLURAL:$1|second|seconds}} may not be shown in this list.",
+       "lag-warn-high": "Due to high database server lag, changes newer than $1 {{PLURAL:$1|second|seconds}} may not be shown in this list.",
+       "editwatchlist-summary": "",
+       "watchlistedit-normal-title": "Edit watchlist",
+       "watchlistedit-normal-legend": "Remove titles from watchlist",
+       "watchlistedit-normal-explain": "Titles on your watchlist are shown below.\nTo remove a title, check the box next to it, and click \"{{int:Watchlistedit-normal-submit}}\".\nYou can also [[Special:EditWatchlist/raw|edit the raw list]].",
+       "watchlistedit-normal-submit": "Remove titles",
+       "watchlistedit-normal-done": "{{PLURAL:$1|1 title was|$1 titles were}} removed from your watchlist:",
+       "watchlistedit-raw-title": "Edit raw watchlist",
+        "watchlistedit-raw-legend": "Edit raw watchlist",
+       "watchlistedit-raw-explain": "Titles on your watchlist are shown below, and can be edited by adding to and removing from the list;\none title per line.\nWhen finished, click \"{{int:Watchlistedit-raw-submit}}\".\nYou can also [[Special:EditWatchlist|use the standard editor]].",
+        "watchlistedit-raw-titles": "Titles:",
+        "watchlistedit-raw-submit": "Update watchlist",
+        "watchlistedit-raw-done": "Your watchlist has been updated.",
+        "watchlistedit-raw-added": "{{PLURAL:$1|1 title was|$1 titles were}} added:",
+        "watchlistedit-raw-removed": "{{PLURAL:$1|1 title was|$1 titles were}} removed:",
+       "watchlistedit-clear-title": "Cleared watchlist",
+       "watchlistedit-clear-legend": "Clear watchlist",
+       "watchlistedit-clear-explain": "All of the titles will be removed from your watchlist",
+       "watchlistedit-clear-titles": "Titles:",
+       "watchlistedit-clear-submit": "Clear the watchlist (This is permanent!)",
+       "watchlistedit-clear-done": "Your watchlist has been cleared.",
+       "watchlistedit-clear-removed": "{{PLURAL:$1|1 title was|$1 titles were}} removed:",
+       "watchlistedit-too-many": "There are too many pages to display here.",
+       "watchlisttools-clear": "Clear the watchlist",
+       "watchlisttools-view": "View relevant changes",
+       "watchlisttools-edit": "View and edit watchlist",
+       "watchlisttools-raw": "Edit raw watchlist",
+       "iranian-calendar-m1": "Farvardin",
+       "iranian-calendar-m2": "Ordibehesht",
+       "iranian-calendar-m3": "Khordad",
+       "iranian-calendar-m4": "Tir",
+       "iranian-calendar-m5": "Mordad",
+       "iranian-calendar-m6": "Shahrivar",
+       "iranian-calendar-m7": "Mehr",
+       "iranian-calendar-m8": "Aban",
+       "iranian-calendar-m9": "Azar",
+       "iranian-calendar-m10": "Dey",
+       "iranian-calendar-m11": "Bahman",
+       "iranian-calendar-m12": "Esfand",
+       "hijri-calendar-m1": "Muharram",
+       "hijri-calendar-m2": "Safar",
+       "hijri-calendar-m3": "Rabi' al-awwal",
+       "hijri-calendar-m4": "Rabi' al-thani",
+       "hijri-calendar-m5": "Jumada al-awwal",
+       "hijri-calendar-m6": "Jumada al-thani",
+       "hijri-calendar-m7": "Rajab",
+       "hijri-calendar-m8": "Sha'aban",
+       "hijri-calendar-m9": "Ramadan",
+       "hijri-calendar-m10": "Shawwal",
+       "hijri-calendar-m11": "Dhu al-Qi'dah",
+       "hijri-calendar-m12": "Dhu al-Hijjah",
+       "hebrew-calendar-m1": "Tishrei",
+       "hebrew-calendar-m2": "Cheshvan",
+       "hebrew-calendar-m3": "Kislev",
+       "hebrew-calendar-m4": "Tevet",
+       "hebrew-calendar-m5": "Shevat",
+       "hebrew-calendar-m6": "Adar",
+       "hebrew-calendar-m6a": "Adar I",
+       "hebrew-calendar-m6b": "Adar II",
+       "hebrew-calendar-m7": "Nisan",
+       "hebrew-calendar-m8": "Iyar",
+       "hebrew-calendar-m9": "Sivan",
+       "hebrew-calendar-m10": "Tamuz",
+       "hebrew-calendar-m11": "Av",
+       "hebrew-calendar-m12": "Elul",
+       "hebrew-calendar-m1-gen": "Tishrei",
+       "hebrew-calendar-m2-gen": "Cheshvan",
+       "hebrew-calendar-m3-gen": "Kislev",
+       "hebrew-calendar-m4-gen": "Tevet",
+       "hebrew-calendar-m5-gen": "Shevat",
+       "hebrew-calendar-m6-gen": "Adar",
+       "hebrew-calendar-m6a-gen": "Adar I",
+       "hebrew-calendar-m6b-gen": "Adar II",
+       "hebrew-calendar-m7-gen": "Nisan",
+       "hebrew-calendar-m8-gen": "Iyar",
+       "hebrew-calendar-m9-gen": "Sivan",
+       "hebrew-calendar-m10-gen": "Tamuz",
+       "hebrew-calendar-m11-gen": "Av",
+       "hebrew-calendar-m12-gen": "Elul",
+       "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|talk]])",
+       "signature-anon": "[[{{#special:Contributions}}/$1|$2]]",
+       "timezone-utc": "UTC",
+       "unknown_extension_tag": "Unknown extension tag \"$1\"",
+       "duplicate-defaultsort": "<strong>Warning:</strong> Default sort key \"$2\" overrides earlier default sort key \"$1\".",
+       "version": "Version",
+       "version-summary": "",
+       "version-extensions": "Installed extensions",
+       "version-specialpages": "Special pages",
+       "version-parserhooks": "Parser hooks",
+       "version-variables": "Variables",
+       "version-antispam": "Spam prevention",
+       "version-skins": "Skins",
+       "version-api": "API",
+       "version-other": "Other",
+       "version-mediahandlers": "Media handlers",
+       "version-hooks": "Hooks",
+       "version-parser-extensiontags": "Parser extension tags",
+       "version-parser-function-hooks": "Parser function hooks",
+       "version-hook-name": "Hook name",
+       "version-hook-subscribedby": "Subscribed by",
+       "version-version": "($1)",
+       "version-svn-revision": "r$1",
+       "version-license": "MediaWiki License",
+       "version-ext-license": "License",
+       "version-ext-colheader-name": "Extension",
+       "version-ext-colheader-version": "Version",
+       "version-ext-colheader-license": "License",
+       "version-ext-colheader-description": "Description",
+       "version-ext-colheader-credits": "Authors",
+       "version-license-title": "License for $1",
+       "version-license-not-found": "No detailed license information was found for this extension.",
+       "version-credits-title": "Credits for $1",
+       "version-credits-not-found": "No detailed credits information was found for this extension.",
+       "version-poweredby-credits": "This wiki is powered by <strong>[https://www.mediawiki.org/ MediaWiki]</strong>, copyright © 2001-$1 $2.",
+       "version-poweredby-others": "others",
+       "version-poweredby-translators": "translatewiki.net translators",
+       "version-credits-summary": "We would like to recognize the following persons for their contribution to [[Special:Version|MediaWiki]].",
+       "version-license-info": "MediaWiki 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.\n\nMediaWiki 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.\n\nYou should have received [{{SERVER}}{{SCRIPTPATH}}/COPYING 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 or [//www.gnu.org/licenses/old-licenses/gpl-2.0.html read it online].",
+       "version-software": "Installed software",
+       "version-software-product": "Product",
+       "version-software-version": "Version",
+       "version-db-mysql-url": "http://www.mysql.com/",
+       "version-db-mariadb-url": "http://mariadb.org/",
+       "version-db-percona-url": "http://www.percona.com/software/percona-server",
+       "version-db-postgres-url": "http://www.postgresql.org/",
+       "version-db-oracle-url": "http://www.oracle.com/database/",
+       "version-db-sqlite-url": "http://www.sqlite.org/",
+       "version-db-mssql-url": "http://www.microsoft.com/sql/",
+       "version-entrypoints": "Entry point URLs",
+       "version-entrypoints-header-entrypoint": "Entry point",
+       "version-entrypoints-header-url": "URL",
+       "version-entrypoints-articlepath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgArticlePath Article path]",
+       "version-entrypoints-scriptpath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgScriptPath Script path]",
+       "version-entrypoints-index-php": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:index.php index.php]",
+       "version-entrypoints-api-php": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:api.php api.php]",
+       "version-entrypoints-load-php": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:load.php load.php]",
+       "redirect": "Redirect by file, user, page or revision ID",
+       "redirect-legend": "Redirect to a file or page",
+       "redirect-text": "",
+       "redirect-summary": "This special page redirects to a file (given the file name), a page (given a revision ID or page ID), or a user page (given a numeric user ID). Usage: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], or [[{{#Special:Redirect}}/user/101]].",
+       "redirect-submit": "Go",
+       "redirect-lookup": "Lookup:",
+       "redirect-value": "Value:",
+       "redirect-user": "User ID",
+       "redirect-page": "Page ID",
+       "redirect-revision": "Page revision",
+       "redirect-file": "File name",
+       "redirect-not-exists": "Value not found",
+       "fileduplicatesearch": "Search for duplicate files",
+       "fileduplicatesearch-summary": "Search for duplicate files based on hash values.",
+       "fileduplicatesearch-legend": "Search for a duplicate",
+       "fileduplicatesearch-filename": "Filename:",
+       "fileduplicatesearch-submit": "Search",
+       "fileduplicatesearch-info": "$1 × $2 pixel<br />File size: $3<br />MIME type: $4",
+       "fileduplicatesearch-result-1": "The file \"$1\" has no identical duplication.",
+       "fileduplicatesearch-result-n": "The file \"$1\" has {{PLURAL:$2|1 identical duplication|$2 identical duplications}}.",
+       "fileduplicatesearch-noresults": "No file named \"$1\" found.",
+       "specialpages": "Special pages",
+       "specialpages-summary": "",
+       "specialpages-note-top": "Legend",
+       "specialpages-note": "* Normal special pages.\n* <span class=\"mw-specialpagerestricted\">Restricted special pages.</span>",
+       "specialpages-group-maintenance": "Maintenance reports",
+       "specialpages-group-other": "Other special pages",
+       "specialpages-group-login": "Login / create account",
+       "specialpages-group-changes": "Recent changes and logs",
+       "specialpages-group-media": "Media reports and uploads",
+       "specialpages-group-users": "Users and rights",
+       "specialpages-group-highuse": "High use pages",
+       "specialpages-group-pages": "Lists of pages",
+       "specialpages-group-pagetools": "Page tools",
+       "specialpages-group-wiki": "Data and tools",
+       "specialpages-group-redirects": "Redirecting special pages",
+       "specialpages-group-spam": "Spam tools",
+       "blankpage": "Blank page",
+       "intentionallyblankpage": "This page is intentionally left blank.",
+       "external_image_whitelist": " #Leave this line exactly as it is<pre>\n#Put regular expression fragments (just the part that goes between the //) below\n#These will be matched with the URLs of external (hotlinked) images\n#Those that match will be displayed as images, otherwise only a link to the image will be shown\n#Lines beginning with # are treated as comments\n#This is case-insensitive\n\n#Put all regex fragments above this line. Leave this line exactly as it is</pre>",
+       "tags": "Valid change tags",
+       "tags-summary": "",
+       "tag-filter": "[[Special:Tags|Tag]] filter:",
+       "tag-filter-submit": "Filter",
+       "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Tag|Tags}}]]: $2)",
+       "tags-title": "Tags",
+       "tags-intro": "This page lists the tags that the software may mark an edit with, and their meaning.",
+       "tags-tag": "Tag name",
+       "tags-display-header": "Appearance on change lists",
+       "tags-description-header": "Full description of meaning",
+       "tags-active-header": "Active?",
+       "tags-hitcount-header": "Tagged changes",
+       "tags-active-yes": "Yes",
+       "tags-active-no": "No",
+       "tags-edit": "edit",
+       "tags-hitcount": "$1 {{PLURAL:$1|change|changes}}",
+       "comparepages": "Compare pages",
+       "comparepages-summary": "",
+       "compare-page1": "Page 1",
+       "compare-page2": "Page 2",
+       "compare-rev1": "Revision 1",
+       "compare-rev2": "Revision 2",
+       "compare-submit": "Compare",
+       "compare-invalid-title": "The title you specified is invalid.",
+       "compare-title-not-exists": "The title you specified does not exist.",
+       "compare-revision-not-exists": "The revision you specified does not exist.",
+       "dberr-problems": "Sorry! This site is experiencing technical difficulties.",
+       "dberr-again": "Try waiting a few minutes and reloading.",
+       "dberr-info": "(Cannot contact the database server: $1)",
+       "dberr-info-hidden": "(Cannot contact the database server)",
+       "dberr-usegoogle": "You can try searching via Google in the meantime.",
+       "dberr-outofdate": "Note that their indexes of our content may be out of date.",
+       "dberr-cachederror": "This is a cached copy of the requested page, and may not be up to date.",
+       "htmlform-invalid-input": "There are problems with some of your input.",
+       "htmlform-select-badoption": "The value you specified is not a valid option.",
+       "htmlform-int-invalid": "The value you specified is not an integer.",
+       "htmlform-float-invalid": "The value you specified is not a number.",
+       "htmlform-int-toolow": "The value you specified is below the minimum of $1.",
+       "htmlform-int-toohigh": "The value you specified is above the maximum of $1.",
+       "htmlform-required": "This value is required.",
+       "htmlform-submit": "Submit",
+       "htmlform-reset": "Undo changes",
+       "htmlform-selectorother-other": "Other",
+       "htmlform-no": "No",
+       "htmlform-yes": "Yes",
+       "htmlform-chosen-placeholder": "Select an option",
        "htmlform-cloner-create": "Add more",
        "htmlform-cloner-delete": "Remove",
        "htmlform-cloner-required": "At least one value is required.",
-    "sqlite-has-fts": "$1 with full-text search support",
-    "sqlite-no-fts": "$1 without full-text search support",
-    "logentry-delete-delete": "$1 {{GENDER:$2|deleted}} page $3",
-    "logentry-delete-restore": "$1 {{GENDER:$2|restored}} page $3",
-    "logentry-delete-event": "$1 {{GENDER:$2|changed}} visibility of {{PLURAL:$5|a log event|$5 log events}} on $3: $4",
-    "logentry-delete-revision": "$1 {{GENDER:$2|changed}} visibility of {{PLURAL:$5|a revision|$5 revisions}} on page $3: $4",
-    "logentry-delete-event-legacy": "$1 {{GENDER:$2|changed}} visibility of log events on $3",
-    "logentry-delete-revision-legacy": "$1 {{GENDER:$2|changed}} visibility of revisions on page $3",
-    "logentry-suppress-delete": "$1 {{GENDER:$2|suppressed}} page $3",
-    "logentry-suppress-event": "$1 secretly {{GENDER:$2|changed}} visibility of {{PLURAL:$5|a log event|$5 log events}} on $3: $4",
-    "logentry-suppress-revision": "$1 secretly {{GENDER:$2|changed}} visibility of {{PLURAL:$5|a revision|$5 revisions}} on page $3: $4",
-    "logentry-suppress-event-legacy": "$1 secretly {{GENDER:$2|changed}} visibility of log events on $3",
-    "logentry-suppress-revision-legacy": "$1 secretly {{GENDER:$2|changed}} visibility of revisions on page $3",
-    "revdelete-content-hid": "content hidden",
-    "revdelete-summary-hid": "edit summary hidden",
-    "revdelete-uname-hid": "username hidden",
-    "revdelete-content-unhid": "content unhidden",
-    "revdelete-summary-unhid": "edit summary unhidden",
-    "revdelete-uname-unhid": "username unhidden",
-    "revdelete-restricted": "applied restrictions to administrators",
-    "revdelete-unrestricted": "removed restrictions for administrators",
-    "logentry-move-move": "$1 {{GENDER:$2|moved}} page $3 to $4",
-    "logentry-move-move-noredirect": "$1 {{GENDER:$2|moved}} page $3 to $4 without leaving a redirect",
-    "logentry-move-move_redir": "$1 {{GENDER:$2|moved}} page $3 to $4 over redirect",
-    "logentry-move-move_redir-noredirect": "$1 {{GENDER:$2|moved}} page $3 to $4 over a redirect without leaving a redirect",
-    "logentry-patrol-patrol": "$1 {{GENDER:$2|marked}} revision $4 of page $3 patrolled",
-    "logentry-patrol-patrol-auto": "$1 automatically {{GENDER:$2|marked}} revision $4 of page $3 patrolled",
-    "logentry-newusers-newusers": "User account $1 was {{GENDER:$2|created}}",
-    "logentry-newusers-create": "User account $1 was {{GENDER:$2|created}}",
-    "logentry-newusers-create2": "User account $3 was {{GENDER:$2|created}} by $1",
-    "logentry-newusers-byemail": "User account $3 was {{GENDER:$2|created}} by $1 and password was sent by email",
-    "logentry-newusers-autocreate": "User account $1 was {{GENDER:$2|created}} automatically",
-    "logentry-rights-rights": "$1 {{GENDER:$2|changed}} group membership for $3 from $4 to $5",
-    "logentry-rights-rights-legacy": "$1 {{GENDER:$2|changed}} group membership for $3",
-    "logentry-rights-autopromote": "$1 was automatically {{GENDER:$2|promoted}} from $4 to $5",
-    "rightsnone": "(none)",
-    "revdelete-logentry": "changed revision visibility of \"[[$1]]\"",
-    "logdelete-logentry": "changed event visibility of \"[[$1]]\"",
-    "revdelete-content": "content",
-    "revdelete-summary": "edit summary",
-    "revdelete-uname": "username",
-    "revdelete-hid": "hid $1",
-    "revdelete-unhid": "unhid $1",
-    "revdelete-log-message": "$1 for $2 {{PLURAL:$2|revision|revisions}}",
-    "logdelete-log-message": "$1 for $2 {{PLURAL:$2|event|events}}",
-    "deletedarticle": "deleted \"[[$1]]\"",
-    "suppressedarticle": "suppressed \"[[$1]]\"",
-    "undeletedarticle": "restored \"[[$1]]\"",
-    "patrol-log-line": "marked $1 of $2 patrolled $3",
-    "patrol-log-auto": "(automatic)",
-    "patrol-log-diff": "revision $1",
-    "1movedto2": "moved [[$1]] to [[$2]]",
-    "1movedto2_redir": "moved [[$1]] to [[$2]] over redirect",
-    "move-redirect-suppressed": "redirect suppressed",
-    "newuserlog-create-entry": "New user account",
-    "newuserlog-create2-entry": "created new account $1",
-    "newuserlog-autocreate-entry": "Account created automatically",
-    "rightslogentry": "changed group membership for $1 from $2 to $3",
-    "rightslogentry-autopromote": "was automatically promoted from $2 to $3",
-    "feedback-bugornote": "If you are ready to describe a technical problem in detail please [$1 report a bug].\nOtherwise, you can use the easy form below. Your comment will be added to the page \"[$3 $2]\", along with your username.",
-    "feedback-subject": "Subject:",
-    "feedback-message": "Message:",
-    "feedback-cancel": "Cancel",
-    "feedback-submit": "Submit Feedback",
-    "feedback-adding": "Adding feedback to page...",
-    "feedback-error1": "Error: Unrecognized result from API",
-    "feedback-error2": "Error: Edit failed",
-    "feedback-error3": "Error: No response from API",
-    "feedback-thanks": "Thanks! Your feedback has been posted to the page \"[$2 $1]\".",
-    "feedback-close": "Done",
-    "feedback-bugcheck": "Great! Just check that it is not already one of the [$1 known bugs].",
-    "feedback-bugnew": "I checked. Report a new bug",
-    "searchsuggest-search": "Search",
-    "searchsuggest-containing": "containing...",
-    "api-error-badaccess-groups": "You are not permitted to upload files to this wiki.",
-    "api-error-badtoken": "Internal error: Bad token.",
-    "api-error-copyuploaddisabled": "Uploading by URL is disabled on this server.",
-    "api-error-duplicate": "There {{PLURAL:$1|is [$2 another file]|are [$2 some other files]}} already on the site with the same content.",
-    "api-error-duplicate-archive": "There {{PLURAL:$1|was [$2 another file]|were [$2 some other files]}} already on the site with the same content, but {{PLURAL:$1|it was|they were}} deleted.",
-    "api-error-duplicate-archive-popup-title": "Duplicate {{PLURAL:$1|file that has|files that have}} already been deleted.",
-    "api-error-duplicate-popup-title": "Duplicate {{PLURAL:$1|file|files}}.",
-    "api-error-empty-file": "The file you submitted was empty.",
-    "api-error-emptypage": "Creating new, empty pages is not allowed.",
-    "api-error-fetchfileerror": "Internal error: Something went wrong while fetching the file.",
-    "api-error-fileexists-forbidden": "A file with name \"$1\" already exists, and cannot be overwritten.",
-    "api-error-fileexists-shared-forbidden": "A file with name \"$1\" already exists in the shared file repository, and cannot be overwritten.",
-    "api-error-file-too-large": "The file you submitted was too large.",
-    "api-error-filename-tooshort": "The filename is too short.",
-    "api-error-filetype-banned": "This type of file is banned.",
-    "api-error-filetype-banned-type": "$1 {{PLURAL:$4|is not a permitted file type|are not permitted file types}}. Permitted {{PLURAL:$3|file type is|file types are}} $2.",
-    "api-error-filetype-missing": "The filename is missing an extension.",
-    "api-error-hookaborted": "The modification you tried to make was aborted by an extension.",
-    "api-error-http": "Internal error: Unable to connect to server.",
-    "api-error-illegal-filename": "The filename is not allowed.",
-    "api-error-internal-error": "Internal error: Something went wrong with processing your upload on the wiki.",
-    "api-error-invalid-file-key": "Internal error: File was not found in temporary storage.",
-    "api-error-missingparam": "Internal error: Missing parameters on request.",
-    "api-error-missingresult": "Internal error: Could not determine if the copy succeeded.",
-    "api-error-mustbeloggedin": "You must be logged in to upload files.",
-    "api-error-mustbeposted": "Internal error: Request requires HTTP POST.",
-    "api-error-noimageinfo": "The upload succeeded, but the server did not give us any information about the file.",
-    "api-error-nomodule": "Internal error: No upload module set.",
-    "api-error-ok-but-empty": "Internal error: No response from server.",
-    "api-error-overwrite": "Overwriting an existing file is not allowed.",
-    "api-error-stashfailed": "Internal error: Server failed to store temporary file.",
-    "api-error-publishfailed": "Internal error: Server failed to publish temporary file.",
-    "api-error-stasherror": "There was an error while uploading the file to stash.",
-    "api-error-timeout": "The server did not respond within the expected time.",
-    "api-error-unclassified": "An unknown error occurred.",
-    "api-error-unknown-code": "Unknown error: \"$1\".",
-    "api-error-unknown-error": "Internal error: Something went wrong when trying to upload your file.",
-    "api-error-unknown-warning": "Unknown warning: \"$1\".",
-    "api-error-unknownerror": "Unknown error: \"$1\".",
-    "api-error-uploaddisabled": "Uploading is disabled on this wiki.",
-    "api-error-verification-error": "This file might be corrupt, or have the wrong extension.",
-    "duration-seconds": "$1 {{PLURAL:$1|second|seconds}}",
-    "duration-minutes": "$1 {{PLURAL:$1|minute|minutes}}",
-    "duration-hours": "$1 {{PLURAL:$1|hour|hours}}",
-    "duration-days": "$1 {{PLURAL:$1|day|days}}",
-    "duration-weeks": "$1 {{PLURAL:$1|week|weeks}}",
-    "duration-years": "$1 {{PLURAL:$1|year|years}}",
-    "duration-decades": "$1 {{PLURAL:$1|decade|decades}}",
-    "duration-centuries": "$1 {{PLURAL:$1|century|centuries}}",
-    "duration-millennia": "$1 {{PLURAL:$1|millennium|millennia}}",
-    "rotate-comment": "Image rotated by $1 {{PLURAL:$1|degree|degrees}} clockwise",
-    "limitreport-title": "Parser profiling data:",
-    "limitreport-cputime": "CPU time usage",
-    "limitreport-cputime-value": "$1 {{PLURAL:$1|second|seconds}}",
-    "limitreport-walltime": "Real time usage",
-    "limitreport-walltime-value": "$1 {{PLURAL:$1|second|seconds}}",
-    "limitreport-ppvisitednodes": "Preprocessor visited node count",
-    "limitreport-ppvisitednodes-value": "$1/$2",
-    "limitreport-ppgeneratednodes": "Preprocessor generated node count",
-    "limitreport-ppgeneratednodes-value": "$1/$2",
-    "limitreport-postexpandincludesize": "Post-expand include size",
-    "limitreport-postexpandincludesize-value": "$1/$2 {{PLURAL:$2|byte|bytes}}",
-    "limitreport-templateargumentsize": "Template argument size",
-    "limitreport-templateargumentsize-value": "$1/$2 {{PLURAL:$2|byte|bytes}}",
-    "limitreport-expansiondepth": "Highest expansion depth",
-    "limitreport-expansiondepth-value": "$1/$2",
-    "limitreport-expensivefunctioncount": "Expensive parser function count",
-    "limitreport-expensivefunctioncount-value": "$1/$2",
-    "expandtemplates": "Expand templates",
-    "expand_templates_intro": "This special page takes text and expands all templates in it recursively.\nIt also expands supported parser functions like\n<code><nowiki>{{</nowiki>#language:…}}</code> and variables like\n<code><nowiki>{{</nowiki>CURRENTDAY}}</code>.\nIn fact, it expands pretty much everything in double-braces.",
-    "expand_templates_title": "Context title, for {{FULLPAGENAME}}, etc.:",
-    "expand_templates_input": "Input text:",
-    "expand_templates_output": "Result",
-    "expand_templates_xml_output": "XML output",
-    "expand_templates_html_output": "Raw HTML output",
-    "expand_templates_ok": "OK",
-    "expand_templates_remove_comments": "Remove comments",
-    "expand_templates_remove_nowiki": "Suppress <nowiki> tags in result",
-    "expand_templates_generate_xml": "Show XML parse tree",
-    "expand_templates_generate_rawhtml": "Show raw HTML",
-    "expand_templates_preview": "Preview"
+       "sqlite-has-fts": "$1 with full-text search support",
+       "sqlite-no-fts": "$1 without full-text search support",
+       "logentry-delete-delete": "$1 {{GENDER:$2|deleted}} page $3",
+       "logentry-delete-restore": "$1 {{GENDER:$2|restored}} page $3",
+       "logentry-delete-event": "$1 {{GENDER:$2|changed}} visibility of {{PLURAL:$5|a log event|$5 log events}} on $3: $4",
+       "logentry-delete-revision": "$1 {{GENDER:$2|changed}} visibility of {{PLURAL:$5|a revision|$5 revisions}} on page $3: $4",
+       "logentry-delete-event-legacy": "$1 {{GENDER:$2|changed}} visibility of log events on $3",
+       "logentry-delete-revision-legacy": "$1 {{GENDER:$2|changed}} visibility of revisions on page $3",
+       "logentry-suppress-delete": "$1 {{GENDER:$2|suppressed}} page $3",
+       "logentry-suppress-event": "$1 secretly {{GENDER:$2|changed}} visibility of {{PLURAL:$5|a log event|$5 log events}} on $3: $4",
+       "logentry-suppress-revision": "$1 secretly {{GENDER:$2|changed}} visibility of {{PLURAL:$5|a revision|$5 revisions}} on page $3: $4",
+       "logentry-suppress-event-legacy": "$1 secretly {{GENDER:$2|changed}} visibility of log events on $3",
+       "logentry-suppress-revision-legacy": "$1 secretly {{GENDER:$2|changed}} visibility of revisions on page $3",
+       "revdelete-content-hid": "content hidden",
+       "revdelete-summary-hid": "edit summary hidden",
+       "revdelete-uname-hid": "username hidden",
+       "revdelete-content-unhid": "content unhidden",
+       "revdelete-summary-unhid": "edit summary unhidden",
+       "revdelete-uname-unhid": "username unhidden",
+       "revdelete-restricted": "applied restrictions to administrators",
+       "revdelete-unrestricted": "removed restrictions for administrators",
+       "logentry-move-move": "$1 {{GENDER:$2|moved}} page $3 to $4",
+       "logentry-move-move-noredirect": "$1 {{GENDER:$2|moved}} page $3 to $4 without leaving a redirect",
+       "logentry-move-move_redir": "$1 {{GENDER:$2|moved}} page $3 to $4 over redirect",
+       "logentry-move-move_redir-noredirect": "$1 {{GENDER:$2|moved}} page $3 to $4 over a redirect without leaving a redirect",
+       "logentry-patrol-patrol": "$1 {{GENDER:$2|marked}} revision $4 of page $3 patrolled",
+       "logentry-patrol-patrol-auto": "$1 automatically {{GENDER:$2|marked}} revision $4 of page $3 patrolled",
+       "logentry-newusers-newusers": "User account $1 was {{GENDER:$2|created}}",
+       "logentry-newusers-create": "User account $1 was {{GENDER:$2|created}}",
+       "logentry-newusers-create2": "User account $3 was {{GENDER:$2|created}} by $1",
+       "logentry-newusers-byemail": "User account $3 was {{GENDER:$2|created}} by $1 and password was sent by email",
+       "logentry-newusers-autocreate": "User account $1 was {{GENDER:$2|created}} automatically",
+       "logentry-rights-rights": "$1 {{GENDER:$2|changed}} group membership for $3 from $4 to $5",
+       "logentry-rights-rights-legacy": "$1 {{GENDER:$2|changed}} group membership for $3",
+       "logentry-rights-autopromote": "$1 was automatically {{GENDER:$2|promoted}} from $4 to $5",
+       "rightsnone": "(none)",
+       "revdelete-logentry": "changed revision visibility of \"[[$1]]\"",
+       "logdelete-logentry": "changed event visibility of \"[[$1]]\"",
+       "revdelete-content": "content",
+       "revdelete-summary": "edit summary",
+       "revdelete-uname": "username",
+       "revdelete-hid": "hid $1",
+       "revdelete-unhid": "unhid $1",
+       "revdelete-log-message": "$1 for $2 {{PLURAL:$2|revision|revisions}}",
+       "logdelete-log-message": "$1 for $2 {{PLURAL:$2|event|events}}",
+       "deletedarticle": "deleted \"[[$1]]\"",
+       "suppressedarticle": "suppressed \"[[$1]]\"",
+       "undeletedarticle": "restored \"[[$1]]\"",
+       "patrol-log-line": "marked $1 of $2 patrolled $3",
+       "patrol-log-auto": "(automatic)",
+       "patrol-log-diff": "revision $1",
+       "1movedto2": "moved [[$1]] to [[$2]]",
+       "1movedto2_redir": "moved [[$1]] to [[$2]] over redirect",
+       "move-redirect-suppressed": "redirect suppressed",
+       "newuserlog-create-entry": "New user account",
+       "newuserlog-create2-entry": "created new account $1",
+       "newuserlog-autocreate-entry": "Account created automatically",
+       "rightslogentry": "changed group membership for $1 from $2 to $3",
+       "rightslogentry-autopromote": "was automatically promoted from $2 to $3",
+       "feedback-bugornote": "If you are ready to describe a technical problem in detail please [$1 report a bug].\nOtherwise, you can use the easy form below. Your comment will be added to the page \"[$3 $2]\", along with your username.",
+       "feedback-subject": "Subject:",
+       "feedback-message": "Message:",
+       "feedback-cancel": "Cancel",
+       "feedback-submit": "Submit Feedback",
+       "feedback-adding": "Adding feedback to page...",
+       "feedback-error1": "Error: Unrecognized result from API",
+       "feedback-error2": "Error: Edit failed",
+       "feedback-error3": "Error: No response from API",
+       "feedback-thanks": "Thanks! Your feedback has been posted to the page \"[$2 $1]\".",
+       "feedback-close": "Done",
+       "feedback-bugcheck": "Great! Just check that it is not already one of the [$1 known bugs].",
+       "feedback-bugnew": "I checked. Report a new bug",
+       "searchsuggest-search": "Search",
+       "searchsuggest-containing": "containing...",
+       "api-error-badaccess-groups": "You are not permitted to upload files to this wiki.",
+       "api-error-badtoken": "Internal error: Bad token.",
+       "api-error-copyuploaddisabled": "Uploading by URL is disabled on this server.",
+       "api-error-duplicate": "There {{PLURAL:$1|is [$2 another file]|are [$2 some other files]}} already on the site with the same content.",
+       "api-error-duplicate-archive": "There {{PLURAL:$1|was [$2 another file]|were [$2 some other files]}} already on the site with the same content, but {{PLURAL:$1|it was|they were}} deleted.",
+       "api-error-duplicate-archive-popup-title": "Duplicate {{PLURAL:$1|file that has|files that have}} already been deleted.",
+       "api-error-duplicate-popup-title": "Duplicate {{PLURAL:$1|file|files}}.",
+       "api-error-empty-file": "The file you submitted was empty.",
+       "api-error-emptypage": "Creating new, empty pages is not allowed.",
+       "api-error-fetchfileerror": "Internal error: Something went wrong while fetching the file.",
+       "api-error-fileexists-forbidden": "A file with name \"$1\" already exists, and cannot be overwritten.",
+       "api-error-fileexists-shared-forbidden": "A file with name \"$1\" already exists in the shared file repository, and cannot be overwritten.",
+       "api-error-file-too-large": "The file you submitted was too large.",
+       "api-error-filename-tooshort": "The filename is too short.",
+       "api-error-filetype-banned": "This type of file is banned.",
+       "api-error-filetype-banned-type": "$1 {{PLURAL:$4|is not a permitted file type|are not permitted file types}}. Permitted {{PLURAL:$3|file type is|file types are}} $2.",
+       "api-error-filetype-missing": "The filename is missing an extension.",
+       "api-error-hookaborted": "The modification you tried to make was aborted by an extension.",
+       "api-error-http": "Internal error: Unable to connect to server.",
+       "api-error-illegal-filename": "The filename is not allowed.",
+       "api-error-internal-error": "Internal error: Something went wrong with processing your upload on the wiki.",
+       "api-error-invalid-file-key": "Internal error: File was not found in temporary storage.",
+       "api-error-missingparam": "Internal error: Missing parameters on request.",
+       "api-error-missingresult": "Internal error: Could not determine if the copy succeeded.",
+       "api-error-mustbeloggedin": "You must be logged in to upload files.",
+       "api-error-mustbeposted": "Internal error: Request requires HTTP POST.",
+       "api-error-noimageinfo": "The upload succeeded, but the server did not give us any information about the file.",
+       "api-error-nomodule": "Internal error: No upload module set.",
+       "api-error-ok-but-empty": "Internal error: No response from server.",
+       "api-error-overwrite": "Overwriting an existing file is not allowed.",
+       "api-error-stashfailed": "Internal error: Server failed to store temporary file.",
+       "api-error-publishfailed": "Internal error: Server failed to publish temporary file.",
+       "api-error-stasherror": "There was an error while uploading the file to stash.",
+       "api-error-timeout": "The server did not respond within the expected time.",
+       "api-error-unclassified": "An unknown error occurred.",
+       "api-error-unknown-code": "Unknown error: \"$1\".",
+       "api-error-unknown-error": "Internal error: Something went wrong when trying to upload your file.",
+       "api-error-unknown-warning": "Unknown warning: \"$1\".",
+       "api-error-unknownerror": "Unknown error: \"$1\".",
+       "api-error-uploaddisabled": "Uploading is disabled on this wiki.",
+       "api-error-verification-error": "This file might be corrupt, or have the wrong extension.",
+       "duration-seconds": "$1 {{PLURAL:$1|second|seconds}}",
+       "duration-minutes": "$1 {{PLURAL:$1|minute|minutes}}",
+       "duration-hours": "$1 {{PLURAL:$1|hour|hours}}",
+       "duration-days": "$1 {{PLURAL:$1|day|days}}",
+       "duration-weeks": "$1 {{PLURAL:$1|week|weeks}}",
+       "duration-years": "$1 {{PLURAL:$1|year|years}}",
+       "duration-decades": "$1 {{PLURAL:$1|decade|decades}}",
+       "duration-centuries": "$1 {{PLURAL:$1|century|centuries}}",
+       "duration-millennia": "$1 {{PLURAL:$1|millennium|millennia}}",
+       "rotate-comment": "Image rotated by $1 {{PLURAL:$1|degree|degrees}} clockwise",
+       "limitreport-title": "Parser profiling data:",
+       "limitreport-cputime": "CPU time usage",
+       "limitreport-cputime-value": "$1 {{PLURAL:$1|second|seconds}}",
+       "limitreport-walltime": "Real time usage",
+       "limitreport-walltime-value": "$1 {{PLURAL:$1|second|seconds}}",
+       "limitreport-ppvisitednodes": "Preprocessor visited node count",
+       "limitreport-ppvisitednodes-value": "$1/$2",
+       "limitreport-ppgeneratednodes": "Preprocessor generated node count",
+       "limitreport-ppgeneratednodes-value": "$1/$2",
+       "limitreport-postexpandincludesize": "Post-expand include size",
+       "limitreport-postexpandincludesize-value": "$1/$2 {{PLURAL:$2|byte|bytes}}",
+       "limitreport-templateargumentsize": "Template argument size",
+       "limitreport-templateargumentsize-value": "$1/$2 {{PLURAL:$2|byte|bytes}}",
+       "limitreport-expansiondepth": "Highest expansion depth",
+       "limitreport-expansiondepth-value": "$1/$2",
+       "limitreport-expensivefunctioncount": "Expensive parser function count",
+       "limitreport-expensivefunctioncount-value": "$1/$2",
+       "expandtemplates": "Expand templates",
+       "expand_templates_intro": "This special page takes text and expands all templates in it recursively.\nIt also expands supported parser functions like\n<code><nowiki>{{</nowiki>#language:…}}</code> and variables like\n<code><nowiki>{{</nowiki>CURRENTDAY}}</code>.\nIn fact, it expands pretty much everything in double-braces.",
+       "expand_templates_title": "Context title, for {{FULLPAGENAME}}, etc.:",
+       "expand_templates_input": "Input text:",
+       "expand_templates_output": "Result",
+       "expand_templates_xml_output": "XML output",
+       "expand_templates_html_output": "Raw HTML output",
+       "expand_templates_ok": "OK",
+       "expand_templates_remove_comments": "Remove comments",
+       "expand_templates_remove_nowiki": "Suppress <nowiki> tags in result",
+       "expand_templates_generate_xml": "Show XML parse tree",
+       "expand_templates_generate_rawhtml": "Show raw HTML",
+       "expand_templates_preview": "Preview"
 }
index af7c8c3..dd696b5 100644 (file)
        "newimages-summary": "Ĉi tiu speciala paĝo montras la lastajn alŝutitajn dosierojn.",
        "newimages-legend": "Dosiernomo",
        "newimages-label": "Dosiernomo (aŭ parto de ĝi):",
-       "showhidebots": "($1 robotojn)",
        "noimages": "Nenio videbla.",
        "ilsubmit": "Serĉi",
        "bydate": "laŭ dato",
index c8261b4..39346b0 100644 (file)
        "tog-watchlisthideliu": "Ocultar las ediciones de los usuarios registrados en la lista de seguimiento",
        "tog-watchlisthideanons": "Ocultar las ediciones de los usuarios anónimos en la lista de seguimiento",
        "tog-watchlisthidepatrolled": "Ocultar las ediciones patrulladas en la lista de seguimiento",
-       "tog-ccmeonemails": "Recibir copias de los correos que envío a otros usuarios",
+       "tog-ccmeonemails": "Recibir copias de los mensajes que envíe a otros usuarios",
        "tog-diffonly": "No mostrar bajo las ''diferencias'' el contenido de la página",
        "tog-showhiddencats": "Mostrar las categorías escondidas",
        "tog-norollbackdiff": "Omitir la diferencia después de revertir",
        "nospecialpagetext": "<strong>Ha solicitado una página especial inexistente.</strong>\n\nPuedes ver una lista de las páginas especiales en [[Special:SpecialPages|{{int:specialpages}}]].",
        "error": "Error",
        "databaseerror": "Error de la base de datos",
-       "databaseerror-text": "Se ha producido un error en la base de datos.\nEsto puede indicar un bug en el software.",
+       "databaseerror-text": "Ocurrió un error de consulta de la base de datos.\nEsto puede indicar un fallo en el software.",
        "databaseerror-textcl": "Se ha producido un error en la base de datos.",
        "databaseerror-query": "Consulta: $1",
        "databaseerror-function": "Función: $1",
        "viewsourcetext": "Puedes ver y copiar el código fuente de esta página:",
        "viewyourtext": "Puedes ver y copiar el código de '''tus ediciones''' a esta página:",
        "protectedinterface": "Esta página proporciona el texto de la interfaz del software en este wiki, y está protegida para prevenir el abuso.\nPara agregar o cambiar las traducciones para todos los wikis, por favor, usa [//translatewiki.net/ translatewiki.net], el proyecto de localización de MediaWiki.",
-       "editinginterface": "'''Aviso:''' Estás editando una página usada para proporcionar el texto de la interfaz para el software. \nLos cambios en esta página afectarán a la apariencia de la interfaz para los demás usuarios de este wiki. \nPara añadir o cambiar las traducciones, por favor considera usar [//translatewiki.net/ translatewiki.net], el proyecto de localización de MediaWiki.",
+       "editinginterface": "<strong>Aviso:</strong> Estás editando una página usada para proporcionar el texto de la interfaz para el software. \nLos cambios en esta página afectarán la apariencia de la interfaz para los demás usuarios de este wiki. \nPara añadir o cambiar las traducciones utiliza [//translatewiki.net/ translatewiki.net], el proyecto de localización de MediaWiki.",
        "cascadeprotected": "Esta página ha sido protegida para su edición, porque está incluida en {{PLURAL:$1|la siguiente página|las siguientes páginas}}, que están protegidas con la opción de «cascada»:\n$2",
        "namespaceprotected": "No tienes permiso para editar las páginas del espacio de nombres '''$1'''.",
        "customcssprotected": "No tienes permiso para editar esta página CSS, porque contiene configuraciones personales de otro usuario.",
        "mycustomjsprotected": "No tienes permiso para editar esta página JavaScript.",
        "myprivateinfoprotected": "No tienes permiso para editar tu información privada.",
        "mypreferencesprotected": "No tienes permiso para editar tus preferencias.",
-       "ns-specialprotected": "Las páginas especiales no se pueden editar",
+       "ns-specialprotected": "No se pueden editar las páginas especiales.",
        "titleprotected": "Esta página ha sido protegida contra creación por [[User:$1|$1]].\nEl motivo dado fue: \"''$2''\".",
        "filereadonlyerror": "No se puede modificar el archivo \"$1\" porque el repositorio de archivos \"$2\" está en modo de sólo lectura.\nEl administrador que lo ha bloqueado ofrece esta explicación: \"$3\".",
        "invalidtitle-knownnamespace": "Título no válido con el espacio de nombres \"$2\" y el texto \"$3\"",
        "exception-nologin": "No has iniciado sesión",
        "exception-nologin-text": "[[Special:Userlogin|Inicia sesión]] para acceder a esta página o acción.",
        "exception-nologin-text-manual": "Necesitas $1 para acceder a esta página o acción.",
-       "virus-badscanner": "Error de configuración: Antivirus desconocido: ''$1''",
+       "virus-badscanner": "Configuración incorrecta: antivirus desconocido: <em>$1</em>",
        "virus-scanfailed": "falló el análisis (código $1)",
        "virus-unknownscanner": "antivirus desconocido:",
-       "logouttext": "\"'Usted está ahora desconectado.\"'\nTenga en cuenta que algunas páginas pueden continuar mostrándose como si todavía estuviera conectado, hasta que borres la caché de tu navegador.",
+       "logouttext": "<strong>Ha finalizado tu sesión.</strong>\n\nPuede que algunas páginas continúen mostrándose como si la sesión estuviera iniciada hasta que vacíes la memoria caché del navegador.",
        "welcomeuser": "¡Te damos la bienvenida, $1!",
        "welcomecreation-msg": "Se ha creado tu cuenta.\nNo olvides personalizar tus [[Special:Preferences|preferencias de {{SITENAME}}]].",
        "yourname": "Nombre de usuario:",
        "remembermypassword": "Mantenerme conectado en este navegador (hasta $1 {{PLURAL:$1|día|días}})",
        "userlogin-remembermypassword": "Mantener mi sesión iniciada",
        "userlogin-signwithsecure": "Usar conexión segura",
-       "yourdomainname": "Dominio",
+       "yourdomainname": "Tu dominio:",
        "password-change-forbidden": "No puedes cambiar las contraseñas de este wiki.",
        "externaldberror": "Hubo un error de autenticación externa de la base de datos o bien no tienes autorización para actualizar tu cuenta externa.",
        "login": "Acceder",
        "login-userblocked": "Este usuario está bloqueado. Inicio de sesión no permitido.",
        "wrongpassword": "La contraseña indicada es incorrecta.\nInténtalo de nuevo.",
        "wrongpasswordempty": "No has escrito una contraseña.\nInténtalo de nuevo.",
-       "passwordtooshort": "Las contraseñas deben tener al menos {{PLURAL:$1|1 caracter|$1 caracteres}}.",
+       "passwordtooshort": "Las contraseñas deben tener al menos {{PLURAL:$1|1 carácter|$1 caracteres}}.",
        "password-name-match": "Tu contraseña debe ser diferente de tu nombre de usuario.",
        "password-login-forbidden": "El uso de este nombre de usuario y contraseña han sido prohibidos.",
        "mailmypassword": "Restablecer la contraseña",
        "loginlanguagelabel": "Idioma: $1",
        "suspicious-userlogout": "Tu solicitud de desconexión ha sido denegada, pues parece haber sido enviada desde un navegador defectuoso o un proxy caché.",
        "createacct-another-realname-tip": "El nombre real es opcional.\nSi se proporciona, se usará para dar al usuario la atribución de su trabajo.",
-       "pt-login": "Iniciar sesión",
-       "pt-login-button": "Iniciar sesión",
+       "pt-login": "Acceder",
+       "pt-login-button": "Acceder",
        "pt-createaccount": "Crear una cuenta",
-       "pt-userlogout": "Cerrar sesión",
+       "pt-userlogout": "Salir",
        "php-mail-error-unknown": "Error desconocido en la función mail() de PHP.",
        "user-mail-no-addy": "Se ha intentado enviar correo electrónico sin una dirección de correo electrónico.",
        "user-mail-no-body": "Trató de enviar un correo electrónico con un cuerpo vacío o excesivamente corto.",
        "resetpass-submit-loggedin": "Cambiar contraseña",
        "resetpass-submit-cancel": "Cancelar",
        "resetpass-wrong-oldpass": "La contraseña antigua no es correcta.\nPuede que ya hayas cambiado la contraseña o que hayas pedido una temporal.",
-       "resetpass-recycled": "Por favor, restablece tu contraseña a algo distinto de tu contraseña actual.",
+       "resetpass-recycled": "Restablece tu contraseña a algo distinto de tu contraseña actual.",
        "resetpass-temp-emailed": "Has iniciado sesión con un código temporal por correo electrónico.\nPara terminar la sesión, debes establecer una nueva contraseña aquí:",
        "resetpass-temp-password": "Contraseña temporal:",
        "resetpass-abort-generic": "Una extensión ha cancelado el cambio de la contraseña.",
        "parser-template-recursion-depth-warning": "Se ha excedido el límite de recursión de plantillas ($1)",
        "language-converter-depth-warning": "El límite de profundidad del convertidor de idioma ha excedido ($1)",
        "node-count-exceeded-category": "Páginas donde se supera el número de nodos",
+       "node-count-exceeded-category-desc": "Una categoría para las páginas donde se supera el número de nodos.",
        "node-count-exceeded-warning": "Página que ha superado el número de nodos",
        "expansion-depth-exceeded-category": "Páginas donde se supera la profundidad de expansión",
+       "expansion-depth-exceeded-category-desc": "Esta es una categoría para las páginas donde se supera la profundidad de expansión.",
        "expansion-depth-exceeded-warning": "Página que ha superado la profundidad de expansión",
        "parser-unstrip-loop-warning": "Se ha detectado un bucle \"unstrip\"",
        "parser-unstrip-recursion-limit": "Se ha superado el límite de recursión de \"unstrip\" ($1)",
        "prefs-emailconfirm-label": "Confirmación de correo electrónico:",
        "youremail": "Correo electrónico:",
        "username": "{{GENDER:$1|Nombre de usuario|Nombre de usuaria}}:",
-       "uid": "ID de {{GENDER:$1|usuario|usuaria}}:",
        "prefs-memberingroups": "{{GENDER:$2|Miembro}} {{PLURAL:$1|del grupo|de los grupos}}:",
        "prefs-registration": "Fecha y hora de registro:",
        "yourrealname": "Nombre real:",
        "right-move": "Trasladar páginas",
        "right-move-subpages": "Trasladar páginas con sus subpáginas",
        "right-move-rootuserpages": "Trasladar páginas de usuario raíz",
+       "right-move-categorypages": "Trasladar páginas de categoría",
        "right-movefile": "Trasladar archivos",
        "right-suppressredirect": "No crear redirecciones de las páginas fuente  al trasladar páginas",
        "right-upload": "Subir archivos",
        "action-move": "trasladar esta página",
        "action-move-subpages": "trasladar esta página y sus subpáginas",
        "action-move-rootuserpages": "trasladar páginas de usuario raíz",
+       "action-move-categorypages": "trasladar páginas de categoría",
        "action-movefile": "trasladar este archivo",
        "action-upload": "subir este archivo",
        "action-reupload": "reemplazar este archivo existente",
        "log-title-wildcard": "Buscar títulos que empiecen con este texto",
        "showhideselectedlogentries": "Mostrar u ocultar las entradas seleccionadas del registro",
        "allpages": "Todas las páginas",
-       "alphaindexline": "$1 a $2",
        "nextpage": "Siguiente página ($1)",
        "prevpage": "Página anterior ($1)",
        "allpagesfrom": "Mostrar páginas que empiecen por:",
        "trackingcategories-disabled": "La categoría está desactivada",
        "mailnologin": "Ninguna dirección de envio",
        "mailnologintext": "Debes [[Special:UserLogin|iniciar sesión]] y tener una dirección electrónica válida en tus [[Special:Preferences|preferencias]] para enviar un correo electrónico a otros usuarios.",
-       "emailuser": "Enviar un correo electrónico a {{GENDER:{{BASEPAGENAME}}|este usuario|esta usuaria}}",
-       "emailuser-title-target": "Enviar un correo electrónico a {{GENDER:$1|este usuario|esta usuaria}}",
+       "emailuser": "Enviar un mensaje de correo a {{GENDER:{{BASEPAGENAME}}|este usuario|esta usuaria}}",
+       "emailuser-title-target": "Enviar un mensaje a {{GENDER:$1|este usuario|esta usuaria}}",
        "emailuser-title-notarget": "Enviar un correo electrónico al usuario",
-       "emailpage": "Enviar un correo electrónico a un usuario",
+       "emailpage": "Enviar mensaje al usuario",
        "emailpagetext": "Puedes usar el formulario de abajo para enviar un correo electrónico a {{GENDER:$1|este usuario|esta usuaria}}.\nLa dirección de correo electrónico que indicaste en [[Special:Preferences|tus preferencias de usuario]] aparecerá en el campo \"Remitente\" o \"De\" para que el destinatario pueda responderte.",
        "defemailsubject": "Correo electrónico enviado por el usuario «$1» desde {{SITENAME}}",
        "usermaildisabled": "Correo electrónico del usuario deshabilitado",
        "movepagetalktext": "La página de discusión asociada, si existe, será renombrada automáticamente '''a menos que:'''\n*Estés trasladando la página entre espacios de nombres diferentes,\n*Una página de discusión no vacía ya exista con el nombre nuevo, o\n*No marques el recuadro «Renombrar la página de discusión asociada».\n\nEn estos casos, deberás trasladar manualmente el contenido de la página de discusión.",
        "movearticle": "Renombrar página",
        "moveuserpage-warning": "'''Aviso:''' estás a punto de trasladar una página de usuario. Ten en cuenta que solo será trasladada la página; el usuario '''no''' será renombrado.",
+       "movecategorypage-warning": "<strong>Advertencia:</strong> Estás a punto de trasladar una página de categoría. Ten en cuenta que se trasladará sólo la página y las páginas en la antigua categoría <em>no</em> serán recategorizadas en la nueva.",
        "movenologintext": "Es necesario ser usuario registrado y [[Special:UserLogin|haber iniciado sesión]] para renombrar una página.",
        "movenotallowed": "No tienes permiso para trasladar páginas.",
        "movenotallowedfile": "No tienes permiso para trasladar archivos.",
        "cant-move-user-page": "No tienes permiso para trasladar páginas de usuario (excepto subpáginas).",
        "cant-move-to-user-page": "No tienes permiso para trasladar una página a una página de usuario (excepto a subpáginas de usuario).",
+       "cant-move-category-page": "No tienes permiso para trasladar páginas de categoría.",
+       "cant-move-to-category-page": "No tienes permiso para trasladar una página a una página de categoría.",
        "newtitle": "A título nuevo:",
        "move-watch": "Vigilar páginas de origen y destino",
        "movepagebtn": "Renombrar página",
        "newimages-summary": "Esta página especial muestra una galería de los últimos archivos subidos.",
        "newimages-legend": "Nombre del fichero",
        "newimages-label": "Nombre del fichero (o una parte):",
-       "showhidebots": "($1 bots)",
+       "newimages-showbots": "Mostrar cargas de bots",
        "noimages": "No hay nada que ver.",
        "ilsubmit": "Buscar",
        "bydate": "por fecha",
        "watchlistedit-raw-done": "Tu lista de seguimiento se ha actualizado.",
        "watchlistedit-raw-added": "{{PLURAL:$1|Se ha añadido una página|Se han añadido $1 páginas}}:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|Una página ha sido borrada|$1 páginas han sido borradas}}:",
+       "watchlistedit-clear-title": "Lista de seguimiento limpiada",
+       "watchlistedit-clear-legend": "Limpiar lista de seguimiento",
+       "watchlistedit-clear-explain": "Todos los títulos serán removidos de tu lista de seguimiento",
+       "watchlistedit-clear-titles": "Títulos:",
+       "watchlistedit-clear-submit": "Vaciar la lista de seguimiento (¡permanente!)",
+       "watchlistedit-clear-done": "Se ha vaciado tu lista de seguimiento.",
+       "watchlistedit-clear-removed": "{{PLURAL:$1|un título fue removido|Los títulos $1 fueron removidos}}:",
+       "watchlistedit-too-many": "Hay demasiadas páginas para mostrar aquí.",
+       "watchlisttools-clear": "Limpiar la lista de seguimiento",
        "watchlisttools-view": "Ver cambios",
        "watchlisttools-edit": "Ver y editar tu lista de seguimiento",
        "watchlisttools-raw": "Editar lista de seguimiento en crudo",
        "specialpages-note": "* Páginas especiales normales\n* <span class=\"mw-specialpagerestricted\">Páginas especiales restringidas.</span>\n* <span class=\"mw-specialpagecached\">Páginas especiales en caché (podrían ser obsoletas).</span>",
        "specialpages-group-maintenance": "Reportes de mantenimiento",
        "specialpages-group-other": "Otras páginas especiales",
-       "specialpages-group-login": "Iniciar sesión / Crear cuenta",
+       "specialpages-group-login": "Acceder/crear cuenta",
        "specialpages-group-changes": "Cambios recientes y registros",
        "specialpages-group-media": "Páginas sobre archivos",
        "specialpages-group-users": "Usuarios y permisos",
index 7e0b8a3..592287c 100644 (file)
        "newimages-summary": "Sellel erilehel on viimati üles laaditud failid.",
        "newimages-legend": "Filter",
        "newimages-label": "Failinimi (või selle osa):",
-       "showhidebots": "($1 robotite kaastööd)",
        "noimages": "Uusi pilte ei ole.",
        "ilsubmit": "Otsi",
        "bydate": "kuupäeva järgi",
index 20a25a8..7a59674 100644 (file)
@@ -18,7 +18,8 @@
                        "Xabier Armendaritz",
                        "לערי ריינהארט",
                        "පසිඳු කාවින්ද",
-                       "아라"
+                       "아라",
+                       "Joxemai"
                ]
        },
        "tog-underline": "Loturak azpimarratu:",
        "searchbutton": "Bilatu",
        "go": "Joan",
        "searcharticle": "Joan",
-       "history": "Orrialdearen historia",
+       "history": "Orriaren historia",
        "history_short": "Historia",
        "updatedmarker": "nire azkeneko bisitaz geroztik eguneratuta",
        "printableversion": "Inprimatzeko bertsioa",
        "loginlanguagelabel": "Hizkuntza: $1",
        "suspicious-userlogout": "Saioa amaitzeko egin duzun eskaria ukatu da. Izan ere, ematen du eskari hori gaizki dabilen nabigatzaile edo cache proxy batek bidali duela.",
        "createacct-another-realname-tip": "Benetako izena hautazkoa da.\nEmatea erabakitzen baduzu hori erabiliko da lanaren atribuzioa egiterako garaian.",
+       "pt-createaccount": "Sortu kontua",
+       "pt-userlogout": "Saioa itxi",
        "php-mail-error-unknown": "PHPren mail() funtzioan arazo ezezagun bat egon da.",
        "user-mail-no-addy": "E-posta bidaltzen saiatu zara e-posta helbiderik gabe.",
        "user-mail-no-body": "E-posta bidaltzen saiatu zara testu gorputzik gabe edo laburregiarekin.",
        "changepassword": "Pasahitza aldatu",
-       "resetpass_announce": "E-postaz jasotako kode tenporal baten bidez saioa hasi duzu. Saioa hasierarekin jarraitzeko, pasahitz berri bat definitu beharra daukazu:",
+       "resetpass_announce": "Sartu ahal izateko, pasahitz berria ezarri behar duzu.",
        "resetpass_text": "<!-- Testua hemen idatzi -->",
        "resetpass_header": "Pasahitza aldatu",
        "oldpassword": "Pasahitz zaharra:",
        "retypenew": "Pasahitz berria berriz idatzi:",
        "resetpass_submit": "Pasahitza definitu eta saioa hasi",
        "changepassword-success": "Zure pasahitza ondo aldatu da!",
+       "changepassword-throttled": "Saioa hasteko saiakera gehiegi egin berri dituzu.\nBerriro saiatu aurretik $1 itxoin, mesedez.",
        "resetpass_forbidden": "Ezin dira pasahitzak aldatu",
        "resetpass-no-info": "Orrialde honetara zuzenean sartzeko izena eman behar duzu.",
        "resetpass-submit-loggedin": "Pasahitza aldatu",
        "resetpass-submit-cancel": "Utzi",
        "resetpass-wrong-oldpass": "Behin-behineko edo oraintxuko pasahitza ez da baliagarria.\nAgian dagoeneko ondo aldatu duzu zure pasahitza edo behin-behineko pasahitza bat eskatu duzu.",
+       "resetpass-recycled": "Mesedez berritu zure pasahitza.",
        "resetpass-temp-password": "Behin-behineko pasahitza:",
        "resetpass-abort-generic": "Estentsio batek pasahitza aldatzea ekidin du.",
+       "resetpass-expired": "Zure pasahitza iraungitu da. Sartzeko, pasahitz berria ezarri, mesedez.",
        "passwordreset": "Pasahitzaren berrezarpena",
        "passwordreset-text-one": "Bete formulario hau zure pasahitza berrezartzeko.",
        "passwordreset-text-many": "{{PLURAL:$1|Sartu datuetako bat zure pasahitza berrezartzeko.}}",
        "pagemerge-logentry": "[[$1]] [[$2]](r)ekin batu da ($3(e)raino berrikuspenak)",
        "revertmerge": "Bereiztu",
        "mergelogpagetext": "Jarraian dagoen zerrendak orrialde baten historiatik beste batera egindako azken bateratzeak erakusten ditu.",
-       "history-title": "«$1» orrialdearen historia berrikuspena",
+       "history-title": "«$1» orriaren historia berrikuspena",
        "difference-title": "«$1»: berrikuspenen arteko aldeak",
        "difference-title-multipage": "«$1» eta «$2» orrien arteko aldeak",
        "difference-multipage": "(Orrien arteko aldeak)",
        "prefs-emailconfirm-label": "E-posta baieztapena:",
        "youremail": "E-posta:",
        "username": "{{GENDER:$1|Erabiltzaile izena}}:",
-       "uid": "{{GENDER:$1|Erabiltzaile}} zenbakia:",
        "prefs-memberingroups": "{{PLURAL:$1|Taldeko|taldeetako}} {{GENDER:$2|kidea}}:",
        "prefs-registration": "Erregistratzeko unea:",
        "yourrealname": "Benetako izena:",
        "log-title-wildcard": "Testu honekin hasten diren izenburuak bilatu",
        "showhideselectedlogentries": "Erakutsi/ezkutatu aukeratutako log sarrerak",
        "allpages": "Orri guztiak",
-       "alphaindexline": "$1(e)tik $2(e)raino",
        "nextpage": "Hurrengo orrialdea ($1)",
        "prevpage": "Aurreko orrialdea ($1)",
        "allpagesfrom": "Erakutsi hasiera hau duten orriak:",
        "newimages-summary": "Orrialde berezi honek igotako azkeneko fitxategiak erakusten ditu.",
        "newimages-legend": "Iragazkia",
        "newimages-label": "Fitxategia (edo bere zati bat):",
-       "showhidebots": "($1 bot-ak)",
        "noimages": "Ez dago ezer ikusteko.",
        "ilsubmit": "Bilatu",
        "bydate": "dataren arabera",
index 5246791..46d5017 100644 (file)
        "imagelisttext": "Embahu ai una lista con '''$1''' {{PLURAL:$1|archivu|archivus}} ordenaus $2.",
        "newimages-legend": "Filtru",
        "newimages-label": "Nombri el archivu (u parti):",
-       "showhidebots": "($1 bots)",
        "noimages": "Nu ai ná pa vel.",
        "ilsubmit": "Landeal",
        "bydate": "pol fecha",
index ebf22ba..7758039 100644 (file)
@@ -33,7 +33,8 @@
                        "جواد",
                        "درفش کاویانی",
                        "محک",
-                       "아라"
+                       "아라",
+                       "Mostafadaneshvar"
                ]
        },
        "tog-underline": "خط کشیدن زیر پیوندها:",
        "edit-gone-missing": "امکان به‌روز کردن صفحه وجود ندارد.\nبه نظرمی‌رسد که صفحه حذف شده باشد.",
        "edit-conflict": "تعارض ویرایشی.",
        "edit-no-change": "ویرایش شما نادیده گرفته شد، زیرا تغییری در متن داده نشده بود.",
+       "postedit-confirmation-created": "صفحه ایجاد شده است.",
+       "postedit-confirmation-restored": "صفحه بازیابی شده است.",
        "postedit-confirmation-saved": "ویرایش شما ذخیره شد.",
        "edit-already-exists": "امکان ساختن صفحهٔ جدید وجود ندارد.\nاین صفحه از قبل وجود داشته‌است.",
        "defaultmessagetext": "متن پیش‌فرض پیغام",
        "parser-template-recursion-depth-warning": "محدودیت عمق بازگشت الگو رد شد ($1)",
        "language-converter-depth-warning": "محدودیت عمق مبدل زبانی رد شد ($1)",
        "node-count-exceeded-category": "صفحه‌هایی که از حداکثر تعداد گره تجاوز کرده‌اند",
+       "node-count-exceeded-category-desc": "رده برای صفحاتی که در آنها شمارنده فراتر رفته است.",
        "node-count-exceeded-warning": "صفحه از حداکثر تعداد گره تجاوز کرد",
        "expansion-depth-exceeded-category": "صفحه‌هایی که از حداکثر عمق بسط دادن تجاوز کرده‌اند",
+       "expansion-depth-exceeded-category-desc": "رده برای صفحاتی که در آنها عمق گسترش فراتر رفته است.",
        "expansion-depth-exceeded-warning": "صفحه حداکثر عمق بسط دادن تجاوز کرد",
        "parser-unstrip-loop-warning": "حلقه در دستور unstrip پیدا شد",
        "parser-unstrip-recursion-limit": "از حداکثر ارجاع در دستور unstrip تجاوز شد ($1)",
        "showhideselectedversions": "نمایش/نهفتن نسخه‌های انتخاب شده",
        "editundo": "خنثی‌سازی",
        "diff-empty": "(بدون تفاوت)",
-       "diff-multi-sameuser": "({{PLURAL:$1|یک نسخهٔ متوسط|$1 نسخه‌های متوسط}} توسط کاربر مشابهی که نشان داده نشده)",
+       "diff-multi-sameuser": "({{PLURAL:$1|یک نسخهٔ میانی|$1 نسخهٔ میانی}} توسط کاربر مشابهی که نشان داده نشده)",
        "diff-multi-otherusers": "({{PLURAL:$1|یک نسخهٔ متوسط|$1 نسخه‌های متوسط}} توسط {{PLURAL:$2|کاربر دیگری|$2 کاربران}} نشان داده نشده)",
        "diff-multi-manyusers": "({{PLURAL:$1|یک|$1}} ویرایش میانی توسط بیش از {{PLURAL:$2|یک|$2}} کاربر نشان داده نشده‌است)",
        "difference-missing-revision": "{{PLURAL:$2|یک ویرایش|$2 ویرایش}}  از تفاوت نسخه‌ها ($1) {{PLURAL:$2|یافت|یافت}}  نشد.\n\nمعمولاً در اثر پیوند به تاریخچهٔ به‌روز نشدهٔ صفحهٔ حذف شده است.\nمی‌توانید جزئیات بیشتر را در [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} سیاههٔ حذف] بیابید.",
        "prefs-emailconfirm-label": "تأیید رایانامه:",
        "youremail": "رایانامه:",
        "username": "{{GENDER:$1|نام کاربری}}:",
-       "uid": "شناسهٔ {{GENDER:$1|کاربری}}:",
        "prefs-memberingroups": "{{GENDER:$2|عضو}} {{PLURAL:$1|گروه|گروه}}:",
        "prefs-registration": "زمان ثبت‌نام:",
        "yourrealname": "نام واقعی:",
        "right-move": "انتقال صفحه",
        "right-move-subpages": "انتقال صفحه‌ها به همراه زیر‌صفحه‌هایشان",
        "right-move-rootuserpages": "انتقال صفحه‌های کاربری سرشاخه",
+       "right-move-categorypages": "انتقال صفحهٔ رده",
        "right-movefile": "انتقال پرونده‌ها",
        "right-suppressredirect": "انتقال صفحه بدون ایجاد تغییرمسیر از نام قبلی",
        "right-upload": "بارگذاری پرونده",
        "action-createpage": "ایجاد صفحه",
        "action-createtalk": "ایجاد صفحه‌های بحث",
        "action-createaccount": "ایجاد این حساب کاربری",
+       "action-history": "مشاهده تاریخچه این صفحه",
        "action-minoredit": "علامت زدن این ویرایش به عنوان جزئی",
        "action-move": "انتقال این صفحه",
        "action-move-subpages": "انتقال این صفحه و زیرصفحه‌های آن",
        "action-move-rootuserpages": "انتقال صفحه‌های کاربری سرشاخه",
+       "action-move-categorypages": "انتقال صفحه رده",
        "action-movefile": "این پرونده را انتقال بده",
        "action-upload": "بارگذاری این پرونده",
        "action-reupload": "نوشتن روی این پرونده موجود",
        "rclistfrom": "نمایش تغییرات جدید با شروع از $3 $2",
        "rcshowhideminor": "$1 ویرایش‌های جزئی",
        "rcshowhideminor-show": "نمایش",
-       "rcshowhideminor-hide": "پنهان‌ کردن",
+       "rcshowhideminor-hide": "پنهان‌کردن",
        "rcshowhidebots": "$1 ربات‌ها",
        "rcshowhidebots-show": "نمایش",
        "rcshowhidebots-hide": "پنهان‌کردن",
        "log-title-wildcard": "صفحه‌هایی را جستجو کن که عنوانشان با این عبارت آغاز می‌شود",
        "showhideselectedlogentries": "نمایش/نهفتن موارد انتخابی در سیاهه",
        "allpages": "همهٔ صفحه‌ها",
-       "alphaindexline": "$1 تا $2",
        "nextpage": "صفحهٔ بعد ($1)",
        "prevpage": "صفحهٔ قبلی ($1)",
        "allpagesfrom": "نمایش صفحه‌ها با شروع از:",
        "movepagetalktext": "صفحهٔ بحث مربوط، اگر وجود داشته باشد، بطور خودکار همراه با مقالهٔ اصلی منتقل خواهد شد '''مگر اینکه''' :\n* در حال انتقال صفحه از این فضای نام به فضای نام دیگری باشید،\n* یک صفحهٔ بحث غیرخالی تحت این نام جدید وجود داشته باشد، یا\n* جعبهٔ زیر را تیک نزده باشید.\n\nدر این حالات، باید صفحه را بطور دستی انتقال داده و یا محتویات دو صفحه را با ویرایش ادغام کنید.",
        "movearticle": "انتقال صفحه:",
        "moveuserpage-warning": "'''هشدار:''' شما در حال انتقال دادن یک صفحهٔ کاربر هستید. توجه داشته باشید که تنها صفحه منتقل می‌شود و نام کاربر تغییر '''نمی‌یابد'''.",
+       "movecategorypage-warning": "<strong>هشدار:</strong> شما در حال انتقال صفحه رده هستید. لطفاً توجه داشته باشید که فقط صفحه منتقل خواهد شد و  صفحات در رده قدیمی می‌مانند و به رده جدید <em>نمی‌روند</em>.",
        "movenologintext": "برای انتقال صفحه‌ها باید کاربر ثبت‌شده بوده و [[Special:UserLogin|به سامانه وارد شوید]].",
        "movenotallowed": "شما اجازهٔ انتقال دادن صفحه‌ها را ندارید.",
        "movenotallowedfile": "شما اجازهٔ انتقال پرونده‌ها را ندارید.",
        "cant-move-user-page": "شما اجازه ندارید صفحه‌های کاربری سرشاخه را انتقال دهید.",
        "cant-move-to-user-page": "شما اجازه ندارید که یک صفحه را به یک صفحهٔ کاربر انتقال دهید (به استثنای زیر صفحه‌های کاربری).",
+       "cant-move-category-page": "شما اجازهٔ انتقال دادن صفحهٔ رده‌ها را ندارید.",
+       "cant-move-to-category-page": "شما مجوز برای انتقال صفحه به صفحه رده ندارید.",
        "newtitle": "به‌عنوان جدید",
        "move-watch": "پی‌گیری صفحه‌های مبدأ و مقصد",
        "movepagebtn": "صفحه منتقل شود",
        "newimages-summary": "این صفحهٔ ویژه آخرین پرونده‌های بارگذاری شده را نمایش می‌دهد",
        "newimages-legend": "پالودن",
        "newimages-label": "نام پرونده (یا قسمتی از آن):",
-       "showhidebots": "($1 ربات‌ها)",
+       "newimages-showbots": "نمایش بارگذاری‌ها توسط ربات‌ها",
        "noimages": "چیزی برای دیدن نیست.",
        "ilsubmit": "جستجو",
        "bydate": "از روی تاریخ",
        "watchlistedit-raw-done": "فهرست پی‌گیری‌های شما به روز شد.",
        "watchlistedit-raw-added": "$1 عنوان به فهرست پی‌گیری‌ها اضافه {{PLURAL:$1|شد|شدند}}:",
        "watchlistedit-raw-removed": "$1 عنوان حذف {{PLURAL:$1|شد|شدند}}:",
+       "watchlistedit-clear-title": "فهرست پیگیری پاکسازی‌شده",
+       "watchlistedit-clear-legend": "پاکسازی فهرست پیگیری",
+       "watchlistedit-clear-explain": "همه عناوین از فهرست پیگیریهای شما حذف خواهد شد",
+       "watchlistedit-clear-titles": "عنوان‌ها:",
+       "watchlistedit-clear-submit": "پاک کردن فهرست پیگیریها (این دائم است!)",
+       "watchlistedit-clear-done": "فهرست پیگیریهای شما پاک شد.",
+       "watchlistedit-clear-removed": "$1 عنوان حذف {{PLURAL:$1|شد|شدند}}:",
+       "watchlistedit-too-many": "تعداد زیادی صفحه برای نمایش در اینجا وجود دارد.",
+       "watchlisttools-clear": "پاکسازی فهرست پیگیری",
        "watchlisttools-view": "فهرست پی‌گیری‌ها",
        "watchlisttools-edit": "مشاهده و ویرایش فهرست پی‌گیری‌ها",
        "watchlisttools-raw": "ویرایش فهرست خام پی‌گیری‌ها",
        "htmlform-no": "نه",
        "htmlform-yes": "بله",
        "htmlform-chosen-placeholder": "یک گزینه را انتخاب کنید",
+       "htmlform-cloner-create": "افزودن بیشتر",
+       "htmlform-cloner-delete": "حذف",
+       "htmlform-cloner-required": "حداقل یک مقدار مورد نیاز است.",
        "sqlite-has-fts": "$1 با پشتیبانی از جستجو در متن کامل",
        "sqlite-no-fts": "$1 بدون پشتیبانی از جستجو در متن کامل",
        "logentry-delete-delete": "$1 صفحهٔ $3 را {{GENDER:$2|حذف کرد}}",
index 96d5d52..0fd8501 100644 (file)
        "edit": "Muokkaa",
        "edit-local": "Muokkaa paikallista kuvausta",
        "create": "Luo sivu",
-       "create-local": "Lisää paikallinen kuvaus",
+       "create-local": "Luo paikallinen kuvaus",
        "editthispage": "Muokkaa tätä sivua",
        "create-this-page": "Luo tämä sivu",
        "delete": "Poista",
        "hiddencategories": "Tämä sivu kuuluu {{PLURAL:$1|seuraavaan piilotettuun luokkaan|seuraaviin piilotettuihin luokkiin}}:",
        "edittools": "<!-- Tässä oleva teksti näytetään muokkauskentän alla. -->",
        "nocreatetext": "Et voi luoda uusia sivuja. Voit muokata olemassa olevia sivuja tai [[Special:UserLogin|luoda käyttäjätunnuksen]].",
-       "nocreate-loggedin": "Sinulla ei ole oikeuksia luoda uusia sivuja.",
+       "nocreate-loggedin": "Sinulla ei ole oikeutta luoda uusia sivuja.",
        "sectioneditnotsupported-title": "Osioiden muokkaamista ei tueta.",
        "sectioneditnotsupported-text": "Osioiden muokkaamista ei tueta tällä sivulla.",
        "permissionserrors": "Puutteelliset oikeudet",
        "prefs-emailconfirm-label": "Sähköpostin varmistus",
        "youremail": "Sähköpostiosoite",
        "username": "{{GENDER:$1|Käyttäjätunnus}}",
-       "uid": "{{GENDER:$1|Tunniste}}",
        "prefs-memberingroups": "{{GENDER:$2|Jäsenenä}} {{PLURAL:$1|ryhmässä|ryhmissä}}",
        "prefs-registration": "Rekisteröintiaika",
        "yourrealname": "Oikea nimi",
        "right-move": "Siirtää sivuja",
        "right-move-subpages": "Siirtää sivuja alasivuineen",
        "right-move-rootuserpages": "Siirtää käyttäjäsivuja",
+       "right-move-categorypages": "Siirtää luokkasivuja",
        "right-movefile": "Siirtää tiedostoja",
        "right-suppressredirect": "Siirtää sivuja luomatta automaattisia ohjauksia",
        "right-upload": "Tallentaa tiedostoja",
-       "right-reupload": "Korvata olemassa olevia tiedostoja uudella",
+       "right-reupload": "Tallentaa olemassa olevien tiedostojen tilalle uusia",
        "right-reupload-own": "Korvata itsetallennettu tiedosto uudella tiedostolla",
-       "right-reupload-shared": "Korvata jaettuun mediavarastoon tallennettuja tiedostoja paikallisesti",
+       "right-reupload-shared": "Korvata yhteiseen mediavarastoon tallennettuja tiedostoja paikallisesti",
        "right-upload_by_url": "Tallentaa tiedostoja verkko-osoitteella",
        "right-purge": "Tyhjentää sivuston välimuisti ilman varmennussivua",
        "right-autoconfirmed": "IP-pohjaiset nopeusrajoitukset eivät ole voimassa",
        "action-createpage": "luoda sivuja",
        "action-createtalk": "luoda keskustelusivuja",
        "action-createaccount": "luoda tätä käyttäjätunnusta",
-       "action-history": "näyttää tämän sivun historiaa",
+       "action-history": "tarkastella tämän sivun historiaa",
        "action-minoredit": "merkitä tätä muokkausta pieneksi",
        "action-move": "siirtää tätä sivua",
        "action-move-subpages": "siirtää tätä sivua eikä sen alasivuja",
        "action-move-rootuserpages": "siirtää käyttäjäsivuja",
+       "action-move-categorypages": "siirtää luokkasivuja",
        "action-movefile": "siirtää tätä tiedostoa",
        "action-upload": "tallentaa tätä tiedostoa",
-       "action-reupload": "korvata tätä olemassa olevaa tiedostoa",
-       "action-reupload-shared": "korvata tätä jaetun mediavaraston tiedostoa",
+       "action-reupload": "tallentaa tämän tiedoston tilalle uutta",
+       "action-reupload-shared": "korvata tätä yhteisen mediavaraston tiedostoa",
        "action-upload_by_url": "tallentaa tätä tiedostoa URL-osoitteesta",
        "action-writeapi": "käyttää kirjoitus-APIa",
        "action-delete": "poistaa tätä sivua",
        "fileexists-extension": "Tiedosto, jolla on samankaltainen nimi, on jo olemassa: [[$2|thumb]]\n* Tallennetun tiedoston nimi: <strong>[[:$1]]</strong>\n* Olemassa olevan tiedoston nimi: <strong>[[:$2]]</strong>\nValitse toinen tiedostonimi.",
        "fileexists-thumbnail-yes": "Tiedosto näyttäisi olevan pienennetty kuva ''(pienoiskuva)''. [[$1|thumb]]\nTarkista tiedosto <strong>[[:$1]]</strong>.\nJos yllä oleva tiedosto on alkuperäisversio samasta kuvasta, ei sille tarvitse tallentaa pienoiskuvaa.",
        "file-thumbnail-no": "Tiedostonimi alkaa merkkijonolla <strong>$1</strong>. Tiedosto näyttäisi olevan pienennetty kuva.\nJos sinulla on tämän kuvan alkuperäinen versio, tallenna se. Muussa tapauksessa nimeä tiedosto uudelleen.",
-       "fileexists-forbidden": "Samanniminen tiedosto on jo olemassa, eikä sitä voi korvata. Tallenna tiedosto jollakin toisella nimellä. Nykyinen tiedosto: [[File:$1|thumb|center|$1]]",
+       "fileexists-forbidden": "Samanniminen tiedosto on jo olemassa, eikä sen tilalle voi tallentaa uutta. \nJos kuitenkin haluat tallentaa tiedostosi, palaa takaisin ja käytä jotain toista nimeä. \n[[File:$1|thumb|center|$1]]",
        "fileexists-shared-forbidden": "Samanniminen tiedosto on jo olemassa jaetussa mediavarastossa. Tallenna tiedosto jollakin toisella nimellä. [[File:$1|thumb|center|$1]]",
        "file-exists-duplicate": "Tämä tiedosto on kaksoiskappale {{PLURAL:$1|seuraavasta tiedostosta|seuraavista tiedostoista}}:",
        "file-deleted-duplicate": "Tiedosto, joka on identtinen tämän tiedoston kanssa ([[:$1]]) on aiemmin poistettu. Katso kyseisen tiedoston poistoloki ennen kuin jatkat uudelleentallentamista.",
        "filedelete-maintenance-title": "Tiedostoa ei voi poistaa",
        "mimesearch": "MIME-haku",
        "mimesearch-summary": "Tällä sivulla voit etsiä tiedostoja niiden MIME-tyypin perusteella.\nSyöte: sisältötyyppi/alatyyppi, esimerkiksi <code>image/jpeg</code>.",
-       "mimetype": "MIME-tyyppi",
+       "mimetype": "MIME-tyyppi:",
        "download": "lataa",
        "unwatchedpages": "Tarkkailemattomat sivut",
        "listredirects": "Ohjaukset",
        "log-title-wildcard": "Kohde alkaa merkkijonolla",
        "showhideselectedlogentries": "Muuta valittujen lokitapahtumien näkyvyyttä",
        "allpages": "Kaikki sivut",
-       "alphaindexline": "$1…$2",
        "nextpage": "Seuraava sivu ($1)",
        "prevpage": "Edellinen sivu ($1)",
        "allpagesfrom": "Alkaen sivusta",
        "protect-text": "Voit tarkastella ja muuttaa sivun '''$1''' suojaustasoa.",
        "protect-locked-blocked": "Et voi muuttaa sivun suojauksia, koska sinut on estetty. Alla on sivun ”'''$1'''” nykyiset suojaukset:",
        "protect-locked-dblock": "Sivun suojauksia ei voi muuttaa, koska tietokanta on lukittu. Alla on sivun ”'''$1'''” nykyiset suojaukset:",
-       "protect-locked-access": "Sinulla ei ole tarvittavia oikeuksia sivujen suojauksen muuttamiseen. Alla on sivun ”'''$1'''” nykyiset suojaukset:",
+       "protect-locked-access": "Sinun käyttäjätunnuksellasi ei ole oikeutta muuttaa sivujen suojauksia. \nTässä ovat nykyiset suojausasetukset sivulla <strong>$1</strong>:",
        "protect-cascadeon": "Tämä sivu on suojauksen kohteena, koska se on sisällytetty alla {{PLURAL:$1|olevaan suojattuun sivuun, jossa|oleviin suojattuihin sivuihin, joissa}} on kytketty tarttuva suojaus päälle.\n\nTämän sivun suojaustasoon tehdyillä muutoksilla ei ole vaikutusta sivuun muualta tarttuneeseen suojaukseen.",
        "protect-default": "Salli kaikki käyttäjät",
        "protect-fallback": "Salli vain käyttäjät, joilla on oikeus $1",
        "movepagetalktext": "Sivuun mahdollisesti liittyvä keskustelusivu siirtyy automaattisesti mukana, '''paitsi:'''\n*jos siirron kohdesivulla on olemassa keskustelusivu, joka ei ole tyhjä, tai\n*jos otat pois rastin alla olevasta ruudusta.\n\nNäissä tapauksissa sivu täytyy siirtää tai yhdistää käsin, jos se on tarpeen.",
        "movearticle": "Siirrettävä sivu:",
        "moveuserpage-warning": "'''Varoitus:''' Olet siirtämässä käyttäjäsivua. Huomaa, että vain sivu siirretään ja käyttäjää ''ei'' nimetä uudelleen.",
+       "movecategorypage-warning": "<strong>Varoitus:</strong> Olet siirtämässä luokkasivua. Ota huomioon, että ainoastaan luokan sivu siirretään ja tämä toiminto <em>ei</em> luokittele vanhassa luokassa olevia sivuja uuteen luokkaan.",
        "movenologintext": "Sinun pitää olla rekisteröitynyt käyttäjä ja [[Special:UserLogin|kirjautua sisään]], jotta voisit siirtää sivun.",
        "movenotallowed": "Sinulla ei ole oikeutta siirtää sivuja.",
        "movenotallowedfile": "Sinulla ei ole oikeutta siirtää tiedostoja.",
        "cant-move-user-page": "Sinulla ei ole oikeutta siirtää käyttäjäsivuja (lukuun ottamatta alasivuja).",
        "cant-move-to-user-page": "Sinulla ei ole oikeutta siirtää sivua käyttäjäsivuksi (paitsi käyttäjän alasivuksi).",
+       "cant-move-category-page": "Sinulla ei ole oikeutta siirtää luokkien sivuja.",
+       "cant-move-to-category-page": "Sinulla ei ole oikeutta siirtää sivua luokkasivuksi.",
        "newtitle": "Uusi nimi sivulle:",
        "move-watch": "Tarkkaile tätä sivua",
        "movepagebtn": "Siirrä sivu",
        "newimages": "Uudet tiedostot",
        "imagelisttext": "Alla on {{PLURAL:$1|1 tiedosto|$1 tiedostoa}} lajiteltuna <strong>$2</strong>.",
        "newimages-summary": "Tällä toimintosivulla on viimeisimmät tallennetut tiedostot.",
-       "newimages-legend": "Suodin",
+       "newimages-legend": "Suodatin",
        "newimages-label": "Tiedostonimi (tai osa siitä)",
-       "showhidebots": "($1 botit)",
+       "newimages-showbots": "Näytä bottien tekemät tallennukset",
        "noimages": "Ei uusia tiedostoja.",
        "ilsubmit": "Hae",
        "bydate": "päiväyksen mukaan",
        "watchlistedit-raw-done": "Tarkkailulistasi on päivitetty.",
        "watchlistedit-raw-added": "{{PLURAL:$1|Yksi sivu|$1 sivua}} lisättiin:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|Yksi sivu|$1 sivua}} poistettiin:",
+       "watchlistedit-clear-title": "Tyhjä tarkkailulista",
+       "watchlistedit-clear-legend": "Tyhjennä tarkkailulista",
+       "watchlistedit-clear-explain": "Kaikki sivut poistetaan tarkkailulistaltasi",
+       "watchlistedit-clear-titles": "Sivujen nimet:",
+       "watchlistedit-clear-submit": "Tyhjennä tarkkailulista (pysyvästi ja peruuttamattomasti!)",
+       "watchlistedit-clear-done": "Tarkkailulistasi on tyhjennetty.",
+       "watchlistedit-clear-removed": "{{PLURAL:$1|Yksi sivu|$1 sivua}} on poistettu:",
+       "watchlistedit-too-many": "Luettelossa on liikaa sivuja näytettäväksi tässä.",
+       "watchlisttools-clear": "Tyhjennä tarkkailulista",
        "watchlisttools-view": "Näytä tarkkaillut muutokset",
        "watchlisttools-edit": "Katso ja muokkaa tarkkailulistaa",
        "watchlisttools-raw": "Muokkaa listaa raakamuodossa",
index cb81d99..0b1aef8 100644 (file)
        "parser-template-recursion-depth-warning": "Limite de profondeur des appels de modèles dépassée ($1)",
        "language-converter-depth-warning": "Limite de profondeur du convertisseur de langue dépassée ($1)",
        "node-count-exceeded-category": "Pages où nombre de nœuds est dépassé",
+       "node-count-exceeded-category-desc": "Une catégorie pour les pages où le nombre de nœuds est dépassé.",
        "node-count-exceeded-warning": "Page dépassant le nombre de nœuds",
        "expansion-depth-exceeded-category": "Pages où la profondeur d'expansion est dépassée",
+       "expansion-depth-exceeded-category-desc": "Ceci est une catégorie pour les pages où la profondeur d’expansion est dépassée.",
        "expansion-depth-exceeded-warning": "Page dépassant la profondeur d'expansion",
        "parser-unstrip-loop-warning": "Boucle non démontable détectée",
        "parser-unstrip-recursion-limit": "Limite de récursion non démontable dépassée ($1)",
        "prefs-emailconfirm-label": "Confirmation du courriel :",
        "youremail": "Courriel :",
        "username": "{{GENDER:$1|Nom d'utilisateur|Nom d'utilisatrice}} :",
-       "uid": "Numéro d’{{GENDER:$1|utilisateur|utilisatrice}} :",
        "prefs-memberingroups": "{{GENDER:$2|Membre}} {{PLURAL:$1|du groupe|des groupes}}:",
        "prefs-registration": "Date d'inscription :",
        "yourrealname": "Nom réel :",
        "right-move": "Renommer des pages",
        "right-move-subpages": "Renommer des pages avec leurs sous-pages",
        "right-move-rootuserpages": "Renommer la page principale d'un utilisateur",
+       "right-move-categorypages": "Renommer des pages de catégorie",
        "right-movefile": "Renommer des fichiers",
        "right-suppressredirect": "Ne pas créer de redirection depuis le titre d'origine en renommant une page",
        "right-upload": "Importer des fichiers",
        "action-move": "renommer cette page",
        "action-move-subpages": "renommer cette page et ses sous-pages",
        "action-move-rootuserpages": "renommer la page principale d'un utilisateur",
+       "action-move-categorypages": "renommer des pages de catégorie",
        "action-movefile": "renommer ce fichier",
        "action-upload": "importer ce fichier",
        "action-reupload": "écraser ce fichier existant",
        "log-title-wildcard": "Chercher parmi les titres commençant par ce texte",
        "showhideselectedlogentries": "Afficher/masquer les entrées de journal sélectionnées",
        "allpages": "Toutes les pages",
-       "alphaindexline": "de $1 à $2",
        "nextpage": "Page suivante ($1)",
        "prevpage": "Page précédente ($1)",
        "allpagesfrom": "Afficher les pages à partir de :",
        "movepagetalktext": "La page de discussion associée, si présente, sera automatiquement renommée '''sauf si :'''\n* vous déplacez la page vers un autre espace de noms, ou\n* une page de discussion non vide existe déjà sous le nouveau nom, ou\n* vous décochez la case ci-dessous.\n\nDans ces cas-là, vous devrez renommer ou fusionner cette page de discussion manuellement si vous le désirez.",
        "movearticle": "Renommer la page :",
        "moveuserpage-warning": "'''Attention :''' Vous êtes sur le point de renommer une page d’utilisateur. Veuillez noter que seule la page sera renommée et que l’utilisateur '''ne''' sera '''pas''' renommé.",
+       "movecategorypage-warning": "<strong>Avertissement :</strong> Vous êtes sur le point de renommer une page de catégorie. Veuillez noter que seul la page sera renommée et que toutes les pages dans l'ancienne catégorie ne seront <em>pas</em> transférées dans la nouvelle.",
        "movenologintext": "Pour pouvoir renommer une page, vous devez être [[Special:UserLogin|identifié{{GENDER:||e|(e)}}]] avec un compte utilisateur enregistré et d'ancienneté suffisante.",
        "movenotallowed": "Vous n'avez pas la permission de renommer les pages.",
        "movenotallowedfile": "Vous n'avez pas la permission de renommer les fichiers.",
        "cant-move-user-page": "Vous n’avez pas la permission de renommer les pages principales d’utilisateurs.",
        "cant-move-to-user-page": "Vous n’avez pas la permission de renommer une page vers une page utilisateur (à l’exception d’une sous-page).",
+       "cant-move-category-page": "Vous n'avez pas la permis de renommer les pages de catégorie.",
+       "cant-move-to-category-page": "Vous n'avez pas la permission de renommer une page vers une page de catégorie.",
        "newtitle": "Vers le nouveau titre :",
        "move-watch": "Suivre les pages originale et nouvelle",
        "movepagebtn": "Renommer la page",
        "newimages-summary": "Cette page spéciale affiche les derniers fichiers importés.",
        "newimages-legend": "Nom du fichier",
        "newimages-label": "Nom du fichier (ou une partie de celui-ci) :",
-       "showhidebots": "($1 robots)",
+       "newimages-showbots": "Afficher les imports par des robots",
        "noimages": "Aucune image à afficher.",
        "ilsubmit": "Rechercher",
        "bydate": "par date",
        "watchlistedit-raw-done": "Votre liste de suivi a été mise à jour.",
        "watchlistedit-raw-added": "{{PLURAL:$1|Un titre a été ajouté|$1 titres ont été ajoutés}} :",
        "watchlistedit-raw-removed": "{{PLURAL:$1|Un titre a été retiré|$1 titres ont été retirés}} :",
+       "watchlistedit-clear-title": "Liste de suivi vidée",
+       "watchlistedit-clear-legend": "Effacer la liste de suivi",
+       "watchlistedit-clear-explain": "Tous les titres seront supprimés de votre liste de suivi",
+       "watchlistedit-clear-titles": "Titres :",
+       "watchlistedit-clear-submit": "Effacer la liste de suivi (ceci est permanent !)",
+       "watchlistedit-clear-done": "Votre liste de suivi a été effacée.",
+       "watchlistedit-clear-removed": "{{PLURAL:$1|Un titre a été|$1 titres ont été}} retirés :",
+       "watchlistedit-too-many": "Il y a trop de pages à afficher ici.",
+       "watchlisttools-clear": "Effacer la liste de suivi",
        "watchlisttools-view": "Liste de suivi",
        "watchlisttools-edit": "Voir et modifier la liste de suivi",
        "watchlisttools-raw": "Modifier la liste de suivi en mode brut",
index 2c07dfb..1d41451 100644 (file)
        "newimages-summary": "Ceta pâge spèciâla montre los dèrriérs fichiérs tèlèchargiês.",
        "newimages-legend": "Nom du fichiér",
        "newimages-label": "Nom du fichiér (ou ben una partia de ceti) :",
-       "showhidebots": "($1 los bots)",
        "noimages": "Gins de fichiér a fâre vêre.",
        "ilsubmit": "Rechèrchiér",
        "bydate": "per dâta",
index 7af11ad..624a890 100644 (file)
        "newimages-summary": "Detdiar spezial-sidj wiset a tuleetst huuchschüürd datein uun.",
        "newimages-legend": "Filter",
        "newimages-label": "Dateinööm (of en dial diarfaan):",
-       "showhidebots": "(Bots $1)",
        "noimages": "Niks tu sen.",
        "ilsubmit": "Schük",
        "bydate": "efter dootem",
index b2e4b26..ece00d8 100644 (file)
        "newimages": "Nije ôfbylden",
        "imagelisttext": "Dit is in list fan '''$1''' {{PLURAL:$1|triem|triemen}}, op $2.",
        "newimages-legend": "Filter",
-       "showhidebots": "(Bots $1)",
        "noimages": "Neat te sjen.",
        "ilsubmit": "Sykje",
        "bydate": "datum",
index 72e62e4..97b3acb 100644 (file)
        "newimages": "Gailearaí na n-íomhánna nua",
        "imagelisttext": "Tá liosta thíos de {{PLURAL:$1|comhad amháin|$1 comhaid $2}}.",
        "newimages-label": "Comhadainm (nó cuid de):",
-       "showhidebots": "($1 róbónna)",
        "noimages": "Tada le feiceáil.",
        "ilsubmit": "Cuardaigh",
        "bydate": "de réir dáta",
index 3884d60..747f40c 100644 (file)
        "show-big-image": "完整分辨率",
        "newimages": "新建图像画廊",
        "imagelisttext": "底下系按$2排列𠮶$1只档案列表。",
-       "showhidebots": "($1机器人)",
        "noimages": "冇什哩可望。",
        "ilsubmit": "寻",
        "bydate": "按日子",
index 344bb1e..d98fe23 100644 (file)
        "show-big-image": "完整解析度",
        "newimages": "新建圖像畫廊",
        "imagelisttext": "底下係按$2排列嗰$1隻檔案列表。",
-       "showhidebots": "($1機器人)",
        "noimages": "冇什哩可望。",
        "ilsubmit": "尋",
        "bydate": "按日子",
index f88ab0d..3072722 100644 (file)
        "newimages-summary": "Esta páxina especial mostra os últimos ficheiros cargados.",
        "newimages-legend": "Filtro",
        "newimages-label": "Nome do ficheiro (ou parte del):",
-       "showhidebots": "($1 os bots)",
        "noimages": "Non hai imaxes para ver.",
        "ilsubmit": "Procurar",
        "bydate": "por data",
index 178a132..95e9f9b 100644 (file)
        "newimages-summary": "Ἥδε ἡ εἰδικὴ δέλτος δεικνύει τὰ πλέον πρόσφατα ἐπιπεφορτισμένα ἀρχεῖα.",
        "newimages-legend": "Διηθητήριον",
        "newimages-label": "Ἀρχειώνυμον (ἢ μέρος οὗ):",
-       "showhidebots": "($1 αὐτόματα)",
        "noimages": "Οὐδεμία εἰκών.",
        "ilsubmit": "Ζητεῖν",
        "bydate": "κατὰ χρονολογίαν",
index 1007997..a3ec3ba 100644 (file)
        "newimages-summary": "Die Spezialsyte zeigt di zletscht uffegladene Dateie aa.",
        "newimages-legend": "Filter",
        "newimages-label": "Dateiname (oder e Teil devu):",
-       "showhidebots": "(Bötli $1)",
        "noimages": "Kei Dateie gfunde.",
        "ilsubmit": "Suech",
        "bydate": "noch Datum",
index 322e8b4..bc124ce 100644 (file)
        "newimages-summary": "આ ખાસ પાનું છેવટની  ચડાવેલા વફાઈલા બતાવે છે",
        "newimages-legend": "ચાળણી",
        "newimages-label": "ફાઈલનામ (કે તેનો ભાગ)",
-       "showhidebots": "($1 બોટ)",
        "noimages": "જોવા માટે કશું નથી.",
        "ilsubmit": "શોધો",
        "bydate": "તારીખ પ્રમાણે",
index 82e2a75..cb5b009 100644 (file)
        "svg-long-desc": "coadan SVG, $1 × {{PLURAL:$2|$2 pixel|$2 phixel|$2 phixel|$2 pixelyn}} dy ennymagh, mooadys y choadan: $3",
        "show-big-image": "Jeeskeaylley ymlane",
        "newimages": "Laaragh coadanyn noa",
-       "showhidebots": "($1 botyn)",
        "ilsubmit": "Ronsee",
        "bydate": "rere date",
        "bad_image_list": "Shoh yn aght:\n\nCha nel agh meeryn ayns rolley (linnaghyn as * ec y toshiaght) ta goll er smooinaghtyn er.\nShegin da'n chied chiangley er linney ve ny chiangley da drogh choadan.\nKianglaghyn eiyrtyssagh erbee er yn linney shoh, t'ad goll er loaghtey myr lhimmaghyn, shen gra, duillagyn as ta'n coadan ayns-linney, foddee.",
index f00846c..63e467b 100644 (file)
        "show-big-image": "完整分辨率",
        "newimages": "Sîn-kien thù-chhiong ke va̍k-lòng",
        "imagelisttext": "Yî-ha he on $2 phài-lie̍t ke $1-ke tóng-on lie̍t-péu.",
-       "showhidebots": "($1 kî-hi-ngìn)",
        "noimages": "Mò-khó kiám-sṳ thù-chhiong.",
        "ilsubmit": "Chhìm-cháu",
        "bydate": "on-cheu ngit-khì",
index 81621ed..a2f4238 100644 (file)
@@ -25,7 +25,8 @@
                        "ערן",
                        "פדיחה",
                        "שומבלע",
-                       "תומר ט"
+                       "תומר ט",
+                       "Matanya"
                ]
        },
        "tog-underline": "סימון קישורים בקו תחתי:",
        "parser-template-recursion-depth-warning": "עומק התבניות המוכללות זו בזו עבר את המגבלה ($1)",
        "language-converter-depth-warning": "עומק ממיר השפה עבר את המגבלה ($1)",
        "node-count-exceeded-category": "דפים שבהם מספר הצמתים גדול מדי",
+       "node-count-exceeded-category-desc": "קטגוריה לדפים שמספר הצמתים בהם גדול מדי.",
        "node-count-exceeded-warning": "מספר הצמתים בדף גדול מדי",
        "expansion-depth-exceeded-category": "דפים שבהם עומק ההרחבה גדול מדי",
+       "expansion-depth-exceeded-category-desc": "זוהי קטגוריה לדפים שבהם עומק ההרחבה גדול מדי.",
        "expansion-depth-exceeded-warning": "עומק ההרחבה בדף גדול מדי",
        "parser-unstrip-loop-warning": "נמצאה לולאה בפריסה",
        "parser-unstrip-recursion-limit": "עומק הרקורסיה של הפריסה עבר את המגבלה ($1)",
        "prefs-emailconfirm-label": "אימות כתובת דוא\"ל:",
        "youremail": "דואר אלקטרוני:",
        "username": "שם {{GENDER:$1|המשתמש|המשתמשת}}:",
-       "uid": "המספר הסידורי של {{GENDER:$1|המשתמש|המשתמשת}}:",
        "prefs-memberingroups": "{{GENDER:$2|חבר|חברה}} {{PLURAL:$1|בקבוצה|בקבוצות}}:",
        "prefs-registration": "זמן ההרשמה:",
        "yourrealname": "שם אמיתי:",
        "right-move": "העברת דפים",
        "right-move-subpages": "העברת דפים עם דפי המשנה שלהם",
        "right-move-rootuserpages": "העברת דפי משתמש שאינם דפי משנה",
+       "right-move-categorypages": "העברת דפי קטגוריה",
        "right-movefile": "העברת קבצים",
        "right-suppressredirect": "הימנעות מיצירת הפניות מדפי המקור בעת העברת דפים",
        "right-upload": "העלאת קבצים",
        "action-move": "להעביר דף זה",
        "action-move-subpages": "להעביר דף זה יחד עם דפי המשנה שלו",
        "action-move-rootuserpages": "להעביר דפי משתמש שאינם דפי משנה",
+       "action-move-categorypages": "להעביר דפי קטגוריה",
        "action-movefile": "להעביר קובץ זה",
        "action-upload": "להעלות קובץ זה",
        "action-reupload": "לדרוס את הקובץ הקיים הזה",
        "log-title-wildcard": "חיפוש כותרות המתחילות באותיות אלה",
        "showhideselectedlogentries": "הצגת/הסתרת פעולות היומן שנבחרו",
        "allpages": "כל הדפים",
-       "alphaindexline": "$1 עד $2",
        "nextpage": "הדף הבא ($1)",
        "prevpage": "הדף הקודם ($1)",
        "allpagesfrom": "הצגת דפים החל מ:",
        "rollbacklinkcount-morethan": "שחזור יותר מ{{PLURAL:$1|עריכה אחת|־$1 עריכות}}",
        "rollbackfailed": "השחזור נכשל",
        "cantrollback": "לא ניתן לשחזר את העריכה;\nהתורם האחרון הוא היחיד שכתב בדף זה.",
-       "alreadyrolled": "×\9c×\90 × ×\99ת×\9f ×\9cש×\97×\96ר ×\90ת ×\94ער×\99×\9b×\94 ×©×\9c [[User:$2|$2]] ([[User talk:$2|ש×\99×\97×\94]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]) ×\91×\93×£ [[:$1]]; ×\9e×\99ש×\94×\95 ×\90×\97ר ×\9b×\91ר ×¢×¨×\9a ×\90×\95 ×©×\97×\96ר ×\90ת ×\94×\93×£.\n\nהעריכה האחרונה הייתה של [[User:$3|$3]] ([[User talk:$3|שיחה]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
+       "alreadyrolled": "×\9c×\90 × ×\99ת×\9f ×\9cש×\97×\96ר ×\90ת ×\94ער×\99×\9b×\94 ×©×\9c [[User:$2|$2]] ([[User talk:$2|ש×\99×\97×\94]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]) ×\91×\93×£ [[:$1]]; ×\94×\93×£ ×\9b×\91ר × ×¢×¨×\9a ×\90×\95 ×©×\95×\97×\96ר.\n\nהעריכה האחרונה הייתה של [[User:$3|$3]] ([[User talk:$3|שיחה]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
        "editcomment": "תקציר העריכה היה: \"'''$1'''\".",
        "revertpage": "שוחזר מעריכות של [[Special:Contributions/$2|$2]] ([[User talk:$2|שיחה]]) לעריכה האחרונה של [[User:$1|$1]]",
        "revertpage-nouser": "שוחזר מעריכות של משתמש מוסתר לעריכה האחרונה של {{GENDER:$1|[[User:$1|$1]]}}",
        "movepagetalktext": "דף השיחה של דף זה יועבר אוטומטית, אלא אם:\n* קיים דף שיחה שאינו ריק תחת השם החדש אליו מועבר הדף, או\n* הסרתם את הסימון בתיבה שלהלן.\n\nבמקרים אלו, תצטרכו להעביר או לשלב את הדפים באופן ידני, אם תרצו.",
        "movearticle": "העברת דף:",
        "moveuserpage-warning": "'''אזהרה:''' אתם עומדים להעביר דף משתמש. שימו לב שרק הדף יועבר וששם המשתמש '''לא''' ישתנה.",
+       "movecategorypage-warning": "<strong>אזהרה:</strong> אתם עומדים להעביר דף קטגוריה. שימו לב שרק הדף יועבר ושכל הדפים בקטגוריה הישנה <strong>לא</strong> יסווגו לקטגוריה החדשה.",
        "movenologintext": "עליכם [[Special:UserLogin|להיכנס לחשבון]] כדי להעביר דפים.",
        "movenotallowed": "אינכם מורשים להעביר דפים.",
        "movenotallowedfile": "אינכם מורשים להעביר קבצים.",
        "cant-move-user-page": "אינכם מורשים להעביר דפי משתמש (למעט דפי משנה).",
        "cant-move-to-user-page": "אינכם מורשים להעביר דף לדף משתמש (למעט לדף משנה של דף משתמש).",
+       "cant-move-category-page": "אינכם מורשים להעביר דפי קטגוריה.",
+       "cant-move-to-category-page": "אינכם מורשים להעביר דף לדף קטגוריה.",
        "newtitle": "לשם החדש:",
        "move-watch": "מעקב אחר דף המקור ואחר דף היעד",
        "movepagebtn": "העברה",
        "newimages-summary": "דף זה מציג את הקבצים האחרונים שהועלו",
        "newimages-legend": "מסנן",
        "newimages-label": "שם הקובץ (או חלק ממנו):",
-       "showhidebots": "($1 בוטים)",
+       "newimages-showbots": "הצגת העלאות שבוצעו על־ידי בוטים",
        "noimages": "אין קבצים.",
        "ilsubmit": "חיפוש",
        "bydate": "לפי תאריך",
        "watchlistedit-raw-done": "רשימת המעקב עודכנה.",
        "watchlistedit-raw-added": "{{PLURAL:$1|כותרת אחת נוספה|$1 כותרות נוספו}}:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|כותרת אחת הוסרה|$1 כותרות הוסרו}}:",
+       "watchlistedit-clear-title": "רשימת המעקב נמחקה",
+       "watchlistedit-clear-legend": "מחיקת רשימת המעקב",
+       "watchlistedit-clear-explain": "כל הכותרות של הדפים שיוסרו מרשימת המעקב",
+       "watchlistedit-clear-titles": "כותרות:",
+       "watchlistedit-clear-submit": "מחיקת רשימת המעקב (לצמיתות!)",
+       "watchlistedit-clear-done": "רשימת המעקב שלך נמחקה.",
+       "watchlistedit-clear-removed": "{{PLURAL:$1|כותרת אחת הוסרה|$1 כותרות הוסרו}}:",
+       "watchlistedit-too-many": "יש יותר מדי דפים ולא ניתן להציגם כאן.",
+       "watchlisttools-clear": "מחיקת רשימת המעקב",
        "watchlisttools-view": "הצגת השינויים הרלוונטיים",
        "watchlisttools-edit": "הצגה ועריכה של רשימת המעקב",
        "watchlisttools-raw": "עריכת הרשימה הגולמית",
index 368b549..5aea0f6 100644 (file)
        "newimages-summary": "यह विशेष पृष्ठ हाल ही में अपलोड की गयी फ़ाइलें दिखाता है।",
        "newimages-legend": "छननी",
        "newimages-label": "संचिका नाम (या उसका अंश):",
-       "showhidebots": "(बोट्स $1)",
        "noimages": "देखने के लिए कुछ नहीं है।",
        "ilsubmit": "खोजें",
        "bydate": "तिथि अनुसार",
index bb2bc8e..caa8d29 100644 (file)
        "newimages-summary": "Ii khaas panna pahile waala upload karaa gais file ke dekhae hai.",
        "newimages-legend": "Chaalo",
        "newimages-label": "Filename (nai to iske ek hissa):",
-       "showhidebots": "($1 bots)",
        "noimages": "Koi chij dekhe ke nai hai.",
        "ilsubmit": "Khojo",
        "bydate": "tarik se",
index d63da89..0828510 100644 (file)
        "logdelete-success": "'''Vidljivost uređivanja uspješno postavljena.'''",
        "logdelete-failure": "'''Vidljivost evidencije ne može biti postavljena:'''\n$1",
        "revdel-restore": "Promijeni dostupnost",
-       "pagehist": "Povijest stranice",
+       "pagehist": "stare izmjene",
        "deletedhist": "Obrisana povijest",
        "revdelete-hide-current": "Pogrješka u skrivanju stavke datirane $2, $1: ovo je trenutačna inačica. Ne može biti skrivena.",
        "revdelete-show-no-access": "Pogrješka u prikazivanju stavke od $2, $1: ova stavka označena je kao \"ograničeno\".\nNemate pristup do nje.",
        "prefs-emailconfirm-label": "Potvrda e-mail adrese:",
        "youremail": "Vaša elektronska pošta *",
        "username": "Ime {{GENDER:$1|suradnika|suradnice}}:",
-       "uid": "ID-broj {{GENDER:$1|suradnika|suradnice}}:",
        "prefs-memberingroups": "{{GENDER:$2|Suradnik|Suradnica}} je član {{PLURAL:$1|sljedeće skupine|sljedećih skupina}}:",
        "prefs-registration": "Vrijeme prijave:",
        "yourrealname": "Pravo ime (nije obvezno)*",
        "log-title-wildcard": "Traži stranice koje počinju s navedenim izrazom",
        "showhideselectedlogentries": "Otkrij/sakrij odabrane evidencije",
        "allpages": "Sve stranice",
-       "alphaindexline": "$1 do $2",
        "nextpage": "Sljedeća stranica ($1)",
        "prevpage": "Prethodna stranica ($1)",
        "allpagesfrom": "Pokaži stranice počevši od:",
        "exbeforeblank": "sadržaj prije brisanja je bio: '$1'",
        "delete-confirm": "Obriši \"$1\"",
        "delete-legend": "Izbriši",
-       "historywarning": "'''Upozorenje''':  Stranica koju želite obrisati ima starije izmjene s približno $1 {{PLURAL:$1|inačicom|inačice|inačica}}:",
+       "historywarning": "'''Upozorenje''': stranica koju želite izbrisati ima starije izmjene s približno $1 {{PLURAL:$1|inačicom|inačice|inačica}}:",
        "confirmdeletetext": "Zauvijek ćete izbrisati stranicu ili sliku zajedno s prijašnjim inačicama.\nMolim potvrdite svoju namjeru, da razumijete posljedice i da ovo radite u skladu s [[{{MediaWiki:Policy-url}}|pravilima]].",
        "actioncomplete": "Zahvat završen",
        "actionfailed": "Radnja nije uspjela",
        "newimages-summary": "Ova posebna stranica pokazuje posljednje nedavno postavljene datoteke.",
        "newimages-legend": "Filtar",
        "newimages-label": "Naziv datoteke (ili njen dio):",
-       "showhidebots": "($1 botova)",
        "noimages": "Nema slika.",
        "ilsubmit": "Traži",
        "bydate": "po datumu",
index 292c687..b9bec71 100644 (file)
        "edit-gone-missing": "Die Seit konnt net aktualisiert sin.\nDie woard oonscheinend gelöscht.",
        "edit-conflict": "Beoorbeitungskonflikt.",
        "edit-no-change": "Dein Beoorbeitung woard ignoriert, do ken Ännrung an dem Text voargenomm  woard.",
+       "postedit-confirmation-created": "Die Seit woard erstellt.",
+       "postedit-confirmation-restored": "Die Seit woard wiederhergestellt.",
        "postedit-confirmation-saved": "Dein Beoorbeitung woard gespeichert.",
        "edit-already-exists": "Die neie Seit konnt net erstellt werre, do sie bereits voarhand ist.",
        "defaultmessagetext": "Standardtext",
        "prefs-emailconfirm-label": "E-Mail-Bestätichung:",
        "youremail": "E-Mail-Adress:",
        "username": "{{GENDER:$1|Benutzernoome}}:",
-       "uid": "{{GENDER:$1|Benutzerkennung}}:",
        "prefs-memberingroups": "{{GENDER:$2|Mitglied}} von der {{PLURAL:$1|Benutzergrupp|Benutzergruppe}}:",
        "prefs-registration": "Oonmeldezeitpunkt:",
        "yourrealname": "Dein Noome wie registriert:",
        "action-createpage": "Seite zu erstelle",
        "action-createtalk": "Diskussionsseite erstelle",
        "action-createaccount": "der Benutzerkonto erstelle",
+       "action-history": "die Versionsgeschichte von der Seit oonsiehen",
        "action-minoredit": "die Beoorbeitung als klen markiere",
        "action-move": "die Seit verschiebe",
        "action-move-subpages": "die Seit und zugehöriche Unnerseite verschiebe",
        "pageswithprop-prophidden-binary": "Binäreichenschaftsweart versteckt ($1)",
        "doubleredirects": "Doppelte Weiterleitunge",
        "doubleredirectstext": "Diese Liste enthält Weiterleitungen, die auf Weiterleitungen verlinken.\nJede Zeile enthält Links zur ersten und zweiten Weiterleitung sowie dem Ziel der zweiten Weiterleitung, welches für gewöhnlich die gewünschte Zielseite ist, auf die bereits die erste Weiterleitung zeigen sollte.\n<del>Durchgestrichene</del> Einträge wurden bereits erfolgreich bearbeitet.",
-       "double-redirect-fixed-move": "[[$1]] woard verschub und leitet jetzt noh [[$2]] weiter.",
-       "double-redirect-fixed-maintenance": "Bereinichung von der doppelte Weiterleitung von [[$1]] noh [[$2]].",
+       "double-redirect-fixed-move": "[[$1]] woard verschub. Die Seit woard automatisch aktualisiert und leitet jetzt noh [[$2]] weiter.",
+       "double-redirect-fixed-maintenance": "Automatische Bereinichung von der doppelte Weiterleitung von [[$1]] noh [[$2]] in enem Woortungsufftrooch.",
        "double-redirect-fixer": "RedirectBot",
        "brokenredirects": "Defekte Weiterleitunge",
        "brokenredirectstext": "Die Spezialseit listiert Weiterleitung uff net existierende Seite uff.",
        "log-title-wildcard": "Titel beginnt mit …",
        "showhideselectedlogentries": "Ausgewählte Logbucheinträch oonzeiche/verstecke",
        "allpages": "All Seite",
-       "alphaindexline": "$1 bis $2",
        "nextpage": "Nächste Seit ($1)",
        "prevpage": "Vorhrich Seit ($1)",
        "allpagesfrom": "Seite oonzeiche ab:",
        "newimages-summary": "Die Spezialseit tut die zuletzt hochgeloodne Dateie oonzeiche.",
        "newimages-legend": "Filter",
        "newimages-label": "Dateinoome (orrer ein Tel davon):",
-       "showhidebots": "(Bots $1)",
        "noimages": "Kene Dateie gefund.",
        "ilsubmit": "Suche",
        "bydate": "noh Datum",
        "htmlform-no": "Ne, nein",
        "htmlform-yes": "Jo",
        "htmlform-chosen-placeholder": "Wähl ein Option",
+       "htmlform-cloner-create": "Weitre dozu tun",
+       "htmlform-cloner-delete": "Entferne",
+       "htmlform-cloner-required": "Es ist minschtens en Weart erforderlich.",
        "sqlite-has-fts": "Version $1 mit Unnerstützung für die Volltextsuch",
        "sqlite-no-fts": "Version $1 ohne Unnerstützung für die Volltextsuch",
        "logentry-delete-delete": "$1 {{GENDER:$2|löschte}} Seit $3",
index 6e9b7e0..336c9c1 100644 (file)
        "prefs-emailconfirm-label": "E-mejlowe wobkrućenje:",
        "youremail": "E-mejl:",
        "username": "Mjeno {{GENDER:$1|wužiwarja|wužiwarki}}:",
-       "uid": "ID {{GENDER:$1|wužiwarja|wužiwarki}}:",
        "prefs-memberingroups": "{{GENDER:$2|Čłon|Čłonka}} {{PLURAL:$1|wužiwarskeje skupiny|wužiwarskeju skupinow|wužiwarskich skupinow}}:",
        "prefs-registration": "Čas registracije:",
        "yourrealname": "Woprawdźite mjeno:",
        "log-title-wildcard": "Titul započina so z …",
        "showhideselectedlogentries": "Wubrane protokolowe zapiski pokazać/schować",
        "allpages": "Wšě nastawki",
-       "alphaindexline": "$1 do $2",
        "nextpage": "přichodna strona ($1)",
        "prevpage": "předchadna strona ($1)",
        "allpagesfrom": "Strony pokazać, započinajo z:",
        "newimages-summary": "Tuta specialna strona naliči aktualnje nahrate wobrazy a druhe dataje.",
        "newimages-legend": "Filter",
        "newimages-label": "Datajowe mjeno (abo dźěl z njeho):",
-       "showhidebots": "(bots $1)",
        "noimages": "Žane dataje.",
        "ilsubmit": "Pytać",
        "bydate": "datumje",
index 79d3f5c..0c1b436 100644 (file)
        "gotaccountlink": "Bejelentkezés",
        "userlogin-resetlink": "Elfelejtetted a bejelentkezési adataidat?",
        "userlogin-resetpassword-link": "Elfelejtetted a jelszavad?",
+       "userlogin-helplink2": "Segítség a bejelentkezéshez",
        "userlogin-loggedin": "Már be vagy jelentkezve mint {{GENDER:$1|$1}}. Ha más néven akarsz belépni, alább megteheted.",
        "userlogin-createanother": "Felhasználói fiók létrehozása",
        "createacct-emailrequired": "E-mail cím",
        "createacct-captcha": "Biztonsági ellenőrzés",
        "createacct-imgcaptcha-ph": "Írd be a szöveget, amit fent látsz",
        "createacct-submit": "Felhasználói fiók létrehozása",
-       "createacct-another-submit": "Újabb felhasználó létrehozása",
+       "createacct-another-submit": "Újabb felhasználói fiók létrehozása",
        "createacct-benefit-heading": "A(z) {{SITENAME}}-t hozzád hasonló emberek készítik.",
        "createacct-benefit-body1": "{{PLURAL:$1|szerkesztés|szerkesztés}}",
        "createacct-benefit-body2": "{{PLURAL:$1|lap|lap}}",
        "resetpass-abort-generic": "A jelszómódosítást megszakította egy kiterjesztés.",
        "resetpass-expired": "A jelszavad lejárt. Adjál meg egy új jelszót a bejelentkezéshez!",
        "resetpass-expired-soft": "A jelszavad lejárt, ezért újat kell beállítanod. Válassz most egy új jelszót, vagy kattints a {{int:resetpass-submit-cancel}} gombra, ha később akarod csak beállítani.",
+       "resetpass-validity-soft": "Adj meg egy új jelszót most, vagy kattints a \"{{int:resetpass-submit-cancel}}\" gombra, ha később akarod megadni.",
        "passwordreset": "Jelszó törlése",
        "passwordreset-text-one": "A jelszavad alaphelyzetbe állításához töltsd ki az űrlapot.",
        "passwordreset-text-many": "{{PLURAL:$1|Az átmeneti jelszó elküldéséhez töltsd ki az alábbi mezők egyikét.}}",
        "editundo": "visszavonás",
        "diff-empty": "(Nincs különbség)",
        "diff-multi-sameuser": "({{PLURAL:$1|Egy közbenső módosítás|$1 közbenső módosítás}} ugyanattól a szerkesztőtől nincs mutatva)",
+       "diff-multi-otherusers": "({{PLURAL:$1|Egy közbenső módosítás|$1 közbenső módosítás}}, amit {{PLURAL:$2|egy másik szerkesztő végzett|$2 másik szerkesztő végzett}}, nincs mutatva)",
        "diff-multi-manyusers": "({{PLURAL:$1|Egy közbeeső változat|$1 közbeeső változat}} nincs mutatva, amit $2 szerkesztő módosított)",
        "difference-missing-revision": "A(z) \"{{PAGENAME}}\" nevű oldal #$1 $2 változata nem létezik.\n\nEzt általában egy elavult, törölt oldalra mutató laptörténeti hivatkozás használata okozza. Részletek a [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} törlési naplóban] találhatóak.",
        "searchresults": "A keresés eredménye",
        "search-section": "($1 szakasz)",
        "search-suggest": "Keresési javaslat: $1",
        "search-interwiki-caption": "Társlapok",
-       "search-interwiki-default": "$1 találat",
+       "search-interwiki-default": "$1 találatok:",
        "search-interwiki-more": "(több)",
        "search-relatedarticle": "Kapcsolódó",
        "searcheverything-enable": "Keresés az összes névtérben",
        "prefs-emailconfirm-label": "E-mail cím megerősítése:",
        "youremail": "Az e-mail címed:",
        "username": "{{GENDER:$1|Szerkesztőnév}}:",
-       "uid": "{{GENDER:$1|Azonosító}}:",
        "prefs-memberingroups": "{{GENDER:$2|{{PLURAL:$1|Csoporttagság|Csoporttagságok}}}}:",
        "prefs-registration": "Regisztráció ideje:",
        "yourrealname": "Valódi neved:",
        "log-title-wildcard": "Így kezdődő címek keresése",
        "showhideselectedlogentries": "Kijelölt napló bejegyzések megjelenítése/elrejtése",
        "allpages": "Az összes lap listája",
-       "alphaindexline": "$1 – $2",
        "nextpage": "Következő lap ($1)",
        "prevpage": "Előző lap ($1)",
        "allpagesfrom": "Lapok listázása a következő címtől kezdve:",
        "newimages-summary": "Ezen a speciális lapon láthatóak a legutóbb feltöltött fájlok.",
        "newimages-legend": "Fájlnév",
        "newimages-label": "Fájlnév (vagy annak részlete):",
-       "showhidebots": "(botok szerkesztéseinek $1)",
        "noimages": "Nem tekinthető meg semmi.",
        "ilsubmit": "Keresés",
        "bydate": "dátum szerint",
index 31d93ca..ce10d7e 100644 (file)
        "newimages": "Նոր նիշքերի սրահ",
        "imagelisttext": "Ստորև բերված է '''$1''' {{PLURAL:$1|նիշքի}} ցանկ՝ դասավորված ըստ $2։",
        "newimages-legend": "Ֆիլտր",
-       "showhidebots": "($1 բոտերին)",
        "noimages": "Տեսնելու բան չկա։",
        "ilsubmit": "Որոնել",
        "bydate": "ըստ ամսաթվի",
index 0c479de..bd1d41e 100644 (file)
        "newimages-summary": "Iste pagina special detalia le recente files incargate.",
        "newimages-legend": "Filtro",
        "newimages-label": "Nomine del file (o un parte de illo):",
-       "showhidebots": "($1 bots)",
        "noimages": "Nihil a vider.",
        "ilsubmit": "Cercar",
        "bydate": "per data",
index a109bac..b258bea 100644 (file)
        "prefs-emailconfirm-label": "Konfirmasi surel:",
        "youremail": "Surel:",
        "username": "{{GENDER:$1|Nama pengguna}}:",
-       "uid": "ID {{GENDER:$1|pengguna}}:",
        "prefs-memberingroups": "{{GENDER:$2|Anggota}} {{PLURAL:$1|kelompok|kelompok}}:",
        "prefs-memberingroups-type": "$1",
        "prefs-registration": "Waktu pendaftaran:",
        "protectedpages-unknown-timestamp": "Tidak diketahui",
        "protectedpages-unknown-performer": "Pengguna yang tidak diketahui",
        "protectedtitles": "Judul yang dilindungi",
+       "protectedtitles-summary": "Halaman ini mendaftarkan judul-judul yang saat ini dilindungi dari pembuatan. Untuk daftar halaman yang sudah ada dan dilindungi, lihat [[{{#special:ProtectedPages}}|{{int:protectedpages}}]].",
        "protectedtitlesempty": "Tidak ada judul yang dilindungi.",
        "listusers": "Daftar pengguna",
        "listusers-editsonly": "Tampilkan hanya pengguna yang memiliki kontribusi",
        "log-title-wildcard": "Cari judul yang diawali dengan teks tersebut",
        "showhideselectedlogentries": "Tampilkan/sembunyikan entri log terpilih",
        "allpages": "Semua halaman",
-       "alphaindexline": "$1 hingga $2",
        "nextpage": "Halaman selanjutnya ($1)",
        "prevpage": "Halaman sebelumnya ($1)",
        "allpagesfrom": "Tampilkan halaman mulai dari:",
        "trackingcategories-msg": "Kategori pelacak",
        "trackingcategories-name": "Nama pesan",
        "trackingcategories-desc": "Kriteria inklusi kategori",
+       "noindex-category-desc": "Halaman tidak diindeks oleh robot karena ini mempunyai kata khusus <code><nowiki>__NOINDEX__</nowiki></code> padanya dan berada dalam ruang nama yang mengizinkan penanda itu.",
        "post-expand-template-inclusion-category-desc": "Setelah memperluas semua templat, ukuran halaman menjadi lebih besar dari <code>$wgMaxArticleSize</code>, sehingga beberapa templat tidak diperluas.",
        "broken-file-category-desc": "Kategori ditambahkan jika halaman tersebut berisi pranala rusak (pranala untuk menanamkan sebuah berkas ketika berkas tersebut tidak ada).",
        "trackingcategories-nodesc": "Deskripsi tidak tersedia.",
        "range_block_disabled": "Kemampuan pengurus dalam membuat blokir blok IP dimatikan.",
        "ipb_expiry_invalid": "Waktu kedaluwarsa tidak sah.",
        "ipb_expiry_temp": "Pemblokiran atas nama pengguna yang disembunyikan harus permanen.",
-       "ipb_hide_invalid": "Tak dapat menutup akun ini; mungkin akun tersebut memiliki terlalu banyak suntingan.",
+       "ipb_hide_invalid": "Tak dapat menutup akun ini; akun tersebut memiliki {{PLURAL:$1|satu suntingan|$1 suntingan}}.",
        "ipb_already_blocked": "\"$1\" telah diblokir",
        "ipb-needreblock": "$1 sudah diblokir. Apakah Anda ingin mengubah set pemblokiran yang bersangkutan?",
        "ipb-otherblocks-header": "{{PLURAL:$1|Blok|Blok}} lain",
        "newimages-summary": "Halaman istimewa berikut menampilkan daftar berkas yang terakhir dimuat",
        "newimages-legend": "Penyaring",
        "newimages-label": "Nama berkas (atau sebagian dari nama berkas):",
-       "showhidebots": "($1 bot)",
        "noimages": "Tidak ada yang dilihat.",
        "ilsubmit": "Cari",
        "bydate": "berdasarkan tanggal",
        "htmlform-yes": "Ya",
        "htmlform-chosen-placeholder": "Pilih opsi",
        "htmlform-cloner-create": "Tambahkan lebih banyak",
+       "htmlform-cloner-delete": "Hapus",
        "htmlform-cloner-required": "Paling sedikit satu nilai diperlukan.",
        "sqlite-has-fts": "$1 dengan dukungan pencarian teks lengkap",
        "sqlite-no-fts": "$1 tanpa dukungan pencarian teks lengkap",
index 628184f..715a939 100644 (file)
        "newimages-summary": "Daytoy nga espesial a panid ket ipakitana ti kinaudi a pinag-ipan kadagiti papeles.",
        "newimages-legend": "Sagat",
        "newimages-label": "Nagan ti papeles (wenno paset na) :",
-       "showhidebots": "($1 dagiti bot)",
        "noimages": "Awan ti makita.",
        "ilsubmit": "Biruken",
        "bydate": "babaen ti petsa",
index 4b2bd77..d7a1e69 100644 (file)
        "newimages-summary": "Þessi kerfissíða sýnir nýlega innhlaðnar skrár.",
        "newimages-legend": "Sía",
        "newimages-label": "Skráarnafn (eða hluti þess):",
-       "showhidebots": "($1 vélmenni)",
        "noimages": "Ekkert að sjá.",
        "ilsubmit": "Leita",
        "bydate": "eftir dagsetningu",
index 841d3b1..450eb53 100644 (file)
        "parser-template-recursion-depth-warning": "È stato raggiunto il limite di ricorsione nel template ($1)",
        "language-converter-depth-warning": "Limite di profondità del convertitore di lingua superato ($1)",
        "node-count-exceeded-category": "Pagine dove viene superato il numero di nodi",
+       "node-count-exceeded-category-desc": "Una categoria per pagine dove viene superato il numero di nodi.",
        "node-count-exceeded-warning": "Questa pagina ha superato il numero di nodi",
        "expansion-depth-exceeded-category": "Pagine dove viene superata la profondità di espansione",
+       "expansion-depth-exceeded-category-desc": "Questa è una categoria per pagine dove viene superata la profondità di espansione.",
        "expansion-depth-exceeded-warning": "Questa pagina ha superato la profondità di espansione",
        "parser-unstrip-loop-warning": "Rilevato ciclo di Unstrip",
        "parser-unstrip-recursion-limit": "Superati i limiti di ricorsione di Unstrip ($1)",
        "prefs-emailconfirm-label": "Conferma dell'e-mail:",
        "youremail": "Indirizzo email:",
        "username": "{{GENDER:$1|Nome utente}}:",
-       "uid": "{{GENDER:$1|ID utente}}:",
        "prefs-memberingroups": "{{GENDER:$2|Membro}} {{PLURAL:$1|del gruppo|dei gruppi}}:",
        "prefs-registration": "Data di registrazione:",
        "yourrealname": "Nome vero:",
        "right-move": "Sposta le pagine",
        "right-move-subpages": "Sposta le pagine insieme alle relative sottopagine",
        "right-move-rootuserpages": "Sposta le pagine principali degli utenti",
+       "right-move-categorypages": "Sposta le categorie",
        "right-movefile": "Sposta i file",
        "right-suppressredirect": "Non crea un redirect automatico quando si sposta una pagina",
        "right-upload": "Carica file",
        "action-move": "spostare questa pagina",
        "action-move-subpages": "spostare questa pagina e le relative sottopagine",
        "action-move-rootuserpages": "spostare le pagine principali degli utenti",
+       "action-move-categorypages": "spostare le categorie",
        "action-movefile": "spostare questo file",
        "action-upload": "caricare questo file",
        "action-reupload": "sovrascrivere questo file esistente",
        "log-title-wildcard": "Ricerca dei titoli che iniziano con",
        "showhideselectedlogentries": "Mostra/nascondi le voci di registro selezionate",
        "allpages": "Tutte le pagine",
-       "alphaindexline": "da $1 a $2",
        "nextpage": "Pagina successiva ($1)",
        "prevpage": "Pagina precedente ($1)",
        "allpagesfrom": "Mostra le pagine a partire da:",
        "movepagetalktext": "La corrispondente pagina di discussione, se esiste, sarà spostata automaticamente insieme alla pagina principale, '''tranne che nei seguenti casi''':\n* lo spostamento della pagina è tra namespace diversi;\n* in corrispondenza del nuovo titolo esiste già una pagina di discussione (non vuota);\n* la casella qui sotto è stata deselezionata.\n\nIn questi casi, se lo si ritiene opportuno, occorre spostare o aggiungere manualmente le informazioni contenute nella pagina di discussione.",
        "movearticle": "Sposta la pagina:",
        "moveuserpage-warning": "'''Attenzione:''' Si sta per spostare una pagina utente. Nota che verrà spostata solamente la pagina. L'utente ''non'' sarà rinominato.",
+       "movecategorypage-warning": "<strong>Attenzione:</strong> stai per spostare una categoria. Solo la pagina verrà spostata, ma tutte le pagine nella vecchia categoria <em>non</em> saranno inserite nella nuova.",
        "movenologintext": "Lo spostamento delle pagine è consentito solo agli utenti registrati che hanno eseguito l'[[Special:UserLogin|accesso]] al sito.",
        "movenotallowed": "Non si dispone dei permessi necessari per spostare le pagine.",
        "movenotallowedfile": "Non si dispone dei permessi necessari per spostare i file.",
        "cant-move-user-page": "Non si dispone dei permessi necessari per spostare le pagine utente (escluse le sottopagine).",
        "cant-move-to-user-page": "Non si dispone dei permessi necessari per spostare la pagina su una pagina utente (escluse le sottopagine utente).",
+       "cant-move-category-page": "Non si dispone dei permessi necessari per spostare categorie.",
+       "cant-move-to-category-page": "Non si dispone dei permessi necessari per spostare la pagina su una categoria.",
        "newtitle": "Nuovo titolo:",
        "move-watch": "Aggiungi la pagina agli osservati speciali",
        "movepagebtn": "Sposta la pagina",
        "newimages-summary": "Questa pagina speciale mostra i file caricati più di recente.",
        "newimages-legend": "Filtra",
        "newimages-label": "Nome file (o una parte di esso):",
-       "showhidebots": "($1 i bot)",
+       "newimages-showbots": "Mostra caricamenti di bot",
        "noimages": "Non c'è nulla da vedere.",
        "ilsubmit": "Ricerca",
        "bydate": "per data",
        "watchlistedit-raw-title": "Modifica degli osservati speciali in forma testuale",
        "watchlistedit-raw-legend": "Modifica testuale osservati speciali",
        "watchlistedit-raw-explain": "Di seguito sono elencate tutte le pagine osservate. Per modificare la lista aggiungere o rimuovere i rispettivi titoli, uno per riga.\nUna volta terminato, fare clic su \"{{int:Watchlistedit-raw-submit}}\" in fondo all'elenco.\nSi noti che è anche possibile [[Special:EditWatchlist|modificare la lista con l'interfaccia standard]].",
-       "watchlistedit-raw-titles": "Titoli delle pagine:",
+       "watchlistedit-raw-titles": "Titoli:",
        "watchlistedit-raw-submit": "Aggiorna la lista",
        "watchlistedit-raw-done": "La lista degli osservati speciali è stata aggiornata.",
        "watchlistedit-raw-added": "{{PLURAL:$1|È stata aggiunta una pagina|Sono state aggiunte $1 pagine}}:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|È stata eliminata una pagina|Sono state eliminate $1 pagine}}:",
+       "watchlistedit-clear-title": "Osservati speciali puliti",
+       "watchlistedit-clear-legend": "Pulisci osservati speciali",
+       "watchlistedit-clear-explain": "Tutti i titoli saranno rimossi dai tuoi osservati speciali",
+       "watchlistedit-clear-titles": "Titoli:",
+       "watchlistedit-clear-submit": "Pulisci gli osservati speciali (sarà permanente!)",
+       "watchlistedit-clear-done": "La lista degli osservati speciali è stata pulita.",
+       "watchlistedit-clear-removed": "{{PLURAL:$1|È stata eliminata una pagina|Sono state eliminate $1 pagine}}:",
+       "watchlistedit-too-many": "Ci sono troppe pagine da visualizzare qui.",
+       "watchlisttools-clear": "Pulisci gli osservati speciali",
        "watchlisttools-view": "Visualizza le modifiche pertinenti",
        "watchlisttools-edit": "Visualizza e modifica la lista degli osservati speciali",
        "watchlisttools-raw": "Modifica la lista in formato testo",
        "compare-submit": "Confronta",
        "compare-invalid-title": "Il titolo che hai specificato non è valido.",
        "compare-title-not-exists": "Il titolo che hai specificato non esiste.",
-       "compare-revision-not-exists": "La revisione che hai specificato non esiste.",
+       "compare-revision-not-exists": "La versione che hai specificato non esiste.",
        "dberr-problems": "Questo sito sta avendo dei problemi tecnici.",
        "dberr-again": "Prova ad attendere qualche minuto e ricaricare.",
        "dberr-info": "(Impossibile contattare il server del database: $1)",
index 297ce05..65c9ee9 100644 (file)
        "nonunicodebrowser": "<strong>警告: ご使用中のブラウザーは Unicode に未対応です。</strong>\n安全にページを編集する回避策を表示しています: 編集ボックス内の非 ASCII 文字を 16 進数コードで表現しています。",
        "editingold": "<strong>警告: このページの古い版を編集しています。</strong>\n保存すると、この版以降になされた変更がすべて失われます。",
        "yourdiff": "差分",
-       "copyrightwarning": "{{SITENAME}}ã\81¸ã\81®æ\8a\95稿ã\81¯ã\80\81ã\81\99ã\81¹ã\81¦$2 (詳細ã\81¯$1ã\82\92å\8f\82ç\85§) ã\81®ã\82\82ã\81¨ã\81§å\85¬é\96\8bã\81\97ã\81\9fã\81¨è¦\8bã\81ªã\81\95ã\82\8cã\82\8bã\81\93ã\81¨ã\81«ã\81\94注æ\84\8fã\81\8fã\81 ã\81\95ã\81\84ã\80\82\nã\81\82ã\81ªã\81\9fã\81\8cæ\8a\95稿ã\81\97ã\81\9fã\82\82ã\81®ã\82\92ã\80\81ä»\96人ã\81\8cよって遠慮なく編集し、それを自由に配布するのを望まない場合は、ここには投稿しないでください。<br />\nまた、投稿するのは、あなたが書いたものか、パブリック ドメインまたはそれに類するフリーな資料からの複製であることを約束してください。\n<strong>著作権保護されている作品を、許諾なしに投稿しないでください!</strong>",
+       "copyrightwarning": "{{SITENAME}}ã\81¸ã\81®æ\8a\95稿ã\81¯ã\80\81ã\81\99ã\81¹ã\81¦$2 (詳細ã\81¯$1ã\82\92å\8f\82ç\85§) ã\81®ã\82\82ã\81¨ã\81§å\85¬é\96\8bã\81\97ã\81\9fã\81¨è¦\8bã\81ªã\81\95ã\82\8cã\82\8bã\81\93ã\81¨ã\81«ã\81\94注æ\84\8fã\81\8fã\81 ã\81\95ã\81\84ã\80\82\nã\81\82ã\81ªã\81\9fã\81\8cæ\8a\95稿ã\81\97ã\81\9fã\82\82ã\81®ã\82\92ã\80\81ä»\96人ã\81«よって遠慮なく編集し、それを自由に配布するのを望まない場合は、ここには投稿しないでください。<br />\nまた、投稿するのは、あなたが書いたものか、パブリック ドメインまたはそれに類するフリーな資料からの複製であることを約束してください。\n<strong>著作権保護されている作品を、許諾なしに投稿しないでください!</strong>",
        "copyrightwarning2": "{{SITENAME}}へのすべての投稿は、他の利用者によって編集、変更、除去される場合があります。\nあなたの投稿を、他人が遠慮なく編集するのを望まない場合は、ここには投稿しないでください。<br />\nまた、投稿するのは、あなたが書いたものか、パブリック ドメインまたはそれに類するフリーな資料からの複製であることを約束してください (詳細は$1を参照)。\n<strong>著作権保護されている作品を、許諾なしに投稿してはいけません!</strong>",
        "longpageerror": "<strong>エラー: 投稿された文章は {{PLURAL:$1|$1 KB}} の長さがあります。これは投稿できる最大の長さ {{PLURAL:$2|$2 KB}} を超えています。</strong>\nこの編集内容は保存できません。",
        "readonlywarning": "<strong>警告: データベースがメンテナンスのためロックされており、現在は編集内容を保存できません。</strong>\n必要であれば文章をコピー&amp;ペーストしてテキストファイルとして保存し、後ほど保存をやり直してください。\n\nデータベースをロックした管理者による説明は以下の通りです: $1",
        "parser-template-recursion-depth-warning": "テンプレートの再帰の深さ ($1) が上限を超えました",
        "language-converter-depth-warning": "言語変換機能の深さ ($1) が制限を超えました",
        "node-count-exceeded-category": "ノード数が制限を超えたページ",
+       "node-count-exceeded-category-desc": "ノード数が制限を超えたページを列挙するカテゴリです。",
        "node-count-exceeded-warning": "ページがノード数の制限を超えました",
        "expansion-depth-exceeded-category": "展開の深さ制限を超えたページ",
+       "expansion-depth-exceeded-category-desc": "このカテゴリでは、展開の深さが制限を超えたページを列挙します。",
        "expansion-depth-exceeded-warning": "ページが展開の深さ制限を超えました",
        "parser-unstrip-loop-warning": "unstrip のループを検出しました",
        "parser-unstrip-recursion-limit": "unstrip の再帰 ($1) が上限を超えました",
        "prefs-emailconfirm-label": "メールアドレスの確認:",
        "youremail": "メールアドレス:",
        "username": "{{GENDER:$1|利用者名}}:",
-       "uid": "{{GENDER:$1|利用者}} ID:",
        "prefs-memberingroups": "{{GENDER:$2|所属}}{{PLURAL:$1|グループ}}:",
        "prefs-memberingroups-type": "$1",
        "prefs-registration": "登録日時:",
        "right-move": "ページを移動",
        "right-move-subpages": "下位ページを含めてページを移動",
        "right-move-rootuserpages": "利用者ページ本体を移動",
+       "right-move-categorypages": "カテゴリのページを移動",
        "right-movefile": "ファイルを移動",
        "right-suppressredirect": "転送ページを作成せずにページを移動",
        "right-upload": "ファイルをアップロード",
        "action-move": "このページの移動",
        "action-move-subpages": "このページとその下位ページの移動",
        "action-move-rootuserpages": "利用者ページ本体の移動",
+       "action-move-categorypages": "カテゴリのページの移動",
        "action-movefile": "このファイルの移動",
        "action-upload": "このファイルのアップロード",
        "action-reupload": "この既存のファイルへの上書き",
        "doubleredirects": "二重転送",
        "doubleredirectstext": "このページでは、転送ページへの転送ページを列挙します。\n最初の転送ページ、その転送先にある転送ページ、さらにその転送先にあるページ、それぞれへのリンクを各行に表示しています。多くの場合は最終的な転送先が「正しい」転送先であり、最初の転送ページの転送先は最終的な転送先に直接向けるべきです。\n<del>取り消し線</del>が入った項目は解決済みです。",
        "double-redirect-fixed-move": "[[$1]]を移動しました。\n今後は[[$2]]に転送されます。",
-       "double-redirect-fixed-maintenance": "[[$1]]から[[$2]]への二重転送を修正します。",
+       "double-redirect-fixed-maintenance": "メンテナンス作業の一環として[[$1]]から[[$2]]への二重転送を自動的に修正します。",
        "double-redirect-fixer": "転送修正係",
        "brokenredirects": "迷子のリダイレクト",
        "brokenredirectstext": "以下は、存在しないページへのリダイレクトの一覧です:",
        "log-title-wildcard": "この文字列で始まるページ名を検索",
        "showhideselectedlogentries": "選択した記録項目を表示/非表示",
        "allpages": "全ページ",
-       "alphaindexline": "$1から$2まで",
        "nextpage": "次のページ ($1)",
        "prevpage": "前のページ ($1)",
        "allpagesfrom": "最初に表示するページ:",
        "broken-file-category-desc": "リンク切れしたファイルを含むページ (ファイルを埋め込むリンクがあり、そのファイルが存在しない) に追加されるカテゴリ",
        "hidden-category-category-desc": "<code><nowiki>__HIDDENCAT__</nowiki></code> を含むカテゴリ。このカテゴリは、既定ではページのカテゴリ リンク ボックス内に表示されません。",
        "trackingcategories-nodesc": "説明はありません。",
+       "trackingcategories-disabled": "このカテゴリは無効化されています",
        "mailnologin": "送信アドレスがありません",
        "mailnologintext": "他の利用者宛にメールを送信するためには、[[Special:UserLogin|ログイン]]し、[[Special:Preferences|個人設定]]で有効なメールアドレスを設定する必要があります。",
        "emailuser": "この利用者にメールを送信",
        "blocklogpage": "ブロック記録",
        "blocklog-showlog": "この利用者は以前にブロックされたことがあります。\n参考のため、ブロック記録を以下に示します:",
        "blocklog-showsuppresslog": "この利用者は以前にブロックされ、隠されたことがあります。\n参考のため、秘匿記録を以下に示します:",
-       "blocklogentry": "が [[$1]] を$2ブロックしました。追加事項: $3",
-       "reblock-logentry": "が [[$1]] のブロック設定を$2に変更しました。ブロックの詳細: $3",
+       "blocklogentry": "が [[$1]] を$2ブロックしました $3",
+       "reblock-logentry": "が [[$1]] のブロック設定を$2に変更しました $3",
        "blocklogtext": "このページは利用者のブロックと解除の記録です。\n自動的にブロックされたIPアドレスは表示されていません。\n現時点で有効なブロックは[[Special:BlockList|ブロックの一覧]]をご覧ください。",
        "unblocklogentry": "$1のブロックを解除しました",
        "block-log-flags-anononly": "対象は匿名利用者のみ",
        "block-log-flags-nocreate": "アカウント作成も禁止",
-       "block-log-flags-noautoblock": "自動ブロック無効",
-       "block-log-flags-noemail": "メール送信禁止",
+       "block-log-flags-noautoblock": "自動ブロック無効",
+       "block-log-flags-noemail": "メール送信禁止",
        "block-log-flags-nousertalk": "自分のトークページも編集禁止",
        "block-log-flags-angry-autoblock": "拡張自動ブロック有効",
        "block-log-flags-hiddenname": "利用者名の秘匿",
        "movepagetalktext": "関連付けられたトークページも一緒に、自動的に移動されます。ただし、<strong>以下の場合を除きます:</strong>\n* 移動先に、空ではないトークページが既に存在する場合\n* 下のボックスのチェックを消した場合\n\nこれらの場合、必要に応じて、トークページを移動または統合する必要があります。",
        "movearticle": "移動するページ:",
        "moveuserpage-warning": "<strong>警告:</strong> 利用者ページを移動しようとしています。この操作ではページのみが移動され、利用者名は<em>変更されない</em>点に注意してください。",
+       "movecategorypage-warning": "<strong>警告:</strong> カテゴリのページを移動させようとしています。カテゴリのページのみが移動するため、元のカテゴリに属していたどのページも新しいカテゴリには移動 <em>しない</em> ことにご注意ください。",
        "movenologintext": "ページを移動するためには、登録利用者でありかつ、[[Special:UserLogin|ログイン]]している必要があります。",
        "movenotallowed": "ページを移動する権限がありません。",
        "movenotallowedfile": "ファイルを移動する権限がありません。",
        "cant-move-user-page": "利用者ページを移動させる権限がありません (下位ページ内を除く)。",
        "cant-move-to-user-page": "利用者下位ページ以外の利用者ページに、ページを移動させる権限がありません。",
+       "cant-move-category-page": "カテゴリのページを移動させる権限がありません。",
+       "cant-move-to-category-page": "ページをカテゴリのページに移動させる権限がありません。",
        "newtitle": "新しいページ名:",
        "move-watch": "移動元と移動先ページをウォッチ",
        "movepagebtn": "ページを移動",
        "newimages-summary": "この特別ページでは、最近アップロードされたファイルを表示します。",
        "newimages-legend": "絞り込み",
        "newimages-label": "ファイル名 (またはその一部):",
-       "showhidebots": "(ボットを$1)",
+       "newimages-showbots": "ボットによるアップロードを表示",
        "noimages": "表示できるものがありません。",
        "ilsubmit": "検索",
        "bydate": "日付順",
        "watchlistedit-raw-done": "ウォッチリストを更新しました。",
        "watchlistedit-raw-added": "{{PLURAL:$1|$1 ページ}}を追加しました:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|$1 ページ}}を除去しました:",
+       "watchlistedit-clear-explain": "ウォッチリストに追加されたページ名がすべて除去されます",
+       "watchlistedit-clear-titles": "ページ名:",
+       "watchlistedit-clear-removed": "{{PLURAL:$1|$1 件のページ}}を除去しました:",
+       "watchlistedit-too-many": "ページ数が多すぎるため表示できません。",
        "watchlisttools-view": "関連する変更を閲覧",
        "watchlisttools-edit": "ウォッチリストの閲覧と編集",
        "watchlisttools-raw": "ウォッチリストをテキストで編集",
index ba3b827..dc61e25 100644 (file)
        "newimages-summary": "Kaca astaméwa utawa kusus iki nuduhaké daftar berkas anyar dhéwé sing diunggahaké.",
        "newimages-legend": "Filter",
        "newimages-label": "Jeneng berkas (utawa sapérangan seka jeneng berkas):",
-       "showhidebots": "($1 bot)",
        "noimages": "Ora ana sing dideleng.",
        "ilsubmit": "Golek",
        "bydate": "miturut tanggal",
index 4b4a81c..0712260 100644 (file)
        "prefs-emailconfirm-label": "ელ-ფოსტის დადასტურება:",
        "youremail": "ელექტრონული ფოსტა:",
        "username": "{{GENDER:$1|მომხმარებლის სახელი}}:",
-       "uid": "{{GENDER:$1|მომხმარებლის}} იდენტიფიკატორი:",
        "prefs-memberingroups": "{{PLURAL:$1|ჯგუფის|ჯგუფების}} {{GENDER:$2|წევრი}}:",
        "prefs-memberingroups-type": "$1",
        "prefs-registration": "რეგისტრაციის თარიღი",
        "log-title-wildcard": "სათაურების ძებნა, რომლებიც იწყება ამ ტექსტით",
        "showhideselectedlogentries": "არჩეული ჟურნალის ჩანაწერის ჩვენება/დამალვა",
        "allpages": "ყველა გვერდი",
-       "alphaindexline": "$1-დან $2-მდე",
        "nextpage": "შემდეგი გვერდი ($1)",
        "prevpage": "წინა გვერდი ($1)",
        "allpagesfrom": "გვერდების ჩვენება დაწყებული:",
        "newimages-summary": "ეს სპეცგვერდი აჩვენებს ბოლო დროს ატვირთულ ფაილებს.",
        "newimages-legend": "ფილტრი",
        "newimages-label": "ფაილის (ან მისი სახელის) ნაწილი",
-       "showhidebots": "(რობოტების $1)",
        "noimages": "გადასახედი არაფერია.",
        "ilsubmit": "ძიება",
        "bydate": "თარიღით",
index e5b78f9..7737c39 100644 (file)
        "newimages-summary": "Asebtar agi uslig yebeqqeḍ ifuyla ineggura i kteren.",
        "newimages-legend": "Tastayt",
        "newimages-label": "Isem n ufaylu (naɣ aḥric ines) :",
-       "showhidebots": "($1 iṛubuten)",
        "noimages": "Tugna ulac-itt.",
        "ilsubmit": "Nadi",
        "bydate": "s uzemz",
index fb7fe5a..94d44db 100644 (file)
        "prefs-files": "Dosyey",
        "youremail": "E-poste:",
        "username": "Namê karberi:",
-       "uid": "Kamiya {{GENDER:$1|karberi}}:",
        "prefs-memberingroups": "{{GENDER:$2|Ezayê}} {{PLURAL:$1|grube|grubu}}:",
        "yourrealname": "Namo rastıkên:",
        "yourlanguage": "Zon:",
        "nmembers": "$1 {{PLURAL:$1|eza|ezay}}",
        "nrevisions": "$1 {{PLURAL:$1|çım-ra-viarnais|çım-ra-viarnaişi}}",
        "nviews": "$1 {{PLURAL:$1|vênais|vênaişi}}",
-       "uncategorizedpages": "Pelê kategorizenêkerdey",
+       "uncategorizedpages": "Pelê ke kategorize nêbiyê",
        "prefixindex": "Peli pêro be verbend",
        "shortpages": "Pelê kılmi",
        "longpages": "Pelê dergi",
        "speciallogtitlelabel": "Sernuste:",
        "log": "Qeydi",
        "allpages": "Peli pêro",
-       "alphaindexline": "$1 bere $2",
        "nextpage": "Pela peyê coy ($1)",
        "prevpage": "Pela verêne ($1)",
        "allpagesfrom": "Pelê ke be na herfe dest niyo pıra bıasne:",
        "tooltip-ca-history": "Versiyonê verênê na pele",
        "tooltip-ca-protect": "Na pele bısevekne",
        "tooltip-ca-delete": "Na pele bestere",
-       "tooltip-ca-move": "Namê na pele bıvurne",
+       "tooltip-ca-move": "Na pele bere",
        "tooltip-ca-watch": "Na pele bıcê lista huya şêrkerdene",
        "tooltip-ca-unwatch": "Na pele lista huya şêrkerdene ra wedare",
        "tooltip-search": "Zerrê {{SITENAME}} de cı feteliye",
index 09a7c5d..d5cb2a1 100644 (file)
        "prefs-emailconfirm-label": "Е-поштаның расталуы:",
        "youremail": "Е-поштаңыз:",
        "username": "{{GENDER:$1|Қатысушы атыңыз}}:",
-       "uid": "{{GENDER:$1|Қатысушы}} теңдестіргішіңіз (ID):",
        "prefs-memberingroups": "{{GENDER:$2|Мүше}}  {{PLURAL:$1|тобыңыз|топтарыңыз}}:",
        "prefs-registration": "Тіркелген уақытыңыз:",
        "yourrealname": "Нақты атыңыз:",
        "booksources-go": "Өту",
        "booksources-text": "Төменде жаңа және қолданған кітаптар сататын тораптарының сілтемелері тізімделген. Бұл тораптарда ізделген кітаптар туралы былайғы ақпарат болуға мүмкін.",
        "specialloguserlabel": "Орындаушы:",
-       "speciallogtitlelabel": "Нысана (тақырып аты немесе қатысушы):",
+       "speciallogtitlelabel": "Нысана (атауы немесе қатысушы):",
        "log": "Журналдар",
        "all-logs-page": "Барлық журналдар",
        "alllogstext": "{{SITENAME}} жобасының барлық қатынаулы журналдарын біріктіріп көрсетуі.\nЖурнал түрін, қатысушы атын (үлкен кішілігін ескеріп), не тиісті бетін бөлектеп, тарылтып қарай аласыз (кейде үлкен кішілігін ескеріп).",
        "log-title-wildcard": "Мына мәтіннен басталытын тақырып аттарын іздеу",
        "showhideselectedlogentries": "Таңдалған журнал енгізілімдерін көрсету/жасыру",
        "allpages": "Барлық беттер",
-       "alphaindexline": "$1 дегеннен $2",
        "nextpage": "Келесі бетке ($1)",
        "prevpage": "Алдыңғы бетке ($1)",
        "allpagesfrom": "Мына беттерден бастап көрсету:",
        "noemailtext": "Бұл қатысушы жарамды е-пошта мекенжайын келтірмеген.",
        "emailusername": "Қатысушы аты:",
        "emailusernamesubmit": "Жіберу",
-       "email-legend": "Басқа{{SITENAME}} қатысушысына хат жіберу",
+       "email-legend": "Басқа {{SITENAME}} қатысушысына хат жіберу",
        "emailfrom": "Кімнен:",
        "emailto": "Кімге:",
        "emailsubject": "Тақырыбы:",
        "blocklog-showsuppresslog": "Бұл қатысушы ұдайы жасырылып және бұғатталып отырған.\nДерек үшін төменде жасыру журналы берілген:",
        "blocklogentry": "[[$1]] дегенді $2 мерзімге бұғаттады $3",
        "blocklogtext": "Бұл қатысушыларды бұғаттау және бұғаттауынан босату әрекеттерінің журналы.\nӨздіктік бұғатталған IP мекенжайлар тізімделмеген.\nҚазіргі уақыттағы белсенді тиымдар мен бұғаттауларды [[Special:BlockList|бұғаттау тізімінен]] қараңыз.",
-       "unblocklogentry": "$1 бұғаттауынан босатты",
+       "unblocklogentry": "$1 ÐµÑ\81Ñ\96мдÑ\96 Ò\9bаÑ\82Ñ\8bÑ\81Ñ\83Ñ\88Ñ\8bнÑ\8b Ð±Ò±Ò\93аÑ\82Ñ\82аÑ\83Ñ\8bнан Ð±Ð¾Ñ\81аÑ\82Ñ\82Ñ\8b",
        "block-log-flags-anononly": "тек аноним қатысушылар",
        "block-log-flags-nocreate": "тіркелу өшірілген",
        "block-log-flags-noautoblock": "автобұғаттау өшірілген",
        "pageinfo-length": "Бет ұзындығы (байтпен)",
        "pageinfo-article-id": "Бет ID-і",
        "pageinfo-language": "Бет мәлімет тілі",
-       "pageinfo-content-model": "Бет мағұлымат қалпы",
+       "pageinfo-content-model": "Бет мағлұмат қалпы",
        "pageinfo-robot-policy": "Индекстеуді робот жүргізеді",
        "pageinfo-robot-index": "Рұқсат берілген",
        "pageinfo-robot-noindex": "Рұқсат етілмеген",
        "imagelisttext": "Төменде $2 сұрыпталған '''$1''' файл тізімі.",
        "newimages-summary": "Бұл арнайы бетте соңғы жүктелген файлдар көрсетіледі",
        "newimages-legend": "Сүзгі",
-       "showhidebots": "(боттарды $1)",
        "noimages": "Көретін ештеңе жоқ.",
        "ilsubmit": "Іздеу",
        "bydate": "күн-айымен",
        "logentry-delete-event": "$1 $3 бетіндегі {{PLURAL:$5|журнал оқиғасы|$5 журнал оқиғасы}} көрінісін {{GENDER:$2|өзгертті}}: $4",
        "logentry-delete-revision": "$1 $3 бетіндегі {{PLURAL:$5|нұсқа|$5 нұсқа}} көрінісін {{GENDER:$2|өзгертті}}: $4",
        "logentry-suppress-event": "$1 $3 бетіндегі {{PLURAL:$5|журнал оқиғасы|$5 журнал оқиғасы}} көрінісін құпия түрде {{GENDER:$2|өзгертті}}: $4",
-       "revdelete-content-hid": "мағұлымат жасырылған",
+       "revdelete-content-hid": "мағлұмат жасырылған",
        "revdelete-summary-hid": "өңдеу түйіндемесі жасырылған",
        "revdelete-uname-hid": "қатысушы есімі жасырылған",
        "revdelete-content-unhid": "мағлұматы жасырылмаған",
index 7f2f1ea..fa16fff 100644 (file)
        "newimages-summary": "ទំព័រពិសេសនេះបង្ហាញឯកសារដែលផ្ទុកឡើងចុងក្រោយគេ។",
        "newimages-legend": "តម្រងការពារ",
        "newimages-label": "ឈ្មោះរូបភាព៖",
-       "showhidebots": "($1រូបយន្ត)",
        "noimages": "គ្មានអ្វីសំរាប់មើលទេ។",
        "ilsubmit": "ស្វែងរក",
        "bydate": "តាមកាលបរិច្ឆេទ",
index 8f5de99..47d4840 100644 (file)
        "prefs-emailconfirm-label": "이메일 인증:",
        "youremail": "이메일:",
        "username": "{{GENDER:$1|사용자 이름}}:",
-       "uid": "{{GENDER:$1|사용자}} ID:",
        "prefs-memberingroups": "{{GENDER:$2|소속}} {{PLURAL:$1|그룹}}:",
-       "prefs-registration": "ë\93±ë¡\9d ì\9d¼ì\8b\9c:",
+       "prefs-registration": "ë\93±ë¡\9d ì\8b\9cê°\84:",
        "yourrealname": "실명:",
        "yourlanguage": "언어:",
        "yourvariant": "언어 변종:",
        "right-move": "문서 옮기기",
        "right-move-subpages": "문서와 하위 문서 옮기기",
        "right-move-rootuserpages": "최상위 사용자 문서 옮기기",
+       "right-move-categorypages": "분류 문서 옮기기",
        "right-movefile": "파일 옮기기",
        "right-suppressredirect": "문서을 옮길 때 원래 문서 이름으로 된 넘겨주기를 만들지 않기",
        "right-upload": "파일 올리기",
        "action-move": "이 문서 옮기기",
        "action-move-subpages": "이 문서와 하위 문서를 함께 옮기기",
        "action-move-rootuserpages": "최상위 사용자 문서를 이동할",
+       "action-move-categorypages": "분류 문서 옮기기",
        "action-movefile": "이 파일을 옮기기",
        "action-upload": "이 파일을 올리기",
        "action-reupload": "이미 존재하는 파일 덮어쓰기",
        "empty-file": "올린 파일이 비어 있습니다.",
        "file-too-large": "올리려는 파일이 너무 큽니다.",
        "filename-tooshort": "파일 이름이 너무 짧습니다.",
-       "filetype-banned": "이러한 종류의 파일은 금지되어 있습니다.",
+       "filetype-banned": "이 파일의 형식은 금지되어 있습니다.",
        "verification-error": "이 파일은 파일 확인 절차를 통과하지 않았습니다.",
        "hookaborted": "수정하려고 한 것이 확장 기능 훅에 의해 중지되었습니다.",
        "illegal-filename": "이 파일 이름은 허용되지 않습니다.",
        "log-title-wildcard": "다음 글로 시작하는 제목 검색",
        "showhideselectedlogentries": "선택한 기록 항목 보이기/숨기기",
        "allpages": "모든 문서 목록",
-       "alphaindexline": "$1부터 $2까지",
        "nextpage": "다음 문서 ($1)",
        "prevpage": "이전 문서 ($1)",
        "allpagesfrom": "다음으로 시작하는 문서 보기:",
        "movepagetalktext": "딸린 토론 문서도 자동으로 이동합니다. 하지만 다음의 경우는 '''이동하지 않습니다''':\n* 이동할 이름으로 된 문서가 이미 있는 경우\n* 아래의 선택을 해제하는 경우\n\n이 경우에는 문서를 직접 이동하거나 두 문서를 합쳐야 합니다.",
        "movearticle": "문서 옮기기:",
        "moveuserpage-warning": "'''경고:''' 사용자 문서를 옮기려 하고 있습니다. 사용자 문서만 이동되며 사용자 이름이 바뀌지 '''않는다'''는 점을 참고하세요.",
+       "movecategorypage-warning": "<strong>경고:</strong> 분류 문서를 옮기려고 합니다. 해당 문서만 옮겨지고 옛 분류에 있는 문서는 새 분류 안에 다시 분류되지 <em>않음</em>을 참고하세요.",
        "movenologintext": "문서를 이동하려면 [[Special:UserLogin|로그인]]해야 합니다.",
        "movenotallowed": "문서를 옮길 권한이 없습니다.",
        "movenotallowedfile": "파일을 옮길 권한이 없습니다.",
-       "cant-move-user-page": "사용자 문서를 옮길 권한이 없습니다(하위 문서는 예외).",
-       "cant-move-to-user-page": "문서를 사용자 문서로 옮길 권한이 없습니다(하위 문서는 예외).",
+       "cant-move-user-page": "사용자 문서를 옮길 권한이 없습니다 (하위 문서는 예외).",
+       "cant-move-to-user-page": "문서를 사용자 문서로 옮길 권한이 없습니다 (하위 문서는 예외).",
+       "cant-move-category-page": "분류 문서를 옮길 권한이 없습니다.",
+       "cant-move-to-category-page": "문서를 분류 문서로 옮길 권한이 없습니다.",
        "newtitle": "새 제목:",
        "move-watch": "원래 문서와 대상 문서를 주시하기",
        "movepagebtn": "문서 옮기기",
        "newimages-summary": "이 특수 문서는 최근에 올라온 파일을 나열하고 있습니다.",
        "newimages-legend": "필터",
        "newimages-label": "파일 이름 (또는 그 일부분):",
-       "showhidebots": "(봇을 $1)",
+       "newimages-showbots": "봇이 올린 것 보기",
        "noimages": "그림이 없습니다.",
        "ilsubmit": "검색",
        "bydate": "날짜",
        "api-error-fileexists-shared-forbidden": "\"$1\" 이름으로 된 파일이 이미 공용 저장소에 존재하며 덮어쓸 수 없습니다.",
        "api-error-file-too-large": "올리려는 파일이 너무 큽니다.",
        "api-error-filename-tooshort": "파일 이름이 너무 짧습니다.",
-       "api-error-filetype-banned": "이런 파일 형식은 올릴 수 없습니다.",
+       "api-error-filetype-banned": "이 파일의 형식은 금지되어 있습니다.",
        "api-error-filetype-banned-type": "$1 {{PLURAL:$4|파일 형식은 올릴 수 없습니다}}. $2 {{PLURAL:$3|파일 형식만 사용할 수 있습니다}}.",
        "api-error-filetype-missing": "파일 이름에 확장자가 없습니다.",
        "api-error-hookaborted": "수정하려고 한 것이 확장 기능에 의해 중지되었습니다.",
index 5f9281e..4a94dfd 100644 (file)
        "view": "Къарау",
        "view-foreign": "$1 сайтда къара",
        "edit": "Тюрлендир",
+       "edit-local": "Локал айгъакълауну тюрлендириу",
        "create": "Къура",
        "editthispage": "Бу бетни тюрлендир",
        "create-this-page": "Бу бетни къура",
        "changeemail-password": "«{{SITENAME}}» проектде паролугъуз:",
        "changeemail-submit": "Адресни тюрлендир",
        "changeemail-cancel": "Ызына алыу",
+       "resettokens": "Токенлени джибер",
        "resettokens-tokens": "Токенле:",
        "bold_sample": "Къалын джазыу",
        "bold_tip": "Къалын джазыу",
-       "italic_sample": "Ð\9aÑ\83Ñ\80Ñ\81ив джазыу",
-       "italic_tip": "Ð\9aÑ\83Ñ\80Ñ\81ив джазыу",
+       "italic_sample": "СÑ\91дегей джазыу",
+       "italic_tip": "СÑ\91дегей джазыу",
        "link_sample": "Джибериуню башлыгъы",
        "link_tip": "Ич джибериу",
        "extlink_sample": "http://www.example.com линкни ачыкълауу",
        "prefs-emailconfirm-label": "Электрон почтаны бегитиу:",
        "youremail": "Электрон почта:",
        "username": "{{GENDER:$1|Къошулуучу ат}}:",
-       "uid": "{{GENDER:$1|Къошулуучуну}} коду:",
        "prefs-memberingroups": "{{PLURAL:$1|1=Группаны|Группаланы}} {{GENDER:$2|члени}}:",
        "prefs-memberingroups-type": "$1",
        "prefs-registration": "Регистрацияны этилген заманы:",
        "fewestrevisions": "Эм аз версиясы болгъан бетле",
        "nbytes": "$1 {{PLURAL:$1|байт}}",
        "ncategories": "$1 {{PLURAL:$1|категория}}",
+       "ninterwikis": "$1 {{PLURAL:$1|интервики}}",
        "nlinks": "$1 {{PLURAL:$1|джибериу}}",
        "nmembers": "$1 {{PLURAL:$1|объект}}",
+       "nmemberschanged": "$1 → $2 {{PLURAL:$2|объект}}",
        "nrevisions": "$1 {{PLURAL:$1|версия}}",
        "nviews": "$1 {{PLURAL:$1|къарау}}",
        "nimagelinks": "$1 {{PLURAL:$1|бетде}} хайырланады",
        "logempty": "Журналлагъа келишген билги джокъду.",
        "log-title-wildcard": "Бу символладан башланнган башлыкъланы изле",
        "allpages": "Бютеу бетле",
-       "alphaindexline": "$1 бетден $2 бетге дери",
        "nextpage": "Эндиги бет ($1)",
        "prevpage": "Алдагъы бет ($1)",
        "allpagesfrom": "Мунга башланнган бетлени чыгъар:",
        "othercontribs": "$1 джанындан этилген ишге тамалланады.",
        "others": "башхала",
        "siteusers": "{{SITENAME}} {{PLURAL:$2|1=къошулуучу|къошулуучула}} $1",
-       "anonusers": "{{SITENAME}} аноним {{PLURAL:$2|1=къошулуучу|къошулуучула}} $1",
+       "anonusers": "{{SITENAME}} аноним {{PLURAL:$2|къошулуучусу|къошулуучулары}} $1",
        "creditspage": "Бетни кредитлери",
        "nocredits": "Бу къошулуучу ючюн кредит билги джокъду.",
        "spamprotectiontitle": "Спамгъа къаршчы фильтр",
        "pageinfo-article-id": "Бетни идентификатору",
        "pageinfo-language": "Бетни ичиндегисини тили",
        "pageinfo-content-model": "Батни ичиндегисини модели",
-       "pageinfo-robot-policy": "Излеу къуллукъла бла индексация",
+       "pageinfo-robot-policy": "Излеу роботла бла индексация",
        "pageinfo-robot-index": "Эркинлик берилгенди",
        "pageinfo-robot-noindex": "Эркинлик берилмегенди",
        "pageinfo-views": "Къарауланы саны",
        "newimages-summary": "Бу къуллукъ бет, кёб болмай джюкленнген файлланы кёргюзеди.",
        "newimages-legend": "Фильтр",
        "newimages-label": "Файлны аты (неда кесеги):",
-       "showhidebots": "($1 бот)",
        "noimages": "Кёрюр зат джокъду",
        "ilsubmit": "Таб",
        "bydate": "Хронологиягъа кёре",
        "htmlform-no": "Огъай",
        "htmlform-yes": "Хоу",
        "htmlform-chosen-placeholder": "Вариантны сайлагъыз",
+       "htmlform-cloner-create": "Энтда къош",
+       "htmlform-cloner-delete": "Кетер",
        "sqlite-has-fts": "$1 толу текст излеуню хайырландыргъан",
        "sqlite-no-fts": "$1 толу текст излеуню хайырландыра билмеген",
        "logentry-delete-delete": "$3 бетни $1 {{GENDER:$2|кетерди}}",
        "limitreport-title": "Анализаторну билгилери:",
        "limitreport-cputime": "Процессорну заманын хайырлан",
        "limitreport-cputime-value": "$1 {{PLURAL:$1|секунд}}",
+       "limitreport-walltime": "Керти заман режимде хайырланыу",
        "limitreport-walltime-value": "$1 {{PLURAL:$1|секунд}}",
+       "limitreport-ppvisitednodes": "Препроцессор кирген тюйюмчеклени саны",
+       "limitreport-ppgeneratednodes": "Препроцессор чыгъаргъан тюйюмчеклени саны",
+       "limitreport-postexpandincludesize": "Кенгерилген джандырыуланы ёлчеми",
        "limitreport-postexpandincludesize-value": "$1/$2 {{PLURAL:$2|байт}}",
        "limitreport-templateargumentsize": "Шаблонну арагументини ёлчеми",
        "limitreport-templateargumentsize-value": "$1/$2 {{PLURAL:$2|байт}}",
+       "limitreport-expansiondepth": "Кенгериуню эм уллу теренлиги",
+       "limitreport-expensivefunctioncount": "Анализаторну «багъа» функцияларыны саны",
        "expandtemplates": "Шаблонланы ачыу",
        "expand_templates_title": "{{FULLPAGENAME}} ючюн контекст башлыкъ эм д. а. к.:",
        "expand_templates_input": "Кириу текст:",
index 755adcf..2b2e49e 100644 (file)
        "gotaccountlink": "Enlogge",
        "userlogin-resetlink": "Häß De Ding Daate för et Enlogge verjäße?",
        "userlogin-resetpassword-link": "Paßwoot verjäße?",
-       "userlogin-loggedin": "Do bes ald als {{GENDER:$1|dä Metmaacher|de Metmaacherėn|dä Metmaacher|de Metmaacherėn|däMetmaacher}} [[User:$1|$1]] enjelogg. Met heh dämm Fommolaa kanns De jäz ävver onger enem andere Nahme enlogge.",
+       "userlogin-helplink2": "Hölp mem Enlogge",
+       "userlogin-loggedin": "Do bes ald als {{GENDER:$1|dä Metmaacher|de Metmaacherėn|dä Metmaacher|de Metmaacherėn|dä Metmaacher}} [[User:$1|$1]] enjelogg. Met heh dämm Fommolaa kanns De jäz ävver onger enem andere Nahme enlogge.",
        "userlogin-createanother": "Donn ene zohsäzlejje Zohjang aanlääje",
        "createacct-emailrequired": "Ding Addräß för de <i lang=\"en\">e-mail</i>",
        "createacct-emailoptional": "Ding Addräß för de <i lang=\"en\">e-mail</i>, kann fott bliive",
        "resetpass-abort-generic": "E Zohsazprojramm häd_et nit zohjelohße, et Paßwoot ze ändere.",
        "resetpass-expired": "Di Paßwood es afjeloufe. Donn jetz e neu Passwoot för et Enlogg faßlääje.",
        "resetpass-expired-soft": "Ding Paßwood es afjeloufe un moß neu jesaz wääde. Bes esu jood_un donn e neu Paßwoot ußsöhke, udder jangk op {{int:resetpass-submit-cancel}}, öm et schpääder ze säze.",
+       "resetpass-validity-soft": "Ding Kännwood es nit johd: $1\n\nSöhk Der e neu Kännwood us, udder jangg_op <em>{{int:resetpass-submit-cancel}}</em>, öm dat schpääder ze donn.",
        "passwordreset": "Et Paßwoot zeröck säze",
        "passwordreset-text-one": "Föll dat Fommolaa uß, öm Ding Paßwoot ze ändere.",
        "passwordreset-text-many": "{{PLURAL:$1|Föll ei vun dä Fälder en heh däm Fommolaa uß, öm e Zwesche_Paßwoot ze krijje.}}",
        "edit-gone-missing": "Kunnt di Sigg nit änndere. Se schingk verschwunde un weed fottjeschemeße woode sin.",
        "edit-conflict": "Dubbelt beärbeit.",
        "edit-no-change": "Do häs ja nix aan dä Sigg jeändert, do dom_mer och nix domet.",
+       "postedit-confirmation-created": "Di Sigg es aanjelaat.",
+       "postedit-confirmation-restored": "Der ahle Zohschtand es widder zeröck jehollt.",
        "postedit-confirmation-saved": "Ding Änderunge sin nit faßjehallde.",
        "edit-already-exists": "Kunnt kei neu Sigg aanlääje. Di Sigg jidd_et ald.",
        "defaultmessagetext": "Dä standaadmäßije Tex",
        "revdelete-no-file": "De aanjejovve Dattei jidd_et nit.",
        "revdelete-show-file-confirm": "Beß De sescher, dat De de fottjeschmeße Version vun dä Dattei „<nowiki>$1</nowiki>“ vum $2 oö $3 Uhr aanloore wells?",
        "revdelete-show-file-submit": "Lohß Jonn!",
+       "revdelete-selected-text": "Di ußjesöhk Väsjohn{{PLURAL:$1||e|}} vun [[:$2]]:",
+       "revdelete-selected-file": "Di ußjesöhk Väsjohn{{PLURAL:$1||e|}} vun dä Dattei [[:$2]]:",
        "logdelete-selected": "{{PLURAL:$1|Dä ußjewählte Logboch-Endrach|De Ußjewählte Logboch-Endrähsch}}:",
+       "revdelete-text-text": "Fottjeschmeße Väsjohne blieve en dä Leß met de vörrije Väsjohne, ävver zom Deil kann de Öffentleschkeit nit mieh drop zohjriehfe.",
+       "revdelete-text-file": "Fottjeschmeße Väsjohne vun Datteije blieve en dä Leß met de vörrije Väsjohne, ävver zom Deil kann de Öffentleschkeit nit mieh drop zohjriehfe.",
+       "logdelete-text": "Fottjeschmeße Endrääsch en de Logbööscher blieve en dä Leß met de vörrije Väsjohne, ävver zom Deil kann de Öffentleschkeit nit mieh drop zohjriehfe.",
+       "revdelete-text-others": "De Wiki_Kööbeße künne emmer noch drop zohjriefe un künne och wider för alle seeschbaa maache, wat jäz verschtoche es, esu lang kein äxtra Beschränkonge jemaat woodte.",
        "revdelete-confirm": "Bes esu joot un doon dat beschtääteje, un donn domet ongerschriive, dat De dat donn wells, dat De weiß, wat dobei eruß kütt, un dat De dat och noh de [[{{MediaWiki:Policy-url}}|Rääjelle]] deihß.",
        "revdelete-suppress-text": "Dat sullt '''blooß''' jedonn wäde för:\n* onjesäzlesche Aanjaabe\n* unjenehmesch persöhnlesch Daate\n*: ''Aanschreffte, Tellefoon- un ander Nummere, <span lang=\"en\" xml:lang=\"en\">e-mail</span> Adräß, uew.''",
        "revdelete-legend": "Dä öffentlije Zojang enschränke",
        "search-file-match": "(en dä Dattei dren)",
        "search-suggest": "Häß De „$1“ jemeint?",
        "search-interwiki-caption": "Schwesterprojekte",
-       "search-interwiki-default": "$1 hät heh di Träffer jefonge:",
+       "search-interwiki-default": "Op $1 woodte heh di Träffer jefonge:",
        "search-interwiki-more": "(mieh)",
        "search-relatedarticle": "Ähnlesch",
        "searcheverything-enable": "En alle Appachtemangs söhke",
        "prefs-emailconfirm-label": "Beshtätejung övver <i lang=\"en\">e-mail</i>:",
        "youremail": "E-Mail *",
        "username": "{{GENDER:$1|Metmaacher|Metmaacherėnne|Metmaacher|Metmaacherėnne|Metmaacher}} Name:",
-       "uid": "{{GENDER:$1|Metmaacher|Metmaacherėnne|Metmaacher|Metmaacherėnne|Metmaacher}} Nommer:",
        "prefs-memberingroups": "{{GENDER:$2|Bes}} en {{PLURAL:$1|de Metmaacherjrupp:|$1 Metmaacherjruppe:|keijn Metmaacherjruppe.}}",
        "prefs-registration": "Aanjemeldt zick",
        "prefs-registration-date-time": "dem $2 öm $3 Uhr",
        "right-move": "Sigge ömnenne",
        "right-move-subpages": "Sigge, un ier Ungersigge, zosamme ömnenne",
        "right-move-rootuserpages": "(Houp)-Metmaacher-Sigg Ömnänne",
+       "right-move-categorypages": "Sigge vun Saachjroppe ömbenänne",
        "right-movefile": "Dateie ömnenne",
        "right-suppressredirect": "Kein automatesche Ömleidong aanlääje beim Ömnenne",
        "right-upload": "Dateie huhlade",
        "action-createpage": "di Sigg aanzeläje",
        "action-createtalk": "Klaafsigge aanzeläje",
        "action-createaccount": "hee dä neue Metmaacher aanzemelde",
+       "action-history": "de Leß met de fröhjere Väsohne vun heh dä Sigg ze belohre",
        "action-minoredit": "hee di Änderung als klein „mini“ ze makkeere",
        "action-move": "di Sigg ömzebenänne",
        "action-move-subpages": "hee di Sigg un ier Ongersigge ömzebenänne",
        "action-move-rootuserpages": "enem Metmaacher sing (Houp)-Metmaacher-Sigg ömzenänne",
+       "action-move-categorypages": "Sigge vun Saachjroppe ömzebenänne",
        "action-movefile": "Die Datei ömnenne",
        "action-upload": "hee di Datei huhzelade",
        "action-reupload": "hee di Datei, di et ald jitt, ußzetuusche",
        "unwatchedpages": "Sigge, wo keiner drop oppass",
        "listredirects": "Ömleitunge",
        "listduplicatedfiles": "Leß met dubbelte Datteije",
+       "listduplicatedfiles-entry": "Zoh dä Dattei [[:File:$1|$1]] ham_mer [[$3|{{PLURAL:$2|a Dubbel|$2 Dubbelte|kein Dubbelte}}]] jefonge.",
        "unusedtemplates": "Schablone oder Baustein, die nit jebruch wääde",
        "unusedtemplatestext": "Hee sin all de Schablone opjeliss, die em Appachtemeng „{{ns:template}}“ sin, die nit en\nander Sigge enjefüg wääde. Ih De jet dovun fottschmieß, denk dran, se künnte och op en ander Aat jebruch\nwääde, un luur Der der iehr ander Links aan!",
        "unusedtemplateswlh": "ander Links",
        "pageswithprop-submit": "Lohß Jonn!",
        "doubleredirects": "Ömleitunge op Ömleitunge",
        "doubleredirectstext": "Hee fings De en jede Reih ene Link op de iertste un de zweite Ömleitung, donoh ene Link op de Sigg, wo de\nzweite Ömleitung hin jeiht. För jewöhnlich es dat dann och de richtije Sigg, wo de iertste Ömleitung ald hen jonn sullt.\n<del>Ußjeshtreshe</del> Reije sin ald äleedesh.\nMet däm „(Ändere)“-Link kanns De de eetste Sigg tirek aanpacke.\nTipp: Merk Der dä Tittel vun dä Sigg dovör.",
-       "double-redirect-fixed-move": "dubbel Ömleidong nohm Ömnenne automattesch opjelös: [[$1]] → [[$2]]",
+       "double-redirect-fixed-move": "Di Sigg [[$1]] es ömjenannt un längk jäz autmattesch öm op di Sigg [[$2]].",
        "double-redirect-fixed-maintenance": "De dubbelte Ömleidong vun [[$1]] noh [[$2]] wood opjelühß.",
        "double-redirect-fixer": "(Opjaveleß)",
        "brokenredirects": "Ömleitunge, die en et Leere jonn",
        "deadendpagestext": "De Atikele hee han kein Links op ander Atikele em Wiki.",
        "protectedpages": "Jeschötzte Sigge",
        "protectedpages-indef": "Nor de Sigge zeije, woh alleins de Wiki-Köbesse draan dörrve",
-       "protectedpages-summary": "He sin Sigge opjeliss, wo jäje Veränderunge un/odde jäje et Ömnenne jeschötz sin, su dat nit einfach Jede jet draan don kann.",
+       "protectedpages-summary": "He sin Sigge opjeließ, wo jäje et Verändere udder jäje et Ömnänne jeschötz sin.\nEn Leß met dä Sigge, di mer nit aanlääje darref, es op dä Sigg [[{{#special:ProtectedTitles}}|{{int:protectedtitles}}]] ze fenge.",
        "protectedpages-cascade": "Nur Sigge en ener Schotz-Kaskad",
        "protectedpages-noredirect": "Ömleidonge verschteische",
        "protectedpagesempty": "Op di Aat sin jrad kein Sigge jeschötz.",
        "protectedpages-unknown-timestamp": "Onbikannt",
        "protectedpages-unknown-performer": "Onbikannte Metmaacher",
        "protectedtitles": "Verbodde Titele för Sigge",
-       "protectedtitles-summary": "Hee sin verbodde Sigge-Tittele opjelis, unger dä Name ka'mer kein neu Sigge aanläje.",
+       "protectedtitles-summary": "Hee sin verbodde Sigge-Tittele opjeleß. Onger dä Name ka_mer kein neu Sigge aanläje.\nEn Leß met dä Sigge, di jäje et Verändere udder jäje et Ömnenne jeschötz sin, fengk mer op dä Sigg [[{{#special:ProtectedPages}}|{{int:protectedpages}}]].",
        "protectedtitlesempty": "Op di Aat sin jrad kein Sigge jäje et neu Aanlääje jeschötz.",
        "listusers": "De Metmaacherleß",
        "listusers-editsonly": "Donn nor Metmaacher zeije, di och ens jät jeschrevve han.",
        "log-title-wildcard": "Sök noh Titelle, di aanfange met …",
        "showhideselectedlogentries": "Ußjesöhk Endrääsch verschteische udder zeije",
        "allpages": "All Sigge",
-       "alphaindexline": "$1 … $2",
        "nextpage": "De nächste Sigg: „$1“",
        "prevpage": "Vörijje Sigg ($1)",
        "allpagesfrom": "Sigge aanzeije av däm Name:",
        "listgrouprights-removegroup-self": "Kann sesch sällver {{PLURAL:$2|eruß nämme uß dä Metmaacherjropp:|uß $2 Metmaacherjroppe eruß nämme:|uß kei Metmaacherjropp eruß nämme.}} $1",
        "listgrouprights-addgroup-self-all": "Kann sesch sällver en alle Metmaacherjroppe erenn donn",
        "listgrouprights-removegroup-self-all": "Kann sesch sällver uß alle Metmaacherjroppe eruß nämme",
+       "trackingcategories-name": "Dä Nohreesch udder däm Täxschtöck singe Nahme",
        "mailnologin": "Keij E-Mail Adress",
        "mailnologintext": "Do mööts ald aanjemeldt un [[Special:UserLogin|enjelogg]] sin, un en jode E-Mail\nAdress en Dinge [[Special:Preferences|ming Enstellunge]] stonn han, öm en E-Mail aan andere Metmaacher ze\nschecke.",
        "emailuser": "E-mail aan dä Metmaacher",
        "newimages-summary": "Heh die Sigg zeig die zoletz huhjeladene Belder un Dateie aan.",
        "newimages-legend": "Ußwähle",
        "newimages-label": "Dä Dattei ier Name udder e Stöck dofun:",
-       "showhidebots": "(Bots $1)",
        "noimages": "Kein Dateie jefunge.",
        "ilsubmit": "Söhk",
        "bydate": "nohm Datum",
index 881b9ed..b9b62ad 100644 (file)
        "imagelisttext": "Jêr lîsteyek ji $1 file'an heye, duxrekirin $2.",
        "newimages-summary": "Ev rûpela taybet dosyeyên ku herî dawî hatine barkirin, nîşan dide.",
        "newimages-legend": "Parzûn",
-       "showhidebots": "(Bot'an $1)",
        "noimages": "Ne tiştek tê dîtin.",
        "ilsubmit": "Lêgerîn",
        "bydate": "li gor dîrokê",
index ffc925f..c48b946 100644 (file)
        "newimages-summary": "Haec pagina specialis monstrat fasciculos impositos ultimos.",
        "newimages-legend": "Filtrum",
        "newimages-label": "Nomen fasciculi (vel pars eius):",
-       "showhidebots": "($1 automata)",
        "noimages": "Nullum videndum.",
        "ilsubmit": "Quaerere",
        "bydate": "ex die",
index 9210407..92f541d 100644 (file)
        "prefs-emailconfirm-label": "E-Mail Confirmatioun:",
        "youremail": "E-Mail-Adress:",
        "username": "{{GENDER:$1|Benotzernumm}}:",
-       "uid": "{{GENDER:$1|Benotzer}} ID:",
        "prefs-memberingroups": "{{GENDER:$2|Member}} vun {{PLURAL:$1|der Benotzergrupp|de Benotzergruppen}}:",
        "prefs-registration": "Zäitpunkt vum Opmaache vum Benotzerkont:",
        "yourrealname": "Richtegen Numm:",
        "recentchanges-summary": "Op dëser Säit kënnt Dir déi rezent Ännerungen op dëser Wiki gesinn.",
        "recentchanges-noresult": "Keng Ännerunge während der Period déi ugi gouf passen op de Critère.",
        "recentchanges-feed-description": "Verfollegt mat dësem Feed déi rezent Ännerungen op {{SITENAME}}.",
-       "recentchanges-label-newpage": "Dës Ännerung huet eng nei Säit ugeluecht",
+       "recentchanges-label-newpage": "Mat dëser Ännerung gouf eng nei Säit ugeluecht",
        "recentchanges-label-minor": "Dëst ass eng kleng Ännerung",
        "recentchanges-label-bot": "Dës Ännerung gouf vun engem Bot gemaacht",
        "recentchanges-label-unpatrolled": "Dës Ännerung gouf nach net nogekuckt",
        "log-title-wildcard": "Titel fänkt mat dësem Text un",
        "showhideselectedlogentries": "Déi erausgesichte Entréeën am Logbuch weisen/verstoppen",
        "allpages": "All Säiten",
-       "alphaindexline": "$1 bis $2",
        "nextpage": "Nächst Säit ($1)",
        "prevpage": "Säit viru(n) ($1)",
        "allpagesfrom": "Säite weisen, ugefaange mat:",
        "newimages-summary": "Dës Spezialsäit weist eng Lëscht mat de Fichieren déi als lescht eropgeluede goufen.",
        "newimages-legend": "Filter",
        "newimages-label": "Numm vum Fichier (oder en Deel dovun):",
-       "showhidebots": "($1 Botten)",
        "noimages": "Keng Biller fonnt.",
        "ilsubmit": "Sichen",
        "bydate": "no Datum",
        "watchlistedit-raw-done": "Är Iwwerwaachungslëscht gouf aktualiséiert.",
        "watchlistedit-raw-added": "{{PLURAL:$1|1 Säit gouf|$1 Säite goufen}} derbäigesat:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|1 Säit gouf|$1 Säite goufen}} erausgeholl:",
+       "watchlistedit-clear-legend": "Iwwerwaachungslëscht eidelmaachen",
+       "watchlistedit-clear-explain": "All D'Säite gi vun Ärer Iwwerwaachungslëscht erofgeholl",
+       "watchlistedit-clear-titles": "Säiten:",
+       "watchlistedit-clear-done": "Är Iwwerwaachungslëscht gouf eidel gemaach.",
+       "watchlistedit-clear-removed": "{{PLURAL:$1|1 Säit gouf|$1 Säite goufen}} erausgeholl:",
+       "watchlistedit-too-many": "Et sinn ze vill Säite fir se hei ze weisen.",
+       "watchlisttools-clear": "D'Iwwerwaachungslëscht eidelmaachen",
        "watchlisttools-view": "Iwwerwaachungslëscht: Ännerungen",
        "watchlisttools-edit": "Iwwerwaachungslëscht weisen an änneren",
        "watchlisttools-raw": "Net-formatéiert Iwwerwaachungslëscht änneren",
index d88dd13..365b76f 100644 (file)
        "watchthis": "И ччин гуьзетун",
        "savearticle": "Ччин хуьн",
        "preview": "Сифтедин килигун",
-       "showpreview": "СиÑ\84Ñ\82един ÐºÐ¸Ð»Ð¸Ð³Ñ\83н ÐºÑ\8aалÑ\83Ñ\80ун",
+       "showpreview": "Ð\92иликамаз ÐºÐ¸Ð»Ð¸Ð³ун",
        "showdiff": "МасакIавилер къалурун",
        "anoneditwarning": "'''Дикъет:''' Куьне системадиз жув вуж ятIа лагьанвач. Куь IP-адрес и ччинин масакIавилерин тарихдиз  кхьида.",
        "summary-preview": "Сифте килигун паталди:",
        "prefs-files": "Шикил",
        "youremail": "Электрон почта:",
        "username": "Уртахдин тӀвар",
-       "uid": "Уртах тайин ийидайди:",
        "yourrealname": "Xалис тIвар:",
        "yourlanguage": "ЧIалар",
        "yournick": "ЦӀийи къул:",
        "booksources-go": "Фин",
        "log": "Журналар",
        "allpages": "Вири ччинар",
-       "alphaindexline": "$1-кай $2 -ди",
        "prevpage": "Алатай чар ($1)",
        "allpagesfrom": "Къалур хъувун,идалай гатIунай:",
        "allpagesto": "Акъудан чарар, куьтягь жезвай:",
index 7c5dae3..743e9cf 100644 (file)
        "newimages-summary": "Op dees speciaal pazjena waere de meis recènt toegevoogde bestenj weergegaeve.",
        "newimages-legend": "Bestandjsnaam",
        "newimages-label": "Bestandjsnaam (of deel daarvan):",
-       "showhidebots": "($1 Bots)",
        "noimages": "Niks te zeen.",
        "ilsubmit": "Zeuk",
        "bydate": "op datum",
index 138d47e..8d9bae3 100644 (file)
        "newimages-summary": "Šis specialus puslapis rodo paskiausiai įkeltus failus.",
        "newimages-legend": "Filtras",
        "newimages-label": "Failo vardas (ar jo dalis):",
-       "showhidebots": "($1 robotus)",
        "noimages": "Nėra ką parodyti.",
        "ilsubmit": "Ieškoti",
        "bydate": "pagal datą",
index 51e7667..781b149 100644 (file)
        "newimages-summary": "Šeit var apskatīties pēdējos šeit augšuplādētos failus.",
        "newimages-legend": "Filtrs",
        "newimages-label": "Faila nosaukums (vai tā daļa):",
-       "showhidebots": "($1 botus)",
        "noimages": "Nav nekā ko redzēt.",
        "ilsubmit": "Meklēt",
        "bydate": "<b>pēc datuma</b>",
index 73e8cb9..cab767d 100644 (file)
        "newimages-summary": "此奇頁示最後呈上之檔也。",
        "newimages-legend": "濾",
        "newimages-label": "名(或其部):",
-       "showhidebots": "($1僕)",
        "noimages": "無可見。",
        "ilsubmit": "尋檔",
        "bydate": "時序",
index 4f661fb..2baf3b1 100644 (file)
        "newimages-summary": "ऐ विशेष पन्नामे उपारोपित संचिका सभ देखाएल गेल अछि।",
        "newimages-legend": "चलनी",
        "newimages-label": "संचिका नाम (वा ओकर अंश):",
-       "showhidebots": "($1 स्वचालक सभ)",
        "noimages": "किछु देखबा योग्य नै |",
        "ilsubmit": "ताकू",
        "bydate": "तारीख सं",
index 022a709..5bc4044 100644 (file)
        "newimages-summary": "Тя башка тевонь лопась няфнесыне мекольце тонкф файлхт.",
        "newimages-legend": "Педяма",
        "newimages-label": "Файллем (эли сонь пакшец):",
-       "showhidebots": "($1 робот програпт)",
        "noimages": "Мезеге аш.",
        "ilsubmit": "Вешендемс",
        "bydate": "ши коряс",
index d8c9ed8..bc2ad0f 100644 (file)
        "imagelisttext": "{{PLURAL:}}Eto ambany ny lisitran'ny rakitra $1 milahatra araka ny $2.",
        "newimages-legend": "Anaran-drakitra",
        "newimages-label": "Anaran-drakitra (na singan'izy io) :",
-       "showhidebots": "(rôbô $1)",
        "noimages": "Tsy misy sary ato.",
        "ilsubmit": "Karohy",
        "bydate": "araka ny daty",
index e991760..bcffc2a 100644 (file)
        "recreate-moveddeleted-warn": "'''Йолташ, тиде лаштыкым тиддеч ончыч шӧреныт.''' Тудым илаҥдарыме деч ончыч, тыгай лаштык кӱлешак мо - тергыман. Ӱлнырак шӧрымаш да лӱм вашталтымаш журнал-влакым шергал лекташ лиеш.",
        "moveddeleted-notice": "Тиде лаштык шӧралтын.\nЛаштыклан шӧрымӧ да кусарыме нерген журнал ӱлнӧ ончыктымо.",
        "viewpagelogs": "Тиде лаштыклан журнал-влакым ончыкташ",
-       "currentrev": "Кызытсе тӱрлык",
+       "currentrev": "Кызытсе версий",
        "currentrev-asof": "$1 кечын кызытсе тӱрлык",
        "revisionasof": "$1 тӱрлык",
        "revision-info": "$1; $2 деч версий",
        "revdelete-reasonotherlist": "Вес амал",
        "mergehistory-reason": "Амал:",
        "revertmerge": "Ойыраш",
-       "history-title": "$1лан тӱрлык эртымгорно",
+       "history-title": "$1 — вашталтылме эртымгорно",
        "lineno": "$1 корно:",
        "compareselectedversions": "Ойырымо версий-влакым таҥастараш",
        "editundo": "чараш",
        "prefs-emailconfirm-label": "Электрон почто пеҥгыдемдыме:",
        "youremail": "Электрон почто:",
        "username": "{{GENDER:$1|Пайдаланышын лӱмжӧ|Пайдаланышын лӱмжӧ}}:",
-       "uid": "{{GENDER:$1|Пайдаланышын}} ID-же:",
        "prefs-memberingroups": "{{PLURAL:$1|1=Тӱшкаште шогышо|Тӱшка-влакыште шогышо}}:",
        "yourrealname": "Чын лӱмжӧ:",
        "yourlanguage": "Йылме:",
        "linkstoimage": "Тиде {{PLURAL:$1|1=$1 лаштык саде файл дене кылдалтын|$1 лаштык-влак саде файл дене кылдалтыныт}}:",
        "nolinkstoimage": "Тиде файл дене кылдалтше ик лаштыкат уке.",
        "sharedupload": "Тиде файлын верже: $1, туге гынат, тудым моло веренат кучылташ лиеш.",
-       "uploadnewversion-linktext": "Тиде файлын у тӱрлыкшым пурташ",
+       "uploadnewversion-linktext": "Тиде файлын у версийжым пурташ",
        "filedelete-comment": "Амал:",
        "filedelete-submit": "Шӧраш",
        "filedelete-otherreason": "Вес/ешартыш амал:",
        "specialloguserlabel": "Пайдаланыше:",
        "log": "Журнал-влак",
        "allpages": "Чыла лаштык-влак",
-       "alphaindexline": "$1 $2 марте",
        "prevpage": "Ончычсо лаштык ($1)",
        "allpagesfrom": "Лукташ тыгай лӱман лаштык-влакым, кудыжо тӱҥалыт:",
        "allpagesto": "кудыжо пытат:",
        "svg-long-desc": "SVG файл, шкенжын кугытшо: $1 × $2 пиксел, файлын кугытшо: $3",
        "show-big-image": "Шкенжын чаплыкше",
        "newimages-legend": "Фильтр",
-       "showhidebots": "(Бот-влакым $1 )",
        "ilsubmit": "Кычал",
        "bad_image_list": "Формат тыгай лийшаш:\n\nЛӱмерын ужашыже-влак гына шотыш налалташ тӱналалтыт (* дене туҥалше корно-влак).\nКорнышто икымше кылвер шӱкшӧ файлыш кылвер семын лийшаш.\nТиде корнышто вара лийше кылвер-влак лийын кертдыме семын ончалтыт: файлыш кылверан лаштык-влак.",
        "metadata": "Метаданный-влак",
index 2b34f50..c0b054c 100644 (file)
        "previewnote": "'''Имајте предвид дека ова е само преглед.'''\nПромените сè уште не се зачувани!",
        "continue-editing": "Оди на полето за уредување",
        "previewconflict": "Овој преглед прикажува како ќе изгледа текстот внесен во горниот дел откако ќе се зачува страницата.",
-       "session_fail_preview": "'''Жалиме! Не можевме да го обработиме вашето уредување поради загуба на сесиски податоци.'''\nОбидете се повторно.\nАко сè уште не функционира, обидете се да се [[Special:UserLogout|одјавите]] и повторно да се најавите.",
-       "session_fail_preview_html": "'''Ð\96алиме, Ð½Ð¾ Ð\92аÑ\88еÑ\82о Ñ\83Ñ\80едÑ\83ваÑ\9aе Ð½Ðµ Ð¼Ð¾Ð¶ÐµÑ\88е Ð´Ð° Ñ\81е Ð¾Ð±Ñ\80абоÑ\82и Ð¿Ð¾Ñ\80ади Ð³Ñ\83беÑ\9aе Ð½Ð° Ñ\81еÑ\81иÑ\81киÑ\82е Ð¿Ð¾Ð´Ð°Ñ\82оÑ\86и.'''\n\n''{{SITENAME}} има овозможено чист HTML, па прегледот е скриен како мерка за заштита од JavaScript-напади.''\n\n'''Ако ова е разумен обид за уредување, тогаш обидете се повторно.'''\nАко и ова не го реши проблемот, обидете се со [[Special:UserLogout|одјавување]] и повторно најавување.",
+       "session_fail_preview": "'''Жалиме! Не можевме да го обработиме вашето уредување поради загуба на податоци од седницата.'''\nОбидете се повторно.\nАко сè уште не функционира, обидете се да се [[Special:UserLogout|одјавите]] и повторно да се најавите.",
+       "session_fail_preview_html": "'''Ð\96алиме, Ð½Ð¾ Ð\92аÑ\88еÑ\82о Ñ\83Ñ\80едÑ\83ваÑ\9aе Ð½Ðµ Ð¼Ð¾Ð¶ÐµÑ\88е Ð´Ð° Ñ\81е Ð¾Ð±Ñ\80абоÑ\82и Ð¿Ð¾Ñ\80ади Ð·Ð°Ð³Ñ\83ва Ð½Ð° Ð¿Ð¾Ð´Ð°Ñ\82оÑ\86иÑ\82е Ð¾Ð´ Ñ\81едниÑ\86аÑ\82а.'''\n\n''{{SITENAME}} има овозможено чист HTML, па прегледот е скриен како мерка за заштита од JavaScript-напади.''\n\n'''Ако ова е разумен обид за уредување, тогаш обидете се повторно.'''\nАко и ова не го реши проблемот, обидете се со [[Special:UserLogout|одјавување]] и повторно најавување.",
        "token_suffix_mismatch": "'''Вашето уредување е одбиено затоа што вашиот пребарувач направил проблеми со интерпукциските знаци во шифрата на уредувањето.\nУредувањето не е прифатено за да се спречи несакана промена на текстот на страницата.\nОва понекогаш се случува кога користите неисправна мрежна анонимна застапничка (proxy) служба.'''",
        "edit_form_incomplete": "'''Некои делови од образецот за уредување не стасаа до опслужувачот. Внимателно проверете дали уреденото не е пореметено и обидете се поввторно.'''",
        "editing": "Уредување на $1",
        "parser-template-recursion-depth-warning": "Пречекорена е границата на длабочината на рекурзијата во шаблонот ($1)",
        "language-converter-depth-warning": "Пречекорена е границата на длабочината на јазичниот претворач ($1)",
        "node-count-exceeded-category": "Страници каде е надминат бројот на јазли",
+       "node-count-exceeded-category-desc": "Категорија за страници каде е надминат бројот на јазли.",
        "node-count-exceeded-warning": "Страницата го надмина бројот на јазли",
        "expansion-depth-exceeded-category": "Страници каде е пречекорена длабочината на проширувањето",
+       "expansion-depth-exceeded-category-desc": "Ова е категорија наменета за страници со надмината длабочина на проширување.",
        "expansion-depth-exceeded-warning": "Страницата ја надмина длабочината на проширувањето",
        "parser-unstrip-loop-warning": "Утврдена е јамка",
        "parser-unstrip-recursion-limit": "Пречекорена е границата на рекурзија ($1)",
        "prefs-emailconfirm-label": "Потврда на е-пошта:",
        "youremail": "Е-пошта:",
        "username": "{{GENDER:$1|Корисничко име}}:",
-       "uid": "{{GENDER:$1|Кориснички бр.}}:",
        "prefs-memberingroups": "{{GENDER:$2|Член}} на {{PLURAL:$1|групата|групите}}:",
        "prefs-registration": "Време на регистрација:",
        "yourrealname": "Вистинско име:",
        "right-move": "Преместување страници",
        "right-move-subpages": "Преместување на страници со нивните потстраници",
        "right-move-rootuserpages": "Преместување на основна корисничка страница",
+       "right-move-categorypages": "Преместување на категориски страници",
        "right-movefile": "Преместување на податотеки",
        "right-suppressredirect": "Не прави пренасочување од старото име при преместување на страница",
        "right-upload": "Подигни податотеки",
        "action-move": "преместување на оваа страница",
        "action-move-subpages": "преместување на оваа страница и нејзините потстраници",
        "action-move-rootuserpages": "преместување на основна корисничка страница",
+       "action-move-categorypages": "преместување на категориски страници",
        "action-movefile": "премести ја оваа податотека",
        "action-upload": "подигни ја податотекава",
        "action-reupload": "заменување на оваа постоечка податотека",
        "log-title-wildcard": "Пребарај наслови кои почнуваат со овој текст",
        "showhideselectedlogentries": "Прикажи/скриј одбрани записи",
        "allpages": "Сите страници",
-       "alphaindexline": "од $1 до $2",
        "nextpage": "Следна страница ($1)",
        "prevpage": "Претходна страница ($1)",
        "allpagesfrom": "Прикажи страници кои започнуваат со:",
        "emailccme": "Испрати ми копија на пораката по е-пошта.",
        "emailccsubject": "Копија од вашата порака до $1: $2",
        "emailsent": "Писмото е испратено",
-       "emailsenttext": "Ð\92аÑ\88аÑ\82а Ðµ-поÑ\88Ñ\82а Ðµ Ð¿Ñ\80аÑ\82ена.",
+       "emailsenttext": "Ð\9fиÑ\81моÑ\82о Ðµ Ð¸Ñ\81пÑ\80аÑ\82ено.",
        "emailuserfooter": "Оваа е-порака беше пратена од $1 до $2 со помош на функцијата Е-пошта на {{SITENAME}}.",
        "usermessage-summary": "Оставете системска порака.",
        "usermessage-editor": "Системски гласник",
        "revertpage": "Отстрането уредувањето на [[Special:Contributions/$2|$2]] ([[User talk:$2|разговор]]), вратено на последната верзија на [[User:$1|$1]]",
        "revertpage-nouser": "Вратени уредувања од скриен корисник на последната преработка на {{GENDER:$1|[[User:$1|$1]]}}",
        "rollback-success": "Откажани уредувањата на $1; вратено на последната верзија на $2.",
-       "sessionfailure-title": "Сесијата не успеа",
-       "sessionfailure": "Има проблем со вашата сесија;\nоваа дејство е откажано како превентива против преземање сесии.\nПритиснете го копчето „назад“ и повторно вчитајте ја страницата од која дојдовте и обидете се повторно.",
+       "sessionfailure-title": "Седницата не успеа",
+       "sessionfailure": "Има проблем со вашата седница;\nоваа дејство е откажано како превентива против преземање седници.\nПритиснете го копчето „назад“ и повторно вчитајте ја страницата од која дојдовте и обидете се повторно.",
        "protectlogpage": "Дневник на заштитувања",
        "protectlogtext": "Подолу има список на измените во заштитата на страницата.\nМоментално заштитените страници ќе ги најдете [[Special:ProtectedPages|овој список]].",
        "protectedarticle": "заштитена „[[$1]]“",
        "movepagetalktext": "Соодветната страница за разговор, доколку постои, ќе биде автоматски преместена заедно со неа, освен ако:\n*Веќе постои страница за разговор за новиот наслов, или\n*Долното поле е неозначено.\n\nВо овие случаи, ќе треба рачно да се премести или спои ако има потреба.",
        "movearticle": "Премести страница:",
        "moveuserpage-warning": "'''Предупредување:''' На пат сте да преместите корисничка страница. Имајте предвид дека само страницата ќе биде преместена, а самиот корисник ''нема'' да биде преименуван.",
+       "movecategorypage-warning": "<strong>Предупредување:</strong> Преместувате категориска страница. Имајте предвид дека ќе се премести само страницата, а страниците во старата категорија <em>нема</em> да се прекатегоризираат во новата.",
        "movenologintext": "Мора да бидете регистриран корисник и да сте [[Special:UserLogin|најавени]] за да можете да преместувате страници.",
        "movenotallowed": "Немате доволно привилегии за преместување на страници.",
        "movenotallowedfile": "Немате дозвола за преместување податотеки.",
        "cant-move-user-page": "Немате дозвола за преместување на основни кориснички страници (освен потстраници).",
        "cant-move-to-user-page": "Немате дозвола за преместување на страница во ваша корисничка страница (освен во корисничка потстраница)",
+       "cant-move-category-page": "Немате дозвола да преместувате категориски страници.",
+       "cant-move-to-category-page": "Немате дозвола да преместувате страници во категориски страници.",
        "newtitle": "Кон новиот наслов:",
        "move-watch": "Набљудувај ја страницава",
        "movepagebtn": "Премести страница",
        "import-nonewrevisions": "Не увезов ниедна преработка (сите се веќе присутни или изоставени поради грешки)",
        "xml-error-string": "$1 во ред $2, колона $3 (бајт $4): $5",
        "import-upload": "Подигни XML податоци",
-       "import-token-mismatch": "Ð\93Ñ\83беÑ\9aе Ð½Ð° Ñ\81еÑ\81иÑ\81киÑ\82е Ð¿Ð¾Ð´Ð°Ñ\82оÑ\86и. Обидете се повторно.",
+       "import-token-mismatch": "Ð\97агÑ\83бени Ð½Ð° Ð¿Ð¾Ð´Ð°Ñ\82оÑ\86иÑ\82е Ð¾Ð´ Ñ\81едниÑ\86аÑ\82а. Обидете се повторно.",
        "import-invalid-interwiki": "Не можам да увезам од наведеното вики.",
        "import-error-edit": "Страницата „$1“ не е увезена бидејќи не ви е дозволено да ја уредувате.",
        "import-error-create": "Страницата „$1“ не е увезена бидејќи не ви е дозволено да ја создадете.",
        "newimages-summary": "Оваа специјална страница ги покажува скоро подигнатите податотеки.",
        "newimages-legend": "Филтрирај",
        "newimages-label": "Име на податотека (или дел од името):",
-       "showhidebots": "($1 ботови)",
+       "newimages-showbots": "Прикажувај подигања од ботови",
        "noimages": "Нема ништо.",
        "ilsubmit": "Барај",
        "bydate": "по датум",
        "exif-subsectime": "Дел од секундата во кој е сликано",
        "exif-subsectimeoriginal": "Дел од секундата во кој е фотографирано",
        "exif-subsectimedigitized": "Дел од секундата во кој е дигитализирано",
-       "exif-exposuretime": "Ð\95кÑ\81позиÑ\86иÑ\98а",
+       "exif-exposuretime": "Ð\92Ñ\80еме Ð½Ð° Ð¸Ð·Ð»Ð¾Ð¶ÐµÐ½Ð¾Ñ\81Ñ\82",
        "exif-exposuretime-format": "$1 сек ($2)",
        "exif-fnumber": "F-бр.",
        "exif-fnumber-format": "f/$1",
-       "exif-exposureprogram": "Режим Ð½Ð° ÐµÐºÑ\81позиÑ\86иÑ\98а",
+       "exif-exposureprogram": "Ð\9fÑ\80огÑ\80ам Ð½Ð° Ð¸Ð·Ð»Ð¾Ð¶Ñ\83ваÑ\9aе",
        "exif-spectralsensitivity": "Спектрална осетливост",
        "exif-isospeedratings": "Светлоосетливост по ISO",
        "exif-shutterspeedvalue": "APEX-брзина на затворачот",
        "exif-aperturevalue": "APEX-oтвор",
        "exif-brightnessvalue": "APEX-светлост",
-       "exif-exposurebiasvalue": "Ð\9dадомеÑ\81Ñ\82ок Ð½Ð° ÐµÐºÑ\81позиÑ\86иÑ\98аÑ\82а",
+       "exif-exposurebiasvalue": "Ð\9dадомеÑ\81Ñ\82ок Ð½Ð° Ð¸Ð·Ð»Ð¾Ð¶Ñ\83ваÑ\9aеÑ\82о",
        "exif-maxaperturevalue": "Макс. отвореност на блендата",
        "exif-subjectdistance": "Оддалеченост до објектот",
        "exif-meteringmode": "Режим на мерачот",
        "exif-focalplaneyresolution": "Разложеност на жаришната рамнина Y",
        "exif-focalplaneresolutionunit": "Единица за разложеност на жаришната рамнина",
        "exif-subjectlocation": "Положба на субјектот",
-       "exif-exposureindex": "Ð\98ндекÑ\81 Ð½Ð° ÐµÐºÑ\81позиÑ\86иÑ\98аÑ\82а",
+       "exif-exposureindex": "Ð\9fоказаÑ\82ел Ð½Ð° Ð¸Ð·Ð»Ð¾Ð¶Ñ\83ваÑ\9aеÑ\82о",
        "exif-sensingmethod": "Метод на сензорот",
        "exif-filesource": "Извор на податотеката",
        "exif-scenetype": "Тип на сцена",
        "exif-customrendered": "Дополнитела обработка на сликата",
-       "exif-exposuremode": "Режим Ð½Ð° ÐµÐºÑ\81позиÑ\86иÑ\98а",
+       "exif-exposuremode": "Режим Ð½Ð° Ð¸Ð·Ð»Ð¾Ð¶Ñ\83ваÑ\9aе",
        "exif-whitebalance": "Рамнотежа на бело",
        "exif-digitalzoomratio": "Сооднос на дигиталното приближување (зум)",
        "exif-focallengthin35mmfilm": "Жаришно растојание кај 35 мм филм",
        "exif-scenetype-1": "Директно фотографирана слика",
        "exif-customrendered-0": "Нормален процес",
        "exif-customrendered-1": "Нестандарден процес",
-       "exif-exposuremode-0": "Ð\90вÑ\82омаÑ\82Ñ\81ка ÐµÐºÑ\81позиÑ\86иÑ\98а",
-       "exif-exposuremode-1": "РаÑ\87на ÐµÐºÑ\81позиÑ\86иÑ\98а",
+       "exif-exposuremode-0": "Ð\90вÑ\82омаÑ\82Ñ\81ко Ð¸Ð·Ð»Ð¾Ð¶Ñ\83ваÑ\9aе",
+       "exif-exposuremode-1": "РаÑ\87но Ð¸Ð·Ð»Ð¾Ð¶Ñ\83ваÑ\9aе",
        "exif-exposuremode-2": "Автоматски со зададен распон",
        "exif-whitebalance-0": "Автоматска рамнотежа на бело",
        "exif-whitebalance-1": "Рачна рамнотежа на бело",
        "watchlistedit-raw-submit": "Поднови го списокот",
        "watchlistedit-raw-done": "Вашиот список на набљудувања е подновен.",
        "watchlistedit-raw-added": "{{PLURAL:$1|1 наслов беше|$1 наслови беа}} додадени:",
-       "watchlistedit-raw-removed": "{{PLURAL:$1|1 наслов беше избришан|$1 наслови беа избришани}}:",
+       "watchlistedit-raw-removed": "{{PLURAL:$1|Избришан е еден наслов|Избришани се $1 наслови}}:",
+       "watchlistedit-clear-title": "Исчистен списокот на набљудувања",
+       "watchlistedit-clear-legend": "Исчисти набљудувани",
+       "watchlistedit-clear-explain": "Сите наслови ќе бидат отстранети од списокот на набљудувања",
+       "watchlistedit-clear-titles": "Наслови:",
+       "watchlistedit-clear-submit": "Исчисти ги набљудуваните (Ова е трајно!)",
+       "watchlistedit-clear-done": "Вашиот список на набљудувања е исчистен.",
+       "watchlistedit-clear-removed": "{{PLURAL:$1|Избришан е еден наслов|Избришани се $1 наслови}}:",
+       "watchlistedit-too-many": "Има премногу страници за да можат тука да се прикажат.",
+       "watchlisttools-clear": "Исчисти ги набљудуваните",
        "watchlisttools-view": "Преглед на релевантни промени",
        "watchlisttools-edit": "Погледај и уреди список на набљудувања",
        "watchlisttools-raw": "Напредно уредување на списокот на набљудувања",
index caa5f3f..8ee8c40 100644 (file)
        "jumptonavigation": "വഴികാട്ടി",
        "jumptosearch": "തിരയൂ",
        "view-pool-error": "ക്ഷമിക്കണം, ഈ നിമിഷം സെർവറുകൾ അമിതഭാരം കൈകാര്യം ചെയ്യുകയാണ്.\nധാരാളം ഉപയോക്താക്കൾ ഈ താൾ കാണുവാൻ ശ്രമിച്ചുകൊണ്ടിരിക്കുകയാണ്.\nഇനിയും താൾ ലഭ്യമാക്കുവാൻ താങ്കൾ ശ്രമിക്കുന്നതിന് മുൻപ് ദയവായി അല്പസമയം കാത്തിരിക്കുക.\n\n$1",
+       "generic-pool-error": "ക്ഷമിക്കണം, ഈ നിമിഷം സെർവറുകൾ അമിതഭാരം കൈകാര്യം ചെയ്യുകയാണ്.\nധാരാളം ഉപയോക്താക്കൾ ഈ സ്രോതസ്സുകൾ കാണുവാൻ ശ്രമിച്ചുകൊണ്ടിരിക്കുകയാണ്.\nഇനിയും ഇത് ലഭ്യമാക്കുവാൻ താങ്കൾ ശ്രമിക്കുന്നതിന് മുൻപ് ദയവായി അല്പസമയം കാത്തിരിക്കുക.",
        "pool-timeout": "പൂട്ട് മാറാനുള്ള കാത്തിരിപ്പ് സമയം",
        "pool-queuefull": "പൂൾ ക്യൂ നിറഞ്ഞിരിക്കുന്നു",
        "pool-errorunknown": "അപരിചിതമായ പിഴവ്",
        "prefs-emailconfirm-label": "ഇമെയിൽ സ്ഥിരീകരണം:",
        "youremail": "ഇമെയിൽ:",
        "username": "{{GENDER:$1|ഉപയോക്തൃനാമം}}:",
-       "uid": "{{GENDER:$1|ഉപയോക്തൃ}} ഐ.ഡി.:",
        "prefs-memberingroups": "{{GENDER:$2|അംഗത്വമുള്ള}} {{PLURAL:$1|സംഘം|സംഘങ്ങൾ}}:",
        "prefs-registration": "അംഗത്വം എടുത്തത്:",
        "yourrealname": "യഥാർത്ഥ പേര്‌:",
        "log-title-wildcard": "ഈ വാക്കിൽ തുടങ്ങുന്ന തിരച്ചിൽ ഫലങ്ങൾ",
        "showhideselectedlogentries": "തിരഞ്ഞെടുത്ത രേഖാ വിവരങ്ങൾ പ്രദർശിപ്പിക്കുക/മറയ്ക്കുക",
        "allpages": "എല്ലാ താളുകളും",
-       "alphaindexline": "$1 മുതൽ $2 വരെ",
        "nextpage": "അടുത്ത താൾ ($1)",
        "prevpage": "മുൻപത്തെ താൾ ($1)",
        "allpagesfrom": "താളുകളുടെ തുടക്കം:",
        "newimages-summary": "ചുരുക്കം",
        "newimages-legend": "അരിപ്പ",
        "newimages-label": "പ്രമാണത്തിന്റെ പേര്‌ (അഥവാ പേരിന്റെ ഭാഗം)",
-       "showhidebots": "(യന്ത്രങ്ങളെ $1)",
        "noimages": "ഒന്നും കാണാനില്ല.",
        "ilsubmit": "തിരയൂ",
        "bydate": "ദിനക്രമത്തിൽ",
index fa0f820..a184e82 100644 (file)
        "newimages-summary": "Энэ тусгай хуудсанд хамгийн сүүлд оруулагдсан файлуудыг үзүүлнэ.",
        "newimages-legend": "Шүүлтүүр",
        "newimages-label": "Файлын нэр (эсвэл түүний нэг хэсэг):",
-       "showhidebots": "(Роботуудыг $1)",
        "noimages": "Харах юмгүй.",
        "ilsubmit": "Хайлт",
        "bydate": "Огноогоор",
index 929fc89..418cbb6 100644 (file)
        "newimages-summary": "हे विशेष पान शेवटी चढविलेल्या संचिका दर्शविते.",
        "newimages-legend": "गाळक",
        "newimages-label": "संचिकानाम (किंवा त्याचा भाग):",
-       "showhidebots": "(सांगकामे $1)",
        "noimages": "बघण्यासारखे येथे काही नाही.",
        "ilsubmit": "शोधा",
        "bydate": "तारखेनुसार",
index 51fd2a3..4eee9bc 100644 (file)
@@ -23,7 +23,7 @@
        },
        "tog-underline": "Garis bawah pautan:",
        "tog-hideminor": "Sembunyikan suntingan kecil dalam laman perubahan terkini",
-       "tog-hidepatrolled": "Sorokkan suntingan yang telah dironda daripada senarai perubahan terkini",
+       "tog-hidepatrolled": "Sorokkan suntingan yang telah dironda daripada laman perubahan terkini",
        "tog-newpageshidepatrolled": "Sorokkan laman yang telah dironda daripada senarai laman baru",
        "tog-extendwatchlist": "Kembangkan senarai pantau untuk memaparkan semua perubahan, bukan hanya yang terkini",
        "tog-usenewrc": "Perubahan kumpulan mengikut laman dalam perubahan terkini dan senarai pantau",
        "permalink": "Pautan kekal",
        "print": "Cetak",
        "view": "Paparkan",
+       "view-foreign": "Lihat di $1",
        "edit": "Sunting",
+       "edit-local": "Sunting huraian tempatan",
        "create": "Cipta",
+       "create-local": "Isikan huraian tempatan",
        "editthispage": "Sunting laman ini",
        "create-this-page": "Cipta laman ini",
        "delete": "Hapuskan",
        "jumptonavigation": "pandu arah",
        "jumptosearch": "cari",
        "view-pool-error": "Maaf, pelayan terlebih bebanan pada masa ini.\nTerlalu ramai pengguna cuba melihat laman ini.\nSila tunggu sebentar sebelum cuba mencapai laman ini lagi.\n\n$1",
+       "generic-pool-error": "Maaf, semua pelayan terlebih bebanan ketika ini.\n\nTerlalu ramai pengguna yang sedang cuba mengakses sumber ini.\n\nSila tunggu sebentar sebelum cuba mengakses sumber ini semula.",
        "pool-timeout": "Menunggu sebentar untuk dikunci",
        "pool-queuefull": "Giliran kolam telah penuh",
        "pool-errorunknown": "Ralat tak diketahui",
        "edit-gone-missing": "Laman tersebut telah dihapuskan dan tidak dapat dikemaskinikan.",
        "edit-conflict": "Percanggahan penyuntingan.",
        "edit-no-change": "Suntingan anda diabaikan kerana tiada perubahan dibuat pada teks tersebut.",
+       "postedit-confirmation-created": "Halaman telah diwujudkan.",
+       "postedit-confirmation-restored": "Halaman telah dipulihkan.",
        "postedit-confirmation-saved": "Suntingan anda telah disimpan.",
        "edit-already-exists": "Tidak dapat mencipta laman baru kerana ia telah wujud.",
        "defaultmessagetext": "Teks mesej asal",
        "expensive-parserfunction-warning": "Amaran: Laman ini mengandungi terlalu banyak panggilan fungsi penghurai yang intensif.\n\nHad panggilan ialah $2, sekarang terdapat $1 panggilan.",
        "expensive-parserfunction-category": "Laman yang mengandungi terlalu banyak panggilan fungsi penghurai yang intensif",
        "post-expand-template-inclusion-warning": "Amaran: Saiz penyertaan templat terlalu besar.\nSesetengah templat tidak akan disertakan.",
-       "post-expand-template-inclusion-category": "Laman-laman yang melebihi had saiz penyertaan templat",
+       "post-expand-template-inclusion-category": "Laman yang melebihi had saiz penyertaan templat",
        "post-expand-template-argument-warning": "Amaran: Laman ini mengandungi sekurang-kurangnya satu argumen templat yang mempunyai saiz pengembangan yang terlalu besar.\nArgumen-argumen ini telah ditinggalkan.",
        "post-expand-template-argument-category": "Laman yang mengandungi templat dengan argumen yang tidak lengkap",
        "parser-template-loop-warning": "Gelung templat dikesan: [[$1]]",
        "mergelog": "Log penggabungan",
        "pagemerge-logentry": "menggabungkan [[$1]] ke dalam [[$2]] (semakan sehingga $3)",
        "revertmerge": "Pisahkan",
-       "mergelogpagetext": "Yang berikut ialah senarai terkini bagi penggabungan sejarah sesebuah laman ke dalam lamana yang lain.",
+       "mergelogpagetext": "Yang berikut ialah senarai terkini bagi penggabungan sejarah sesebuah laman ke dalam laman yang lain.",
        "history-title": "Sejarah semakan bagi \"$1\"",
        "difference-title": "Perbezaan antara semakan-semakan \"$1\"",
        "difference-title-multipage": "Perbezaan antara laman \"$1\" dan \"$2\"",
        "prefs-emailconfirm-label": "Pengesahan e-mel:",
        "youremail": "E-mel:",
        "username": "{{GENDER:$1|Nama pengguna}}:",
-       "uid": "ID {{GENDER:$1|Pengguna}}:",
        "prefs-memberingroups": "{{GENDER:$2|Ahli}} {{PLURAL:$1|kumpulan|kumpulan-kumpulan}}:",
        "prefs-memberingroups-type": "$1",
        "prefs-registration": "Waktu pendaftaran:",
        "action-createpage": "mencipta laman",
        "action-createtalk": "mencipta laman perbincangan",
        "action-createaccount": "mencipta akaun pengguna ini",
+       "action-history": "melihat sejarah halaman ini",
        "action-minoredit": "menanda suntingan ini sebagai suntingan kecil",
        "action-move": "memindahkan laman ini",
        "action-move-subpages": "memindahkan laman ini dan sublaman-sublamannya",
        "recentchanges-label-minor": "Ini ialah suntingan kecil",
        "recentchanges-label-bot": "Suntingan ini dilakukan oleh bot",
        "recentchanges-label-unpatrolled": "Suntingan ini belum dirondai",
-       "recentchanges-label-plusminus": "Saiz halaman telah berubah sebanyak jumlah bait ini",
+       "recentchanges-label-plusminus": "Saiz laman telah berubah sebanyak jumlah bait ini",
        "recentchanges-legend-heading": "'''Petunjuk:'''",
-       "recentchanges-legend-newpage": "(lihat juga [[Special:NewPages|senarai halaman baru]])",
+       "recentchanges-legend-newpage": "(lihat juga [[Special:NewPages|senarai laman baru]])",
        "rcnotefrom": "Yang berikut adalah semua suntingan sejak <b>$2</b> (yang dipaparkan sehingga <b>$1</b>).",
-       "rclistfrom": "Papar perubahan sejak $3 $2",
+       "rclistfrom": "Paparkan perubahan sejak $3 $2",
        "rcshowhideminor": "$1 suntingan kecil",
        "rcshowhideminor-show": "Paparkan",
        "rcshowhideminor-hide": "Sorokkan",
        "unusedtemplateswlh": "pautan-pautan lain",
        "randompage": "Laman rawak",
        "randompage-nopages": "Tiada laman dalam {{PLURAL:$2|ruang|ruang-ruang}} nama berikut: $1.",
-       "randomincategory": "Halaman pilihan rawak dalam kategori",
+       "randomincategory": "Laman rawak dalam kategori",
        "randomincategory-invalidcategory": "\"$1\" bukan nama kategori yang sah.",
        "randomincategory-nopages": "Tiada halaman di [[:Category:$1]].",
        "randomincategory-selectcategory": "Dapatkan halaman pilihan rawak dari kategori: $1 $2.",
        "statistics-users-active": "Pengguna aktif",
        "statistics-users-active-desc": "Pengguna yang aktif sejak {{PLURAL:$1|semalam|$1 hari lalu}}",
        "statistics-mostpopular": "Laman dilihat terbanyak",
-       "pageswithprop": "Halaman dengan sifat halaman",
-       "pageswithprop-legend": "Halaman dengan sifat halaman",
+       "pageswithprop": "Laman dengan sifat laman",
+       "pageswithprop-legend": "Laman dengan sifat laman",
        "pageswithprop-text": "Halaman ini menyenaraikan halaman-halaman yang menggunakan sifat halaman yang tertentu.",
        "pageswithprop-prop": "Nama sifat:",
        "pageswithprop-submit": "Pergi",
        "mostlinkedtemplates": "Templat dipaut terbanyak",
        "mostcategories": "Rencana dengan kategori terbanyak",
        "mostimages": "Imej dipaut terbanyak",
-       "mostinterwikis": "Halaman yang paling banyak pautan antara wiki",
+       "mostinterwikis": "Laman yang paling banyak pautan interwiki",
        "mostrevisions": "Rencana dengan semakan terbanyak",
        "prefixindex": "Indeks awalan",
        "prefixindex-namespace": "Semua laman dengan awalan (ruang nama $1)",
        "log-title-wildcard": "Cari semua tajuk yang bermula dengan teks ini",
        "showhideselectedlogentries": "Tunjukkan/sorokkan entri-entri log yang terpilih",
        "allpages": "Semua laman",
-       "alphaindexline": "$1 hingga $2",
        "nextpage": "Halaman berikutnya ($1)",
        "prevpage": "Halaman sebelumnya ($1)",
        "allpagesfrom": "Tunjukkan laman bermula pada:",
        "cachedspecial-viewing-cached-ts": "Anda sedang melihat versi dalam cache laman ini yang mungkin tidak lengkap sepenuhnya.",
        "cachedspecial-refresh-now": "Lihat yang terkini.",
        "categories": "Kategori",
-       "categoriespagetext": "{{PLURAL:$1|Kategori|Kategori-kategori}} berikut mengandungi laman-laman atau media.\n[[Special:UnusedCategories|Kategori yang tidak digunakan]] tidak dipaparkan di sini.\nLihat juga [[Special:WantedCategories|kategori yang dikehendaki]].",
+       "categoriespagetext": "{{PLURAL:$1|Kategori|Kategori-kategori}} berikut mengandungi laman atau media.\n[[Special:UnusedCategories|Kategori yang tidak digunakan]] tidak dipaparkan di sini.\nLihat juga [[Special:WantedCategories|kategori yang dikehendaki]].",
        "categoriesfrom": "Paparkan kategori bermula daripada:",
        "special-categories-sort-count": "susun mengikut tertib bilangan",
        "special-categories-sort-abc": "susun mengikut tertib abjad",
        "listgrouprights-removegroup-self": "Keluar daripada {{PLURAL:$2|kumpulan|kumpulan-kumpulan}}: $1",
        "listgrouprights-addgroup-self-all": "Menyertai semua kumpulan",
        "listgrouprights-removegroup-self-all": "Keluar daripada semua kumpulan",
+       "listgrouprights-namespaceprotection-header": "Sekatan ruang nama",
+       "listgrouprights-namespaceprotection-namespace": "Ruang nama",
+       "trackingcategories": "Kategori penjejak",
+       "trackingcategories-msg": "Kategori penjejak",
+       "trackingcategories-name": "Nama pesanan",
+       "trackingcategories-nodesc": "Tiada keterangan tersedia.",
        "mailnologin": "Tiada alamat e-mel",
        "mailnologintext": "Anda perlu [[Special:UserLogin|log masuk]]\nterlebih dahulu dan mempunyai alamat e-mel yang sah dalam\n[[Special:Preferences|laman keutamaan]] untuk mengirim e-mel kepada pengguna lain.",
        "emailuser": "Kirim e-mel kepada pengguna ini",
        "unwatchthispage": "Berhenti memantau",
        "notanarticle": "Bukan laman kandungan",
        "notvisiblerev": "Semakan ini telah dihapuskan",
-       "watchlist-details": "$1 laman dipantau (tidak termasuk laman perbincangan).",
+       "watchlist-details": "$1 laman dipantau ,tidak termasuk laman perbincangan.",
        "wlheader-enotif": "Pemberitahuan melalui e-mel dibolehkan.",
        "wlheader-showupdated": "Laman-laman yang telah diubah sejak kunjungan terakhir anda dipaparkan dalam '''teks tebal'''.",
        "wlnote2": "Yang berikut adalah perubahan dalam {{PLURAL:$1|sejam|<strong>$1</strong> jam}} yang lepas, setakat $2, $3.",
        "delete-edit-reasonlist": "Ubah sebab-sebab hapus",
        "delete-toobig": "Laman ini mempunyai sejarah yang besar, iaitu melebihi $1 jumlah semakan. Oleh itu, laman ini dilindungi daripada dihapuskan untuk mengelak kerosakan di {{SITENAME}} yang tidak disengajakan.",
        "delete-warning-toobig": "Laman ini mempunyai sejarah yang besar, iaitu melebihi $1 jumlah semakan. Menghapuskannya boleh mengganggu perjalanan pangkalan data {{SITENAME}}. Sila berhati-hati.",
-       "deleting-backlinks-warning": "'''Amaran:''' Terdapat halaman-halaman lain yang berpaut atau bertransklusi dengan halaman yang hendak anda hapus itu.",
+       "deleting-backlinks-warning": "'''Amaran:''' [[Special:WhatLinksHere/{{FULLPAGENAME}}|Terdapat laman lain]] yang berpaut atau bertransklusi dengan laman yang hendak anda hapus ini.",
        "rollback": "Undurkan suntingan.",
        "rollback_short": "Undur",
        "rollbacklink": "undur",
        "protect-locked-blocked": "Anda telah disekat, justeru tidak boleh menukar peringkat perlindungan.\nIni adalah tetapan semasa bagi laman '''$1''':",
        "protect-locked-dblock": "Anda tidak boleh menukar peringkat perlindungan kerana pangkalan data sedang dikunci.\nIni adalah tetapan semasa bagi laman '''$1''':",
        "protect-locked-access": "Anda tidak mempunyai keizinan untuk menukar peringkat perlindungan.\nIni adalah tetapan semasa bagi laman '''$1''':",
-       "protect-cascadeon": "Laman ini dilindungi kerana ia terkandung dalam {{PLURAL:$1|laman|laman-laman}} berikut, yang dilindungi secara melata. Anda boleh menukar peringkat perlindunan laman ini, akan tetapi ia tidak akan menjejaskan perlindungan melata tersebut.",
+       "protect-cascadeon": "Laman ini dilindungi kerana ia terkandung dalam {{PLURAL:$1|laman|laman-laman}} berikut, yang dilindungi secara melata. Penukaran peringkat perlindungan laman ini tidak akan menjejaskan perlindungan melata tersebut.",
        "protect-default": "Benarkan semua pengguna",
        "protect-fallback": "Benarkan pengguna yang berizin \"$1\" sahaja",
        "protect-level-autoconfirmed": "Benarkan pengguna yang diautosahkan sahaja",
        "contributions-title": "Sumbangan oleh $1",
        "mycontris": "Sumbangan",
        "contribsub2": "Untuk {{GENDER:$3|$1}} ($2)",
+       "contributions-userdoesnotexist": "Akaun pengguna \"$1\" tidak berdaftar.",
        "nocontribs": "Tiada sebarang perubahan yang sepadan dengan kriteria-kriteria ini.",
        "uctop": "(terkini)",
        "month": "Sebelum bulan:",
        "sp-contributions-newbies": "Tunjukkan sumbangan daripada akaun baru sahaja",
        "sp-contributions-newbies-sub": "Bagi akaun-akaun baru",
        "sp-contributions-newbies-title": "Sumbangan oleh pengguna baru",
-       "sp-contributions-blocklog": "Log sekatan",
+       "sp-contributions-blocklog": "log sekatan",
        "sp-contributions-deleted": "sumbangan dihapuskan",
        "sp-contributions-uploads": "muat naik",
        "sp-contributions-logs": "log",
        "sp-contributions-search": "Cari sumbangan",
        "sp-contributions-username": "Alamat IP atau nama pengguna:",
        "sp-contributions-toponly": "Hanya paparkan suntingan yang merupakan semakan terkini",
+       "sp-contributions-newonly": "Hanya paparkan suntingan yang merupakan ciptaan laman",
        "sp-contributions-submit": "Cari",
        "whatlinkshere": "Pautan ke laman ini",
        "whatlinkshere-title": "Laman yang mengandungi pautan ke \"$1\"",
        "pageinfo-hidden-categories": "Kategori tersembunyi ($1)",
        "pageinfo-templates": "Templat tertransklusi ($1)",
        "pageinfo-transclusions": "{{PLURAL:$1|Halaman|Halaman-halaman}} yang tertransklusi pada ($1)",
-       "pageinfo-toolboxlink": "Maklumat halaman",
+       "pageinfo-toolboxlink": "Maklumat laman",
        "pageinfo-redirectsto": "Melencong ke",
        "pageinfo-redirectsto-info": "maklumat",
        "pageinfo-contentpage": "Dikira sebagai halaman kandungan",
        "newimages-summary": "Laman khas ini memaparkan senarai fail muat naik terakhir.",
        "newimages-legend": "Penapis",
        "newimages-label": "Nama fail (atau sebahagian daripadanya):",
-       "showhidebots": "($1 bot)",
        "noimages": "Tiada imej.",
        "ilsubmit": "Cari",
        "bydate": "mengikut tarikh",
        "htmlform-chosen-placeholder": "Pilih satu pilihan",
        "sqlite-has-fts": "$1 dengan sokongan carian teks penuh",
        "sqlite-no-fts": "$1 tanpa sokongan carian teks penuh",
-       "logentry-delete-delete": "$1 telah {{GENDER:$2|menghapuskan}} halaman $3",
-       "logentry-delete-restore": "$1 telah {{GENDER:$2|memulihkan}} halaman $3",
+       "logentry-delete-delete": "$1 telah {{GENDER:$2|menghapuskan}} laman $3",
+       "logentry-delete-restore": "$1 telah {{GENDER:$2|memulihkan}} laman $3",
        "logentry-delete-event": "$1 telah {{GENDER:$2|mengubah}} keterlihatan $5 peristiwa log di $3: $4",
        "logentry-delete-revision": "$1 telah {{GENDER:$2|mengubah}} keterlihatan $5 semakan di halaman $3: $4",
        "logentry-delete-event-legacy": "$1 telah {{GENDER:$2|mengubah}} keterlihatan peristiwa log di $3",
        "revdelete-uname-unhid": "nama pengguna terdedah",
        "revdelete-restricted": "mengenakan sekatan pada penyelia",
        "revdelete-unrestricted": "menarik sekatan daripada penyelia",
-       "logentry-move-move": "$1 telah {{GENDER:$2|memindahkan}} halaman $3 ke $4",
-       "logentry-move-move-noredirect": "$1 telah {{GENDER:$2|memindahkan}} halaman $3 ke $4 tanpa meninggalkan lencongan",
-       "logentry-move-move_redir": "$1 telah {{GENDER:$2|memindahkan}} halaman $3 ke $4 melalui lencongan",
-       "logentry-move-move_redir-noredirect": "$1 telah {{GENDER:$2|memindahkan}} halaman $3 ke $4 melalui lencongan tanpa meninggalkan lencongan",
+       "logentry-move-move": "$1 telah {{GENDER:$2|memindahkan}} laman $3 ke $4",
+       "logentry-move-move-noredirect": "$1 telah {{GENDER:$2|memindahkan}} laman $3 ke $4 tanpa meninggalkan lencongan",
+       "logentry-move-move_redir": "$1 telah {{GENDER:$2|memindahkan}} laman $3 ke $4 melalui lencongan",
+       "logentry-move-move_redir-noredirect": "$1 telah {{GENDER:$2|memindahkan}} laman $3 ke $4 melalui lencongan tanpa meninggalkan lencongan",
        "logentry-patrol-patrol": "$1 telah {{GENDER:$2|menanda}} semakan $4 di halaman $3 sebagai dironda",
        "logentry-patrol-patrol-auto": "$1 telah {{GENDER:$2|menanda}} semakan $4 di halaman $3 sebagai dironda secara automatik",
        "logentry-newusers-newusers": "Akaun pengguna $1 telah {{GENDER:$2|dibuka}}",
index 2720a32..768c85d 100644 (file)
@@ -7,7 +7,8 @@
                        "Malafaya",
                        "Roderick Mallia",
                        "Urhixidur",
-                       "아라"
+                       "아라",
+                       "CharlieTheCabbie"
                ]
        },
        "tog-underline": "Ħoloq sottolinjati:",
@@ -34,7 +35,7 @@
        "tog-shownumberswatching": "Uri n-numru ta' utenti li qegħdin isegwu din il-paġna",
        "tog-oldsig": "Firma attwali:",
        "tog-fancysig": "Interpreta l-firma bħala test tal-wiki (mingħajr ħolqa awtomatika)",
-       "tog-uselivepreview": "Attiva l-funzjoni ''Live preview'' (bżonn tal-JavaScript; sperimentali)",
+       "tog-uselivepreview": "Attiva l-funzjoni ''Previżjoni jgħixu'' (bżonn tal-JavaScript; sperimentali)",
        "tog-forceeditsummary": "Nebbaħni meta ndaħħal taqsira tal-modifika vojta",
        "tog-watchlisthideown": "Aħbi l-modifiki tiegħi mil-lista ta' osservazzjoni",
        "tog-watchlisthidebots": "Aħbi l-modifiki tal-bots mil-lista ta' osservazzjoni",
@@ -50,7 +51,7 @@
        "tog-prefershttps": "Dejjem uża l-konnessjoni sigura meta tidħol fil-kont",
        "underline-always": "Dejjem",
        "underline-never": "Qatt",
-       "underline-default": "Żomm l-issettjar tal-browser",
+       "underline-default": "Jżommu tieghek l-issettjar għal tal-browser jew tas-ġilda",
        "editfont-style": "Stil tat-tipa tal-kaxxa tal-editjar:",
        "editfont-default": "Żomm l-issettjar tal-browser",
        "editfont-monospace": "Tipa monospazja",
        "newwindow": "(tinfetaħ f'tieqa ġdida)",
        "cancel": "Annulla",
        "moredotdotdot": "Aktar...",
-       "morenotlisted": "Oħrajn mhux imniżżla...",
+       "morenotlisted": "Oħrajn mhux imniżżla.",
        "mypage": "Paġna",
        "mytalk": "Diskussjoni",
        "anontalk": "Diskussjoni għal dan l-IP",
        "permalink": "Ħolqa permanenti",
        "print": "Ipprintja",
        "view": "Dehra",
+       "view-foreign": "Tara fuq $1",
        "edit": "Editja",
+       "edit-local": "Timmodifika deskrizzjoni lokali",
        "create": "Oħloq",
+       "create-local": "Żid deskrizzjoni lokali",
        "editthispage": "Immodifika din il-paġna",
        "create-this-page": "Oħloq din il-paġna",
        "delete": "Ħassar",
        "prefs-emailconfirm-label": "Konferma tal-ittra-e:",
        "youremail": "E-mail:",
        "username": "{{GENDER:$1|Isem tal-utent}}:",
-       "uid": "{{GENDER:$1|ID tal-utent}}:",
        "prefs-memberingroups": "{{GENDER:$2|Membru}} tal-{{PLURAL:$1|grupp|gruppi}}:",
        "prefs-memberingroups-type": "$1",
        "prefs-registration": "Ħin ta' reġistrazzjoni:",
        "log-title-wildcard": "Tfittxija ta' titli li jibdew b'dan it-test",
        "showhideselectedlogentries": "Uri/aħbi d-daħliet magħżula tar-reġistru",
        "allpages": "Il-paġni kollha",
-       "alphaindexline": "minn $1 sa $2",
        "nextpage": "Il-paġna li jmiss ($1)",
        "prevpage": "Il-paġna ta' qabel ($1)",
        "allpagesfrom": "Uri l-paġni li jibdew minn:",
        "newimages-summary": "Din il-paġna speċjali turi l-aħħar fajls li ġew mtella' riċentament.",
        "newimages-legend": "Filtru",
        "newimages-label": "Isem tal-fajl (jew parti minnu):",
-       "showhidebots": "($1 bots)",
        "noimages": "M'hawn xejn x'tara.",
        "ilsubmit": "Fittex",
        "bydate": "data",
index fd2d2f3..e17ea9c 100644 (file)
        "show-big-image": "Mochi cuallōtl",
        "newimages": "Yancuīc īxipcān",
        "imagelisttext": "Nicān {{PLURAL:$1|mopiya|mopiyah}} '''$1''' īxiptli $2 iuhcopa.",
-       "showhidebots": "($1 tepoztlācah)",
        "noimages": "Ahtlein ic tlatta.",
        "ilsubmit": "Tlatēmōz",
        "bydate": "tōnalcopa",
index a906f17..5e6e0c3 100644 (file)
        "databaseerror": "Chu-liāu-khò· chhò-gō·",
        "databaseerror-query": "揣:$1",
        "databaseerror-function": "功能:$1",
+       "databaseerror-error": "chhò-gō͘",
        "laggedslavemode": "'''提醒:'''頁內容可能毋是上新的。",
        "readonly": "Chu-liāu-khò· só tiâu leh",
        "enterlockreason": "Phah beh hong-só ê lí-iû, pau-koah ko͘-kè siáⁿ-mi̍h sî-chūn ē kái-tû hong-só.",
        "log": "記錄",
        "logempty": "Log lāi-bīn bô sio-tùi ê hāng-bo̍k.",
        "allpages": "Só·-ū ê ia̍h",
-       "alphaindexline": "$1 kàu $2",
        "nextpage": "Āu 1 ia̍h ($1)",
        "prevpage": "前一頁($1)",
        "allpagesfrom": "Tùi chit ia̍h khai-sí hián-sī:",
        "whatlinkshere-next": "{{PLURAL:$1|āu|āu $1 ê}}",
        "whatlinkshere-links": "← Liân kàu chia",
        "blockip": "Hong-só iōng-chiá",
-       "ipadressorusername": "IP Chū-chí a̍h iōng-chiá miâ:",
+       "ipaddressorusername": "IP Chū-chí a̍h iōng-chiá miâ:",
        "ipbreason": "Lí-iû:",
        "ipbsubmit": "Hong-só chit ūi iōng-chiá",
        "badipaddress": "Bô-hāu ê IP chū-chí",
index ff6e10c..fe08230 100644 (file)
        "prefs-emailconfirm-label": "E-postbekreftelse:",
        "youremail": "E-post:",
        "username": "{{GENDER:$1|Brukernavn}}:",
-       "uid": "{{GENDER:$1|Bruker-ID}}:",
        "prefs-memberingroups": "{{GENDER:$2|Medlem}} i følgende {{PLURAL:$1|gruppe|grupper}}:",
        "prefs-registration": "Registreringstid:",
        "yourrealname": "Virkelig navn:",
        "log-title-wildcard": "Søk i titler som starter med denne teksten",
        "showhideselectedlogentries": "Vis/skjul de valgte logghendelsene",
        "allpages": "Alle sider",
-       "alphaindexline": "$1 til $2",
        "nextpage": "Neste side ($1)",
        "prevpage": "Forrige side ($1)",
        "allpagesfrom": "Vis sider fra og med:",
        "newimages-summary": "Denne spesialsiden viser de sist opplastede filene.",
        "newimages-legend": "Filnavn",
        "newimages-label": "Filnavn (helt eller delvis):",
-       "showhidebots": "($1 roboter)",
        "noimages": "Ingenting å se.",
        "ilsubmit": "Søk",
        "bydate": "etter dato",
index a5811b0..1fc788b 100644 (file)
        "prefs-emailconfirm-label": "Netpostbevestiging:",
        "youremail": "Netpostadres (niet verplicht) *",
        "username": "{{GENDER:$1|Gebrukersnaam}}:",
-       "uid": "{{GENDER:$1|Gebrukersnummer}}:",
        "prefs-memberingroups": "{{GENDER:$2|Lid}} van {{PLURAL:$1|groep|groepen}}:",
        "prefs-registration": "Registrasiedaotum:",
        "yourrealname": "Echte naam (niet verplicht)",
        "rcnotefrom": "Dit bin de wiezigingen sinds <strong>$2</strong> (maximum van <strong>$1</strong> wiezigingen).",
        "rclistfrom": "Bekiek wiezigingen vanaof $3 $2",
        "rcshowhideminor": "$1 kleine wiezigingen",
+       "rcshowhideminor-show": "Bekieken",
+       "rcshowhideminor-hide": "Verbargen",
        "rcshowhidebots": "$1 botgebrukers",
+       "rcshowhidebots-show": "Bekieken",
+       "rcshowhidebots-hide": "Verbargen",
        "rcshowhideliu": "$1 eregistreerden gebrukers",
+       "rcshowhideliu-show": "Bekieken",
+       "rcshowhideliu-hide": "Verbargen",
        "rcshowhideanons": "$1 anonieme gebrukers",
+       "rcshowhideanons-show": "Bekieken",
+       "rcshowhideanons-hide": "Verbargen",
        "rcshowhidepatr": "$1 nao-ekeken bewarkingen",
+       "rcshowhidepatr-show": "Bekieken",
+       "rcshowhidepatr-hide": "Verbargen",
        "rcshowhidemine": "$1 mien bewarkingen",
+       "rcshowhidemine-show": "Bekieken",
+       "rcshowhidemine-hide": "Verbargen",
        "rclinks": "Bekiek de leste $1 wiezigingen van de aofgeleupen $2 dagen<br />$3",
        "diff": "wiezig",
        "hist": "gesch",
        "log-title-wildcard": "Zeuk naor titels die beginnen mit disse tekste:",
        "showhideselectedlogentries": "Ekeuzen logboekregels laoten zien of verbargen",
        "allpages": "Alle ziejen",
-       "alphaindexline": "$1 tot $2",
        "nextpage": "Volgende zied ($1)",
        "prevpage": "Veurige zied ($1)",
        "allpagesfrom": "Laot ziejen zien vanaof:",
        "newimages-summary": "Op disse spesiale zied staon de bestaanden die der as lest bie-ekeumen bin.",
        "newimages-legend": "Bestaandsnaam",
        "newimages-label": "Bestaandsnaam (of deel dervan):",
-       "showhidebots": "(Bots $1)",
        "noimages": "Niks te zien.",
        "ilsubmit": "Zeuk",
        "bydate": "op daotum",
index a31c1e9..c05c0dd 100644 (file)
@@ -22,7 +22,7 @@
        "tog-hidepatrolled": "गस्ती(patrolled)सम्पादनहरु हालका परिवर्तनहरुमा लुकाउने",
        "tog-newpageshidepatrolled": "गस्ती गरिएका पृष्ठहरू नयाँ पृष्ठ सूचीबाट लुकाउने",
        "tog-extendwatchlist": "निगरानी सूचीलाई सबै परिवर्तनहरू देखाउने गरी बढाउने , हालैको  बाहेक",
-       "tog-usenewrc": "पृष्ठका भर्खरका परिवर्तन र अवलोकन सूचीको आधारमा सामूहिक परिवर्तनहरु ( जाभास्क्रिप्ट चाहिन्छ)",
+       "tog-usenewrc": "पृष्ठका भर्खरका परिवर्तन र अवलोकन सूचीको आधारमा सामूहिक परिवर्तनहरु",
        "tog-numberheadings": "शीर्षकहरुलाई स्वत:अङ्कित गर्नुहोस्",
        "tog-showtoolbar": "सम्पादन औजारबट्टा देखाउने",
        "tog-editondblclick": "दोहोरो क्लिकमा पृष्ठ सम्पादन गर्ने",
        "rev-suppressed-text-unhide": "यस पृष्ठको पुनरावलोकन '''दबाइएकोछ'''।\nयसको पूर्ण विवरण [{{fullurl:{{#Special:Log}}/delete|पृष्ठ={{FULLPAGENAMEE}}}}को दबाइएको लगमा पाउन सकिन्छ]।\nयदि चाहनु भयो भनें प्रबन्धकको हैसियतमा [यो पुनरावलोकन $1] हेर्न सक्नुहुन्छ।",
        "rev-deleted-text-view": "यस पृष्ठको संशोधन '''मेटिएकोछ'''।\nतपाईंले हेर्न सक्नुहुन्छ; [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} मेटिएको लगमा विवरण पाउन सकिन्छ]।",
        "rev-suppressed-text-view": "यस पृष्ठको पुनरावलोकन '''दबिएकोछ'''।\nप्रबन्धकको हैसियतमा हेर्न सक्नुहुन्छ; [{{fullurl:{{#Special:Log}}/delete|पृष्ठ={{FULLPAGENAMEE}}}}को दबिएको लगमा विवरण पाउन सकिन्छ]",
-       "rev-deleted-no-diff": "तपाईंले यसको भिन्नता पाउन सक्नुहुन्न किन भनें यस पृष्ठको पुनरावलोकन '''मेटाइएकोछ'''।\nयसको विवरण [{{fullurl:{{#Special:Log}}/delete|पृष्ठ={{FULLPAGENAMEE}}}}को मेटाइएको लगमा पाउन सक्नुहुन्छ]।",
+       "rev-deleted-no-diff": "तपाईंले यसको भिन्नता पाउन सक्नुहुन्न किनभने यस पृष्ठको पुनरावलोकन '''मेटाइएको छ'''।\nयसको विवरण [{{fullurl:{{#Special:Log}}/delete|पृष्ठ={{FULLPAGENAMEE}}}}को मेटाइएको लगमा पाउन सक्नुहुन्छ]।",
        "rev-suppressed-no-diff": "तपाईं यसको भिन्नता हेर्न सक्नुहुन्न किनभनें यसको एउटा संशोधन '''मेटाइएको'''छ।",
        "rev-deleted-unhide-diff": "यस पृष्ठको पुनरावलोकनहरु मध्ये एउटा भिन्नता '''मेटाइएकोछ'''।\nयसको पूर्ण विवरण [{{fullurl:{{#Special:Log}}/delete|पृष्ठ={{FULLPAGENAMEE}}}}को मेटाइएको लगमा पाउन सकिन्छ]।\nयदि चाहनु भयो भनें प्रबन्धकको हैसियतमा [यो भिन्नता $1] हेर्न सक्नुहुन्छ।",
        "rev-suppressed-unhide-diff": "यस पृष्ठको पुनरावलोकनहरु मध्ये एउटा भिन्नता '''दबिएकोछ'''।\nयसको पूर्ण विवरण [{{fullurl:{{#Special:Log}}/suppress|पृष्ठ={{FULLPAGENAMEE}}}}को दबिएको लगमा पाउन सकिन्छ]।\nयदि चाहनु भयो भनें प्रबन्धकको हैसियतमा [यो भिन्नता $1] हेर्न सक्नुहुन्छ।",
        "revertmerge": "नमिलाउने",
        "mergelogpagetext": "एउटा पृष्ठको इतिहास अर्कोमा भर्खरै मिलाइएको सूची तल दिइन्छ।",
        "history-title": "\"$1\" को पुनरावृत्ति इतिहास",
-       "difference-multipage": "(पà¥\83षà¥\8dठहरà¥\81मा भिन्नता)",
+       "difference-multipage": "(पà¥\83षà¥\8dठहरà¥\82मा भिन्नता)",
        "lineno": "पंक्ति $1:",
        "compareselectedversions": "छानिएका संस्करणहरू दाँज्नुहोस्",
        "showhideselectedversions": "छानिएका पुनरावलोकनहरु देखाउने/लुकाउने",
        "prefs-emailconfirm-label": "इ-मेल एकिन प्रक्रिया :",
        "youremail": "ईमेल",
        "username": "{{GENDER:$1|प्रयोगकर्ता नाम}}:",
-       "uid": "{{GENDER:$1|प्रयोगकर्ता}} ID:",
        "prefs-memberingroups": "निम्न {{PLURAL:$1|समूह | समूहहरू}}को {{GENDER:$2|सदस्य}} :",
        "prefs-memberingroups-type": "$1",
        "prefs-registration": "दर्ता समय:",
        "recentchanges-feed-description": "यो फिडमा रहेको विकीको सवैभन्दा अन्तिम परिवर्तनहरुको जानकारी राख्नुहोस्",
        "recentchanges-label-newpage": "यो सम्पादनले नयाँ पृष्ठ निर्माण गरेको छ",
        "recentchanges-label-minor": "यो साधारण सम्पादन हो",
-       "recentchanges-label-bot": "यो सम्पादन बोट द्वारा गरिएको थियो",
+       "recentchanges-label-bot": "यो सम्पादन बोटद्वारा गरिएको थियो",
        "recentchanges-label-unpatrolled": "यो सम्पादन अहिले सम्म पट्रोल गरिएको छैन",
        "recentchanges-legend-newpage": "([[Special:NewPages|list of new pages]] यो पनि हेर्नुहोस्)",
        "recentchanges-legend-plusminus": "(''±१२३'')",
        "logempty": "लगमा मिल्ने वस्तु भेटिएन ।",
        "log-title-wildcard": "पाठबाट सुरुहुने शीर्षकहरु खोज्नुहोस्",
        "allpages": "सबै पृष्ठहरू",
-       "alphaindexline": "$1 लाई $2 मा",
        "nextpage": "अर्को पृष्ठ ($1)",
        "prevpage": "पहिलो पृष्ठ ($1)",
        "allpagesfrom": "यहाँदेखि शुरु हुने पृष्ठहरू देखाउनुहोस्:",
        "newimages-summary": "यस विशेष पृष्ठले अन्तिम उर्ध्वभरण गरिका फाइलहरु देखाउँछ ।",
        "newimages-legend": "फिल्टर",
        "newimages-label": "फाइल अथवा (यसको एउटा अंश)को नाम:",
-       "showhidebots": "($1 बोटहरु)",
        "noimages": "हेर्नको लागि केही छैन.",
        "ilsubmit": "खोज्नुहोस्",
        "bydate": "मिति अनुसार",
        "watchlistedit-raw-done": "तपाईको निगरानी सुची अद्यावधिक गरिएको छ।",
        "watchlistedit-raw-added": "{{PLURAL:$1|१ शिर्षक|$1 शिर्षकरु}} थपियो:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|१ शिर्षक|$1 शिर्षकरु}} हटाइयो:",
+       "watchlistedit-clear-titles": "शीर्षकहरू :",
+       "watchlistedit-clear-done": "तपाईको निगरानी सुची हटाइएको छ।",
        "watchlisttools-view": "मिल्दो परिवर्तनहरु हेर्ने",
        "watchlisttools-edit": "निगरानी सूची हेर्नुहोस् र सम्पादन गर्नुहोस्",
        "watchlisttools-raw": "कच्चा निगरानी सूची सम्पादन गर्नुहोस् ।",
        "feedback-submit": "प्रतिकृया बुझाउनुहोस्",
        "feedback-error2": "त्रुटि: सम्पादन असफल",
        "feedback-close": "गरियो",
+       "searchsuggest-search": "खोज",
        "api-error-badaccess-groups": "यस विकिमा तपाईंलाई फाइल अपलोड गर्ने अनुमति छैन।",
        "api-error-copyuploaddisabled": "यस सर्वरमा URL द्वारा अपलोड गर्ने व्यवस्था निस्क्रिय गरिएकोछ।",
        "api-error-duplicate": "यस साइटमा पहिलेबाट यस्तै सामग्री {{PLURAL:$1|भएको [$2 अर्को फाइल छ]|भएका  [$2 केहि अरु फाइलहरु छन्]}} ।",
        "api-error-unknownerror": "अज्ञात त्रुटि: \"$1\".",
        "api-error-uploaddisabled": "यस विकिमा अपलोड निस्क्रिय गरिएकोछ।",
        "expand_templates_output": "परिणाम",
+       "expand_templates_ok": "ठीक",
        "expand_templates_generate_rawhtml": "सुद्ध HTML देखाउने",
        "expand_templates_preview": "पूर्वावलोकन"
 }
index f978672..2df42db 100644 (file)
        "log-title-wildcard": "Pagina's zoeken die met deze tekens beginnen",
        "showhideselectedlogentries": "Geselecteerde logboekregels weergeven of verbergen",
        "allpages": "Alle pagina's",
-       "alphaindexline": "$1 tot $2",
        "nextpage": "Volgende pagina ($1)",
        "prevpage": "Vorige pagina ($1)",
        "allpagesfrom": "Pagina's bekijken vanaf:",
        "newimages-summary": "Op deze speciale pagina worden de meest recent toegevoegde bestanden weergegeven.",
        "newimages-legend": "Bestandsnaam",
        "newimages-label": "Bestandsnaam (of deel daarvan):",
-       "showhidebots": "(Bots $1)",
        "noimages": "Er is niets te zien.",
        "ilsubmit": "Zoeken",
        "bydate": "op datum",
index a5eb7b2..73132c3 100644 (file)
        "newimages-summary": "Denne spesialsida syner dei sist opplasta filene.",
        "newimages-legend": "Filnamn",
        "newimages-label": "Filnamn (eller ein del av det):",
-       "showhidebots": "($1 robotar)",
        "noimages": "Her er ingen filer som kan visast.",
        "ilsubmit": "Søk",
        "bydate": "etter dato",
index e4ae4c7..a7dafa9 100644 (file)
        "log-title-wildcard": "Recercar de títols que començan per aqueste tèxte",
        "showhideselectedlogentries": "Afichar/amagar las entradas de jornal seleccionadas",
        "allpages": "Totas las paginas",
-       "alphaindexline": "$1 a $2",
        "nextpage": "Pagina seguenta ($1)",
        "prevpage": "Pagina precedenta ($1)",
        "allpagesfrom": "Afichar las paginas a partir de :",
        "newimages-summary": "Aquesta pagina especiala aficha los darrièrs fichièrs importats.",
        "newimages-legend": "Filtre",
        "newimages-label": "Nom del fichièr (o una partida d'aqueste) :",
-       "showhidebots": "($1 bòts)",
        "noimages": "Cap d'imatge d'afichar pas.",
        "ilsubmit": "Cercar",
        "bydate": "per data",
index 054bcaa..b89682a 100644 (file)
        "prefs-emailconfirm-label": "ଇ-ମେଲ ସଜାଣି:",
        "youremail": "ଇ-ମେଲ:",
        "username": "{{GENDER:$1|Username}}:",
-       "uid": "{{GENDER:$1|User}} ID:",
        "prefs-memberingroups": "{{PLURAL:$1|group|groups}}:ର {{GENDER:$2|Member}}",
        "prefs-registration": "ନାମଲେଖା ବେଳା:",
        "yourrealname": "ପ୍ରକୃତ ନାମ:",
        "log-title-wildcard": "ଏହି ଲେଖାରେ ଆରମ୍ଭ ହୋଇଥିବା ଶିରୋନାମାସବୁ ଖୋଜିବେ",
        "showhideselectedlogentries": "ବାଛିଥିବା ତାଲିକାକୁ ଦେଖାଇବେ/ଲୁଚାଇବେ",
        "allpages": "ସବୁ ପୃଷ୍ଠା",
-       "alphaindexline": "$1 ରୁ $2",
        "nextpage": "ପର ପୃଷ୍ଠା ($1)",
        "prevpage": "ଆଗ ପୃଷ୍ଠା ($1)",
        "allpagesfrom": "ଏହି ନାଆଁରେ ଆରମ୍ଭ ହେଉଥିବା ପୃଷ୍ଠାଗୁଡ଼ିକୁ ଦେଖାଇବେ:",
        "newimages-summary": "ଏହି ବିଶେଷ ପୃଷ୍ଠାଟି ଶେଷ ଅପଲୋଡ଼ ହୋଇଥିବା ଫାଇଲମାନ ଦେଖାଇଥାଏ ।",
        "newimages-legend": "ଛାଣିବା",
        "newimages-label": "ଫାଇଲ ନାମ (କିମ୍ବା ତାହାର ଏକ ଭାଗ):",
-       "showhidebots": "($1 ଜଣ ବଟ)",
        "noimages": "ଦେଖିବାକୁ କିଛି ନାହିଁ ।",
        "ilsubmit": "ଖୋଜିବା",
        "bydate": "ତାରିଖ ଅନୁସାରେ",
index 0e24496..9b49369 100644 (file)
        "newimages": "Pirinan kareng bayung simpan (new files)",
        "imagelisttext": "Ing makatuki tala yang '''$1''' {{PLURAL:$1|simpan|simpan}} a misamasan $2.",
        "newimages-summary": "Ining bulung a makabukud papakit no reng simpan (file) a tauling milulan.",
-       "showhidebots": "($1 bot)",
        "noimages": "Ala kang akit.",
        "ilsubmit": "Manintun",
        "bydate": "agpang keng aldo",
index fb5a13b..d899a5b 100644 (file)
        "logdelete-selected": "Zaznaczone {{PLURAL:$1|zdarzenie|zdarzenia}} z rejestru:",
        "revdelete-text-text": "Usunięte wersje będą nadal widoczne w historii strony, ale niektóre fragmenty ich treści nie będą dostępne dla wszystkich.",
        "revdelete-text-file": "Usunięte wersje pliku będą nadal widoczne w historii pliku, ale niektóre fragmenty ich treści nie będą dostępne dla wszystkich.",
+       "logdelete-text": "Usunięte wpisy rejestru nadal będą widoczne w rejestrze, ale niektóre fragmenty ich treści nie będą dostępne dla wszystkich.",
+       "revdelete-text-others": "Pozostali administratorzy {{grammar:genitive|{{SITENAME}}}} nadal będą posiadali dostęp do ukrytej treści i będą w stanie odtworzyć ją ponownie za pomocą tego samego interfejsu, jeśli nie zostaną ustawione dodatkowe ograniczenia.",
        "revdelete-confirm": "Potwierdź, że chcesz to zrobić zgodnie z [[{{MediaWiki:Policy-url}}|zasadami]] i że rozumiesz konsekwencje.",
        "revdelete-suppress-text": "Ukrywanie powinno być używane '''wyłącznie''' w sytuacji:\n* Informacji, która może być zniesławieniem\n* Ujawnienie danych osobowych\n*: ''adres domowy, numer telefonu, numer PESEL itp''",
        "revdelete-legend": "Ustaw ograniczenia widoczności",
        "prefs-emailconfirm-label": "Potwierdzenie adresu e‐mail:",
        "youremail": "Twój adres e‐mail:",
        "username": "{{GENDER:$1|Nazwa użytkownika}}:",
-       "uid": "{{GENDER:$1|Identyfikator użytkownika}}:",
        "prefs-memberingroups": "{{GENDER:$2|Członek}} {{PLURAL:$1|grupy|grup}}:",
        "prefs-registration": "Data rejestracji:",
        "yourrealname": "Imię i nazwisko:",
        "right-move": "Przenoszenie stron",
        "right-move-subpages": "Przenoszenie stron razem z ich podstronami",
        "right-move-rootuserpages": "Przenoszenie stron użytkowników",
+       "right-move-categorypages": "Przenoszenie stron kategorii",
        "right-movefile": "Przenoszenie plików",
        "right-suppressredirect": "Przenoszenie stron bez tworzenia przekierowania w miejscu starej nazwy",
        "right-upload": "Przesyłanie plików na serwer",
        "action-createpage": "tworzenia stron",
        "action-createtalk": "tworzenia stron dyskusji",
        "action-createaccount": "utworzenia tego konta użytkownika",
+       "action-history": "przeglądania historii tej strony",
        "action-minoredit": "do oznaczenia tej edycji jako drobna zmiana",
        "action-move": "przeniesienia tej strony",
        "action-move-subpages": "przeniesienia tej strony oraz jej podstron",
        "action-move-rootuserpages": "przenoszenia stron użytkowników (bez podstron)",
+       "action-move-categorypages": "przenoszenia stron kategorii",
        "action-movefile": "przeniesienia tego pliku",
        "action-upload": "przesłania tego pliku",
        "action-reupload": "nadpisania tego pliku",
        "upload-disallowed-here": "Nie możesz nadpisać tego pliku.",
        "filerevert": "Przywracanie $1",
        "filerevert-legend": "Przywracanie poprzedniej wersji pliku",
-       "filerevert-intro": "Zamierzasz przywrócić '''[[Media:$1|$1]]''' do [wersji $4 z $3, $2].",
+       "filerevert-intro": "Zamierzasz przywrócić '''[[Media:$1|$1]]''' do [$4 wersji z $3, $2].",
        "filerevert-comment": "Powód",
        "filerevert-defaultcomment": "Przywrócono wersję z $2, $1",
        "filerevert-submit": "Przywróć",
-       "filerevert-success": "Plik '''[[Media:$1|$1]]''' został cofnięty do [wersji $4 z $3, $2].",
+       "filerevert-success": "Plik '''[[Media:$1|$1]]''' został cofnięty do [$4 wersji z $3, $2].",
        "filerevert-badversion": "Brak poprzedniej lokalnej wersji tego pliku z podaną datą.",
        "filedelete": "Usuwanie „$1”",
        "filedelete-legend": "Usuń plik",
        "pageswithprop-prophidden-binary": "binarna wartość własności ukryta ($1)",
        "doubleredirects": "Podwójne przekierowania",
        "doubleredirectstext": "Lista zawiera strony z przekierowaniami do stron, które przekierowują do innej strony.\nKażdy wiersz zawiera linki do pierwszego i drugiego przekierowania oraz link, do którego prowadzi drugie przekierowanie. Ostatni link prowadzi zazwyczaj do strony, do której powinna w rzeczywistości przekierowywać pierwsza strona.\n<del>Skreślenie</del> oznacza naprawienie przekierowania.",
-       "double-redirect-fixed-move": "Naprawa podwójnego przekierowania [[$1]] → [[$2]]",
+       "double-redirect-fixed-move": "Strona [[$1]] została przeniesiona. Przekierowanie wskazujące na stary tytuł zostało automatycznie zaktualizowane i przekierowuje teraz na stronę [[$2]].",
        "double-redirect-fixed-maintenance": "Automatyczna naprawa podwójnego przekierowania podczas prac konserwacyjnych z [[$1]] na [[$2]].",
        "double-redirect-fixer": "Naprawiacz przekierowań",
        "brokenredirects": "Zerwane przekierowania",
        "log-title-wildcard": "Szukaj tytułów zaczynających się od tego tekstu",
        "showhideselectedlogentries": "Pokaż/ukryj zaznaczone wpisy rejestru",
        "allpages": "Wszystkie strony",
-       "alphaindexline": "od $1 do $2",
        "nextpage": "Następna strona ($1)",
        "prevpage": "Poprzednia strona ($1)",
        "allpagesfrom": "Strony o tytułach rozpoczynających się od",
        "listgrouprights-namespaceprotection-namespace": "Przestrzeń nazw",
        "listgrouprights-namespaceprotection-restrictedto": "Uprawnienia pozwalające użytkownikom na edytowanie",
        "trackingcategories": "Śledzenie kategorii",
+       "trackingcategories-summary": "Ta strona zawiera listę kategorii monitorujących wypełnianych automatycznie przez oprogramowanie MediaWiki. Nazwy kategorii można zmienić edytując odpowiednie komunikaty systemowe znajdujące się w przestrzeni nazw {{ns:8}}.",
        "trackingcategories-msg": "Śledzenie kategorii",
        "trackingcategories-name": "Nazwa komunikatu",
        "trackingcategories-desc": "Kryteria włączenia kategorii",
        "noindex-category-desc": "Ta strona nie jest indeksowana przez roboty, ponieważ ma wpisane magiczne słowo <code><nowiki>__NOINDEX__</nowiki></code> i znajduje się w przestrzeni nazw, w której ta flaga jest dozwolona.",
        "post-expand-template-inclusion-category-desc": "Po rozwinięciu wszystkich szablonów, rozmiar strony jest większe niż <code>$wgMaxArticleSize</code>, więc niektóre szablony nie zostały rozwinięte.",
        "expensive-parserfunction-category-desc": "Na stronie używanych jest zbyt wiele wymagających funkcji parsera (takich jak <code>#ifexist</code>). Więcej informacji na stronie [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit].",
+       "broken-file-category-desc": "Kategoria dodawana do stron zawierających nieprawidłowe odwołania do plików (odwołania do nieistniejących plików).",
        "hidden-category-category-desc": "To jest kategoria z <code><nowiki>__HIDDENCAT__</nowiki></code>, co zapobiega wyświetlaniu jej w sekcji z kategoriami na stronie.",
        "trackingcategories-nodesc": "Opis nie jest dostępny.",
        "trackingcategories-disabled": "Kategoria jest wyłączona",
        "movepagetalktext": "Powiązana strona dyskusji, jeśli istnieje, będzie przeniesiona automatycznie, chyba że:\n*niepusta strona dyskusji już jest pod nową nazwą\n*usuniesz zaznaczenie z poniższego pola wyboru\n\nW takich przypadkach treść dyskusji można przenieść tylko ręcznie.",
        "movearticle": "Przeniesienie strony",
        "moveuserpage-warning": "'''Uwaga!''' Masz zamiar przenieść stronę użytkownika. Miej na uwadze, że zostanie przeniesiona tylko strona, a '''nazwa użytkownika pozostanie niezmieniona'''.",
+       "movecategorypage-warning": "<strong>Uwaga!</strong> Masz zamiar przenieść stronę opisu kategorii. Miej na uwadze, że strony, które należały do starej kategorii, <em>nie</em> zostaną przeniesione do nowej.",
        "movenologintext": "Przenoszenie stron jest możliwe dopiero po zarejestrowaniu się i [[Special:UserLogin|zalogowaniu]].",
        "movenotallowed": "Nie masz uprawnień do przenoszenia stron.",
        "movenotallowedfile": "Nie masz uprawnień do przenoszenia plików.",
        "cant-move-user-page": "Nie masz uprawnień do przenoszenia stron użytkowników (za wyjątkiem podstron).",
        "cant-move-to-user-page": "Nie masz uprawnień do przenoszenia strony do strony użytkownika (za wyjątkiem podstron użytkownika).",
+       "cant-move-category-page": "Nie masz uprawnień do przenoszenia stron kategorii.",
+       "cant-move-to-category-page": "Nie masz uprawnień do przenoszenia strony do strony kategorii.",
        "newtitle": "Nowy tytuł",
        "move-watch": "Obserwuj",
        "movepagebtn": "Przenieś stronę",
        "newimages-summary": "Na tej stronie specjalnej prezentowane są ostatnio przesłane pliki.",
        "newimages-legend": "Filtruj",
        "newimages-label": "Nazwa pliku (lub jej fragment)",
-       "showhidebots": "($1 boty)",
        "noimages": "Brak plików do pokazania.",
        "ilsubmit": "Szukaj",
        "bydate": "według daty",
        "watchlistedit-raw-done": "Lista obserwowanych stron została uaktualniona.",
        "watchlistedit-raw-added": "Dodano {{PLURAL:$1|1 pozycję|$1 pozycje|$1 pozycji}} do listy obserwowanych:",
        "watchlistedit-raw-removed": "Usunięto {{PLURAL:$1|1 pozycję|$1 pozycje|$1 pozycji}} z listy obserwowanych:",
+       "watchlistedit-clear-title": "Wyczyść listę obserwowanych",
+       "watchlistedit-clear-legend": "Wyczyść listę",
+       "watchlistedit-clear-explain": "Wszystkie strony z listy obserwowanych zostaną usunięte",
+       "watchlistedit-clear-submit": "Wyczyść listę obserwowanych (to jest nieodwracalne!)",
+       "watchlistedit-clear-done": "Twoja lista obserwowanych została wyczyszczona.",
+       "watchlistedit-clear-removed": "{{PLURAL:$1|1 strona została usunięta|$1 stron zostało usunięte}}:",
+       "watchlistedit-too-many": "To zbyt wiele stron do wyświetlenia ich tutaj.",
+       "watchlisttools-clear": "wyczyść listę",
        "watchlisttools-view": "pokaż zmiany na liście obserwowanych",
        "watchlisttools-edit": "edycja listy",
        "watchlisttools-raw": "tekstowy edytor listy",
        "htmlform-no": "Nie",
        "htmlform-yes": "Tak",
        "htmlform-chosen-placeholder": "Wybierz opcję",
+       "htmlform-cloner-create": "Dodaj więcej",
        "htmlform-cloner-delete": "Usuń",
+       "htmlform-cloner-required": "Wymagana jest co najmniej jedna wartość.",
        "sqlite-has-fts": "$1 z obsługą pełnotekstowego wyszukiwania",
        "sqlite-no-fts": "$1 bez obsługi pełnotekstowego wyszukiwania",
        "logentry-delete-delete": "$1 {{GENDER:$2|usunął|usunęła}} stronę $3",
index 4e1d493..64e3008 100644 (file)
        "newimages-summary": "Sta pàgina special-sì a la smon j'ùltim archivi carià.",
        "newimages-legend": "Filtror",
        "newimages-label": "Nòm ëd l'archivi (o na soa part):",
-       "showhidebots": "($1 trigomiro)",
        "noimages": "Pa gnente da vëdde.",
        "ilsubmit": "Arserché",
        "bydate": "për data",
index ef1aa43..941ef81 100644 (file)
        "newimages-summary": "اے خاص صفہ آخری چڑھائیاں فائلاں دسدا اے۔",
        "newimages-legend": "فلٹر",
        "newimages-label": "ففائل ناں (یا ایدا انگ)",
-       "showhidebots": "(بوٹ $1)",
        "noimages": "ویکھن آسطے کج نئیں۔",
        "ilsubmit": "کھوجو",
        "bydate": "تریخ نال",
index d090034..1212ab8 100644 (file)
        "log-title-wildcard": "هغه سرليکونه پلټل چې په دې متن پيلېږي",
        "showhideselectedlogentries": "د ټاکلو يادښتونو ښکارېدنه بدلول",
        "allpages": "ټول مخونه",
-       "alphaindexline": "$1 تر $2",
        "nextpage": "بل مخ ($1)",
        "prevpage": "تېر مخ ($1)",
        "allpagesfrom": "هغه مخونه کتل چې پېلېږي په:",
        "newimages-summary": "همدا ځانگړی مخ، وروستنۍ پورته شوې دوتنې ښکاره کوي.",
        "newimages-legend": "چاڼگر",
        "newimages-label": "د دوتنې نوم (يا د دې برخه):",
-       "showhidebots": "($1 روباټ)",
        "noimages": "د کتلو لپاره څه نشته.",
        "ilsubmit": "پلټل",
        "bydate": "د نېټې له مخې",
index 7e2c326..e49d587 100644 (file)
        "prefs-emailconfirm-label": "Confirmação do e-mail:",
        "youremail": "Seu e-mail:",
        "username": "Nome de {{GENDER:$1|usuário|usuária}}:",
-       "uid": "ID de {{GENDER:$1|usuário|usuária}}:",
        "prefs-memberingroups": "{{GENDER:$2|Membro}} {{PLURAL:$1|do grupo|dos grupos}}:",
        "prefs-registration": "Hora de registro:",
        "yourrealname": "Nome verdadeiro:",
        "log-title-wildcard": "Procurar por títulos que sejam iniciados com o seguinte texto",
        "showhideselectedlogentries": "Exibir/ocultar os itens de registros selecionados",
        "allpages": "Todas as páginas",
-       "alphaindexline": "De $1 até $2",
        "nextpage": "Próxima página ($1)",
        "prevpage": "Página anterior ($1)",
        "allpagesfrom": "Primeira página na listagem:",
        "emailuser": "Enviar-lhe um e-mail",
        "emailuser-title-target": "Enviar e-mail para {{GENDER:$1|este usuário|esta usuária}}",
        "emailuser-title-notarget": "Enviar e-mail",
-       "emailpage": "Contactar usuário",
+       "emailpage": "Enviar e-mail ao usuário",
        "emailpagetext": "Você pode usar o formulário a seguir para enviar um e-mail para {{GENDER:$1|este usuário|esta usuária}}.\nO endereço de e-mail que você inseriu em [[Special:Preferences|suas preferências de usuário]] irá aparecer como o endereço do remetente da mensagem, com o destinatário podendo responder diretamente para você.",
        "defemailsubject": "E-mail do usuário \"$1\" da {{SITENAME}}",
        "usermaildisabled": "O e-mail do usuário foi desativado",
        "emailccsubject": "Cópia de sua mensagem para $1: $2",
        "emailsent": "E-mail enviado",
        "emailsenttext": "Sua mensagem foi enviada.",
-       "emailuserfooter": "Este e-mail foi enviado por $1 para $2 através da opção de \"contactar usuário\" da {{SITENAME}}.",
+       "emailuserfooter": "Este e-mail foi enviado por $1 para $2 através da opção de \"enviar e-mail ao usuário\" da {{SITENAME}}.",
        "usermessage-summary": "Deixar mensagem de sistema.",
        "usermessage-editor": "Mensagens de sistema",
        "watchlist": "Páginas vigiadas",
        "blockipsuccesssub": "Bloqueio bem sucedido",
        "blockipsuccesstext": "[[Special:Contributions/$1|$1]] foi {{GENDER:$1|bloqueado|bloqueada}}.<br />\nConsulte a [[Special:BlockList|lista de bloqueios]].",
        "ipb-blockingself": "Você está prestes a bloquear-se a si próprio. Você tem a certeza de que pretende fazê-lo?",
-       "ipb-confirmhideuser": "Você está prestes a bloquear um utilizador com \"Ocultar nome de utilizador/IP\" ativado. Isto irá suprimir o nome do usuário de todas as listas e entradas dos registos. Tem a certeza de que pretende fazê-lo?",
+       "ipb-confirmhideuser": "Você está prestes a bloquear um usuário com \"Ocultar nome de usuário/IP\" ativado. Isto irá suprimir o nome do usuário de todas as listas e entradas dos registos. Tem a certeza de que pretende fazê-lo?",
        "ipb-confirmaction": "Se você tem certeza que realmente quer fazer isto, por favor verifique o campo \"{{int:ipb-confirm}}\" no final.",
        "ipb-edit-dropdown": "Editar motivos de bloqueio",
        "ipb-unblock-addr": "Desbloquear $1",
        "newimages-summary": "Esta página especial mostra os arquivos mais recentemente enviados",
        "newimages-legend": "Filtrar",
        "newimages-label": "Nome de arquivo (ou parte dele):",
-       "showhidebots": "($1 robôs)",
        "noimages": "Nada para ver.",
        "ilsubmit": "Pesquisar",
        "bydate": "por data",
        "compare-revision-not-exists": "A revisão que você especificou não existe.",
        "dberr-problems": "Desculpe! Este sítio está passando por dificuldades técnicas.",
        "dberr-again": "Experimente esperar alguns minutos e atualizar.",
-       "dberr-info": "(Não foi possível contactar o servidor de base de dados: $1)",
+       "dberr-info": "(Não foi possível contatar o servidor de base de dados: $1)",
        "dberr-info-hidden": "(Não foi possível contatar o banco de dados do servidor)",
        "dberr-usegoogle": "Você pode tentar pesquisar no Google entretanto.",
        "dberr-outofdate": "Note que os seus índices relativos ao nosso conteúdo podem estar desatualizados.",
index 106c553..973bd05 100644 (file)
        "viewhelppage": "Ver página de ajuda",
        "categorypage": "Ver página da categoria",
        "viewtalkpage": "Ver discussão",
-       "otherlanguages": "Noutras línguas",
+       "otherlanguages": "Noutros idiomas",
        "redirectedfrom": "(Redireccionado de $1)",
        "redirectpagesub": "Página de redirecionamento",
        "lastmodifiedat": "Esta página foi modificada pela última vez à(s) $2 de $1.",
        "nstab-help": "Ajuda",
        "nstab-category": "Categoria",
        "nosuchaction": "Operação não existe",
-       "nosuchactiontext": "A operação especificada pela URL é inválida.\nÉ possível que tenha escrito mal a URL ou seguido um link incorreto.\nIsto pode também indicar um defeito no software da {{SITENAME}}.",
+       "nosuchactiontext": "A operação especificada pela URL é inválida.\nÉ possível que tenha escrito mal a URL ou seguido uma ligação incorreta.\nIsto pode também indicar um defeito no software da {{SITENAME}}.",
        "nosuchspecialpage": "Esta página especial não existe",
        "nospecialpagetext": "<strong>Solicitou uma página especial inválida.</strong>\n\nEncontra uma lista das páginas especiais válidas em [[Special:SpecialPages|{{int:specialpages}}]].",
        "error": "Erro",
        "readonly": "Base de dados bloqueada (limitada a leituras)",
        "enterlockreason": "Introduza um motivo para bloquear, incluindo uma estimativa de quando será desbloqueada",
        "readonlytext": "A base de dados está bloqueada para impedir a inserção e modificação de dados, provavelmente para uma manutenção de rotina, após a qual a situação será normalizada.\n\nO administrador que a bloqueou deu a seguinte explicação: $1",
-       "missing-article": "A base de dados não encontrou o texto de uma página que deveria ter encontrado, com o nome \"$1\" $2.\n\nGeralmente, esta situação ocorre ao clicar um link para diferenças desatualizado ou para o histórico de uma página que tenha sido removida.\n\nSe nenhuma destas situações se verifica, pode ter encontrado um defeito no programa.\nAnote a URL e reporte este incidente a um [[Special:ListUsers/sysop|administrador]], por favor.",
+       "missing-article": "A base de dados não encontrou o texto de uma página que deveria ter encontrado, com o nome \"$1\" $2.\n\nGeralmente, esta situação ocorre ao clicar numa ligação para diferenças desatualizada ou para o histórico de uma página que tenha sido removida.\n\nSe nenhuma destas situações se verifica, pode ter encontrado um defeito no programa.\nAnote a URL e reporte este incidente a um [[Special:ListUsers/sysop|administrador]], por favor.",
        "missingarticle-rev": "(revisão#: $1)",
        "missingarticle-diff": "(Dif.: $1, $2)",
        "readonly_lag": "A base de dados foi automaticamente bloqueada enquanto os servidores secundários se sincronizam com o primário",
        "delete-hook-aborted": "A eliminação foi cancelada por um \"hook\".\nNão foi dada nenhuma explicação.",
        "no-null-revision": "Não foi possível criar uma nova revisão nula para a página \"$1\"",
        "badtitle": "Título inválido",
-       "badtitletext": "O título de página solicitado era inválido, vazio, ou um link interlínguas ou interwikis incorrecto.\nTalvez contenha um ou mais caracteres que não podem ser usados em títulos.",
+       "badtitletext": "O título de página solicitado era inválido, vazio, ou a ligação interlínguas estava incorreta.\nTalvez contenha um ou mais caracteres que não podem ser usados em títulos.",
        "perfcached": "Os seguintes dados encontram-se armazenados na ''cache'' e podem não estar atualizados. No máximo {{PLURAL:$1|um resultado é disponível|$1 resultados são disponíveis}} na ''cache''.",
        "perfcachedts": "Os seguintes dados encontram-se armazenados na ''cache'' e foram atualizados pela última vez a $1. No máximo {{PLURAL:$4|um resultado está disponível|$4 resultados estão disponíveis}} na ''cache''.",
        "querypage-no-updates": "As atualizações estão presentemente desativadas para esta página.\nPor enquanto, os dados aqui presentes não poderão ser atualizados.",
        "welcomecreation-msg": "A sua conta foi criada.\nNão se esqueça de personalizar as suas [[Special:Preferences|preferências]].",
        "yourname": "Nome de utilizador:",
        "userlogin-yourname": "Nome de utilizador(a):",
-       "userlogin-yourname-ph": "Digite seu nome de utilizador(a)",
-       "createacct-another-username-ph": "Digite o nome de utilizador",
+       "userlogin-yourname-ph": "Digite seu nome de utilizador(a)",
+       "createacct-another-username-ph": "Digite o nome de utilizador(a)",
        "yourpassword": "Palavra-chave:",
        "userlogin-yourpassword": "Palavra-chave",
-       "userlogin-yourpassword-ph": "Digite sua palavra-chave",
+       "userlogin-yourpassword-ph": "Digite sua palavra-chave",
        "createacct-yourpassword-ph": "Digite uma palavra-chave",
        "yourpasswordagain": "Repita a palavra-chave:",
        "createacct-yourpasswordagain": "Confirme a palavra-chave",
        "userlogin-createanother": "Criar outra conta",
        "createacct-emailrequired": "Endereço de email",
        "createacct-emailoptional": "Endereço de email (opcional)",
-       "createacct-email-ph": "Digite seu endereço de email",
-       "createacct-another-email-ph": "Digite o endereço de e-mail",
+       "createacct-email-ph": "Digite o seu endereço de correio electrónico",
+       "createacct-another-email-ph": "Digite o endereço de correio electrónico",
        "createaccountmail": "Usar uma palavra passe aleatória e temporária e enviar para o endereço de correio eletrónico especificado",
        "createacct-realname": "Nome verdadeiro (opcional)",
        "createaccountreason": "Motivo:",
        "passwordremindertitle": "Nova palavra-chave temporária na {{SITENAME}}",
        "passwordremindertext": "Alguém (provavelmente você, a partir do endereço IP $1) solicitou uma palavra-chave nova para a sua conta na {{SITENAME}} ($4).\nFoi criada a palavra-chave temporária \"$3\" para o utilizador \"$2\".\nSe o pedido foi feito por si, entre agora na sua conta e escolha uma palavra-chave nova.\nA palavra-chave temporária expira após {{PLURAL:$5|um dia|$5 dias}}.\n\nCaso outra pessoa tenha feito o pedido, ou se entretanto se recordou da sua palavra-chave e já não deseja alterá-la, ignore esta mensagem e continue a utilizar a palavra-chave antiga.",
        "noemail": "Não foi registado um endereço de correio eletrónico para o utilizador \"$1\".",
-       "noemailcreate": "Tem de fornecer um endereço de correio eletrónico válido",
+       "noemailcreate": "Tem de fornecer um endereço de correio eletrónico válido.",
        "passwordsent": "Foi enviada uma palavra-chave nova para o endereço de correio eletrónico do utilizador \"$1\".\nVolte a autenticar-se após recebê-la, por favor.",
        "blocked-mailpassword": "O seu endereço IP foi bloqueado e, portanto, não será possível utilizar a função de recuperação da palavra-chave, para prevenir o uso abusivo.",
        "eauthentsent": "Foi enviada uma mensagem de confirmação para o endereço de correio eletrónico que especificou.\nAntes que seja enviada qualquer outra mensagem para a conta, terá de seguir as instruções na mensagem enviada, de modo a confirmar que a conta lhe pertence.",
        "changeemail-text": "Preencha este formulário para alterar o endereço de correio eletrónico. Para confirmar esta alteração terá de introduzir a sua palavra-chave.",
        "changeemail-no-info": "Tem de autenticar-se para aceder diretamente a esta página.",
        "changeemail-oldemail": "Correio eletrónico atual:",
-       "changeemail-newemail": "Correio eletrónico novo:",
+       "changeemail-newemail": "Novo endereço de correio eletrónico:",
        "changeemail-none": "(nenhum)",
        "changeemail-password": "A sua senha na wiki {{SITENAME}}:",
        "changeemail-submit": "Alterar correio eletrónico",
        "bold_tip": "Texto a negrito",
        "italic_sample": "Texto em itálico",
        "italic_tip": "Texto em itálico",
-       "link_sample": "Título do link",
-       "link_tip": "Link interno",
-       "extlink_sample": "http://www.example.com link externo",
-       "extlink_tip": "Link externo (lembre-se do prefixo http://)",
+       "link_sample": "Título da ligação",
+       "link_tip": "Ligação interna",
+       "extlink_sample": "http://www.example.com ligação externa",
+       "extlink_tip": "Ligação externa (lembre-se do prefixo http://)",
        "headline_sample": "Texto do cabeçalho",
        "headline_tip": "Seção de nível 2",
        "nowiki_sample": "Inserir texto não-formatado aqui",
        "image_sample": "Exemplo.jpg",
        "image_tip": "Ficheiro incorporado",
        "media_sample": "Exemplo.ogg",
-       "media_tip": "Link para ficheiro",
+       "media_tip": "Ligação para ficheiro",
        "sig_tip": "A sua assinatura, com hora e data",
        "hr_tip": "Linha horizontal (utilize moderadamente)",
        "summary": "Resumo:",
        "accmailtitle": "Palavra-chave enviada.",
        "accmailtext": "Uma palavra-chave gerada aleatoriamente para [[User talk:$1|$1]] foi enviada para $2.\n\nEla pode ser alterada na página [[Special:ChangePassword|de alteração da palavra-chave]] após autenticação.",
        "newarticle": "(Nova)",
-       "newarticletext": "Seguiu um link para uma página que ainda não existe.\nPara criá-la, escreva o seu conteúdo na caixa abaixo (consulte a [$1 página de ajuda] para mais detalhes).\nSe chegou aqui por engano, clique o botão '''voltar''' (ou ''back'') do seu browser.",
+       "newarticletext": "Seguiu uma ligação para uma página que ainda não existe.\nPara criá-la, escreva o seu conteúdo na caixa abaixo (consulte a [$1 página de ajuda] para mais detalhes).\nSe chegou aqui por engano, clique o botão '''voltar''' (ou ''back'') do seu navegador.",
        "anontalkpagetext": "----''Esta é a página de discussão de um utilizador anónimo que ainda não criou uma conta ou não a utiliza, pelo que temos de utilizar o endereço IP para identificá-lo(a).\nUm endereço IP pode ser partilhado por vários utilizadores.\nSe é um utilizador anónimo e sente que lhe foram direccionados comentários irrelevantes, por favor [[Special:UserLogin/signup|crie uma conta]] ou [[Special:UserLogin|autentique-se]] para evitar futuras confusões com outros utilizadores anónimos.''",
        "noarticletext": "Ainda não existe texto nesta página.\nPode [[Special:Search/{{PAGENAME}}|pesquisar o título desta página]] noutras páginas,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} procurar registos relacionados]\nou [{{fullurl:{{FULLPAGENAME}}|action=edit}} editar esta página]</span>.",
        "noarticletext-nopermission": "Ainda não existe texto nesta página.\nPode [[Special:Search/{{PAGENAME}}|pesquisar o título desta página]] noutras páginas, ou <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} procurar nos registos relacionados]</span>, mas não tem permissão para criar esta página.",
-       "missing-revision": "A revisão #$1 da página denominada \"{{FULLPAGENAME}}\" não existe.\n\nIsto é geralmente causado por seguir um link de histórico desatualizado para uma página que foi eliminada.\nOs detalhes podem ser encontrados no [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registo de eliminação].",
+       "missing-revision": "A revisão #$1 da página denominada \"{{FULLPAGENAME}}\" não existe.\n\nIsto é geralmente causado por seguir uma ligação de histórico desatualizada para uma página que foi eliminada.\nOs detalhes podem ser encontrados no [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registo de eliminação].",
        "userpage-userdoesnotexist": "A conta \"<nowiki>$1</nowiki>\" não se encontra registada.\nVerifique se deseja realmente criar ou editar esta página, por favor.",
        "userpage-userdoesnotexist-view": "A conta de utilizador \"$1\" não está registada.",
        "blocked-notice-logextract": "Este utilizador está bloqueado.\nPara referência, o último registo de bloqueio é apresentado abaixo:",
        "nocreate-loggedin": "Não possui permissão para criar novas páginas.",
        "sectioneditnotsupported-title": "Edição de seções não é suportada",
        "sectioneditnotsupported-text": "A edição de seções não é suportada nesta página de edição.",
-       "permissionserrors": "Erros de permissões",
+       "permissionserrors": "Erro de permissão",
        "permissionserrorstext": "Não possui permissão para fazer isso, {{PLURAL:$1|pelo seguinte motivo|pelos seguintes motivos}}:",
        "permissionserrorstext-withaction": "Não possui permissão para $2, {{PLURAL:$1|pelo seguinte motivo|pelos seguintes motivos}}:",
        "recreate-moveddeleted-warn": "'''Aviso: Está a recriar uma página anteriormente eliminada.'''\n\nVerifique se é apropriado continuar a editar esta página.\nPara sua conveniência, é apresentado de seguida o registo de eliminação e de movimento da página:",
        "post-expand-template-argument-category": "Páginas com omissão de argumentos para predefinições",
        "parser-template-loop-warning": "Ciclo de predefinições detectado: [[$1]]",
        "parser-template-recursion-depth-warning": "Foi excedido o limite da profundidade de recursividade nas predefinições ($1)",
-       "language-converter-depth-warning": "O limite de profundidade do conversor de línguas excedeu a ($1)",
+       "language-converter-depth-warning": "O limite de profundidade do conversor de idiomas excedeu a ($1)",
        "node-count-exceeded-category": "Páginas em que o total de nós é excedido",
+       "node-count-exceeded-category-desc": "Uma categoria para páginas onde a contagem dos nós foi excedida.",
        "node-count-exceeded-warning": "A página excedeu o total de nós",
        "expansion-depth-exceeded-category": "Páginas em que a profundidade de expansão é excedida",
+       "expansion-depth-exceeded-category-desc": "Uma categoria para páginas onde a profundidade de expansão foi excedida.",
        "expansion-depth-exceeded-warning": "A página excedeu a profundidade de expansão",
        "parser-unstrip-loop-warning": "Foi detectado um ciclo infinito unstrip",
        "parser-unstrip-recursion-limit": "Limite de recursão do unstrip excedido ($1)",
        "mergehistory-from": "Página de origem:",
        "mergehistory-into": "Página de destino:",
        "mergehistory-list": "Histórico de edições fundíveis",
-       "mergehistory-merge": "As seguintes edições de [[:$1]] podem ser fundidas em [[:$2]].\nUsando os botões de opção, pode escolher fundir apenas as edições até àquela que marcar.\nNote que, se usar os links de navegação, os botões de opção voltarão aos valores originais.",
+       "mergehistory-merge": "As seguintes edições de [[:$1]] podem ser fundidas em [[:$2]].\nUsando os botões de opção, pode escolher fundir apenas as edições até àquela que marcar.\nNote que, se usar as ligações de navegação, os botões de opção voltarão aos valores originais.",
        "mergehistory-go": "Mostrar edições que podem ser fundidas",
        "mergehistory-submit": "Fundir edições",
        "mergehistory-empty": "Não existem revisões fundíveis.",
        "diff-multi-sameuser": "(Há {{PLURAL:$1|uma edição intermédia|$1 edições intermédias}} do mesmo utilizador que não estão a ser apresentadas)",
        "diff-multi-otherusers": "(Há {{PLURAL:$1|uma revisão intermédia|$1 revisões intermédias}} de {{PLURAL:$2|outro utilizador|$2 utilizadores}} que não {{PLURAL:$1|está a ser apresentada|estão a ser apresentadas}})",
        "diff-multi-manyusers": "({{PLURAL:$1|Uma edição intermédia|$1 edições intermédias}} de mais de {{PLURAL:$2|um utilizador|$2 utilizadores}} não {{PLURAL:$1|apresentada|apresentadas}})",
-       "difference-missing-revision": "{{PLURAL:$2|Uma revisão|$2 revisões}} desta diferença ($1) não {{PLURAL:$2|foi encontrada|foram encontradas}}.\n\nIsto é geralmente causado por seguir um link de histórico desatualizado para uma página que foi eliminada.\nOs detalhes podem ser encontrados no [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registo de eliminação].",
+       "difference-missing-revision": "{{PLURAL:$2|Uma revisão|$2 revisões}} desta diferença ($1) não {{PLURAL:$2|foi encontrada|foram encontradas}}.\n\nIsto é geralmente causado por seguir uma ligação de histórico desatualizada para uma página que foi eliminada.\nOs detalhes podem ser encontrados no [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registo de eliminação].",
        "searchresults": "Resultados da pesquisa",
        "searchresults-title": "Resultados da pesquisa de \"$1\"",
        "toomanymatches": "Foram devolvidos demasiados resultados; tente outro termo de pesquisa, por favor",
        "rows": "Linhas:",
        "columns": "Colunas:",
        "searchresultshead": "Pesquisar",
-       "stub-threshold": "Links para páginas curtas terão <a href=\"#\" class=\"stub\">este formato</a> se elas ocuparem menos de (bytes):",
+       "stub-threshold": "Ligações para páginas curtas terão <a href=\"#\" class=\"stub\">este formato</a> se ocuparem menos de (bytes):",
        "stub-threshold-disabled": "Desativado",
        "recentchangesdays": "Dias a apresentar nas mudanças recentes:",
        "recentchangesdays-max": "Máximo: $1 {{PLURAL:$1|dia|dias}}",
        "prefs-emailconfirm-label": "Confirmação do endereço:",
        "youremail": "Correio eletrónico:",
        "username": "Nome de {{GENDER:$1|utilizador|utilizadora}}:",
-       "uid": "Identificação de {{GENDER:$1|utilizador|utilizadora}}:",
        "prefs-memberingroups": "{{GENDER:$2|Membro}} {{PLURAL:$1|do grupo|dos grupos}}:",
        "prefs-registration": "Hora de registo:",
        "yourrealname": "Nome verdadeiro:",
        "email": "Correio eletrónico",
        "prefs-help-realname": "O fornecimento do nome verdadeiro é opcional.\nSe optar por revelá-lo, ele será utilizado para atribuir-lhe crédito pelo seu trabalho.",
        "prefs-help-email": "Opcional: o endereço de correio eletrónico é opcional, mas será necessário para redefinir a palavra-chave caso esqueça a antiga.",
-       "prefs-help-email-others": "Também pode optar por permitir que outros entrem em contacto consigo por correio eletrónico, através de um link nas suas páginas de utilizador ou de discussão, sem revelar o seu endereço de correio eletrónico.",
+       "prefs-help-email-others": "Também pode optar por permitir que outros entrem em contacto consigo por correio eletrónico, através de uma ligação nas suas páginas de utilizador ou de discussão, sem revelar o seu endereço de correio eletrónico.",
        "prefs-help-email-required": "É necessário o endereço de correio eletrónico.",
        "prefs-info": "Informações básicas",
        "prefs-i18n": "Internacionalização",
        "prefs-tabs-navigation-hint": "Dica: Pode usar as setas direita e esquerda do teclado para navegar entre os separadores.",
        "email-address-validity-valid": "Parece válido",
        "email-address-validity-invalid": "Endereço válido necessário!",
-       "userrights": "Privilégios dos utilizadores",
+       "userrights": "Gestão de privilégios do utilizador",
        "userrights-lookup-user": "Gerir grupos de utilizadores",
        "userrights-user-editname": "Introduza um nome de utilizador:",
        "editusergroup": "Editar grupos do utilizador",
        "right-move": "Mover páginas",
        "right-move-subpages": "Mover páginas com as suas subpáginas",
        "right-move-rootuserpages": "Mover páginas raiz de utilizadores",
+       "right-move-categorypages": "Mover categorias",
        "right-movefile": "Mover ficheiros",
        "right-suppressredirect": "Não criar um redirecionamento do nome antigo quando uma página é movida",
        "right-upload": "Carregar ficheiros",
        "action-move": "mover esta página",
        "action-move-subpages": "mover esta página e as respectivas subpáginas",
        "action-move-rootuserpages": "mover páginas raiz de utilizadores",
+       "action-move-categorypages": "mover categorias",
        "action-movefile": "mover este ficheiro",
        "action-upload": "enviar este ficheiro",
        "action-reupload": "sobrepor este ficheiro existente",
        "recentchangeslinked-feed": "Alterações relacionadas",
        "recentchangeslinked-toolbox": "Alterações relacionadas",
        "recentchangeslinked-title": "Alterações relacionadas com \"$1\"",
-       "recentchangeslinked-summary": "Lista das mudanças recentes a todas as páginas para as quais a página fornecida contém links (ou de todas as que pertencem à categoria fornecida).\nAs suas [[Special:Watchlist|páginas vigiadas]] aparecem a '''negrito'''.",
+       "recentchangeslinked-summary": "Lista das mudanças recentes a todas as páginas para as quais a página fornecida contém ligações (ou de todas as que pertencem à categoria fornecida).\nAs suas [[Special:Watchlist|páginas vigiadas]] aparecem a '''negrito'''.",
        "recentchangeslinked-page": "Nome da página:",
-       "recentchangeslinked-to": "Inversamente, mostrar mudanças às páginas que contêm links para esta",
+       "recentchangeslinked-to": "Inversamente, mostrar mudanças às páginas que contêm ligações para esta",
        "upload": "Carregar ficheiro",
        "uploadbtn": "Carregar ficheiro",
        "reuploaddesc": "Cancelar o envio e voltar ao formulário de carregamento",
        "upload_directory_read_only": "O servidor de internet não possui permissão de escrita no diretório de carregamento de ficheiros ($1).",
        "uploaderror": "Erro ao carregar",
        "upload-recreate-warning": "'''Aviso: Um ficheiro com esse nome foi eliminado ou movido.'''\n\nPara sua conveniência, é apresentado de seguida o registo de eliminação e de movimento da página:",
-       "uploadtext": "Utilize o formulário abaixo para fazer upload de ficheiros novos.\nPara ver ou pesquisar ficheiros anteriormente enviados, consulte a [[Special:FileList|lista de ficheiros]].\nOs reenvios de um ficheiro são também registados no [[Special:Log/upload|registo de uploads]] e as eliminações no [[Special:Log/delete|registo de eliminações]].\n\nPara utilizar um ficheiro numa página, depois de ter feito o upload, insira um link com um dos seguintes formatos:\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:ficheiro.jpg]]</nowiki></code>''' para mostrar uma imagem nas suas dimensões originais;\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:ficheiro.png|200px|thumb|left|texto]]</nowiki></code>''' para mostrar uma imagem com a dimensão horizontal de 200 pixels, dentro de uma caixa, na margem esquerda, contendo 'texto' como descrição (pode usar subconjuntos destas características);\n* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:ficheiro.ogg]]</nowiki></code>''' para apresentar um link direto para o ficheiro em vez de mostrá-lo, quer este tenha por conteúdo uma imagem ou outros dados.",
+       "uploadtext": "Utilize o formulário abaixo para fazer o carregamento de novos ficheiros.\nPara ver ou pesquisar ficheiros anteriormente enviados, consulte a [[Special:FileList|lista de ficheiros]].\nOs reenvios de um ficheiro são também registados no [[Special:Log/upload|registo de carregamentos]] e as eliminações no [[Special:Log/delete|registo de eliminações]].\n\nPara utilizar um ficheiro numa página, depois de ter feito o upload, insira uma ligação com um dos seguintes formatos:\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:ficheiro.jpg]]</nowiki></code>''' para mostrar uma imagem nas suas dimensões originais;\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:ficheiro.png|200px|thumb|left|texto]]</nowiki></code>''' para mostrar uma imagem com a dimensão horizontal de 200 pixels, dentro de uma caixa, na margem esquerda, contendo 'texto' como descrição (pode usar subconjuntos destas características);\n* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:ficheiro.ogg]]</nowiki></code>''' para apresentar uma ligação direta para o ficheiro em vez de mostrá-lo, quer este tenha por conteúdo uma imagem ou outros dados.",
        "upload-permitted": "Tipos de ficheiro permitidos: $1.",
        "upload-preferred": "Tipos de ficheiro preferidos: $1.",
        "upload-prohibited": "Tipos de ficheiro proibidos: $1.",
        "filehist-filesize": "Tamanho do ficheiro",
        "filehist-comment": "Comentário",
        "imagelinks": "Uso do ficheiro",
-       "linkstoimage": "{{PLURAL:$1|A seguinte página contém|As seguintes $1 páginas contêm}} links para este ficheiro:",
-       "linkstoimage-more": "Mais de {{PLURAL:$1|uma página contém|$1 páginas contêm}} links para este ficheiro.\nA lista abaixo apresenta apenas {{PLURAL:$1|a primeira página|as primeiras $1 páginas}}.\nEncontra-se disponível uma [[Special:WhatLinksHere/$2|lista completa]].",
-       "nolinkstoimage": "Nenhuma página contém links para este ficheiro.",
-       "morelinkstoimage": "Ver a [[Special:WhatLinksHere/$1|lista completa]] de páginas que contêm links para este ficheiro.",
+       "linkstoimage": "{{PLURAL:$1|A seguinte página contém ligação|As seguintes $1 páginas contêm ligações}} para este ficheiro:",
+       "linkstoimage-more": "Mais de {{PLURAL:$1|uma página contém ligação|$1 páginas contêm ligações}} para este ficheiro.\nA lista abaixo apresenta apenas {{PLURAL:$1|a primeira página|as primeiras $1 páginas}}.\nEncontra-se disponível uma [[Special:WhatLinksHere/$2|lista completa]].",
+       "nolinkstoimage": "Nenhuma página contém ligação para este ficheiro.",
+       "morelinkstoimage": "Ver a [[Special:WhatLinksHere/$1|lista completa]] de páginas que contêm ligações para este ficheiro.",
        "linkstoimage-redirect": "$1 (redirecionamento de ficheiro) $2",
        "duplicatesoffile": "{{PLURAL:$1|O seguinte ficheiro é duplicado|Os seguintes $1 ficheiros são duplicados}} deste ficheiro ([[Special:FileDuplicateSearch/$2|mais detalhes]]):",
        "sharedupload": "Este ficheiro provém de $1 e pode ser usado por outros projetos.",
        "listduplicatedfiles-summary": "Esta é uma lista de ficheiros cuja suas versões mais recentes são duplicatas da versão mais recente de outros ficheiros. Somente os ficheiros locais são considerados.",
        "listduplicatedfiles-entry": "[[:File:$1|$1]] possui [[$3|{{PLURAL:$2|uma duplicata|$2 duplicatas}}]].",
        "unusedtemplates": "Predefinições não utilizadas",
-       "unusedtemplatestext": "Esta página lista todas as páginas no espaço nominal {{ns:template}} que não são incluídas em nenhuma outra página. Lembre-se de verificar a existência de outros links para as predefinições, antes de eliminá-las.",
-       "unusedtemplateswlh": "outros links",
+       "unusedtemplatestext": "Esta página lista todas as páginas no espaço nominal {{ns:template}} que não são incluídas em nenhuma outra página. Lembre-se de verificar a existência de outras ligações para as predefinições, antes de eliminá-las.",
+       "unusedtemplateswlh": "outras ligações",
        "randompage": "Página aleatória",
        "randompage-nopages": "Não há páginas {{PLURAL:$2|no seguinte espaço nominal|nos seguintes espaços nominais}}: $1.",
        "randomincategory": "Página aleatória na categoria",
        "pageswithprop-prophidden-long": "foi ocultado o valor da propriedade por ser um texto muito longo ($1)",
        "pageswithprop-prophidden-binary": "foi ocultado o valor da propriedade por ser binário ($1)",
        "doubleredirects": "Redirecionamentos duplos",
-       "doubleredirectstext": "Esta página lista todas as páginas que redirecionam para outras páginas de redirecionamento.\nCada linha contém links para o primeiro e segundo redirecionamentos, bem como o destino do segundo redirecionamento, geralmente contendo a verdadeira página de destino, que devia ser o destino do primeiro redirecionamento.\n<del>Entradas cortadas</del> já foram solucionadas.",
+       "doubleredirectstext": "Esta página lista todas as páginas que redirecionam para outras páginas de redirecionamento.\nCada linha contém ligações para o primeiro e segundo redirecionamentos, bem como o destino do segundo redirecionamento, geralmente contendo a verdadeira página de destino, que devia ser o destino do primeiro redirecionamento.\n<del>Entradas cortadas</del> já foram solucionadas.",
        "double-redirect-fixed-move": "[[$1]] foi movida.\nEla foi actualizada automaticamente e agora redirecciona para [[$2]].",
        "double-redirect-fixed-maintenance": "A corrigir automaticamente o redirecionamento duplo de [[$1]] para [[$2]], em um trabalho de manutenção.",
        "double-redirect-fixer": "Corretor de redirecionamentos",
        "brokenredirects": "Redirecionamentos quebrados",
-       "brokenredirectstext": "Os seguintes redirecionamentos ligam para páginas inexistentes:",
+       "brokenredirectstext": "Os seguintes redirecionamentos contêm ligações para páginas inexistentes:",
        "brokenredirects-edit": "editar",
        "brokenredirects-delete": "eliminar",
-       "withoutinterwiki": "Páginas sem links interlínguas",
-       "withoutinterwiki-summary": "As seguintes páginas não têm ligação para versões noutras línguas.",
+       "withoutinterwiki": "Páginas sem ligações interlínguas",
+       "withoutinterwiki-summary": "As seguintes páginas não têm ligação para versões noutros idiomas.",
        "withoutinterwiki-legend": "Prefixo",
        "withoutinterwiki-submit": "Mostrar",
        "fewestrevisions": "Páginas com menos revisões",
        "ntransclusions": "usada {{PLURAL:$1|numa página|em $1 páginas}}",
        "specialpage-empty": "Não existem dados para apresentar.",
        "lonelypages": "Páginas órfãs",
-       "lonelypagestext": "As seguintes páginas não são destino de links nem são transcluídas a partir de outras páginas na {{SITENAME}}.",
+       "lonelypagestext": "As seguintes páginas não são destino de ligação nem são transcluídas a partir de outras páginas na {{SITENAME}}.",
        "uncategorizedpages": "Páginas não categorizadas",
        "uncategorizedcategories": "Categorias não categorizadas",
        "uncategorizedimages": "Ficheiros não categorizados",
        "shortpages": "Páginas curtas",
        "longpages": "Páginas longas",
        "deadendpages": "Páginas sem saída",
-       "deadendpagestext": "As seguintes páginas não contêm links para outras páginas na {{SITENAME}}.",
+       "deadendpagestext": "As seguintes páginas não contêm ligações para outras páginas em {{SITENAME}}.",
        "protectedpages": "Páginas protegidas",
        "protectedpages-indef": "Apenas proteções indefinidas",
        "protectedpages-summary": "Esta página lista páginas existentes que estão protegidas. Para ver os títulos cuja criação está impossibilitada, consulte [[{{#special:ProtectedTitles}}|{{int:protectedtitles}}]].",
        "ancientpages": "Páginas mais antigas",
        "move": "Mover",
        "movethispage": "Mover esta página",
-       "unusedimagestext": "Os seguintes ficheiros existem mas não são usados na wiki.\nNo entanto, outros sites na internet podem ter links para um ficheiro através de uma URL direta e, por isso, podem estar listados ficheiros que estão a ser ativamente usados por entidades externas.",
+       "unusedimagestext": "Os seguintes ficheiros existem mas não são usados na wiki.\nNo entanto, outros sítios na Internet podem ter ligação para um ficheiro através de uma URL direta e, por isso, podem estar listados ficheiros que estão a ser ativamente usados por entidades externas.",
        "unusedcategoriestext": "As seguintes categorias existem, embora nenhuma página ou categoria faça uso delas.",
        "notargettitle": "Sem alvo",
        "notargettext": "Especifique sobre que página alvo ou utilizador pretende executar esta função.",
        "booksources": "Fontes bibliográficas",
        "booksources-search-legend": "Pesquisar referências bibliográficas",
        "booksources-go": "Prosseguir",
-       "booksources-text": "É apresentada abaixo uma lista de links para outros sites na internet que vendem livros novos e usados e talvez possuam informações adicionais sobre os livros que procura:",
+       "booksources-text": "É apresentada abaixo uma lista de ligações para outros sítios na Internet que vendem livros novos e usados e talvez possuam informações adicionais sobre os livros que procura:",
        "booksources-invalid-isbn": "O número ISBN fornecido não parece ser válido; verifique a existência de erros ao copiar da fonte original.",
        "specialloguserlabel": "Executante:",
        "speciallogtitlelabel": "Alvo (página ou utilizador):",
        "log-title-wildcard": "Procurar títulos iniciados por este texto",
        "showhideselectedlogentries": "Mostrar ou ocultar as entradas selecionadas",
        "allpages": "Todas as páginas",
-       "alphaindexline": "$1 até $2",
        "nextpage": "Página seguinte ($1)",
        "prevpage": "Página anterior ($1)",
        "allpagesfrom": "Apresentar páginas desde:",
        "linksearch-ns": "Espaço nominal:",
        "linksearch-ok": "Prosseguir",
        "linksearch-text": "É possível usar caracteres de substituição ''(wildcards)'', tais como \"*.wikipedia.org\".\nÉ necessário, pelo menos, um domínio de topo, por exemplo \"*.org\".<br />\n{{PLURAL:$2|Protocolo suportado|Protocolos suportados}}: <code>$1</code> (será utilizado http:// se não for especificado um protocolo).",
-       "linksearch-line": "Link para $1 na página $2",
+       "linksearch-line": "Ligação para $1 na página $2",
        "linksearch-error": "Caracteres de substituição ''(wildcards)'' só podem ser usados no início do endereço.",
        "listusersfrom": "Mostrar utilizadores começando por:",
        "listusers-submit": "Mostrar",
        "trackingcategories-msg": "Categoria monitorada",
        "trackingcategories-name": "Nome da mensagem",
        "trackingcategories-desc": "Critérios de inclusão",
+       "noindex-category-desc": "A página não é indexada por robôs porque contém a palavra mágica <code><nowiki>__NOINDEX__</nowiki></code> e está num domínio onde o estatuto é permitido.",
        "trackingcategories-nodesc": "Nenhuma descrição disponível.",
        "trackingcategories-disabled": "A categoria está desactivada.",
        "mailnologin": "Não existe endereço de envio",
        "undeleterevdel": "O restauro não será efetuado se resulta na remoção parcial da versão mais recente da página ou ficheiro.\nNestes casos, deverá desmarcar ou revelar a versão eliminada mais recente.",
        "undeletehistorynoadmin": "Esta página foi eliminada. O motivo de eliminação é apresentado no sumário abaixo, junto dos detalhes do utilizador que editou esta página antes de eliminar. O texto atual destas edições eliminadas encontra-se agora apenas disponível para administradores.",
        "undelete-revision": "Edição eliminada da página $1 (das $5 de $4), por $3:",
-       "undeleterevision-missing": "Edição inválida ou não encontrada.\nPode ter usado um link incorreto ou talvez a revisão tenha sido restaurada ou removida do arquivo.",
+       "undeleterevision-missing": "Edição inválida ou não encontrada.\nPode ter usado uma ligação incorreta ou talvez a revisão tenha sido restaurada ou removida do arquivo.",
        "undelete-nodiff": "Não foram encontradas edições anteriores.",
        "undeletebtn": "Restaurar",
        "undeletelink": "ver/restaurar",
        "sp-contributions-uploads": "carregamentos",
        "sp-contributions-logs": "registos",
        "sp-contributions-talk": "discussão",
-       "sp-contributions-userrights": "gestão de privilégios de utilizador",
+       "sp-contributions-userrights": "gestão de privilégios do utilizador",
        "sp-contributions-blocked-notice": "Este utilizador está bloqueado neste momento.\nPara referência é apresentado abaixo o último registo de bloqueio:",
        "sp-contributions-blocked-notice-anon": "Este endereço IP está bloqueado neste momento.\nPara referência é apresentado abaixo o último registo de bloqueio:",
        "sp-contributions-search": "Pesquisar contribuições",
        "sp-contributions-newonly": "Mostrar só edições que são criações de páginas",
        "sp-contributions-submit": "Pesquisar",
        "whatlinkshere": "Páginas afluentes",
-       "whatlinkshere-title": "Páginas que têm links para \"$1\"",
+       "whatlinkshere-title": "Páginas que têm ligações para \"$1\"",
        "whatlinkshere-page": "Página:",
        "linkshere": "As seguintes páginas têm ligação a '''[[:$1]]''':",
        "nolinkshere": "Não existem afluentes para '''[[:$1]]''' com as condições especificadas.",
-       "nolinkshere-ns": "Não existem links para '''[[:$1]]''' no espaço nominal selecionado.",
+       "nolinkshere-ns": "Não existem ligações para '''[[:$1]]''' no espaço nominal selecionado.",
        "isredirect": "página de redirecionamento",
        "istemplate": "inclusão",
-       "isimage": "link para o ficheiro",
+       "isimage": "ligação para ficheiro",
        "whatlinkshere-prev": "{{PLURAL:$1|anterior|$1 anteriores}}",
        "whatlinkshere-next": "{{PLURAL:$1|próximo|próximos $1}}",
-       "whatlinkshere-links": "← links",
+       "whatlinkshere-links": "← ligações",
        "whatlinkshere-hideredirs": "$1 redirecionamentos",
        "whatlinkshere-hidetrans": "$1 transclusões",
-       "whatlinkshere-hidelinks": "$1 links",
-       "whatlinkshere-hideimages": "$1 links para ficheiros",
+       "whatlinkshere-hidelinks": "$1 ligações",
+       "whatlinkshere-hideimages": "$1 ligações para ficheiros",
        "whatlinkshere-filters": "Filtros",
        "autoblockid": "Bloqueio automático nº$1",
        "block": "Bloquear utilizador",
        "ipaddressorusername": "Endereço IP ou nome de utilizador:",
        "ipbexpiry": "Expiração:",
        "ipbreason": "Motivo:",
-       "ipbreason-dropdown": "*Razões comuns para um bloqueio\n** Inserção de informações falsas\n** Remoção de conteúdos de páginas\n** Inserção de \"spam\" para sites externos\n** Inserção de conteúdo sem sentido/incompreensível nas páginas\n** Comportamento intimidador/inoportuno\n** Uso abusivo de contas múltiplas\n** Nome de utilizador inaceitável",
+       "ipbreason-dropdown": "*Razões comuns para um bloqueio\n** Inserção de informações falsas\n** Remoção de conteúdos de páginas\n** Inserção de \"spam\" para sítios externos\n** Inserção de conteúdo sem sentido/incompreensível nas páginas\n** Comportamento intimidador/inoportuno\n** Uso abusivo de contas múltiplas\n** Nome de utilizador inaceitável",
        "ipb-hardblock": "Impedir que utilizadores autenticados editem a partir deste endereço IP",
        "ipbcreateaccount": "Impedir criação de contas de utilizador",
        "ipbemailban": "Impedir utilizador de enviar correio eletrónico",
        "anononlyblock": "apenas anón.",
        "noautoblockblock": "bloqueio automático desativado",
        "createaccountblock": "criação de conta bloqueada",
-       "emailblock": "correio eletrónico bloqueado",
+       "emailblock": "correio electrónico desactivado",
        "blocklist-nousertalk": "impedido de editar a própria página de discussão",
        "ipblocklist-empty": "A lista de bloqueios encontra-se vazia.",
        "ipblocklist-no-results": "O endereço IP ou nome de utilizador procurado não se encontra bloqueado.",
        "block-log-flags-anononly": "apenas utilizadores anónimos",
        "block-log-flags-nocreate": "criação de contas impossibilitada",
        "block-log-flags-noautoblock": "bloqueio automático desativado",
-       "block-log-flags-noemail": "correio eletrónico bloqueado",
+       "block-log-flags-noemail": "correio electrónico desactivado",
        "block-log-flags-nousertalk": "impossibilitado de editar a própria página de discussão",
        "block-log-flags-angry-autoblock": "ativado o bloqueio automático melhorado",
        "block-log-flags-hiddenname": "nome de usuário ocultado",
        "lockedbyandtime": "(por $1 em $2 às $3)",
        "move-page": "Mover $1",
        "move-page-legend": "Mover página",
-       "movepagetext": "Usando o formulário abaixo pode mover esta página e todo o seu histórico de edições para uma página nova com outro nome.\nA página original será transformada num redirecionamento para a página nova.\nPode corrigir de forma automática os redirecionamentos existentes que apontam para a página original.\nCaso escolha não o fazer, após a operação certifique-se de que dela não resultaram  [[Special:DoubleRedirects|redirecionamentos duplos]] ou [[Special:BrokenRedirects|quebrados]].\nÉ da sua responsabilidade verificar que os links continuam a apontar para onde é suposto que apontem.\n\nNote que a página '''não''' será movida se já existir uma página com o novo título, a menos que esta última seja um redirecionamento sem qualquer histórico de edições.\nIsto significa que pode mover uma página de volta para o seu nome original se a tiver movido por engano e que não pode mover uma página para cima de outra já existente.\n\n'''CUIDADO!'''\nNuma página popular esta operação pode representar uma mudança drástica e inesperada;\ncertifique-se de que compreende as consequências da mudança antes de prosseguir, por favor.",
-       "movepagetext-noredirectfixer": "Usando o formulário abaixo, pode alterar o nome de uma página e mover todo o histórico desta para o nome novo.\nA página antiga é transformada numa página de redirecionamento para a nova.\nVerifique a existência de [[Special:DoubleRedirects|redirecionamentos duplos]] ou [[Special:BrokenRedirects|quebrados]].\nÉ da sua responsabilidade certificar-se de que os links continuam a apontar para onde é suposto.\n\nNote que a página '''não''' será movida se já existir uma página com o nome novo, a menos que esta página já existente esteja vazia ou seja uma página de redirecionamento e não tenha um histórico de edições.\nIsto também significa que, se se tiver enganado, pode alterar o nome da página movida de volta para o seu nome original; e que não pode sobrescrever o conteúdo de uma página existente.\n\n'''Aviso!'''\nPara páginas populares, esta operação pode representar uma mudança drástica e inesperada;\ncertifique-se de que compreende as consequências da operação antes de continuar.",
+       "movepagetext": "Usando o formulário abaixo pode mover esta página e todo o seu histórico de edições para uma página nova com outro nome.\nA página original será transformada num redirecionamento para a página nova.\nPode corrigir de forma automática os redirecionamentos existentes que apontam para a página original.\nCaso escolha não o fazer, após a operação certifique-se de que dela não resultaram  [[Special:DoubleRedirects|redirecionamentos duplos]] ou [[Special:BrokenRedirects|quebrados]].\nÉ da sua responsabilidade verificar que as ligações continuam a apontar para onde é suposto que apontem.\n\nNote que a página '''não''' será movida se já existir uma página com o novo título, a menos que esta última seja um redirecionamento sem qualquer histórico de edições.\nIsto significa que pode mover uma página de volta para o seu nome original se a tiver movido por engano e que não pode mover uma página para cima de outra já existente.\n\n'''CUIDADO!'''\nNuma página popular esta operação pode representar uma mudança drástica e inesperada;\ncertifique-se de que compreende as consequências da mudança antes de prosseguir, por favor.",
+       "movepagetext-noredirectfixer": "Usando o formulário abaixo, pode alterar o nome de uma página e mover todo o histórico desta para o nome novo.\nA página antiga é transformada numa página de redirecionamento para a nova.\nVerifique a existência de [[Special:DoubleRedirects|redirecionamentos duplos]] ou [[Special:BrokenRedirects|quebrados]].\nÉ da sua responsabilidade certificar-se de que as ligações continuam a apontar para onde é suposto.\n\nNote que a página '''não''' será movida se já existir uma página com o nome novo, a menos que esta página já existente esteja vazia ou seja uma página de redirecionamento e não tenha um histórico de edições.\nIsto também significa que, se se tiver enganado, pode alterar o nome da página movida de volta para o seu nome original; e que não pode sobrescrever o conteúdo de uma página existente.\n\n'''Aviso!'''\nPara páginas populares, esta operação pode representar uma mudança drástica e inesperada;\ncertifique-se de que compreende as consequências da operação antes de continuar.",
        "movepagetalktext": "Se existir uma página de discussão associada, ela será automaticamente movida, '''a não ser que:'''\n*já exista uma página de discussão com o novo título que não esteja vazia, ou\n*desmarque a correspondente caixa de seleção abaixo.\n\nNestes casos, terá de mover a página de discussão manualmente, ou fundi-la com a existente, se assim desejar.",
        "movearticle": "Mover página",
        "moveuserpage-warning": "'''Aviso:''' Está prestes a mover uma página de utilizador. Note que a página será apenas movida, ''sem'' alterar o nome do utilizador.",
+       "movecategorypage-warning": "<strong>Aviso:</strong> Está prestes a mover uma categoria. Por favor, note que apenas moverá a página da categoria e quaisquer páginas que estejam listadas <em>não</em> serão recategorizadas na nova.",
        "movenologintext": "Precisa de ser um utilizador registado e [[Special:UserLogin|autenticado]] para poder mover uma página.",
        "movenotallowed": "Não tem permissão para mover páginas.",
        "movenotallowedfile": "Não possui permissão para mover ficheiros.",
        "cant-move-user-page": "Não tem permissão para mover páginas de utilizador (pode mover sub-páginas).",
        "cant-move-to-user-page": "Não tem permissão para mover uma página para uma página de utilizador (pode movê-la para uma subpágina de utilizador).",
+       "cant-move-category-page": "Não possui permissão para mover categorias.",
+       "cant-move-to-category-page": "Não possui permissão para mover uma página para uma categoria.",
        "newtitle": "Para novo título",
        "move-watch": "Vigiar esta página",
        "movepagebtn": "Mover página",
        "selfmove": "Os títulos de origem e destino são iguais;\nnão é possível mover uma página para ela mesma.",
        "immobile-source-namespace": "Não é possível mover páginas no espaço nominal \"$1\"",
        "immobile-target-namespace": "Não é possível mover páginas para o espaço nominal \"$1\"",
-       "immobile-target-namespace-iw": "Um link interwikis não é um destino válido para uma movimentação de página.",
+       "immobile-target-namespace-iw": "Uma ligação interlíngua não é um destino válido para uma movimentação de página.",
        "immobile-source-page": "Esta página não pode ser movida.",
        "immobile-target-page": "Não é possível mover para esse título de destino.",
        "bad-target-model": "O destino pretendido usa um modelo de conteúdo diferente. Não é possível converter de $1 para $2.",
        "importfailed": "A importação falhou: $1",
        "importunknownsource": "Tipo da fonte de importação desconhecido",
        "importcantopen": "Não foi possível abrir o ficheiro a importar",
-       "importbadinterwiki": "Link interwikis incorrecto",
+       "importbadinterwiki": "Ligação interlíngua incorreta",
        "importsuccess": "Importação completa!",
        "importnosources": "Não foram definidas fontes de importação transwikis e o carregamento direto de históricos encontra-se desativado.",
        "importnofile": "Nenhum ficheiro de importação foi carregado.",
        "import-invalid-interwiki": "Não é possível importar da wiki especificada.",
        "import-error-edit": "A página \"$1\" não foi importada porque você não tem permissão para editá-la.",
        "import-error-create": "A página \"$1\" não foi importada porque você não tem permissão para criá-la.",
-       "import-error-interwiki": "A página \"$1\" não pode ser importada pois seu nome está reservado para um link externo (interwiki).",
+       "import-error-interwiki": "A página \"$1\" não pode ser importada pois o seu nome está reservado para um ligação externa (interlíngua).",
        "import-error-special": "A página \"$1\" não pode ser importada porque ela pertence a um espaço nominal especial que não permite páginas.",
        "import-error-invalid": "A página \"$1\" não pode ser importada porque seu nome é inválido.",
        "import-error-unserialize": "Revisão $2 da página \"$1\" não pode ser desserializada. Foi relatado que a revisão usava o modelo de conteúdo $3 serializado como $4.",
        "tooltip-pt-watchlist": "Lista de mudanças nas páginas que está a vigiar",
        "tooltip-pt-mycontris": "Lista das suas contribuições",
        "tooltip-pt-login": "É encorajado a autenticar-se, apesar de não ser obrigatório.",
-       "tooltip-pt-logout": "Terminar esta sessão na wiki",
+       "tooltip-pt-logout": "Sair da conta",
        "tooltip-ca-talk": "Discussão sobre o conteúdo da página",
        "tooltip-ca-edit": "Pode editar esta página.\nUtilize o botão \"Antever resultado\" antes de gravar, por favor.",
        "tooltip-ca-addsection": "Iniciar uma nova seção",
        "tooltip-n-recentchanges": "A lista de mudanças recentes nesta wiki.",
        "tooltip-n-randompage": "Carregar página aleatória",
        "tooltip-n-help": "Um local reservado para auxílio.",
-       "tooltip-t-whatlinkshere": "Lista de todas as páginas que contêm links para esta",
-       "tooltip-t-recentchangeslinked": "Mudanças recentes nas páginas para as quais esta contém links",
+       "tooltip-t-whatlinkshere": "Lista de todas as páginas que contêm ligações para esta",
+       "tooltip-t-recentchangeslinked": "Mudanças recentes nas páginas para as quais esta contém ligação",
        "tooltip-feed-rss": "''Feed'' RSS desta página",
        "tooltip-feed-atom": "''Feed'' Atom desta página",
        "tooltip-t-contributions": "Ver as contribuições deste utilizador",
        "tooltip-t-upload": "Upload de ficheiros",
        "tooltip-t-specialpages": "Lista de páginas especiais",
        "tooltip-t-print": "Versão para impressão desta página",
-       "tooltip-t-permalink": "Link permanente para esta versão desta página",
+       "tooltip-t-permalink": "Ligação permanente para esta versão desta página",
        "tooltip-ca-nstab-main": "Ver a página de conteúdo",
        "tooltip-ca-nstab-user": "Ver a página de utilizador",
        "tooltip-ca-nstab-media": "Ver a página de multimédia",
        "creditspage": "Créditos da página",
        "nocredits": "Não há informação disponível sobre os créditos desta página.",
        "spamprotectiontitle": "Filtro de proteção contra spam",
-       "spamprotectiontext": "A página que deseja gravar foi bloqueada pelo filtro de ''spam''.\nEste bloqueio foi provavelmente causado por um link para um site externo que consta da lista negra.",
+       "spamprotectiontext": "A página que deseja gravar foi bloqueada pelo filtro de ''spam''.\nEste bloqueio foi provavelmente causado por uma ligação para um sítio externo que consta da lista negra.",
        "spamprotectionmatch": "O seguinte texto activou o filtro de spam: $1",
        "spambot_username": "MediaWiki limpeza de spam",
-       "spam_reverting": "A reverter para a última revisão que não contém links para $1",
-       "spam_blanking": "Todas as revisões continham links para $1; a esvaziar",
-       "spam_deleting": "Todas as revisões continham links para $1; a eliminar",
+       "spam_reverting": "A reverter para a última revisão que não contém ligação para $1",
+       "spam_blanking": "Todas as revisões continham ligações para $1; a esvaziar",
+       "spam_deleting": "Todas as revisões continham ligações para $1; a eliminar",
        "simpleantispam-label": "Verificação contra spam.\n<strong>NÃO</strong> preencha isto!",
        "pageinfo-title": "Informações sobre \"$1\"",
        "pageinfo-not-current": "Desculpe, é impossível fornecer esta informação para revisões antigas.",
        "newimages-summary": "Esta página especial mostra os ficheiros mais recentemente enviados.",
        "newimages-legend": "Filtrar",
        "newimages-label": "Nome de ficheiro (ou parte dele):",
-       "showhidebots": "($1 robôs)",
+       "newimages-showbots": "Mostrar carregamentos feitos por robôs",
        "noimages": "Nada para ver.",
        "ilsubmit": "Pesquisar",
        "bydate": "por data",
        "saturday-at": "Sábado às $1",
        "sunday-at": "Domingo às $1",
        "yesterday-at": "Ontem às $1",
-       "bad_image_list": "O formato é o seguinte:\n\nSó são reconhecidos elementos na forma de lista (linhas começadas por *).\nO primeiro link em cada linha deve apontar para o ficheiro que se pretende bloquear.\nQuaisquer outros links nessa mesma linha são considerados excepções (ou seja, páginas de onde se pode aceder ao ficheiro).",
+       "bad_image_list": "O formato é o seguinte:\n\nSó são reconhecidos elementos na forma de lista (linhas começadas por *).\nO primeiro link em cada linha deve apontar para o ficheiro que se pretende bloquear.\nQuaisquer outras ligações nessa mesma linha são considerados excepções (ou seja, páginas de onde se pode aceder ao ficheiro).",
        "metadata": "Metadados",
        "metadata-help": "Este ficheiro contém informação adicional, provavelmente acrescentada pela câmara digital ou pelo digitalizador usados para criá-lo.\nCaso o ficheiro tenha sido modificado a partir do seu estado original, alguns detalhes poderão não refletir completamente as mudanças efetuadas.",
        "metadata-expand": "Mostrar detalhes adicionais",
        "exif-originaldocumentid": "Identificação exclusiva do documento original",
        "exif-licenseurl": "URL da licença",
        "exif-morepermissionsurl": "Informações para licenciamento alternativo",
-       "exif-attributionurl": "Ao reutilizar esta obra, coloque um link para",
+       "exif-attributionurl": "Ao reutilizar esta obra, faça a atribuição a",
        "exif-preferredattributionname": "Ao reutilizar esta obra, faça a atribuição a",
        "exif-pngfilecomment": "Comentário de ficheiro PNG",
        "exif-disclaimer": "Exoneração de responsabilidade",
        "monthsall": "todos",
        "confirmemail": "Confirmar endereço de correio eletrónico",
        "confirmemail_noemail": "Não tem um endereço de correio eletrónico válido nas suas [[Special:Preferences|preferências de utilizador]].",
-       "confirmemail_text": "A {{SITENAME}} requer que valide o seu endereço de correio eletrónico antes de usar as funcionalidades de correio.\nClique o botão abaixo para enviar uma mensagem de confirmação para o seu endereço.\nA mensagem incluirá uma URL que contém um código;\ninsira a URL no seu browser para confirmar que o seu endereço de correio eletrónico é válido.",
+       "confirmemail_text": "{{SITENAME}} requer que valide o seu endereço de correio eletrónico antes de usar as funcionalidades de correio.\nClique o botão abaixo para enviar uma mensagem de confirmação para o seu endereço.\nA mensagem incluirá uma URL que contém um código;\ninsira a URL no seu navegador para confirmar que o seu endereço de correio eletrónico é válido.",
        "confirmemail_pending": "Um código de confirmação já lhe foi enviado;\ncaso tenha criado a conta recentemente, é recomendado que aguarde alguns minutos até o receber antes de tentar pedir um novo código.",
        "confirmemail_send": "Enviar código de confirmação",
        "confirmemail_sent": "Correio de confirmação enviado.",
        "confirmemail_success": "O seu endereço de correio eletrónico foi confirmado.\nPode agora [[Special:UserLogin|autenticar-se]] e desfrutar da wiki.",
        "confirmemail_loggedin": "O seu endereço de correio eletrónico foi confirmado.",
        "confirmemail_subject": "Confirmação de endereço de correio eletrónico da {{SITENAME}}",
-       "confirmemail_body": "Alguém, provavelmente você a partir do endereço IP $1,\nregistou uma conta \"$2\" com este endereço de correio eletrónico na {{SITENAME}}.\n\nPara confirmar que esta conta é realmente sua e ativar\nas funcionalidades de correio eletrónico na {{SITENAME}},\nabra o seguinte link no seu browser:\n\n$3\n\nSe a conta *não* é sua, abra o seguinte link para cancelar\na confirmação do endereço de correio eletrónico:\n\n$5\n\nEste código de confirmação expira a $4.",
-       "confirmemail_body_changed": "Alguém, provavelmente você a partir do endereço IP $1,\nalterou o endereço de correio eletrónico da conta \"$2\" para este na {{SITENAME}}.\n\nPara confirmar que esta conta é realmente sua e reativar\nas funcionalidades de correio eletrónico na {{SITENAME}},\nabra o seguinte link no seu browser:\n\n$3\n\nCaso a conta *não* lhe pertença, abra o seguinte link\npara cancelar a confirmação do endereço de correio eletrónico:\n\n$5\n\nEste código de confirmação expira a $4.",
-       "confirmemail_body_set": "Alguém, provavelmente você a partir do endereço IP $1,\ndefiniu o seu endereço de correio eletrónico como correio da conta \"$2\" na {{SITENAME}}.\n\nPara confirmar que esta conta é realmente sua e reativar\nas funcionalidades de correio eletrónico na {{SITENAME}},\nabra o seguinte link no seu browser:\n\n$3\n\nCaso a conta *não* lhe pertença, abra o seguinte link\npara cancelar a confirmação do endereço de correio eletrónico:\n\n$5\n\nEste código de confirmação expira a $4.",
+       "confirmemail_body": "Alguém, provavelmente você a partir do endereço IP $1,\nregistou uma conta \"$2\" com este endereço de correio electrónico em {{SITENAME}}.\n\nPara confirmar que esta conta é realmente sua e activar\nas funcionalidades de correio electrónico em {{SITENAME}}, abra a seguinte ligação no seu navegador:\n\n$3\n\nSe a conta *não* é sua, abra a seguinte ligação para cancelar a confirmação do endereço de correio electrónico:\n\n$5\n\nEste código de confirmação expira a $4.",
+       "confirmemail_body_changed": "Alguém, provavelmente você a partir do endereço IP $1,\nalterou o endereço de correio eletrónico da conta \"$2\" para este em {{SITENAME}}.\n\nPara confirmar que esta conta é realmente sua e reativar\nas funcionalidades de correio eletrónico em {{SITENAME}},\nabra o seguinte ligação no seu navegador:\n\n$3\n\nCaso a conta *não* lhe pertença, abra a seguinte ligação\npara cancelar a confirmação do endereço de correio eletrónico:\n\n$5\n\nEste código de confirmação expira a $4.",
+       "confirmemail_body_set": "Alguém, provavelmente você a partir do endereço IP $1,\ndefiniu o seu endereço de correio eletrónico como correio da conta \"$2\" em {{SITENAME}}.\n\nPara confirmar que esta conta é realmente sua e reativar\nas funcionalidades de correio eletrónico em {{SITENAME}},\nabra a seguinte ligação no seu navegador:\n\n$3\n\nCaso a conta *não* lhe pertença, abra a seguinte ligação\npara cancelar a confirmação do endereço de correio eletrónico:\n\n$5\n\nEste código de confirmação expira a $4.",
        "confirmemail_invalidated": "Confirmação de endereço de correio eletrónico cancelada",
        "invalidateemail": "Cancelar confirmação do correio eletrónico",
        "scarytranscludedisabled": "[Transclusão interwikis foi impossibilitada]",
        "watchlistedit-raw-done": "A sua lista de páginas vigiadas foi atualizada.",
        "watchlistedit-raw-added": "{{PLURAL:$1|Foi adicionada uma página|Foram adicionadas $1 páginas}}:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|Foi removida uma página|Foram removidas $1 páginas}}:",
+       "watchlistedit-clear-title": "Lista de páginas vigiadas limpa",
+       "watchlistedit-clear-legend": "Limpar lista de páginas vigiadas",
+       "watchlistedit-clear-explain": "Todos os títulos serão removidos da sua lista de páginas vigiadas.",
+       "watchlistedit-clear-titles": "Páginas:",
+       "watchlistedit-clear-submit": "Limpar páginas vigiadas (isto é permanente!)",
+       "watchlistedit-clear-done": "A sua lista de páginas vigiadas foi limpa.",
+       "watchlistedit-clear-removed": "{{PLURAL:$1|1 página foi removida|$1 páginas foram removidas}}:",
+       "watchlistedit-too-many": "Existem demasiadas páginas para exibir.",
+       "watchlisttools-clear": "Limpar lista de páginas vigiadas",
        "watchlisttools-view": "Ver alterações relevantes",
        "watchlisttools-edit": "Ver e editar a lista de páginas vigiadas",
        "watchlisttools-raw": "Editar a lista de páginas vigiadas em forma de texto",
        "specialpages-group-spam": "Ferramentas anti-spam",
        "blankpage": "Página em branco",
        "intentionallyblankpage": "Esta página foi intencionalmente deixada em branco",
-       "external_image_whitelist": " # Deixe esta linha exatamente como ela está<pre>\n# Coloque fragmentos de expressões regulares (apenas a parte entre //) abaixo\n# Estas serão comparadas com as URLs das imagens externas (com link direto)\n# As que corresponderem serão apresentadas como imagens, caso contrário apenas será apresentado um link para a imagem\n# As linhas que começam com um símbolo de cardinal (#) são tratadas como comentários\n# Esta lista não distingue maiúsculas de minúsculas\n\n# Coloque todos os fragmentos de expressões regulares (regex) acima desta linha. Deixe esta linha exatamente como ela está</pre>",
+       "external_image_whitelist": " # Deixe esta linha exatamente como ela está<pre>\n# Coloque fragmentos de expressões regulares (apenas a parte entre //) abaixo\n# Estas serão comparadas com as URL das imagens externas (com ligação direta)\n# As que corresponderem serão apresentadas como imagens, caso contrário apenas será apresentado um link para a imagem\n# As linhas que começam com um símbolo de cardinal (#) são tratadas como comentários\n# Esta lista não distingue maiúsculas de minúsculas\n\n# Coloque todos os fragmentos de expressões regulares (regex) acima desta linha. Deixe esta linha exatamente como ela está</pre>",
        "tags": "Etiquetas de modificação válidas",
        "tag-filter": "Filtro de [[Special:Tags|etiquetas]]:",
        "tag-filter-submit": "Filtrar",
index 6183506..8f46025 100644 (file)
        "parser-template-recursion-depth-warning": "Parameters:\n* $1 - limit value of recursion depth",
        "language-converter-depth-warning": "Error message shown when a page uses too deeply nested language conversion syntax. Parameters:\n* $1 - the value of the depth limit",
        "node-count-exceeded-category": "This message is used as a category name for a [[mw:Help:Tracking categories|tracking category]] where pages are placed automatically if the node-count of the preprocessor exceeds the limit.\n\nSee also:\n* {{msg-mw|Node-count-exceeded-warning}}",
+       "node-count-exceeded-category-desc": "Node count exceeded category description. Shown on [[Special:TrackingCategories]].\n\nSee also:\n* {{msg-mw|Node-count-exceeded-category}}",
        "node-count-exceeded-warning": "Error message shown when a page exceeded the node-count limit of the preprocessor.\n\nParameters:\n* $1 - (Unused) the value of the node-count limit\n* $2 - (Unused) the value of the max node-count limit\nSee also:\n* {{msg-mw|Node-count-exceeded-category}}",
        "expansion-depth-exceeded-category": "This message is used as a category name for a [[mw:Help:Tracking categories|tracking category]] where pages are placed automatically if the [[meta:Help:Expansion_depth|expansion depth]] of the preprocessor exceeds the limit.",
+       "expansion-depth-exceeded-category-desc": "Expansion depth exceeded category description. Shown on [[Special:TrackingCategories]].\n\nSee also:\n* {{msg-mw|Expansion-depth-exceeded-category}}",
        "expansion-depth-exceeded-warning": "Error message shown when a page exceeded the [[meta:Help:Expansion_depth|expansion depth limit]] of the preprocessor.\n\nParameters:\n* $1 - (Unused) the value of the depth limit\n* $2 - (Unused) the value of the max depth limit\nSee also:\n* {{msg-mw|Expansion-depth-exceeded-category}}",
        "parser-unstrip-loop-warning": "{{Doc-important|Do not translate function name <code>unstrip</code>.}}\nThis error is shown when a parser extension tag such as <code><nowiki><pre></nowiki></code> includes a reference to itself in its own output.\n\nThe reference must be to the exact same invocation of the tag at the same location in the source, merely writing <code><nowiki><pre><pre></pre></pre></nowiki></code> will not do it.\n\nThis is usually impossible and unlikely to happen by accident, so translation is not essential.\n\n\"Unstrip\" refers to the internal function of the parser, called \"unstrip\", which recursively puts the output of parser functions in the place of the parser function call and which would enter an infinite loop in the situation above.\n\nSee also:\n*{{msg-mw|Parser-unstrip-recursion-limit}}",
        "parser-unstrip-recursion-limit": "{{doc-important|Do not translate function name <code>unstrip</code>.}}\nThis message is shown when the recursion limit for nested parser extension tags is exceeded.\n\nThis warning may be encountered due to input text like <code><nowiki><ref><ref><ref>...</ref></ref></ref></nowiki></code>.\n\nParameters:\n* $1 - the depth limit\n\n\"Unstrip\" refers to the internal function of the parser, called 'unstrip', which recursively puts the output of parser functions in the place of the parser function call and which would enter an infinite loop in the situation above.\n\nSee also:\n* {{msg-mw|Parser-unstrip-loop-warning}}",
        "prefs-emailconfirm-label": "Sub-heading in [[Special:Preferences]] > {{int:prefs-personal}} > {{int:email}}.",
        "youremail": "Label of the e-mail text box of the \"E-mail options\" section of [[Special:Preferences]].\nAlso used on create account form.\n\n{{Identical|E-mail}}",
        "username": "Username field in [[Special:Preferences]]. $1 is the current user name for GENDER distinction (depends on sex setting).\n\n{{Identical|Username}}",
-       "uid": "User ID field in [[Special:Preferences]]. $1 is the current user name for GENDER distinction (depends on sex setting).\n\n{{Identical|User ID}}",
        "prefs-memberingroups": "This message is shown on [[Special:Preferences]], first tab.\n\nParameters:\n* $1 - number of user groups\n* $2 - the username for GENDER\nSee also:\n* {{msg-mw|Prefs-memberingroups-type}}",
        "prefs-memberingroups-type": "{{optional}}\nParameters:\n* $1 - list of group names\n* $2 - list of group member names. Label for these is {{msg-mw|Prefs-memberingroups}}",
        "prefs-registration": "Used in [[Special:Preferences]].",
        "right-move": "{{doc-right|move}}\nThe right to move any page that is not protected from moving.\n{{Identical|Move page}}",
        "right-move-subpages": "{{doc-right|move-subpages}}",
        "right-move-rootuserpages": "{{doc-right|move-rootuserpages}}",
+       "right-move-categorypages": "{{doc-right|move-categorypages}}",
        "right-movefile": "{{doc-right|movefile}}",
        "right-suppressredirect": "{{doc-right|suppressredirect}}",
        "right-upload": "{{doc-right|upload}}\nThe right to [[Special:Upload|upload]] a file (this includes images, media, audio, ...).\n{{Identical|Upload file}}",
        "action-move": "{{Doc-action|move}}",
        "action-move-subpages": "{{Doc-action|move-subpages}}",
        "action-move-rootuserpages": "{{Doc-action|move-rootuserpages}}",
+       "action-move-categorypages": "{{Doc-action|move-categorypages}}",
        "action-movefile": "{{doc-action|movefile}}",
        "action-upload": "{{Doc-action|upload}}",
        "action-reupload": "{{Doc-action|reupload}}",
        "showhideselectedlogentries": "Text of the button which brings up the [[mw:RevisionDelete|RevisionDelete]] menu on [[Special:Log]].",
        "allpages": "{{doc-special|AllPages}}\nFirst part of the navigation bar for the special page [[Special:AllPages]] and [[Special:PrefixIndex]].\nThe other parts are {{msg-mw|Prevpage}} and {{msg-mw|Nextpage}}.\n{{Identical|All pages}}",
        "allpages-summary": "{{doc-specialpagesummary|allpages}}",
-       "alphaindexline": "Used on [[Special:AllPages]] if the main namespace contains more than 960 pages. Indicates the page range displayed behind the link. \"from page $1 to page $2\". $1 is the source page name. $1 is the target page name.",
        "nextpage": "Third part of the navigation bar for the special page [[Special:AllPages]] and [[Special:PrefixIndex]]. $1 is a page title. The other parts are {{msg-mw|Allpages}} and {{msg-mw|Prevpage}}.\n\n{{Identical|Next page}}",
        "prevpage": "Second part of the navigation bar for the special page [[Special:AllPages]] and [[Special:PrefixIndex]]. $1 is a page title. The other parts are {{msg-mw|Allpages}} and {{msg-mw|Nextpage}}.\n\n{{Identical|Previous page}}",
        "allpagesfrom": "Option in [[Special:AllPages]].\n\nSee also:\n* {{msg-mw|allpagesto}}",
        "movepagetalktext": "Text on the special 'Move page'. This text only appears if the talk page is not empty.",
        "movearticle": "The text before the name of the page that you are moving. Can be translated as \"Page that is going to be moved\". Used in [[Special:MovePage]].\n\nSee also:\n* {{msg-mw|move-page-legend|legend for the form}}\n* {{msg-mw|newtitle|label for new title}}\n* {{msg-mw|movereason|label for textarea}}\n* {{msg-mw|movetalk|label for checkbox}}\n* {{msg-mw|move-leave-redirect|label for checkbox}}\n* {{msg-mw|fix-double-redirects|label for checkbox}}\n* {{msg-mw|move-subpages|label for checkbox}}\n* {{msg-mw|move-talk-subpages|label for checkbox}}\n* {{msg-mw|move-watch|label for checkbox}}\n{{Identical|Move page}}",
        "moveuserpage-warning": "Used as warning in [[Special:MovePage]], when moving a user page.",
-       "movenologintext": "Text of message on special page 'Permissions Errors', which appears when somebody tries to move a page without being logged in.\n\nSee also:\n* {{msg-mw|cant-move-user-page}}\n* {{msg-mw|cant-move-to-user-page}}\n* {{msg-mw|movenotallowedfile}}\n* {{msg-mw|movenotallowed}}",
-       "movenotallowed": "Used as error message.\n\nSee also:\n* {{msg-mw|cant-move-user-page}}\n* {{msg-mw|cant-move-to-user-page}}\n* {{msg-mw|movenotallowedfile}}\n* {{msg-mw|movenologintext}}",
-       "movenotallowedfile": "Used as error message.\n\nSee also:\n* {{msg-mw|cant-move-user-page}}\n* {{msg-mw|cant-move-to-user-page}}\n* {{msg-mw|movenotallowed}}\n* {{msg-mw|movenologintext}}",
-       "cant-move-user-page": "Used as error message.\n\nSee also:\n* {{msg-mw|cant-move-to-user-page}}\n* {{msg-mw|movenotallowedfile}}\n* {{msg-mw|movenotallowed}}\n* {{msg-mw|movenologintext}}",
-       "cant-move-to-user-page": "Used as error message.\n\nSee also:\n* {{msg-mw|cant-move-user-page}}\n* {{msg-mw|movenotallowedfile}}\n* {{msg-mw|movenotallowed}}\n* {{msg-mw|movenologintext}}",
+       "movecategorypage-warning": "Used as warning in [[Special:MovePage]], when moving a category page.",
+       "movenologintext": "Text of message on special page 'Permissions Errors', which appears when somebody tries to move a page without being logged in.\n\nSee also:\n* {{msg-mw|cant-move-user-page}}\n* {{msg-mw|cant-move-to-user-page}}\n* {{msg-mw|cant-move-category-page}}\n* {{msg-mw|cant-move-to-category-page}}\n* {{msg-mw|movenotallowedfile}}\n* {{msg-mw|movenotallowed}}",
+       "movenotallowed": "Used as error message.\n\nSee also:\n* {{msg-mw|cant-move-user-page}}\n* {{msg-mw|cant-move-to-user-page}}\n* {{msg-mw|cant-move-category-page}}\n* {{msg-mw|cant-move-to-category-page}}\n* {{msg-mw|movenotallowedfile}}\n* {{msg-mw|movenologintext}}",
+       "movenotallowedfile": "Used as error message.\n\nSee also:\n* {{msg-mw|cant-move-user-page}}\n* {{msg-mw|cant-move-to-user-page}}\n* {{msg-mw|cant-move-category-page}}\n* {{msg-mw|cant-move-to-category-page}}\n* {{msg-mw|movenotallowed}}\n* {{msg-mw|movenologintext}}",
+       "cant-move-user-page": "Used as error message.\n\nSee also:\n* {{msg-mw|cant-move-to-user-page}}\n* {{msg-mw|cant-move-category-page}}\n* {{msg-mw|cant-move-to-category-page}}\n* {{msg-mw|movenotallowedfile}}\n* {{msg-mw|movenotallowed}}\n* {{msg-mw|movenologintext}}",
+       "cant-move-to-user-page": "Used as error message.\n\nSee also:\n* {{msg-mw|cant-move-user-page}}\n* {{msg-mw|cant-move-category-page}}\n* {{msg-mw|cant-move-to-category-page}}\n* {{msg-mw|movenotallowedfile}}\n* {{msg-mw|movenotallowed}}\n* {{msg-mw|movenologintext}}",
+       "cant-move-category-page": "Used as error message.\n\nSee also:\n* {{msg-mw|cant-move-user-page}}\n* {{msg-mw|cant-move-to-user-page}}\n* {{msg-mw|cant-move-to-category-page}}\n* {{msg-mw|movenotallowedfile}}\n* {{msg-mw|movenotallowed}}\n* {{msg-mw|movenologintext}}",
+       "cant-move-to-category-page": "Used as error message.\n\nSee also:\n* {{msg-mw|cant-move-user-page}}\n* {{msg-mw|cant-move-to-user-page}}\n* {{msg-mw|cant-move-category-page}}\n* {{msg-mw|movenotallowedfile}}\n* {{msg-mw|movenotallowed}}\n* {{msg-mw|movenologintext}}",
        "newtitle": "Used in the special page \"[[Special:MovePage]]\". The text for the inputbox to give the new page title.\n\nSee also:\n* {{msg-mw|Move-page-legend|legend for the form}}\n* {{msg-mw|Movearticle|label for old title}}\n* {{msg-mw|Movereason|label for textarea}}\n* {{msg-mw|Movetalk|label for checkbox}}\n* {{msg-mw|Move-leave-redirect|label for checkbox}}\n* {{msg-mw|Fix-double-redirects|label for checkbox}}\n* {{msg-mw|Move-subpages|label for checkbox}}\n* {{msg-mw|Move-talk-subpages|label for checkbox}}\n* {{msg-mw|Move-watch|label for checkbox}}",
        "move-watch": "The text of the checkbox to watch the pages you are moving from and to. If checked, both the destination page and the original page will be added to the watchlist, even if you decide not to leave a redirect behind.\n\nSee also:\n* {{msg-mw|Move-page-legend|legend for the form}}\n* {{msg-mw|Movearticle|label for old title}}\n* {{msg-mw|Newtitle|label for new title}}\n* {{msg-mw|Movereason|label for textarea}}\n* {{msg-mw|Movetalk|label for checkbox}}\n* {{msg-mw|Move-leave-redirect|label for checkbox}}\n* {{msg-mw|Fix-double-redirects|label for checkbox}}\n* {{msg-mw|Move-subpages|label for checkbox}}\n* {{msg-mw|Move-talk-subpages|label for checkbox}}",
        "movepagebtn": "Button label on the special 'Move page'.\n\n{{Identical|Move page}}",
        "movenosubpage": "See also:\n* {{msg-mw|movesubpage|section header}}\n* {{msg-mw|movenosubpage|without subpage}}\n* {{msg-mw|movesubpagetext|with subpages}}",
        "movereason": "Used in [[Special:MovePage]]. The text for the inputbox to give a reason for the page move.\n\nSee also:\n* {{msg-mw|Move-page-legend|legend for the form}}\n* {{msg-mw|Movearticle|label for old title}}\n* {{msg-mw|Newtitle|label for new title}}\n* {{msg-mw|Movetalk|label for checkbox}}\n* {{msg-mw|Move-leave-redirect|label for checkbox}}\n* {{msg-mw|Fix-double-redirects|label for checkbox}}\n* {{msg-mw|Move-subpages|label for checkbox}}\n* {{msg-mw|Move-talk-subpages|label for checkbox}}\n* {{msg-mw|Move-watch|label for checkbox}}\n{{Identical|Reason}}",
        "move-redirect-text": "{{ignored}}The text that's added to a redirected page when that redirect is created.",
+       "category-move-redirect-override": "{{ignored}}The text that's added to a redirected category page when that redirect is created.",
        "revertmove": "{{Identical|Revert}}",
        "delete_and_move": "Button text on the move page when the target page already exists.",
        "delete_and_move_text": "Used when moving a page, but the destination page already exists and needs deletion.\n\nThis message is to confirm that you really want to delete the page.\n\nParameters:\n* $1 - the destination page title\n\nSee also:\n* {{msg-mw|Delete and move confirm}}",
        "newimages-summary": "This message is displayed at the top of [[Special:NewImages]] to explain what is shown on that special page.",
        "newimages-legend": "Caption of the fieldset for the filter on [[Special:NewImages]]\n\n{{Identical|Filter}}",
        "newimages-label": "Caption of the filter editbox on [[Special:NewImages]]",
-       "showhidebots": "This is shown on the special page [[Special:NewImages]]. The format is \"{{int:showhidebots|[[MediaWiki:Hide/{{SUBPAGENAME}}|{{int:hide}}]]}}\" or \"{{int:showhidebots|[[MediaWiki:Show/{{SUBPAGENAME}}|{{int:show}}]]}}\"\n\n{{Identical|$1 bots}}",
+       "newimages-showbots": "Used as label for a checkbox. When checked, [[Special:NewImages]] will also display uploads by users in the bots group.",
        "noimages": "This is shown on the special page [[Special:NewImages]], when there aren't any recently uploaded files.",
        "ilsubmit": "Used as label for input box in the MIMESearch form on [[Special:MIMESearch]].\n\nSee also:\n* {{msg-mw|Mimesearch|page title}}\n* {{msg-mw|Mimetype|label for input box}}\n{{Identical|Search}}",
        "bydate": "{{Identical|Date}}",
        "variantname-shi-tfng": "{{optional}}",
        "variantname-shi-latn": "{{optional}}",
        "variantname-shi": "{{optional}}",
+       "variantname-uz": "{{optional}}",
+       "variantname-uz-latn": "{{optional}}",
+       "variantname-uz-cyrl": "{{optional}}",
        "metadata": "The title of a section on an image description page, with information and data about the image. For example of message in use see [[commons:File:Titan-crystal_bar.JPG|Commons]].\n{{Identical|Metadata}}",
        "metadata-help": "This message is followed by a table with metadata.",
        "metadata-expand": "On an image description page, there is mostly a table containing data (metadata) about the image. The most important data are shown, but if you click on this link, you can see more data and information. For the link to hide back the less important data, see {{msg-mw|Metadata-collapse}}.",
        "exif-gpsdifferential": "Label for EXIF information. Indicates whether differential correction is applied to the GPS receiver.",
        "exif-coordinate-format": "{{optional}}\nFor formatting GPS latitude coordinates. Parameters:\n* $1 - degrees\n* $2 - minutes\n* $3 - seconds (up to two decimal places)\n* $4 - direction (N, S, W, or E)\n* $5 - (Unused) coordinate as a single positive or negative real number",
        "exif-jpegfilecomment": "This is not a true exif tag, but the contents of the JPEG COM segment. This often contains a file source, but can potentially contain any comment about the file. This is similar to {{msg-mw|exif-usercomment}}, {{msg-mw|exif-pngfilecomment}}, and {{msg-mw|exif-giffilecomment}}.",
-       "exif-keywords": "List of keywords for the photograph (or other media).\n\nThis can come from IPTC-iim 2:25 keyword field, or XMP's dc:subject field.",
+       "exif-keywords": "List of keywords for the photograph (or other media).\n\nThis can come from IPTC-iim 2:25 keyword field, or XMP's dc:subject field.\n{{Identical|Keyword}}",
        "exif-worldregioncreated": "The world region (generally that means continent, but could also include 'World' as a whole) where the media was created.",
        "exif-countrycreated": "Country that the picture was taken in. Note this is where it was taken, not what country is depicted in the picture.",
        "exif-countrycodecreated": "ISO Code for the country that the picture was taken in. Note this is where it was taken, not what country is depicted in the picture.",
        "descending_abbrev": "Abbreviation of descending order.\nSee also:\n* {{msg-mw|Ascending abbrev}}\n* {{msg-mw|Descending abbrev}}",
        "table_pager_next": "Used as image button text of pager. See [[Support|example]] (the bottom of the page).\n{{Identical|Next page}}",
        "table_pager_prev": "Used as image button text of pager. See [[Support|example]] (the bottom of the page).\n{{Identical|Previous page}}",
-       "table_pager_first": "Used as image button text of pager. See [[Support|example]] (the bottom of the page).",
-       "table_pager_last": "Used as image button text of pager. See [[Support|example]] (the bottom of the page).",
+       "table_pager_first": "Used as image button text of pager. See [[Support|example]] (the bottom of the page).\n{{Identical|First page}}",
+       "table_pager_last": "Used as image button text of pager. See [[Support|example]] (the bottom of the page).\n{{Identical|Last page}}",
        "table_pager_limit": "Do not use PLURAL in this message, because ''$1'' is not the actual number. ''$1'' is a limit selector drop-down list.",
        "table_pager_limit_label": "Used as label for input field.",
        "table_pager_limit_submit": "{{Identical|Go}}",
        "watchlistedit-raw-done": "A message which appears after the raw watchlist has been updated using [[Special:Watchlist/raw]].",
        "watchlistedit-raw-added": "Message on [[Special:EditWatchlist/raw]].\n\nThe message appears after at least 1 message is added to the raw watchlist.\n\nFollowed by list of page titles which are added.\n\nParameters:\n* $1 - number of page titles which are added\nSee also:\n* {{msg-mw|Watchlistedit-normal-done}}\n* {{msg-mw|Watchlistedit-raw-removed}}",
        "watchlistedit-raw-removed": "Message on [[Special:EditWatchlist/raw]].\n\nThe message appears after at least 1 message is deleted from the raw watchlist.\n\nFollowed by list of page titles which are removed.\n\nParameters:\n* $1 - number of page titles which are removed\nSee also:\n* {{msg-mw|Watchlistedit-normal-done}}\n* {{msg-mw|Watchlistedit-raw-added}}",
+       "watchlistedit-clear-title": "Used as page title in [[Special:Watchlist/clear]].",
+       "watchlistedit-clear-legend": "Heading of dialog box on [[Special:Watchlist/clear]].\n{{Identical|Clear watchlist}}",
+       "watchlistedit-clear-explain": "Used as intro text on [[Special:Watchlist/clear]].\n\nPreceded by the fieldset label {{msg-mw|Watchlistedit-clear-legend}}.\n\nFollowed by the button {{msg-mw|Watchlistedit-clear-submit}}.",
+       "watchlistedit-clear-titles": "Text above edit box containing items being watched on [[Special:Watchlist/clear]].\n{{Identical|Title}}",
+       "watchlistedit-clear-submit": "Text of submit button on [[Special:Watchlist/clear]].\n{{Identical|Clear watchlist}}",
+       "watchlistedit-clear-done": "A message which appears after the watchlist has been cleared using [[Special:Watchlist/clear]].",
+       "watchlistedit-clear-removed": "Message on [[Special:EditWatchlist/clear]].\n\nThe message appears once the watchlist has been cleared.",
+       "watchlistedit-too-many": "Message on [[Special:EditWatchlist]] that is used when there are too many titles to display.\n\nShown instead of list of the pages.",
+       "watchlisttools-clear": "[[Special:Watchlist]]: Navigation link under the title.\n{{Identical|Clear watchlist}}",
        "watchlisttools-view": "[[Special:Watchlist]]: Navigation link under the title.\n\nSee also:\n* {{msg-mw|watchlisttools-edit}}\n* {{msg-mw|watchlisttools-raw}}",
        "watchlisttools-edit": "[[Special:Watchlist]]: Navigation link under the title.\n\nSee also:\n* {{msg-mw|Watchlisttools-view}}\n* {{msg-mw|Watchlisttools-raw}}",
        "watchlisttools-raw": "[[Special:Watchlist]]: Navigation link under the title.\n\nSee also:\n* {{msg-mw|watchlisttools-view}}\n* {{msg-mw|watchlisttools-edit}}\n{{Identical|Edit raw watchlist}}",
index a4ecfc0..4cb40b3 100644 (file)
@@ -8,7 +8,8 @@
                        "Reedy",
                        "The Evil IP address",
                        "לערי ריינהארט",
-                       "아라"
+                       "아라",
+                       "Fitoschido"
                ]
        },
        "tog-underline": "T'inkikunata uranpi sikwiy",
        "edit-gone-missing": "Manam atirqanichu p'anqata musuqchayta.\nQullusqachá.",
        "edit-conflict": "Tuylla llamk'apuymanta sasachakuy.",
        "edit-no-change": "Manapuni hukchaptiykim, llamk'apusqayki manam hallch'asqachu.",
+       "postedit-confirmation-created": "P'anqaqa kamarisqañam.",
+       "postedit-confirmation-restored": "P'anqaqa musuqmanta kamarisqañam.",
        "postedit-confirmation-saved": "Llamk'apusqaykiqa waqaychasqañam.",
        "edit-already-exists": "Manam atinichu musuq p'anqata kamariyta.\nKachkañam.",
        "defaultmessagetext": "Ñawpaq qillqa",
        "pagemerge-logentry": "[[$1]]-ta [[$2]]-man huñusqa (llamk'apusqakuna $3-kama)",
        "revertmerge": "Huñusqata kutichiy",
        "mergelogpagetext": "Kay qatiqpiqa aswan ñaqha huk p'anqa wiñay kawsaymanta huk p'anqa wiñay kawsayman huñusqakunatam rikunki.",
-       "history-title": "\"$1\" p'anqata hukchasqakunap wiñay kawsaynin",
+       "history-title": "«$1» p’anqata hukchasqakunap wiñay kawsaynin",
        "difference-title": "$1 nisqapaq musuqchasqapura wakin kaynin",
        "difference-title-multipage": "$1, $2 sutiyuq willañiqipura wakin kaynin",
        "difference-multipage": "(P'anqakunaqa manam kaqllachu)",
        "prefs-emailconfirm-label": "E-chaskita takyachiy:",
        "youremail": "E-chaski imamaytayki",
        "username": "{{GENDER:$1|Ruraqpa sutin}}:",
-       "uid": "{{GENDER:$1|Ruraqpa}} ID-nin:",
        "prefs-memberingroups": "Kay {{PLURAL:$1|huñuman|huñukunaman}} {{GENDER:$2|kapuq}}:",
        "prefs-registration": "Hallch'ay pacha:",
        "yourrealname": "Chiqap sutiyki*",
        "log-title-wildcard": "Kaywan qallariq p'anqa sutikunata maskay",
        "showhideselectedlogentries": "Akllasqa hallch'asqakunata rikuchiy/pakay",
        "allpages": "Tukuy p'anqakuna",
-       "alphaindexline": "$1-ta $2-man",
        "nextpage": "Qatiq p'anqa ($1)",
        "prevpage": "Ñawpaq p'anqa ($1)",
        "allpagesfrom": "Rikuchiy kaywan qallariq p'anqakunata:",
        "newimages-summary": "Kay sapaq p'anqapiqa ñaqha churkusqa willañiqikunatam rikunki.",
        "newimages-legend": "Ch'illchina",
        "newimages-label": "Willañiqip sutin (icha sutinpa rakin):",
-       "showhidebots": "($1 rurana antacha)",
        "noimages": "Manam ima rikunallapas kanchu.",
        "ilsubmit": "Maskay",
        "bydate": "p'unchawkama",
index 103336c..b1b19df 100644 (file)
        "newimages-summary": "Questa pagina speziala mussa las davosas datotecas ch'èn vegnidas chargiadas si.",
        "newimages-legend": "Filter",
        "newimages-label": "Num da la datoteca (u ina part da quel):",
-       "showhidebots": "($1 bots)",
        "noimages": "Chattà naginas datotecas.",
        "ilsubmit": "Tschertgar",
        "bydate": "tenor data",
index 1ce2fe2..8ed6f24 100644 (file)
        "pool-timeout": "Timpul alocat așteptării pentru blocare a expirat",
        "pool-queuefull": "Coada de așteptare este plină",
        "pool-errorunknown": "Eroare necunoscută",
+       "pool-servererror": "Serviciul de contorizare a rezervei nu este disponibil ($1).",
        "aboutsite": "Despre {{SITENAME}}",
        "aboutpage": "Project:Despre",
        "copyright": "Conținutul este disponibil sub $1, exceptând cazurile în care se specifică altfel.",
        "search-result-size": "$1 ({{PLURAL:$2|1 cuvânt|$2 cuvinte}})",
        "search-result-category-size": "$1 {{PLURAL:$1|element|elemente}} ($2 {{PLURAL:$2|categorie|categorii}}, $3 {{PLURAL:$3|fișier|fișiere}})",
        "search-result-score": "Relevanță: $1%",
-       "search-redirect": "(redirecționare către $1)",
+       "search-redirect": "(redirecționare de la $1)",
        "search-section": "(secțiunea $1)",
        "search-file-match": "(se regăsește în conținutul fișierului)",
        "search-suggest": "V-ați referit la: $1",
        "prefs-watchlist": "Listă de urmărire",
        "prefs-watchlist-days": "Numărul de zile care apar în lista paginilor urmărite:",
        "prefs-watchlist-days-max": "Maxim $1 {{PLURAL:$1|zi|zile}}",
-       "prefs-watchlist-edits": "Numărul de editări care apar în lista extinsă a paginilor urmărite:",
+       "prefs-watchlist-edits": "Numărul de modificări care apar în lista extinsă a paginilor urmărite:",
        "prefs-watchlist-edits-max": "Număr maxim: 1000",
        "prefs-watchlist-token": "Jeton pentru lista de pagini urmărite:",
        "prefs-misc": "Parametri diverși",
        "prefs-emailconfirm-label": "Confirmare e-mail:",
        "youremail": "Adresă de e-mail:",
        "username": "{{GENDER:$1|Nume de utilizator}}:",
-       "uid": "ID {{GENDER:$1|utilizator|utilizatoare}}:",
        "prefs-memberingroups": "{{GENDER:$2|Membru|Membră}} în {{PLURAL:$1|grupul|grupurile}}:",
        "prefs-registration": "Data înregistrării:",
        "yourrealname": "Nume real:",
        "right-move": "Redenumește paginile",
        "right-move-subpages": "Redenumește paginile cu tot cu subpagini",
        "right-move-rootuserpages": "Redenumește pagina principală a unui utilizator",
+       "right-move-categorypages": "Redenumește paginile categoriilor",
        "right-movefile": "Redenumește fișiere",
        "right-suppressredirect": "Nu creează o redirecționare de la vechiul nume atunci când redenumește o pagină",
        "right-upload": "Încarcă fișiere",
        "action-move": "redenumiți această pagină",
        "action-move-subpages": "redenumiți această pagină și subpaginile sale",
        "action-move-rootuserpages": "redenumiți pagina principală a unui utilizator",
+       "action-move-categorypages": "redenumiți paginile categoriilor",
        "action-movefile": "redenumiți acest fișier",
        "action-upload": "încărcați acest fișier",
        "action-reupload": "suprascrieți fișierul existent",
        "recentchanges-legend-newpage": "(vedeți și [[Special:NewPages|lista cu pagini noi]])",
        "recentchanges-legend-plusminus": "(''±123'')",
        "rcnotefrom": "Dedesubt sunt modificările începând cu <b>$2</b> (maximum <b>$1</b> afișate).",
-       "rclistfrom": "Se afișează modificările începând cu $3 $2",
+       "rclistfrom": "Se afișează modificările începând cu $3, $2",
        "rcshowhideminor": "$1 modificările minore",
        "rcshowhideminor-show": "Arată",
        "rcshowhideminor-hide": "Ascunde",
        "log-title-wildcard": "Caută titluri care încep cu acest text",
        "showhideselectedlogentries": "Arată/ascunde intrările selectate din jurnal",
        "allpages": "Toate paginile",
-       "alphaindexline": "$1 către $2",
        "nextpage": "Pagina următoare ($1)",
        "prevpage": "Pagina anterioară ($1)",
        "allpagesfrom": "Afișează paginile pornind de la:",
        "listgrouprights-namespaceprotection-namespace": "Spațiu de nume",
        "listgrouprights-namespaceprotection-restrictedto": "Drept(uri) care permit(e) utilizatorului modificări",
        "trackingcategories": "Categorii de urmărire",
-       "trackingcategories-summary": "Această pagină conține categorii de urmărire care sunt populate în mod automat de către software-ul MediaWiki. Numele acestora se pot schimba modificând mesajele de sistem relevante din spațiul de nume {{ns:8}}.",
+       "trackingcategories-summary": "Această pagină conține categorii de urmărire care sunt populate în mod automat de către software-ul MediaWiki. Numele acestora se poate schimba modificând mesajele de sistem relevante din spațiul de nume {{ns:8}}.",
        "trackingcategories-msg": "Categorie de urmărire",
        "trackingcategories-name": "Numele mesajului",
        "trackingcategories-desc": "Criteriile de includere în categorie",
        "noindex-category-desc": "Pagina conține cuvântul magic <code><nowiki>__NOINDEX__</nowiki></code> (aflându-se într-un spațiu de nume care permite acest marcaj) și, drept urmare, nu este indexată de roboți.",
        "index-category-desc": "Pagina conține cuvântul magic <code><nowiki>__INDEX__</nowiki></code> (aflându-se într-un spațiu de nume care permite acest marcaj) și, ca urmare, este indexată de roboți, deși în mod normal acest lucru nu s-ar fi întâmplat.",
        "post-expand-template-inclusion-category-desc": "După extinderea tuturor formatelor, dimensiunea paginii a depășit <code>$wgMaxArticleSize</code>, astfel că anumite formate nu au fost extinse.",
-       "post-expand-template-argument-category-desc": "După extinderea argumentului unui format (ceva plasat între acolade triple, precum <code>{{{Foo}}})</code>, pagina a depășit <code>$wgMaxArticleSize</code>.",
+       "post-expand-template-argument-category-desc": "După extinderea argumentului unui format (ceva plasat între acolade triple, precum <code>{{{Foo}}}</code>), pagina a depășit <code>$wgMaxArticleSize</code>.",
+       "expensive-parserfunction-category-desc": "Prea multe funcții costisitoare de analiză (precum <code>#ifexist</code>) incluse într-o pagină. Vedeți [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit].",
        "broken-file-category-desc": "Categorie adăugată dacă pagina conține o legătură întreruptă către un fișier (o legătură folosită pentru încorporarea unui fișier atunci când fișierul nu există).",
        "hidden-category-category-desc": "Această categorie conține <code><nowiki>__HIDDENCAT__</nowiki></code>, ceea ce împiedică în mod implicit afișarea ei în zona cu legături către categorii din cadrul paginilor.",
        "trackingcategories-nodesc": "Nicio descriere disponibilă.",
        "movepagetalktext": "Pagina de discuții asociată, dacă există, va fi redenumită\nautomat odată cu aceasta în '''afara următoarelor cazuri''':\n* există deja o pagină de discuții cu conținut (care nu este goală) sub noul nume, sau\n* nu bifați căsuța de mai jos.\n\nÎn oricare din cazurile de mai sus va trebui să redenumiți sau să unificați\nmanual paginile de discuții, dacă doriți acest lucru.",
        "movearticle": "Pagina de redenumit:",
        "moveuserpage-warning": "'''Atenție''': sunteți pe cale să redenumiți o pagină de utilizator. Vă rugăm să rețineți că singura redenumită va fi pagina, nu și utilizatorul.",
+       "movecategorypage-warning": "<strong>Atenție:</strong> Sunteți pe cale să redenumiți pagina unei categorii. Rețineți că doar pagina va fi redenumită, iar orice alte pagini conținute în vechea categorie <em>nu</em> vor fi transferate în cea nouă.",
        "movenologintext": "Trebuie să fiți un utilizator înregistrat și [[Special:UserLogin|autentificat]] pentru a redenumi o pagină.",
        "movenotallowed": "Nu aveți permisiunea de a redenumi pagini.",
        "movenotallowedfile": "Nu aveți permisiunea de a redenumi fișiere.",
        "cant-move-user-page": "Nu aveți permisiunea de a redenumi pagini de utilizator (cu excepția subpaginilor).",
        "cant-move-to-user-page": "Nu aveți permisiunea de a redenumi o pagină într-o pagină de utilizator (cu excepția subpaginii utilizatorului).",
+       "cant-move-category-page": "Nu aveți permisiunea de a redenumi paginile categoriilor.",
+       "cant-move-to-category-page": "Nu aveți permisiunea de a redenumi o pagină într-o pagină a unei categorii.",
        "newtitle": "Titlul nou",
        "move-watch": "Urmărește această pagină",
        "movepagebtn": "Redenumește pagina",
        "newimages-summary": "Această pagină specială arată ultimele fișiere încărcate.",
        "newimages-legend": "Filtru",
        "newimages-label": "Numele fișierului (sau parte din el):",
-       "showhidebots": "($1 roboți)",
+       "newimages-showbots": "Arată încărcările roboților",
        "noimages": "Nimic de văzut.",
        "ilsubmit": "Caută",
        "bydate": "după dată",
        "watchlistedit-raw-done": "Lista paginilor urmărite a fost actualizată.",
        "watchlistedit-raw-added": "{{PLURAL:$1|1 titlu a fost adăugat|$1 titluri au fost adăugate}}:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|1 titlu a fost șters|$1 titluri au fost șterse}}:",
+       "watchlistedit-clear-title": "Listă de pagini urmărite golită",
+       "watchlistedit-clear-legend": "Golire listă de pagini urmărite",
+       "watchlistedit-clear-explain": "Toate titlurile vor fi înlăturate din lista dumnevoastră de pagini urmărite",
+       "watchlistedit-clear-titles": "Titluri:",
+       "watchlistedit-clear-submit": "Golește lista de pagini urmărite (ireversibil!)",
+       "watchlistedit-clear-done": "Lista dumnevoastră de pagini urmărite a fost golită.",
+       "watchlistedit-clear-removed": "{{PLURAL:$1|1 titlu a|$1 titlu au|$1 de titluri au}} fost înlăturat{{PLURAL:$1||e|e}}:",
+       "watchlistedit-too-many": "Sunt prea multe pagini care trebuie afișate aici.",
+       "watchlisttools-clear": "Golește lista de pagini urmărite",
        "watchlisttools-view": "Vizualizează schimbările relevante",
        "watchlisttools-edit": "Vezi și modifică lista paginilor urmărite",
        "watchlisttools-raw": "Modifică lista brută a paginilor urmărite",
index 7c191b2..dca8ad2 100644 (file)
        "newimages-summary": "Sta pàgena speciale face vedè l'urteme file carecate.",
        "newimages-legend": "Filtre",
        "newimages-label": "Nome d'u fail (o 'nu stuezze de jidde):",
-       "showhidebots": "($1 bot)",
        "noimages": "Non ge stè ninde da vedè.",
        "ilsubmit": "Cirche",
        "bydate": "pe date",
index 65b1021..68bf9fd 100644 (file)
        "parser-template-recursion-depth-warning": "Превышен предел глубины рекурсии шаблона ($1)",
        "language-converter-depth-warning": "Превышен предел глубины преобразователя языков ($1)",
        "node-count-exceeded-category": "Странице, на которых превышено число узлов",
+       "node-count-exceeded-category-desc": "Категория для страниц, на которых превышено число узлов.",
        "node-count-exceeded-warning": "На странице превышено число узлов",
        "expansion-depth-exceeded-category": "Страницы с превышением глубины раскрытия",
+       "expansion-depth-exceeded-category-desc": "Это категория для страниц с превышением глубины раскрытия.",
        "expansion-depth-exceeded-warning": "На странице превышен предел вложенности",
        "parser-unstrip-loop-warning": "Обнаружен незакрытый pre",
        "parser-unstrip-recursion-limit": "Превышен предел рекурсии ($1)",
        "prefs-emailconfirm-label": "Подтверждение электронной почты:",
        "youremail": "Электронная почта:",
        "username": "{{GENDER:$1|Имя участника|Имя участницы}}:",
-       "uid": "Код {{GENDER:$1|участника|участницы}}:",
        "prefs-memberingroups": "{{GENDER:$2|Член|Член}} {{PLURAL:$1|1=группы|групп}}:",
        "prefs-registration": "Время регистрации:",
        "yourrealname": "Настоящее имя:",
        "right-move": "переименование страниц",
        "right-move-subpages": "переименование страниц с их подстраницами",
        "right-move-rootuserpages": "переименование корневых страниц участников",
+       "right-move-categorypages": "Переименование страниц категорий",
        "right-movefile": "переименование файлов",
        "right-suppressredirect": "не создавать перенаправление со старого имени при переименовании страницы",
        "right-upload": "загрузка файлов",
        "action-move": "переименование этой страницы",
        "action-move-subpages": "переименование этой страницы со всеми её подстраницами",
        "action-move-rootuserpages": "переименование корневых страниц участников",
+       "action-move-categorypages": "переименование страниц категорий",
        "action-movefile": "переименовать этот файл",
        "action-upload": "загрузку этого файла",
        "action-reupload": "перезапись существующего файла",
        "log-title-wildcard": "Найти заголовки, начинающиеся с данных символов",
        "showhideselectedlogentries": "Показать/скрыть выбранные записи журнала",
        "allpages": "Все страницы",
-       "alphaindexline": "от $1 до $2",
        "nextpage": "Следующая страница ($1)",
        "prevpage": "Предыдущая страница ($1)",
        "allpagesfrom": "Вывести страницы, начинающиеся на:",
        "movenotallowedfile": "У вас нет разрешения переименовывать файлы.",
        "cant-move-user-page": "У вас нет разрешения переименовывать основные страницы участников.",
        "cant-move-to-user-page": "У вас нет прав переименовывать страницу в страницу участника (можно переименовать в подстраницу).",
+       "cant-move-category-page": "У вас нет разрешения переименовывать страницы категорий.",
+       "cant-move-to-category-page": "У вас нет разрешения переименовывание страницы в страницу категории.",
        "newtitle": "Новое название",
        "move-watch": "Включить эту страницу в список наблюдения",
        "movepagebtn": "Переименовать страницу",
        "newimages-summary": "На этой служебной странице показаны недавно загруженные файлы.",
        "newimages-legend": "Фильтр",
        "newimages-label": "Имя файла (или его часть):",
-       "showhidebots": "($1 ботов)",
+       "newimages-showbots": "Показать загрузки ботов",
        "noimages": "Изображения отсутствуют.",
        "ilsubmit": "Найти",
        "bydate": "по дате",
        "watchlistedit-raw-done": "Ваш список наблюдения сохранён.",
        "watchlistedit-raw-added": "{{PLURAL:$1|Была добавлена|Было добавлено|Были добавлены}} $1 {{PLURAL:$1|запись|записей|записи}}:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|Была удалена|Было удалено|Были удалены}} $1 {{PLURAL:$1|запись|записей|записи}}:",
+       "watchlistedit-clear-title": "Очищенный список наблюдения",
+       "watchlistedit-clear-legend": "Очистить список наблюдения",
+       "watchlistedit-clear-explain": "Все записи будут удалены из вашего списка наблюдения",
+       "watchlistedit-clear-titles": "Заголовок:",
+       "watchlistedit-clear-submit": "Очистить список наблюдения (это необратимо!)",
+       "watchlistedit-clear-done": "Ваш список наблюдения очищен.",
+       "watchlistedit-clear-removed": "{{PLURAL:$1|Была удалена|Было удалено|Были удалены}} $1 {{PLURAL:$1|запись|записей|записи}}:",
+       "watchlistedit-too-many": "Слишком много страниц для того, чтобы показать их здесь.",
+       "watchlisttools-clear": "Очистить список наблюдения",
        "watchlisttools-view": "Изменения на страницах из списка",
        "watchlisttools-edit": "Смотреть и редактировать список",
        "watchlisttools-raw": "Редактировать как обычный текст",
index 3ada920..4fdf3dc 100644 (file)
        "newimages-summary": "На тій шпеціалній сторінцї ся зображують остатнї наладованы файлы.",
        "newimages-legend": "Філтер",
        "newimages-label": "Назва файлу (або єй часть):",
-       "showhidebots": "($1 ботів)",
        "noimages": "Не є што зобразити.",
        "ilsubmit": "Глядати",
        "bydate": "за датумом",
index ec5f593..f8c8daa 100644 (file)
        "jumptonavigation": "सञ्चरणं",
        "jumptosearch": "अन्वेषणम्",
        "view-pool-error": "क्षम्यताम् ! सद्यः वितरकस्य (server) उपरि बहु कार्यभारः अस्ति । \nबहवः जनाः एतत् पृष्ठं पश्यन्तः सन्ति । \nएतत् पृष्ठं पुनर्द्रष्टुं पतिक्षा क्रियताम् । $1",
+       "generic-pool-error": "क्षम्यताम् ! सद्यः वितरकस्य (server) उपरि बहु कार्यभारः अस्ति । \nबहवः जनाः एतत् पृष्ठं पश्यन्तः सन्ति । \nएतत् पृष्ठं पुनर्द्रष्टुं पतिक्षा क्रियताम् ।",
        "pool-timeout": "संरक्षणार्थं कालावधिः समाप्ता",
        "pool-queuefull": "Pool इति पङ्कतिः पूर्णा अस्ति ।",
        "pool-errorunknown": "अज्ञातदोषः",
        "diff-multi-sameuser": "(अनेन योजकेनैव {{PLURAL:$1|कृतम् एकं संस्करणं न प्रदर्श्यते|क्रितानि $1 संस्करणानि न प्रदर्श्यन्ते}})",
        "diff-multi-otherusers": "({{PLURAL:$2|एकेन अन्ययोजकेन|$2 योजकैः}} {{PLURAL:$1|कृतम् एकं संस्करणं न प्रदर्श्यते|क्रितानि $1 संस्करणानि न प्रदर्श्यन्ते}})",
        "diff-multi-manyusers": "{{PLURAL:$2|एकेन योजकेन कृतं|$2 योजकैः कृतानि}} ({{PLURAL:$1|मध्यस्थम् एकं संस्करणं न प्रदर्शितम् ।|मध्यस्थानि $1 परिवर्तनानि न प्रदर्शितानि ।}})",
-       "difference-missing-revision": "{{PLURAL:$2|One revision|$2 पुनरावृत्तेः }} व्यत्यासः ($1) {{PLURAL:$2|was|were}} न दृष्टः ।\nकारणम् अत्र दृश्यते । [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log].",
+       "difference-missing-revision": "एतस्य भेदस्य {{PLURAL:$2|एकं संस्करणं|$2 संस्करणानि}} ($1) न {{PLURAL:$2|प्राप्तम्|प्राप्तानि}} ।\n\nअपाकृतानां पृष्ठानां संस्करणानाम् अन्वेषणकाले प्रायशः एतादृशं भवति । अधिकं ज्ञातुं [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} अपाकृतानाम् आवलि)] पश्यतु ।",
        "searchresults": "अन्वेषणपरिणामाः",
        "searchresults-title": "\"$1\" कृते अन्वेषणपरिणामाः",
        "toomanymatches": "बहवः परिणामाः प्राप्ताः, कृपया शब्दं परिवर्त्य पुनः अन्विष्यताम्",
        "searcheverything-enable": "सर्वस्मिन् नामाकाशे अन्विष्यताम्",
        "searchrelated": "सम्बद्धानि",
        "searchall": "सर्वाणि",
-       "showingresults": "निम्नगतक्रमाङ्कस्य '''$2''' तः आरभ्य अधिकतमं परिणामः'''$1''' {{PLURAL:$1| दर्शितः}}।",
-       "showingresultsnum": "निम्नगतक्रमाङ्क'''$2'''तः आरभ्य अधिकतमः '''$3''' परिणामः {{PLURAL:$3|दर्शितः}}।",
+       "showingresults": "#'''$2''' क्रमाङ्कात् आरभ्य {{PLURAL:$1|'''$1''' परिणामः अधः प्रदर्शितः|'''$1''' परिणामाः अधः प्रदर्शिताः}}।",
+       "showingresultsinrange": "#'''$2''' क्रमाङ्कात् आरभ्य #'''$3''' क्रमाङ्कपर्यन्तं {{PLURAL:$1|'''$1''' परिणामः अधः प्रदर्शितः|'''$1''' परिणामाः अधः प्रदर्शिताः}}।",
+       "showingresultsnum": "#'''$2''' क्रमाङ्कात् आरभ्य {{PLURAL:$3|'''1''' परिणामः अधः प्रदर्शितः|'''$3''' परिणामाः अधः प्रदर्शिताः}}।",
        "showingresultsheader": "'''$4''' इत्येतस्मै {{PLURAL:$5|'''$1''' परिणामः '''$3''' इत्येषु|'''$1 - $2''' परिणामाः '''$3''' इत्येषु}}",
        "search-nonefound": "भवतः/भवत्याः अपेक्षानुगुणं परिणामः न विद्यते ।",
        "powersearch-legend": "प्रगतम् अन्वेषणम्",
-       "powersearch-ns": "नामाकाशेषु अन्विष्यताम्:",
-       "powersearch-togglelabel": "à¤\86यà¥\80à¤\95ा:",
+       "powersearch-ns": "नामाकाशेषु अन्विष्यताम् :",
+       "powersearch-togglelabel": "परà¥\80à¤\95à¥\8dषà¥\8dयतामà¥\8d :",
        "powersearch-toggleall": "सर्वम्",
-       "powersearch-togglenone": "नासà¥\8dति",
+       "powersearch-togglenone": "नà¥\88à¤\95मपि",
        "search-external": "बाह्यान्वेषणम्",
-       "searchdisabled": "{{SITENAME}} अन्वेषणं निष्क्रियम्\nअश्मिन् समये भवान् गूगल माध्यमेन अन्वेषणं कर्तुं शक्नोति\nस्मरयतु यत् {{SITENAME}} इति स्थलस्य क्रमाङ्का नैव अद्यातना  इति सोच्यते।",
+       "searchdisabled": "{{SITENAME}} इत्यत्र अन्वेषणं कर्तुं न शक्यते ।\nतावता गुगल-माध्यमेन अन्वेषणं कर्तुं शक्यते ।\n'''पूर्वसूचना'''गुगल-जालस्थाने {{SITENAME}} इत्यस्य पुरातना सूचना भवितुम् अर्हति ।",
+       "search-error": "$1 इति अन्वेषणकाले दोषः प्राप्तः :",
        "preferences": "इष्टतमानि",
        "mypreferences": "इष्टतमानि",
        "prefs-edits": "सम्पादनानां सख्याः",
+       "prefsnologintext2": "स्वस्य इष्टतमानि परिवर्तितुं कृपया $1 इत्येनं नुदतु ।",
        "prefs-skin": "त्वक्",
        "skin-preview": "प्राग्दृश्यम्",
-       "datedefault": "वरà¥\80याà¤\82सि à¤¨à¤¾à¤¸्ति",
-       "prefs-labs": "पà¥\8dरयà¥\8bà¤\97शालालà¤\95à¥\8dषणानि à¥¤",
-       "prefs-user-pages": "यà¥\8bà¤\9cà¤\95पà¥\81à¤\9fानि à¥¤",
-       "prefs-personal": "यà¥\8bà¤\9cà¤\95सà¥\8dय à¤°à¥\82परà¥\87à¤\96ा",
+       "datedefault": "à¤\87षà¥\8dà¤\9fतमानि à¤¨ à¤¸à¤¨्ति",
+       "prefs-labs": "पà¥\8dरयà¥\8bà¤\97शालावà¥\88शिषà¥\8dà¤\9fà¥\8dयमà¥\8d",
+       "prefs-user-pages": "यà¥\8bà¤\9cतपà¥\83षà¥\8dठानि",
+       "prefs-personal": "यà¥\8bà¤\9cà¤\95सà¥\8dय à¤µà¤¿à¤µà¤°à¤£à¤®à¥\8d",
        "prefs-rc": "सद्यो जातानि परिवर्तनानि",
-       "prefs-watchlist": "निरà¥\80à¤\95à¥\8dषासà¥\82à¤\9aà¥\80",
-       "prefs-watchlist-days": "दà¥\83षà¥\8dà¤\9fि à¤¸à¥\82à¤\9aà¥\80 à¤¦à¤°à¥\8dशनारà¥\8dथà¥\87  à¤¦à¤¿à¤µà¤¸à¤¾à¤¨à¤¿",
-       "prefs-watchlist-days-max": "अधिकतमानि $1 {{PLURAL:$1|दिनानि}}",
-       "prefs-watchlist-edits": "विसà¥\8dतà¥\83तावलà¥\8bà¤\95नावलà¥\8dयाà¤\82 à¤ªà¥\8dरदरà¥\8dशयितà¥\81मà¥\8d à¤\85तà¥\8dयधिà¤\95परिवरà¥\8dतनानि à¥¤",
-       "prefs-watchlist-edits-max": "अधिकतम संख्या: १०००",
-       "prefs-watchlist-token": "à¤\85वलà¥\8bà¤\95नावलà¥\8dयाà¤\83 à¤ªà¥\8dरतà¥\80à¤\95à¤\83 à¥¤",
-       "prefs-misc": "विविधà¤\83",
+       "prefs-watchlist": "à¤\85वà¥\87à¤\95à¥\8dषणावलिà¤\83",
+       "prefs-watchlist-days": "à¤\85नà¥\87à¤\95à¥\8dषणावलà¥\8dयाà¤\82 à¤¦à¤°à¥\8dशनियानि à¤¦à¤¿à¤¨à¤¾à¤¨à¤¿ :",
+       "prefs-watchlist-days-max": "$1 अधिकतम{{PLURAL:$1|दिनं|दिनानि}}",
+       "prefs-watchlist-edits": "à¤\85सà¥\8dयाà¤\82 à¤µà¤¿à¤¸à¥\8dतà¥\83त-à¤\85वà¥\87à¤\95à¥\8dषणावलà¥\8dयाà¤\82 à¤ªà¥\8dरदरà¥\8dशयितà¥\81à¤\82 à¤®à¤¹à¤¤à¥\8dतमपरिवरà¥\8dतनानाà¤\82 à¤¸à¤\99à¥\8dà¤\96à¥\8dया :",
+       "prefs-watchlist-edits-max": "अधिकतमसङ्ख्याः : १०००",
+       "prefs-watchlist-token": "à¤\85वà¥\87à¤\95à¥\8dषणावलà¥\8dयाà¤\83 à¤ªà¥\8dरतà¥\80à¤\95à¤\83",
+       "prefs-misc": "विविधमà¥\8d",
        "prefs-resetpass": "कूटशब्दः परिवर्त्यताम्",
-       "prefs-changeemail": "विदà¥\8dयà¥\81नà¥\8dमानपतà¥\8dरसà¤\99à¥\8dà¤\95à¥\87तà¤\82 à¤ªà¤°à¤¿à¤µà¤°à¥\8dतयतà¥\81 à¥¤",
-       "prefs-setemail": "विदà¥\8dयà¥\81नà¥\8dमानपतà¥\8dरसà¤\99à¥\8dà¤\95à¥\87तà¤\82 à¤¯à¥\8bà¤\9cयतà¥\81 à¥¤",
-       "prefs-email": "à¤\87मà¥\87ल à¤µà¥\88à¤\95लà¥\8dपिà¤\95ाः",
+       "prefs-changeemail": "à¤\88-पतà¥\8dरसà¤\99à¥\8dà¤\95à¥\87तà¤\83 à¤ªà¤°à¤¿à¤µà¤°à¥\8dतà¥\8dयतामà¥\8d",
+       "prefs-setemail": "à¤\88-पतà¥\8dरसà¤\99à¥\8dà¤\95à¥\87तà¤\83 à¤²à¤¿à¤\96à¥\8dयतामà¥\8d",
+       "prefs-email": "à¤\88पतà¥\8dर-विà¤\95लà¥\8dपाः",
        "prefs-rendering": "स्वरूपम्",
-       "saveprefs": "सà¤\82रà¤\95à¥\8dषà¥\8dयतामà¥\8d",
-       "restoreprefs": "समà¤\97à¥\8dराà¤\83 à¤µà¥\8dयवसà¥\8dथादय à¤µà¥\8dयवसà¥\8dथानà¥\81सारà¤\82 à¤ªà¥\81नà¤\83 à¤¸à¤\82रà¤\95à¥\8dषà¥\8dयतामà¥\8d",
+       "saveprefs": "रक्ष्यताम्",
+       "restoreprefs": "मà¥\82लवà¥\8dयवसà¥\8dथापनानà¥\81à¤\97à¥\81णà¤\82 (default settings) à¤¸à¤°à¥\8dवà¥\87 à¤µà¤¿à¤\95लà¥\8dपाà¤\83 à¤­à¤µà¤¨à¥\8dतà¥\81 (सरà¥\8dवà¥\87षà¥\81 à¤µà¤¿à¤­à¤¾à¤\97à¥\87षà¥\81)",
        "prefs-editing": "सम्पादनम्",
-       "rows": "पà¤\82à¤\95à¥\8dति",
-       "columns": "à¤\85ध: à¤ªà¤\82à¤\95à¥\8dतà¥\8dयाà¤\83",
+       "rows": "पà¤\99à¥\8dà¤\95तयà¤\83 :",
+       "columns": "सà¥\8dतमà¥\8dभाà¤\83 :",
        "searchresultshead": "अन्वेषणम्",
-       "stub-threshold": "<a href=\"#\" class=\"stub\">आधारानुबन्धानां </a>अधिकतमाकारः ।",
+       "stub-threshold": "<a href=\"#\" class=\"stub\">stub link</a> इत्यस्य प्रारूपणस्य (formatting) कृते प्रारम्भिकसोपान formatting (bytes):",
        "stub-threshold-disabled": "निष्क्रियः",
-       "recentchangesdays": "दिवसानि पर्यन्तो सद्यावधि-परिवर्तनानि दृश्यतु:",
-       "recentchangesdays-max": "अधिकतम $1 {{PLURAL:$1|दिवसः|दिवसानि}}",
-       "recentchangescount": "सम्पादन संख्यकानि व्यवस्थानुसारेण दृश्यतु:",
-       "prefs-help-recentchangescount": "अत्र सद्यः परिवर्तनानि, पुटेतिहासाः, प्रवेशाः च अन्तर्गताः ।",
-       "savedprefs": "आद्यताः संरक्षिताः ।",
-       "timezonelegend": "समय मण्डल:",
-       "localtime": "स्थानीय समय:",
-       "timezoneuseserverdefault": "विकिनिश्चितं ($1) उपयुज्यताम् ।",
-       "timezoneuseoffset": "अन्ये (समयान्तरं निर्दिशतु )",
-       "servertime": "वितारकसमयः ।",
-       "guesstimezone": "जालदर्शिकातः पूरयतु ।",
-       "timezoneregion-africa": "कालद्वीप",
+       "recentchangesdays": "नूतनपरिवर्तनेषु प्रदर्शनीयानि दिनानि :",
+       "recentchangesdays-max": "$1 अधिकतम{{PLURAL:$1|दिनं|दिनानि}}",
+       "recentchangescount": "फलकेषु सामान्यतया यानि परिवर्तनानि अभवन्, तेषां सङ्ख्या :",
+       "prefs-help-recentchangescount": "अत्र नूतनपरिवर्तनानि, पृष्ठेतिहासः, संरक्षितावल्यश्च अन्तर्भवन्ति ।",
+       "prefs-help-watchlist-token2": "भवतः/भवत्याः अवेक्षणावल्याः वेब-करस्य (web feed) गुप्तकुञ्चिका अस्त्येषा । \nएषा कुञ्चिका यस्य पार्श्वे भविष्यति, सः तव अवेक्षणावलिं द्रष्टुं प्रभविष्यति । अतः एनां गुप्ततया स्थाप्यताम् ।\n[[Special:ResetTokens|गुप्तकुञ्चिकां परिवर्तयितुम् अत्र नुद्यताम् ।]]।",
+       "savedprefs": "भवतः/भवत्याः इष्टतमानि रक्षितानि ।",
+       "timezonelegend": "समयवलयः (time zone) :",
+       "localtime": "स्थानीयसमय:",
+       "timezoneuseserverdefault": "विकि-मूलविकल्पान् स्थापयन्तु ($1)",
+       "timezoneuseoffset": "अन्यम् (समयान्तरं निर्दिशतु )",
+       "servertime": "वितरकसमयः :",
+       "guesstimezone": "गवेक्षणे पूरयतु",
+       "timezoneregion-africa": "कालद्वीपः",
        "timezoneregion-america": "अमेरिका",
-       "timezoneregion-antarctica": "à¤\85à¤\82टार्कटिका",
+       "timezoneregion-antarctica": "à¤\85णà¥\8dटार्कटिका",
        "timezoneregion-arctic": "आर्कटिक",
-       "timezoneregion-asia": "जम्बुमहाद्वीप",
-       "timezoneregion-atlantic": "à¤\8fà¤\9fलाà¤\82à¤\9fिà¤\95 à¤®à¤¹à¤¾à¤¸à¤¾à¤\97र",
+       "timezoneregion-asia": "जम्बुमहाद्वीप",
+       "timezoneregion-atlantic": "à¤\8fà¤\9fलाणà¥\8dà¤\9fिà¤\95-महासाà¤\97रà¤\83",
        "timezoneregion-australia": "ऑस्ट्रेलिया",
        "timezoneregion-europe": "यूरोप",
-       "timezoneregion-indian": "हिंद महासागर",
-       "timezoneregion-pacific": "प्रशांत महासागर",
-       "allowemail": "अन्योपयोजकानां विद्युन्मानसङ्केतं निष्कियं करोतु ।",
-       "prefs-searchoptions": "अन्वेषणविकल्पाः",
-       "prefs-namespaces": "नामाकाशः :",
-       "defaultns": "अन्यथा एतेषु नामाकाशेषु अन्विषतु ।",
-       "default": "यदभावे",
-       "prefs-files": "सञ्चिका",
-       "prefs-custom-css": "सि.एस्.एस्.रचयतु ।",
-       "prefs-custom-js": "जावालिपिं रचयतु ।",
-       "prefs-common-css-js": "सर्वावरणानां कृते विभक्त सि.एस्.एस्./ जावालिपिः ।",
-       "prefs-reset-intro": "आद्यतानां पुनर्निदेशार्थम् एतत्पुटम् उपयोक्तुं शकोति । एतत् अकृतं न भवति ।",
-       "prefs-emailconfirm-label": "विद्युन्मानसङ्केतस्य दृढीकरणम् ।",
-       "youremail": "ई-पत्रसङ्केतः",
-       "username": "योजकनामन्:",
-       "uid": "प्रयोक्तृ-क्रमांकः :",
-       "prefs-memberingroups": "{{PLURAL:$1|समूहस्य|समूहानां}}  सदस्यः:",
-       "prefs-registration": "पंजीकरण कालः:",
-       "yourrealname": "वास्तविकनाम:",
-       "yourlanguage": "भाषा:",
-       "yourvariant": "भाषासामग्रीणां संस्करणम् ।",
+       "timezoneregion-indian": "हिन्द-महासागरः",
+       "timezoneregion-pacific": "प्रशान्त-महासागरः",
+       "allowemail": "अन्ययोजकैः प्रेषितानि ई-पत्राणि अनुमतिं ददातु",
+       "prefs-searchoptions": "अन्विष्यताम्",
+       "prefs-namespaces": "नामाकाशाः",
+       "defaultns": "अन्यथा एतेषु नामाकाशेषु अन्विषतु :",
+       "default": "पूर्वनिर्दिष्टम्",
+       "prefs-files": "सञ्चिका:",
+       "prefs-custom-css": "स्वानुकुलसम्पादितं CSS",
+       "prefs-custom-js": "स्वानुकुलसम्पादितं JavaScript",
+       "prefs-common-css-js": "सर्वासां त्वचां (of skins) कृते CSS/JavaScript:",
+       "prefs-reset-intro": "भवान्/भवती अस्य पृष्ठस्य साहाय्येन स्वस्य इष्टतमविकल्पान् मूलविकि-विकल्पसदृशं स्थापयितुं (कर्तुं) शक्नोति ।\nपरन्तु ततः भवान्/भवती पूर्ववत् स्थितिं प्राप्तुं न शक्ष्यति ।",
+       "prefs-emailconfirm-label": "ई-पत्रं दृढीक्रियताम् :",
+       "youremail": "ई-पत्रसङ्केतः :",
+       "username": "{{GENDER:$1|योजकनाम}} :",
+       "prefs-memberingroups": "{{PLURAL:$1|समूहस्य|समूहानां}} {{GENDER:$2|सदस्यः/सदस्याः}} :",
+       "prefs-registration": "पञ्जीकरणस्य कालः :",
+       "yourrealname": "वास्तविकनाम :",
+       "yourlanguage": "भाषा :",
+       "yourvariant": "भाषायाः सामग्रीवैविध्यम् :",
        "prefs-help-variant": " विक्यां प्रदर्शितुं भवति ।",
-       "yournick": "नà¥\82तनाà¤\83 à¤¹à¤¸à¥\8dताà¤\95à¥\8dषराà¤\83:",
-       "prefs-help-signature": "सà¤\82भाषणपà¥\83षà¥\8dठà¤\97ताà¤\83 à¤¸à¤\82वादाà¤\83 \"<nowiki>~~~~</nowiki>\" à¤\87ति à¤²à¤¿à¤\96ितà¥\8dवा à¤¹à¤¸à¥\8dताà¤\95à¥\8dषरà¥\8bपà¥\87ताà¤\83 à¤\95रà¥\8dतà¥\8dतवà¥\8dयाà¤\83। à¤\8fतानि à¤\9aिहà¥\8dनानि à¤ªà¥\83षà¥\8dठरà¤\95à¥\8dषणपशà¥\8dà¤\9aातà¥\8d à¤­à¤µà¤¤à¤\83 à¤¹à¤¸à¥\8dताà¤\95à¥\8dषरानà¥\8d à¤¸à¤®à¤¯à¤®à¥\81दà¥\8dराà¤\82 à¤\9a à¤ªà¥\8dरदरà¥\8dशयिषà¥\8dयनà¥\8dति।",
-       "badsig": "à¤\85मानà¥\8dयाà¤\83 (तà¥\8dरà¥\81à¤\9fिपà¥\82रà¥\8dणाà¤\83) à¤¹à¤¿ à¤\8fतà¥\87 à¤\85पà¤\95à¥\8dवाà¤\83 à¤¹à¤¸à¥\8dताà¤\95à¥\8dषराà¤\83।\nà¤\8fà¤\9aà¤\9fà¥\80à¤\8fमà¤\8fलà¥\8d-à¤\9fà¥\88à¤\97 à¤\87तà¥\8dयà¥\87तानि à¤ªà¥\81नरà¥\80à¤\95à¥\8dषितवà¥\8dयानि à¤­à¤µà¤¤à¤¾।",
-       "badsiglength": "भवतà¤\83 à¤¹à¤¸à¥\8dताà¤\95à¥\8dषराà¤\83 à¤¤à¥\81 à¤\85तà¥\80व à¤¦à¥\80रà¥\8dà¤\98ाà¤\83।\nà¤\8fतà¥\87 $1 {{PLURAL:$1|à¤\85à¤\95à¥\8dषरातà¥\8d|à¤\85à¤\95à¥\8dषरà¥\87भà¥\8dयà¤\83}} à¤¦à¥\80रà¥\8dà¤\98ाà¤\83 à¤¨ à¤­à¤µà¤¿à¤¤à¤µà¥\8dयाà¤\83।",
-       "yourgender": "लिà¤\82à¤\97मà¥\8d (Gender):",
-       "gender-unknown": "à¤\85निरà¥\8dदिषà¥\8dà¤\9fमà¥\8d",
-       "gender-male": "पà¥\81रà¥\81ष",
-       "gender-female": "सà¥\8dतà¥\8dरà¥\80",
-       "prefs-help-gender": "वà¥\88à¤\95लà¥\8dपिà¤\95à¤\83 : à¤\85यà¤\82 à¤¤à¤¨à¥\8dतà¥\8dराà¤\82शà¤\83 à¤²à¤¿à¤\99à¥\8dà¤\97ानà¥\81सारसमà¥\8dबà¥\8bधनसà¥\8dय à¤\89पयà¥\8bà¤\9cà¤\95à¤\83 ।",
-       "email": "विदà¥\8dयà¥\81तà¥\8dपतà¥\8dरवà¥\8dयवसà¥\8dथा",
-       "prefs-help-realname": "निà¤\9cनामधà¥\87यसà¥\8dय à¤\89लà¥\8dलà¥\87à¤\96à¤\83 à¤\86वशà¥\8dयà¤\95à¤\83 à¤¨à¤¾à¤¸à¥\8dति à¥¤ \nयदि à¤¦à¤¦à¤¾à¤¤à¤¿ à¤¤à¤°à¥\8dहि à¤\85सà¥\8dय à¤ªà¥\8dरयà¥\8bà¤\97à¤\83 à¤­à¤µà¤¤à¤\83 à¤¯à¥\8bà¤\97दानारà¥\8dथà¤\82 à¤­à¤µà¤¤à¥\87 à¤¶à¥\8dरà¥\87यà¤\82 à¤¦à¤¾à¤¤à¥\81मà¥\8d à¤\89पयà¥\81à¤\95à¥\8dतà¤\83 à¤­à¤µति ।",
+       "yournick": "नà¥\82तनहसà¥\8dताà¤\95à¥\8dषरमà¥\8d :",
+       "prefs-help-signature": "समà¥\8dभाषणपà¥\83षà¥\8dठà¥\87षà¥\81 à¤\9fिपà¥\8dपणà¥\80à¤\82 à¤²à¤¿à¤\96ितà¥\8dवा à¤\85नà¥\8dतà¥\87 \"<nowiki>~~~~</nowiki>\" à¤²à¤¿à¤\96तà¥\81 à¥¤ à¤\85नà¥\87न à¤¸à¥\8dवसà¥\8dय à¤¹à¤¸à¥\8dताà¤\95à¥\8dषरà¥\87ण à¤¸à¤¹ à¤\9fिपà¥\8dपणà¥\80लà¥\87à¤\96नà¤\95ालसà¥\8dयापि à¤\89लà¥\8dलà¥\87à¤\96à¤\83 à¤­à¤µà¤¿à¤·à¥\8dयति ।",
+       "badsig": "à¤\85यà¥\8bà¤\97à¥\8dयà¤\82 à¤ªà¥\8dरारà¥\82परहितà¤\82 (raw) à¤¹à¤¸à¥\8dताà¤\95à¥\8dषरमà¥\8d à¥¤\nHTML à¤\9aिहà¥\8dनà¤\82 à¤ªà¤¶à¥\8dयतà¥\81 ।",
+       "badsiglength": "हसà¥\8dताà¤\95à¥\8dषरà¤\82 à¤¬à¤¹à¥\81लमà¥\8dबमानमà¥\8d à¤\85सà¥\8dति à¥¤\nहसà¥\8dताà¤\95à¥\8dषरà¤\82 $1 {{PLURAL:$1|à¤\85à¤\95à¥\8dषरातà¥\8d|à¤\85à¤\95à¥\8dषरà¥\87भà¥\8dयà¤\83}} à¤¦à¥\80रà¥\8dà¤\98à¤\82 à¤¨ à¤­à¤µà¥\87तà¥\8d ।",
+       "yourgender": "सà¥\8dवपरिà¤\9aयà¤\82 à¤\95थà¤\82 à¤¦à¤¾à¤¤à¥\81मà¥\8d à¤\87à¤\9aà¥\8dà¤\9bति ?",
+       "gender-unknown": "सà¥\8dवपरिà¤\9aयà¤\82 à¤¦à¤¾à¤¤à¥\81à¤\82 à¤¨à¥\87à¤\9aà¥\8dà¤\9bामि",
+       "gender-male": "सà¤\83 à¤µà¤¿à¤\95ि-पà¥\83षà¥\8dठानि à¤¸à¤®à¥\8dपादयति",
+       "gender-female": "सा à¤µà¤¿à¤\95ि-पà¥\83षà¥\8dठानि à¤¸à¤®à¥\8dपादयति",
+       "prefs-help-gender": "à¤\8fततà¥\8d à¤µà¤¿à¤µà¤°à¤£à¤®à¥\8d à¤\90à¤\9aà¥\8dà¤\9bिà¤\95मà¥\8d à¤\85सà¥\8dति à¥¤ à¤\8fतसà¥\8dमिनà¥\8d à¤¤à¤¨à¥\8dतà¥\8dराà¤\82शà¥\87\nलिà¤\99à¥\8dà¤\97ाधारà¥\87ण à¤­à¤µà¤¤à¤\83/भवतà¥\8dयाà¤\83 à¤¸à¤®à¥\8dबà¥\8bधनारà¥\8dथमà¥\8d à¤\85सà¥\8dयà¥\8bपयà¥\8bà¤\97à¤\83 à¤­à¤µà¤¤à¤¿ à¥¤\nà¤\8fततà¥\8d à¤µà¤¿à¤µà¤°à¤£à¤\82 à¤¸à¤¾à¤°à¥\8dवà¤\9cनिà¤\95à¤\82 à¤­à¤µà¤¿à¤·à¥\8dयति ।",
+       "email": "à¤\88-पतà¥\8dरमà¥\8d",
+       "prefs-help-realname": "वासà¥\8dतविà¤\95नाम à¤\90à¤\9aà¥\8dà¤\9bà¤\95मà¥\8d à¤\85सà¥\8dति à¥¤ à¤­à¤µà¤¾à¤¨à¥\8d/भवतà¥\80 à¤\8fनà¤\82 à¤µà¤¿à¤\95लà¥\8dपà¤\82 à¤¸à¤®à¤°à¥\8dथयति à¤\9aà¥\87तà¥\8d, à¤­à¤µà¤¤à¤\83/भवतà¥\8dयाà¤\83 à¤¯à¥\8bà¤\97दानशà¥\8dरà¥\87यसà¥\8dय à¤\89लà¥\8dलà¥\87à¤\96समयà¥\87 à¤\85सà¥\8dय à¤\89पयà¥\8bà¤\97à¤\83 à¤­à¤µà¤¿à¤·à¥\8dयति ।",
        "prefs-help-email": "ई-पत्रसङ्केतः अनिवार्यः नास्ति । किन्तु कूटशब्दः विस्मर्यते चेत् तस्य परिवर्तनाय आवश्यकः भवति ।",
        "prefs-help-email-others": "योजकपृष्ठ-सम्भाषणपृष्ठयोः माध्यमेन,  ई-पत्रमाध्यमेन वा अन्ये योजकाः भवतः/भवत्याः सम्पर्कं कर्तुं शक्नुयुः ।\nसम्पर्केऽस्मिन् भवतः/भवत्याः ई-पत्रसङ्केतम् अन्ययोजकाः ज्ञातुं न प्रभवतन्ति ।",
-       "prefs-help-email-required": "विदà¥\8dयà¥\81नà¥\8dमानपतà¥\8dरसà¤\99à¥\8dà¤\95à¥\87तà¤\83 à¤\86वशà¥\8dयà¤\95ः ।",
+       "prefs-help-email-required": "à¤\88-पतà¥\8dरसà¤\99à¥\8dà¤\95à¥\87तà¤\83 à¤\85निवारà¥\8dयः ।",
        "prefs-info": "मूलसूचनाः",
-       "prefs-i18n": "अन्ताराष्ट्रिकरणम् ।",
-       "prefs-signature": "हस्ताक्षर",
+       "prefs-i18n": "अन्ताराष्ट्रिकरणम्",
+       "prefs-signature": "हस्ताक्षरम्",
        "prefs-dateformat": "दिनाङ्कस्य प्रारूपः",
-       "prefs-timeoffset": "समयान्तरम् ।",
-       "prefs-advancedediting": "उन्नतविकल्पाः",
-       "prefs-advancedrc": "उन्नतविकल्पाः",
-       "prefs-advancedrendering": "उन्नतविकल्पाः",
-       "prefs-advancedsearchoptions": "उन्नतविकल्पाः",
-       "prefs-advancedwatchlist": "उन्नतविकल्पाः",
-       "prefs-displayrc": "प्रदर्शनविकल्पाः",
-       "prefs-displaywatchlist": "प्रदर्शनविकल्पाः",
+       "prefs-timeoffset": "समयान्तरम्",
+       "prefs-advancedediting": "सामान्यविकल्पाः",
+       "prefs-editor": "योजकः",
+       "prefs-preview": "प्राग्दृश्यम्",
+       "prefs-advancedrc": "विशेषविकल्पाः",
+       "prefs-advancedrendering": "विशेषविकल्पाः",
+       "prefs-advancedsearchoptions": "विशेषविकल्पाः",
+       "prefs-advancedwatchlist": "विशेषविकल्पाः",
+       "prefs-displayrc": "प्रदर्शन-विकल्पाः",
+       "prefs-displaywatchlist": "प्रदर्शन-विकल्पाः",
+       "prefs-tokenwatchlist": "स्तोकम् (token)",
        "prefs-diffs": "अन्तरम्",
-       "email-address-validity-valid": "प्रयुक्तः विद्युन्मानपत्रसङ्केतः मानितः ।",
-       "email-address-validity-invalid": "मान्यः विद्युन्मानपत्रसङ्केतः योजनीयः ।",
-       "userrights": "योजकाधिकारस्य प्रबन्धनम् ।",
-       "userrights-lookup-user": "योजकसमूहं प्रबन्धयतु ।",
-       "userrights-user-editname": "योजकनाम योजयतु ।",
-       "editusergroup": "योजकसमूहं सम्पादयतु ।",
-       "editinguser": "'''[[User:$1|$1]]''' $2 इति योजकस्य योजकाधिकारः परिवर्त्यते ।",
-       "userrights-editusergroup": "योजकसमूहं सम्पादयतु ।",
-       "saveusergroups": "योजकसमूहं संरक्षतु ।",
-       "userrights-groupsmember": "अस्य सदस्यः  ।",
-       "userrights-groupsmember-auto": "अस्य निश्चितसदस्यः ।",
-       "userrights-groups-help": "अस्य सदस्यस्य समूहसदस्यत्वं परिवर्तयितुं शक्यते । \n* मञ्जूषा अङ्किता चेत् योजकः अस्य समूहस्य सदस्यः अस्ति ।\n* मञ्जूषा अनङ्किता चेत् योजकः अस्य समूहस्य सदस्यः न \n* कदाचित् भवता समूहः योजितः चेत् अपनेतुं नैव शक्नोति इति * चिह्नं सूचयति ।",
+       "prefs-help-prefershttps": "आगामिप्रेवेशकाले एतत् परिवर्तनं सक्रियं भवष्यति ।",
+       "prefs-tabs-navigation-hint": "परामर्शः : पट्टीकयोः (tabs) मध्ये गमनागमनं कर्तुं भवान्/भवती वामतीरकुड्मलस्य, दक्षिणतीरकुण्मलस्य च उपयोगं कर्तुं शक्नोति ।",
+       "email-address-validity-valid": "ई-पत्रसङ्केतः मान्यः अस्ति इति प्रतियते",
+       "email-address-validity-invalid": "मान्यः ई-पत्रसङ्केतः लिख्यताम्",
+       "userrights": "योजकाधिकारस्य प्रबन्धनम्",
+       "userrights-lookup-user": "योजकसमूहस्य प्रबन्धनं करोतु",
+       "userrights-user-editname": "प्रयोक्तृनाम दीयताम्",
+       "editusergroup": "योजकसमूहः सम्पाद्यताम्",
+       "editinguser": "'''[[User:$1|$1]]''' इत्यस्य योजकस्य योजकाधिकारः परिवर्त्यते । $2",
+       "userrights-editusergroup": "योजकसमूहः सम्पाद्यताम्",
+       "saveusergroups": "योजकसमूहः रक्ष्यताम्",
+       "userrights-groupsmember": "अस्य सदस्यः :",
+       "userrights-groupsmember-auto": "निम्न{{PLURAL:$1|समूहस्य|समूहानाम्}} अन्तर्निहिः सदस्यः :",
+       "userrights-groups-help": "अस्य सदस्यस्य समूहसदस्यत्वं परिवर्तयितुं शक्यते । \n* अङ्कनपेटिका (check box) अङ्किता चेत्, योजकः अस्य समूहस्य सदस्यः अस्ति ।\n* अङ्कनपेटिका अनङ्किता चेत्, योजकः अस्य समूहस्य सदस्यः नास्ति ।\n* एकवारं समूहः योजितः अपाकृतः वा चेत्, पुनः पूर्ववत् कर्तुं न शक्यते इति * चिह्नं सूचयति ।",
        "userrights-reason": "कारणम् :",
-       "userrights-no-interwiki": "अन्यविकिषु योजकाधिकारं सम्पादयितुं ते अनुमतिः नास्ति ।",
-       "userrights-nodatabase": "$1 मूलपाठाः न सन्ति अथवा स्थानीयाः ।",
-       "userrights-nologin": "[[Special:UserLogin|log in]] प्रशासकस्थानेन प्रविश्य योजकाधिकारान् निर्देष्टुं शक्नोति ।",
-       "userrights-notallowed": "योजकाधिकारान् अपनेतुं ते स्थानस्य अनुमतिः नास्ति ।",
-       "userrights-changeable-col": "परिवर्तनार्हाः समूहाः ।",
-       "userrights-unchangeable-col": "परिवर्तनार्हाः समूहाः ।",
+       "userrights-no-interwiki": "अन्यविकि-जालस्थानेषु योजकाधिकारं सम्पादयितुं ते अनुमतिः नास्ति ।",
+       "userrights-nodatabase": "$1 दत्तांशनिधिः न विद्यते । अथवा तु सः स्थानीयः नास्ति ।",
+       "userrights-nologin": "योजकान् अधिकारं दातुं प्रबन्धकत्वेन प्रवेशः आवश्यकः । [[Special:UserLogin|प्रविश्यताम्]]",
+       "userrights-notallowed": "योजकेभ्यः अधिकारं दातम्, अपाकर्तुं च ते अनुमतिः नास्ति ।",
+       "userrights-changeable-col": "परिवर्तनार्हाः समूहाः",
+       "userrights-unchangeable-col": "परिवर्तनम् अनर्हाः समूहाः",
+       "userrights-conflict": "सदस्याधिकारस्य परिवर्तनेषु अन्तर्विरोधः अस्ति ! कृपया स्वकृतानि परिवर्तनानि पुनरवलोक्य संरक्ष्यताम् ।",
+       "userrights-removed-self": "भवता/भवत्या सफलतया स्वाधिकाराः अपाकृताः । अतः भवान्/भवती एतत् पृष्ठं द्रष्टुं न प्रभवति ।",
        "group": "समूहः :",
-       "group-user": "योजकः",
-       "group-autoconfirmed": "स्वदृढितयोजकाः ।",
-       "group-bot": "सà¥\8dवयà¤\82 à¤¸à¤\95à¥\8dरियाà¤\83 à¥¤",
-       "group-sysop": "पà¥\8dरबà¤\82धकाः",
-       "group-bureaucrat": "सà¥\8dवयमà¥\8d à¤\85धिà¤\95ारिणà¤\83 à¥¤",
-       "group-suppress": "अलक्ष्यम् ।",
+       "group-user": "यà¥\8bà¤\9cà¤\95ाà¤\83",
+       "group-autoconfirmed": "स्वदृढितयोजकाः",
+       "group-bot": "बà¥\8bà¤\9fà¥\8dसà¥\8d",
+       "group-sysop": "पà¥\8dरबनà¥\8dधकाः",
+       "group-bureaucrat": "à¤\85धिà¤\95ारिणà¤\83",
+       "group-suppress": "अलक्ष्यम्",
        "group-all": "(सर्वे)",
        "group-user-member": "{{GENDER:$1|योजक}}",
-       "group-autoconfirmed-member": "{{GENDER:$1|सà¥\8dवसà¥\8dथानदà¥\83ढितà¤\83 योजकः}}",
-       "group-bot-member": "{{GENDER:$1|सà¥\8dवयà¤\82 à¤¸à¤\95à¥\8dरियà¤\83}}",
-       "group-sysop-member": "{{GENDER:$1|पà¥\8dरशासकः}}",
-       "group-bureaucrat-member": "{{GENDER:$1|सà¥\8dवयमà¥\8d à¤\85धिà¤\95ारà¥\80}}",
+       "group-autoconfirmed-member": "{{GENDER:$1|सà¥\8dवदà¥\83ढितयोजकः}}",
+       "group-bot-member": "{{GENDER:$1|बà¥\89à¤\9fà¥\8d}}",
+       "group-sysop-member": "{{GENDER:$1|पà¥\8dरबनà¥\8dधकः}}",
+       "group-bureaucrat-member": "{{GENDER:$1|अधिकारी}}",
        "group-suppress-member": "{{GENDER:$1|अलक्ष्यम्}}",
-       "grouppage-user": "{{ns:project}}:योजक",
-       "grouppage-autoconfirmed": "{{ns:project}}: स्वयंदृढितयोजकाः ।",
-       "grouppage-bot": "{{ns:project}}: स्वयंसक्रियाः।",
-       "grouppage-sysop": "{{ns:project}}:प्रचालकाः",
-       "grouppage-bureaucrat": "{{ns:project}}: स्वयम् अधिकारिणः ।",
-       "grouppage-suppress": "{{ns:project}}: अक्ष्यम् ।",
-       "right-read": "पुटानि पठतु ।",
-       "right-edit": "पुटसम्पादनं करोतु ।",
-       "right-createpage": "पुटनिर्माणं करोतु ।(यानि चर्च्यानि न सन्ति)",
-       "right-createtalk": "चर्च्यपुटानां निर्माणं करोतु ।",
-       "right-createaccount": "नूतनयोजकस्थानं निर्मातु ।",
-       "right-minoredit": "सम्पादनं लघुचिह्नया निर्दिशतु ।",
-       "right-move": "पुटं चालयतु ।",
-       "right-move-subpages": "उपपुटैः सह पुटं चालयतु ।",
-       "right-move-rootuserpages": "मूलयोजकपुटानि चालयतु ।",
-       "right-movefile": "सञ्चिकाः चालयतु ।",
-       "right-suppressredirect": "पुटचालनावसरे मूलपुटेभ्यः पुनर्निदेशं न सृजतु ।",
-       "right-upload": "सञ्चिकाः उत्तारयतु ।",
-       "right-reupload": "स्थितसञ्चिकाः पुनर्लिखतु ।",
-       "right-reupload-own": "एकेन उत्तारितसञ्चिकाः पुनर्लिखतु ।",
-       "right-reupload-shared": "विभक्तमाध्यमकोशगतसञ्चिकाः अतिसञ्चरतु ।",
-       "right-upload_by_url": "अन्तर्जालस्थानात् सञ्चिकाः उत्तारयतु ।",
-       "right-purge": "दृढतारहितपुटस्य क्षेत्राधारं पुनातु ।",
+       "grouppage-user": "{{ns:project}}:योजकाः",
+       "grouppage-autoconfirmed": "{{ns:project}}:स्वदृढितयोजकाः",
+       "grouppage-bot": "{{ns:project}}:बॉट्स्",
+       "grouppage-sysop": "{{ns:project}}:प्रबन्धकाः",
+       "grouppage-bureaucrat": "{{ns:project}}:अधिकारिणः",
+       "grouppage-suppress": "{{ns:project}}:अक्ष्यम्",
+       "right-read": "पृष्ठानि पठ्यताम्",
+       "right-edit": "पृष्ठानि सम्पाद्यताम्",
+       "right-createpage": "पृष्ठानि निर्मियताम् ।(येषां सम्भाषणपृष्ठं न स्यात् ।)",
+       "right-createtalk": "सम्भाषणपृष्ठानि निर्मियताम्",
+       "right-createaccount": "नूतनप्रयोक्तृवृत्तान्तं रच्यताम्",
+       "right-minoredit": "लघुसम्पादनत्वेन अङ्कितं करोतु",
+       "right-move": "पृष्ठं चाल्यताम्",
+       "right-move-subpages": "उपपृष्ठैः सह पृष्ठं चालयतु",
+       "right-move-rootuserpages": "मूलयोजकपुष्ठानि चाल्यताम्",
+       "right-move-categorypages": "वर्गपृष्ठानि चाल्यताम्",
+       "right-movefile": "सञ्चिकाः चाल्यताम्",
+       "right-suppressredirect": "पृष्ठं यदा चालयति, तदा मूलपृष्ठात् प्रतिप्रषणं मास्तु ।",
+       "right-upload": "उपारोहण(upload)सञ्चिकाः",
+       "right-reupload": "वर्तमानसञ्चिकाः नवीनसञ्चिकाभिः परिवर्त्यताम्",
+       "right-reupload-own": "अन्येन उपारोहिताः (upload) सञ्चिकाः नवीनसञ्चिकाभिः परिवर्त्यताम",
+       "right-reupload-shared": "विभक्तमाध्यमेन (shared media) स्थानिय-उपारोहिताः सञ्चिकाः नवीनसञ्चाकाभिः परिवर्त्यताम्",
+       "right-upload_by_url": "सर्वासङ्केतात् (URL) उपारोहिताः सञ्चिकाः",
+       "right-purge": "पृष्ठस्य उपस्मृतिं (cache) रिक्तीक्रियताम्",
        "right-autoconfirmed": "अल्परक्षितपुटनि सम्पादयतु ।",
-       "right-bot": "सà¥\8dवà¤\9aालितपà¥\8dरà¤\95à¥\8dरियाà¤\83 à¤\87व à¤\89पà¤\9aारितà¤\83 à¤­à¤µतु ।",
+       "right-bot": "à¤\8fताà¤\82 à¤¸à¥\8dवसà¤\9eà¥\8dà¤\9aालितपà¥\8dरणालितà¥\8dवà¥\87न à¤¸à¥\8dवà¥\80à¤\95रà¥\8bतु ।",
        "right-nominornewtalk": "चर्चापुटानां लघुसम्पादनं न भवतु । नूतनसन्देशान् चोदयतु ।",
        "right-apihighlimits": "API प्रश्नेषु उन्नतसीमम् उपयोजयतु ।",
        "right-writeapi": "श्वेतं API उपयोगः ।",
        "log-title-wildcard": "अनेन पाठेन आरब्धानि शीर्षकानि अन्विषतु ।",
        "showhideselectedlogentries": "चितप्रवेशावलीः प्रदर्शयतु/गोपयतु ।",
        "allpages": "सर्वाणि पृष्ठानि",
-       "alphaindexline": "$1 तः $2 पर्यन्तम्",
        "nextpage": "($1)अग्रिमपुटम् ।",
        "prevpage": "पूर्वपृष्ठम् ($1)",
        "allpagesfrom": "इत्यस्मात् आरभ्यमाणानि पृष्ठानि दर्श्यन्ताम्:",
        "newimages-summary": "एतत् विशेषपुटम् सद्यः उत्तारितसञ्चिकाः दर्शयति ।",
        "newimages-legend": "शोधनी ।",
        "newimages-label": "सञ्चिकानाम (अथवा अस्य भागः)",
-       "showhidebots": "(स्वयं चालकः $1)",
        "noimages": "शून्यदर्शनम् ।",
        "ilsubmit": "अन्वेषणम्",
        "bydate": "दिनाङ्कानुगुणम्",
index c9a79b6..7b89944 100644 (file)
                        "아라"
                ]
        },
-       "tog-underline": "ЫйÑ\8bннÑ\8cÑ\8bкÑ\82аÑ\80Ñ\8b аннынан тардыы:",
+       "tog-underline": "СигÑ\8dлÑ\8dÑ\80и аннынан тардыы:",
        "tog-hideminor": "Кыра көннөрүүлэри көрдөрбөккө",
        "tog-hidepatrolled": "Ботурууллааччы көрбүт көннөрүүтүн саҥа көннөрүүлэр тиһиктэригэр көрдөрүмэ",
        "tog-newpageshidepatrolled": "Ботуруулламмыт сирэйдэри саҥа сирэйдэр тиһиктэригэр көрдөрүмэ",
-       "tog-extendwatchlist": "Кэтээһин тупсарыллыбыт испииһэгэ. Бары уларытыылар көстөллөр (бүтэһиктэр эрэ буолбатах)",
+       "tog-extendwatchlist": "Кэтээһин тупсарыллыбыт тиһигэ. Бары уларытыылар көстөллөр (бүтэһиктэр эрэ буолбатах)",
        "tog-usenewrc": "Саҥа уларытыы уонна кэтэбил тиһиктэригэр уларыйыылары бөлөхтүүргэ",
-       "tog-numberheadings": "Ð\91аÑ\81 Ñ\82Ñ\8bллаÑ\80Ñ\8b нүөмэрдээ",
-       "tog-showtoolbar": "Көннөрүү үстүрүмүөннэрин көрдөр",
-       "tog-editondblclick": "ХоһÑ\83лаÑ\82ан Ð¸ÐºÐºÐ¸Ñ\82Ñ\8d Ð±Ð°Ñ\82Ñ\82аан Ñ\81иÑ\80Ñ\8dйи Ñ\83лаÑ\80Ñ\8bÑ\82Ñ\8bÑ\8b",
-       "tog-editsectiononrightclick": "СиÑ\8dкÑ\81ийÑ\8d Ð±Ð°Ò»Ñ\8bгаÑ\80 Ñ\83ҥа Ñ\82имÑ\8dÒ\95инÑ\8dн Ð±Ð°Ñ\82Ñ\82аан Ñ\81иÑ\8dкÑ\81ийÑ\8dни ÐºÓ©Ð½Ð½Ó©Ñ\80Ò¯Ò¯",
+       "tog-numberheadings": "ТүһүмÑ\8dÑ\85Ñ\82Ñ\8dÑ\80 Ð°Ð°Ñ\82Ñ\82аÑ\80Ñ\8bн нүөмэрдээ",
+       "tog-showtoolbar": "Көннөрүү хапталын көрдөр",
+       "tog-editondblclick": "Хоһулатан баттаан сирэйи уларытыы",
+       "tog-editsectiononrightclick": "ТүһүмÑ\8dÑ\85 Ð±Ð°Ò»Ñ\8bн Ñ\83ҥа Ñ\82имÑ\8dÒ\95инÑ\8dн Ð±Ð°Ñ\82Ñ\82аан Ñ\82үһүмÑ\8dÒ\95и Ñ\83лаÑ\80Ñ\8bÑ\82Ñ\8bÑ\8b",
        "tog-watchcreations": "Суруйбут ыстатыйаларбын уонна укпут билэлэрбин кэтээн көрүүгэ киллэрэн ис",
        "tog-watchdefault": "Уларыппыт сирэйдэрбин уонна билэлэрбин кэтээн көрүү тиһигэр киллэрэн ис",
-       "tog-watchmoves": "Аатын уларыппыт сирэйдэрбин уонна билэлэрбин кэтээн көрүү испииһэгэр киллэрэн ис",
+       "tog-watchmoves": "Аатын уларыппыт сирэйдэрбин уонна билэлэрбин кэтээн көрүү тиһигэр киллэрэн ис",
        "tog-watchdeletion": "Соппут сирэйдэрбин уонна билэлэрбин кэтээн көрүү тиһигэр киллэрэн ис",
        "tog-minordefault": "Уларытыылары атын этиллибэтэҕинэ кыра уларытыы курдук бэлиэтээ",
        "tog-previewontop": "Хайдах буоларын уларытар түннүк үрдүнэн (иннигэр) көрдөр",
        "tog-enotifminoredits": "Кыра да уларытыы киирдэҕинэ эл. почтанан биллэрээр",
        "tog-enotifrevealaddr": "Мин почтам аадырыһын биллэриилэргэ көрдөр",
        "tog-shownumberswatching": "Сирэйи кэтээн көрөр дьон ахсаанын көрдөр",
-       "tog-oldsig": "Ð\91ааÑ\80 илии баттааһын:",
-       "tog-fancysig": "Ð\91Ñ\8dйÑ\8d Ð¸Ð»Ð¸Ð¸ Ð±Ð°Ñ\82Ñ\82ааһÑ\8bна (Ñ\8bйÑ\8bннÑ\8cÑ\8bга суох)",
+       "tog-oldsig": "Ð\91илиҥҥи илии баттааһын:",
+       "tog-fancysig": "Ð\91Ñ\8dйÑ\8d Ð¸Ð»Ð¸Ð¸ Ð±Ð°Ñ\82Ñ\82ааһÑ\8bна (Ñ\81игÑ\8dÑ\82Ñ\8d суох)",
        "tog-uselivepreview": "Хайдах буолуохтааҕын тутатына эрдэ көрүү (тургутуу быһыытынан)",
        "tog-forceeditsummary": "Тугу уларыппытым туһунан суруйбатахпына сэрэт",
-       "tog-watchlisthideown": "Кэтээн көрүү испииһэгэр бэйэм уларытыыларбын көрдөрүмэ",
-       "tog-watchlisthidebots": "Кэтээн көрүү испииһэгэр робот уларытыытын көрдөрүмэ",
+       "tog-watchlisthideown": "Кэтээн көрүү тиһигэр бэйэм уларытыыларбын көрдөрүмэ",
+       "tog-watchlisthidebots": "Кэтээн көрүү тиһигэр робот уларытыытын көрдөрүмэ",
        "tog-watchlisthideminor": "Кыра уларытыылары кэтээмэ",
-       "tog-watchlisthideliu": "Бэлиэтэммит кыттааччылар уларытыыларын кэтиир испииһэккэ көрдөрүмэ",
+       "tog-watchlisthideliu": "Бэлиэтэммит кыттааччылар уларытыыларын кэтиир тиһиккэ көрдөрүмэ",
        "tog-watchlisthideanons": "Ааттарын эппэтэх кыттааччылар уларытыыларын кэтээһин испииһэгэр көрдөрүмэ",
        "tog-watchlisthidepatrolled": "Ботурууллааччы көрбүт көннөрүүтүн кэтээһин испииһэгэр көрдөрүмэ",
        "tog-ccmeonemails": "Атын кыттааччыларга суруйбут суруктарбын бэйэбэр эмиэ ыыт",
        "category-article-count": "{{PLURAL:$2|Бу категория манна эрэ көстүбүт субкатегориялаах.|$2 категорияттан {{PLURAL:$1|субкатегорията|$1 субкатегориялара}} көрдөрүлүннүлэр.}}",
        "category-article-count-limited": "Бу категорияҕа {{PLURAL:$1|1 эрэ сирэй|$1 сирэй}} баар.",
        "category-file-count": "{{PLURAL:$2|Бу категория манна эрэ көстүбүт билэлээх.|$2 категорияттан {{PLURAL:$1|билэтэ|$1 билэлэрэ}} көрдөрүлүннүлэр.}}",
-       "category-file-count-limited": "Бу категорияҕа  {{PLURAL:$1|биир билэ|$1 билэ}} баар.",
+       "category-file-count-limited": "Бу категорияҕа  {{PLURAL:$1|соҕотох билэ|$1 билэ}} баар.",
        "listingcontinuesabbrev": "(салгыыта)",
-       "index-category": "Индекстаммыт сирэйдэр",
+       "index-category": "Индекстэммит сирэйдэр",
        "noindex-category": "Индексктаммыт сирэйдэр суохтар",
        "broken-file-category": "Билэҕэ сигэлэрэ алҕастаах сирэйдэр",
        "about": "Бу туһунан",
        "talkpagelinktext": "Ырытыы",
        "specialpage": "Анал сирэй",
        "personaltools": "Тус бэйэ туттар туруоруулара",
-       "postcomment": "Саҥа Ñ\81алаа",
+       "postcomment": "Саҥа Ñ\82үһүмÑ\8dÑ\85",
        "articlepage": "Ыстатыйаны көр",
        "talk": "Ырытыы",
        "views": "Көрүүлэр",
        "badaccess": "Сатаан киирбэтэ",
        "badaccess-group0": "Эн бу дьайыыны оҥорор кыаҕыҥ суох.",
        "badaccess-groups": "Дьайыыны $1 {{PLURAL:$2|бөлөххө|бөлөхтөртөн биирдэстэригэр}} киирэр кыттааччыларылар эрэ оҥорор кыахтаахтар.",
-       "versionrequired": "MediaWiki $1 -Ñ\81 Ð±Ð¸Ñ\8dÑ\80Ñ\81ийÑ\8dÑ\82Ñ\8d Ð½Ð°Ð°Ð´Ð°",
+       "versionrequired": "MediaWiki $1 -Ñ\81 Ð±Ð°Ñ\80Ñ\8bла Ð¸Ñ\80дÑ\8dнÑ\8dÑ\80",
        "versionrequiredtext": "Бу сирэйи туттарга MediaWiki $1 -с барыла наада. [[Special:Version|Барыллар тустарынан сирэйи]] көр.",
        "ok": "Сөп",
        "retrievedfrom": "\"$1\" -н кэллэ",
        "prefs-emailconfirm-label": "Эл. почтаны бигэргэтии:",
        "youremail": "E-mail-ыҥ:",
        "username": "{{GENDER:$1|Бэлиэтэммит аатыҥ}}:",
-       "uid": "{{GENDER:$1|Кыттааччы}} ID-та:",
        "prefs-memberingroups": "Бу {{PLURAL:$1|бөлөххө|бөлөхтөргө}} {{GENDER:$2|киирэр}}:",
        "prefs-registration": "Бэлиэтэнии кэмэ:",
        "prefs-registration-date-time": "$1",
        "log-title-wildcard": "Бу сурук бэлиэлэриттэн (буукубалартан) саҕаланар ааттары бул",
        "showhideselectedlogentries": "Талыллыбыт суруктары кистээ/көрдөр",
        "allpages": "Сирэйдэр барыта",
-       "alphaindexline": "мантан $1 маныаха дылы $2",
        "nextpage": "Аныгыскы сирэй ($1)",
        "prevpage": "Бу иннинээҕи сирэй ($1)",
        "allpagesfrom": "Мантан саҕаланар сирэйдэри көрдөр:",
        "newimages-summary": "Бу анал сирэй киллэриллибит билэлэр испииһэктэрин көрдөрөр.",
        "newimages-legend": "Фильтр",
        "newimages-label": "Билэ аата (эбэтэр сорҕото):",
-       "showhidebots": "($1 робот)",
        "noimages": "Ойуу суох.",
        "ilsubmit": "Көрдөт",
        "bydate": "айыллыбыт кэминэн",
index bcb9357..3cbd84d 100644 (file)
        "newimages-summary": "Sta pàggina spiciali ammustra li file caricati di cchiù picca tempu.",
        "newimages-legend": "Nomu file",
        "newimages-label": "Nomu file (o nu pezzu d'iddu):",
-       "showhidebots": "($1 li bot)",
        "noimages": "Nenti a vìdiri.",
        "ilsubmit": "Va' cerca",
        "bydate": "pi data",
index d8450a7..1fa5fa8 100644 (file)
        "prefs-emailconfirm-label": "Wab-mail confirmation:",
        "youremail": "Yer email:",
        "username": "{{GENDER:$1|Uisername}}:",
-       "uid": "{{GENDER:$1|Uiser}} ID:",
        "prefs-memberingroups": "{{GENDER:$2|Memmer}} o {{PLURAL:$1|groop|groops}}:",
        "prefs-registration": "Regeestration time:",
        "yourrealname": "Yer real name:",
        "uploadstash-refresh": "Refresh the leet o files",
        "invalid-chunk-offset": "Onvalid chunk affset",
        "img-auth-accessdenied": "Access denied.",
-       "img-auth-nopathinfo": "Missin PATH_INFO.\nYer server isna set up tae pass this information.\nIt micht be CGI-based n canna support img_auth.\nSee https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization.",
+       "img-auth-nopathinfo": "Missin PATH_INFO.\nYer server is no set up tae pass this information.\nIt micht be CGI-based n canna support img_auth.\nSee https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization.",
        "img-auth-notindir": "Requested path isna in the confeegured uplaid directerie.",
        "img-auth-badtitle": "Onable tae cræft ae valid title fae \"$1\".",
        "img-auth-nologinnWL": "Ye'r naw loggit in n \"$1\" isna in the whiteleet.",
        "log-title-wildcard": "Rake titles stairtin wi this tex",
        "showhideselectedlogentries": "Chynge veesibeelitie o selectit log entries",
        "allpages": "Aw pages",
-       "alphaindexline": "$1 til $2",
        "nextpage": "Neis page ($1)",
        "prevpage": "Aforegaun page ($1)",
        "allpagesfrom": "Shaw pages stairtin at:",
        "enotif_lastvisited": "Hae ae leuk at $1 fer aa chynges sin yer laist veesit.",
        "enotif_lastdiff": "See $1 tae see this chynge.",
        "enotif_anon_editor": "anonymoos uiser $1",
-       "enotif_body": "Dear $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nEediter's ootline: $PAGESUMMARY $PAGEMINOREDIT\n\nContact the eediter:\nmail: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nThaur'll be naw ither annooncemants in case o further acteevitie onless ye veesit this page while loggit in. Ye coud forby reset the annooncemant flags fer aw yer watched pages oan yer watchleet.\n\nYer freendlie {{SITENAME}} annooncemant system\n\n--\nTaae chynge yer wab-mail annooncemant settins, veesit\n{{canonicalurl:{{#special:Preferences}}}}\n\nTae chynge yer watchleet settins, veesit\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nTae delyte the page fae yer watchleet, veesit\n$UNWATCHURL\n\nFeedback n further asseestance:\n$HELPPAGE",
+       "enotif_body": "Dear $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nEediter's ootline: $PAGESUMMARY $PAGEMINOREDIT\n\nContact the eediter:\nmail: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nThaur'll be naw ither annooncemants in case o further acteevitie onless ye veesit this page while loggit in. Ye coud forby reset the annooncemant flags fer aw yer watched pages oan yer watchleet.\n\nYer freendlie {{SITENAME}} annooncemant system\n\n--\nTae chynge yer wab-mail annooncemant settins, veesit\n{{canonicalurl:{{#special:Preferences}}}}\n\nTae chynge yer watchleet settins, veesit\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nTae delyte the page fae yer watchleet, veesit\n$UNWATCHURL\n\nFeedback n further asseestance:\n$HELPPAGE",
        "created": "cræftit",
        "changed": "chynged",
        "deletepage": "Delyte page",
index e550ff0..67d9eab 100644 (file)
        "show-big-image": "File d'orìgini",
        "newimages": "Galleria di li file nobi",
        "imagelisttext": "Inogghi una listha di '''$1''' {{PLURAL:$1|file|file}} ordhinaddi pa $2.",
-       "showhidebots": "($1 li bot)",
        "noimages": "Nò v'è nudda da vidé.",
        "ilsubmit": "Zercha",
        "bydate": "data",
index 3429490..389e4dd 100644 (file)
        "protectedpagetext": "Šėts poslapis īr ožrakints, saugont anū nū redagavėma.",
        "viewsourcetext": "Tomsta galėt veizietė ėr kopėjoutė poslapė kuoda:",
        "protectedinterface": "Šėtom poslapi īr pruogramėnės ironguos sasajuos teksts katros īr apsauguots, kū neprietelē anū nasogadėntu.",
-       "editinginterface": "'''Diemesė:''' Tamsta keitat poslapi, katros īr nauduojams programėnės irongas sōsajės tekstė. Pakeitėmā tamė poslapū tēpuogi pakeis nauduotuojė sōsajės ėšruoda ė kėtėims nauduotujams. Jēgo nuorėt pargoldītė, siūluom pasėnauduotė [//translatewiki.net/wiki/Main_Page?setlang=bat-smg „translatewiki.net“], „MediaWiki“ lokalėzacėjės pruojėktu.",
+       "editinginterface": "<strong>Diemesė:</strong> Tamsta keitat poslapi, katros īr nauduojams programėnės irongas sōsajės tekstė. Pakeitėmā tamė poslapū tēpuogi pakeis nauduotuojė sōsajės ėšruoda ė kėtėims nauduotujams. Jēgo nuorėt pargoldītė, siūluom pasėnauduotė [//translatewiki.net „translatewiki.net“], „MediaWiki“ lokalėzacėjės pruojėktu.",
        "namespaceprotected": "Tamsta netorėt teisiu keistė poslapiu '''$1''' srėtī.",
        "ns-specialprotected": "Specēlė̅ jė poslapē negal būtė keitamė.",
        "logouttext": "'''Daba Tamsta esat atsėjongės.'''\n\nGalat ė tuoliau nauduotė {{SITENAME}} anuonimėškā aba <span class='plainlinks'>[$1 prisėjonkat]</span> ėš naujė šėtuo patiu a kėto nauduotuojė vardu.\nPastebiejims: katruos nekatruos poslapiuos ė tuoliau gal ruodītė būktā būtomiet prisėjongės lėgė tuol, kumet ėšvalīsėt sava naršīklės dietovė (''cache'').",
        "recreate-moveddeleted-warn": "'''Parspiejėms: Tamsta ikeliat faila, katros onkstiau bova ėštrėnts.'''\n\nTamsta torietomiet nusprēstė, a īr naudėnga tuoliau ikeldinietė ta faila.\nTuo faila pašalinėma istuorėjė īr pateikta dielē patuogoma:",
        "moveddeleted-notice": "Tas poslapis bova ėštrėnts.\nĖštrėnta poslapė versėju sārašos īr pateikts paveiziejėmō žemiau.",
        "edit-conflict": "Redagavėma kuonflėktos",
-       "postedit-confirmation": "Tamstas padėrbts pakeitėms ėšsauguots īr.",
+       "postedit-confirmation-saved": "Tamstas padėrbts pakeitėms ėšsauguots īr.",
        "post-expand-template-inclusion-warning": "Perspiejėms: Šabluonu īterpėma dėdoms īr par dėdelis.\nKāp katrėi šabluonā nebus ītrauktė.",
        "post-expand-template-inclusion-category": "Poslapē, kur šabluonu īterpėma dėdoms viršėjams",
        "post-expand-template-argument-warning": "Perspiejėms: Tas poslapis tor nuors vėina šabluona argomenta, katros tor per dėdli ėšplietėma dėdoma.\nTė argomentā bova praleistė.",
        "prefs-files": "Failā",
        "youremail": "El. pašts:",
        "username": "Nauduotuojė vards:",
-       "uid": "Nauduotuojė ID:",
        "prefs-memberingroups": "{{PLURAL:$1|Gropės|Gropiu}} narīs:",
        "prefs-registration": "Ožsėregėstravėma čiesos:",
        "yourrealname": "Tėkros vards:",
        "log-title-wildcard": "Ėiškuotė pavadinėmu, katrė prasėded šėtuo teksto",
        "showhideselectedlogentries": "Ruodītė/kavuotė sāraša ponktus, katrūs pasėrėnkot",
        "allpages": "Vėsė straipsnē",
-       "alphaindexline": "Nu $1 lėg $2",
        "nextpage": "Kėts poslapis ($1)",
        "prevpage": "Unkstesnis poslapis ($1)",
        "allpagesfrom": "Ruodītė poslapius pradedont nu:",
        "blockip": "Ožblokoutė nauduotuoja",
        "blockip-legend": "Blokoutė nauduotuoja",
        "blockiptext": "Nauduokėt šėta fuorma noriedamė oždraustė redagavėma teises nuruodīto IP adreso a nauduotuojo. Tas torietu būt atlėikama tam, kū sostabdītomiet vandalėzma, ė vagol [[{{ns:project}}:Puolitėka|puolitėka]].\nŽemiau nuruodīkėt tėkslē prižastė.",
-       "ipadressorusername": "IP adresos a nauduotuojė vards",
+       "ipaddressorusername": "IP adresos a nauduotuojė vards",
        "ipbexpiry": "Galiuojėma čiesos",
        "ipbreason": "Prīžastis:",
        "ipbreason-dropdown": "*Dažniausės bluokavėma prižastīs\n** Melagėngas infuormacėjės rašīms\n** Torėnė trīnims ėš poslapiu\n** Spaminims\n** Zaunu/bikuo rašīms i poslapios\n** Gondinėmā/Pėktžuodiavėmā\n** Pėktnaudžiavėms paskėruomis\n** Netėnkams nauduotuojė vards",
        "newimages": "Naujausiu abruozdieliu galerėjė",
        "imagelisttext": "Žemiau īr '''$1''' failu sārašos, sorūšiouts $2.",
        "newimages-label": "Faila vards (ar anuo dalis):",
-       "showhidebots": "($1 robotos)",
        "ilsubmit": "Ėiškoutė",
        "bydate": "palē data",
        "sp-newimages-showfrom": "Ruodītė naujus abruozdielius pradedant nū $2, $1",
index 987badd..118f7cf 100644 (file)
        "newimages-summary": "Ova posebna stranica prikazuje posljednje postavljene datoteke.",
        "newimages-legend": "Filter",
        "newimages-label": "Ime datoteke (ili dio imena):",
-       "showhidebots": "($1 botove)",
        "noimages": "Ništa za prikazati.",
        "ilsubmit": "Traži / Тражи",
        "bydate": "po datumu",
index b251b5b..5ff85ce 100644 (file)
        "prefs-emailconfirm-label": "විද්‍යුත්-ලිපිනය තහවුරුකිරීම:",
        "youremail": "විද්‍යුත් තැපෑල:",
        "username": "{{GENDER:$1|පරිශීලක නාමය}}:",
-       "uid": "{{GENDER:$1|පරිශීලක}} අනන්‍යාංකය:",
        "prefs-memberingroups": "ඉදිරියේ දැක්වෙන {{PLURAL:$1|කණ්ඩායමෙහි|කණ්ඩායම් වල}} {{GENDER:$2|සාමාජිකයෙකි}}:",
        "prefs-registration": "ලියාපදිංචිවූ වේලාව:",
        "yourrealname": "සැබෑ නාමය:",
        "logempty": "ලඝු-සටහනෙහි ගැලපෙන අයිතමයන් කිසිවක් නොමැත.",
        "log-title-wildcard": "මෙම පෙළෙන් ඇරඹෙන ශීර්ෂ සඳහා ගවේෂණය කරන්න",
        "allpages": "සියළු පිටු",
-       "alphaindexline": "$1 සි‍ට $2 වෙත",
        "nextpage": "මීළඟ පිටුව ($1)",
        "prevpage": "පෙර පිටුව ($1)",
        "allpagesfrom": "මෙහිදී ඇරඹෙන පිටු පෙන්වන්න:",
        "newimages-summary": "මෙම විශේෂ පිටුව, අවසානයට උඩුගත කෙරුණු ගොනු පෙන්වයි.",
        "newimages-legend": "පෙරහන",
        "newimages-label": "ගොනු නාමය (හෝ එයින් කොටසක්):",
-       "showhidebots": "(රොබෝ $1 දෙනෙක්)",
        "noimages": "පෙනෙන්නට කිසිවක් නොමැත.",
        "ilsubmit": "ගවේෂණය",
        "bydate": "දිනය මගිනි",
        "watchlistedit-raw-done": "ඔබගේ මුර-ලැයිස්තුව යාවත්කාලීන කරන ලදි.",
        "watchlistedit-raw-added": "{{PLURAL:$1|ශීර්ෂ 1 ක් |ශීර්ෂ  $1 ක් }} එක් කරන ලදි:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|ශීර්ෂ 1 ක්|ශීර්ෂ  $1 ක්}} ඉවත් කරන ලදි:",
+       "watchlistedit-clear-titles": "ශීර්ෂයන්:",
        "watchlisttools-view": "අදාල වෙනස්වීම් නරඹන්න",
        "watchlisttools-edit": "මුර ලැයිස්තුව නැරඹීම හා සංස්කරණය",
        "watchlisttools-raw": "නොනිමි මුර ලැයිස්තුව සංස්කරණය කරන්න",
index d32938a..f9e4885 100644 (file)
        "prefs-emailconfirm-label": "Potvrdenie emailu:",
        "youremail": "Váš e-mail²",
        "username": "{{GENDER:$1|Používateľské meno}}:",
-       "uid": "ID {{GENDER:$1|používateľa}}:",
        "prefs-memberingroups": "{{GENDER:$2|Člen|Členovia}} {{PLURAL:$1|skupiny|skupín}}:",
        "prefs-registration": "Čas registrácie:",
        "yourrealname": "Skutočné meno *:",
        "log-title-wildcard": "Hľadať názvy začínajúce týmto textom",
        "showhideselectedlogentries": "Zobraziť/skryť vybraté položky záznamu",
        "allpages": "Všetky stránky",
-       "alphaindexline": "$1 do $2",
        "nextpage": "Ďalšia stránka ($1)",
        "prevpage": "Predchádzajúca stránka ($1)",
        "allpagesfrom": "Zobraziť stránky od:",
        "newimages-summary": "Táto špeciálna stránka zobrazuje posledné nahrané súbory.",
        "newimages-legend": "Filter",
        "newimages-label": "Názov súboru (alebo jeho časť):",
-       "showhidebots": "($1 botov)",
        "noimages": "Niet čo zobraziť.",
        "ilsubmit": "Hľadať",
        "bydate": "podľa dátumu",
index 7dddd80..2646b01 100644 (file)
@@ -21,8 +21,8 @@
        "tog-showtoolbar": "Prikaži urejevalno orodno vrstico",
        "tog-editondblclick": "Omogoči urejanje strani z dvojnim klikom",
        "tog-editsectiononrightclick": "Omogoči urejanje razdelkov z desnim klikanjem njihovih naslovov",
-       "tog-watchcreations": "Vse ustvarjene strani in moje naložene datoteke dodaj na spisek nadzorov",
-       "tog-watchdefault": "Dodaj na spisek nadzorov vse članke in datoteke, ki sem jih spremenil/-a",
+       "tog-watchcreations": "Na spisek nadzorov dodaj vse ustvarjene strani in moje naložene datoteke",
+       "tog-watchdefault": "Na spisek nadzorov dodaj vse članke in datoteke, ki sem jih spremenil/-a",
        "tog-watchmoves": "Dodaj strani in datoteke, ki jih premaknem, na moj spisek nadzorov",
        "tog-watchdeletion": "Dodaj strani in datoteke, ki jih izbrišem, na moj spisek nadzorov",
        "tog-minordefault": "Vsa urejanja označi kot manjša",
@@ -40,8 +40,8 @@
        "tog-watchlisthideown": "Na spisku nadzorov skrij moja urejanja",
        "tog-watchlisthidebots": "Na spisku nadzorov skrij urejanja botov",
        "tog-watchlisthideminor": "Na spisku nadzorov skrij manjša urejanja",
-       "tog-watchlisthideliu": "Skrij urejanja prijavljenih uporabnikov na spisku nadzorov",
-       "tog-watchlisthideanons": "Skrij urejanja anonimnih uporabnikov na spisku nadzorov",
+       "tog-watchlisthideliu": "Na spisku nadzorov skrij urejanja prijavljenih uporabnikov",
+       "tog-watchlisthideanons": "Na spisku nadzorov skrij urejanja anonimnih uporabnikov",
        "tog-watchlisthidepatrolled": "Na spisku nadzorov skrij pregledana urejanja",
        "tog-ccmeonemails": "Pošlji mi kopijo e-pošt, ki jih pošljem drugim uporabnikom",
        "tog-diffonly": "Pod primerjavo ne prikaži vsebine strani",
        "parser-template-recursion-depth-warning": "Prekoračena globina rekurzije predlog ($1)",
        "language-converter-depth-warning": "Prekoračena globina pretvorbe jezikov ($1)",
        "node-count-exceeded-category": "Strani s prekoračenim številom vozlišč",
+       "node-count-exceeded-category-desc": "Kategorija s stranmi, na katerih je preseženo število vozlišč.",
        "node-count-exceeded-warning": "Stran je prekoračila število vozlišč",
        "expansion-depth-exceeded-category": "Strani s prekoračeno globino razširitve",
+       "expansion-depth-exceeded-category-desc": "Kategorija s stranmi, na katerih je prekoračena globina razširitve.",
        "expansion-depth-exceeded-warning": "Stran je prekoračila globino razširitve",
        "parser-unstrip-loop-warning": "Zaznal sem odvezano zanko",
        "parser-unstrip-recursion-limit": "Presežena je omejitev odvezane rekurzije ($1)",
        "recentchangescount": "Privzeto število prikazanih urejanj:",
        "prefs-help-recentchangescount": "Vključuje zadnje spremembe, zgodovine strani in dnevniške zapise.",
        "prefs-help-watchlist-token2": "To je skrivni ključ do spletnega vira vašega spiska nadzorov. Kdor ve zanj, lahko bere vaš spisek nadzorov, zato ključa ne delite. [[Special:ResetTokens|Kliknite tukaj, če ga želite ponastaviti]].",
-       "savedprefs": "Spremembe so uspešno shranjene.",
+       "savedprefs": "Spremembe smo uspešno shranili.",
        "timezonelegend": "Časovni pas",
        "localtime": "Krajevni čas:",
        "timezoneuseserverdefault": "Uporabi privzeti wiki čas ($1)",
        "prefs-emailconfirm-label": "Potrditev e-pošte:",
        "youremail": "E-poštni naslov:",
        "username": "{{GENDER:$1|Uporabniško|Uporabničino}} ime:",
-       "uid": "ID {{GENDER:$1|uporabnika|uporabnice}}:",
        "prefs-memberingroups": "{{GENDER:$2|Član|Članica}} {{PLURAL:$1|naslednje skupine|naslednjih skupin}}:",
        "prefs-memberingroups-type": "$1",
        "prefs-registration": "Registriran od:",
        "right-move": "Premikanje strani",
        "right-move-subpages": "Premikanje strani s pripadajočimi podstranmi",
        "right-move-rootuserpages": "Premikanje korenskih uporabniških strani",
+       "right-move-categorypages": "Prestavljanje strani kategorij",
        "right-movefile": "Premikanje datotek",
        "right-suppressredirect": "Možnost izpuščanja preusmeritve pri premikanju strani",
        "right-upload": "Nalaganje datotek",
        "action-move": "premik te strani",
        "action-move-subpages": "premik te strani in njenih podstrani",
        "action-move-rootuserpages": "premik korenskih uporabniških strani",
+       "action-move-categorypages": "prestavljanje strani kategorij",
        "action-movefile": "premik te datoteke",
        "action-upload": "nalaganje te datoteke",
        "action-reupload": "prepis obstoječe datoteke",
        "log-title-wildcard": "Iskanje po naslovih, začenši s tem besedilom",
        "showhideselectedlogentries": "Pokaži/skrij izbrane dnevniške vnose",
        "allpages": "Vse strani",
-       "alphaindexline": "$1 do $2",
        "nextpage": "Naslednja stran ($1)",
        "prevpage": "Prejšnja stran ($1)",
        "allpagesfrom": "Prikaži strani, ki se začnejo na:",
        "movepagetalktext": "Če obstaja, bo samodejno prestavljena tudi pripadajoča pogovorna stran, '''razen kadar'''\n*pod novim imenom že obstaja neprazna pogovorna stran ali\n*ste odkljukali spodnji okvirček.\n\nČe je tako, boste morali pogovorno stran, če želite, prestaviti ali povezati ročno.",
        "movearticle": "Prestavi stran:",
        "moveuserpage-warning": "'''Opozorilo:''' Premikate uporabniško stran. To pomeni, da bo premaknjena samo stran in uporabnik ''ne'' bo preimenovan.",
+       "movecategorypage-warning": "<strong>Opozorilo:</strong> Prestavili boste stran kategorije. Pomnite, da boste prestavili samo stran; vse strani v stari kategoriji <em>ne</em> bomo prekategorizirali v novo kategorijo.",
        "movenologintext": "Za prestavljanje strani morate biti registrirani in [[Special:UserLogin|prijavljeni]].",
        "movenotallowed": "Za prestavljanje strani nimate dovoljenja.",
        "movenotallowedfile": "Nimate dovoljenja, da premikate datoteke.",
        "cant-move-user-page": "Nimate dovoljenja, da premikate uporabniške strani (razen podstrani).",
        "cant-move-to-user-page": "Nimate dovoljenja, da premikate strani na uporabniške strani (razen na uporabniške podstrani).",
+       "cant-move-category-page": "Nimate pravic za prestavljanje strani kategorij.",
+       "cant-move-to-category-page": "Nimate pravic za prestavljanje strani na stran kategorije.",
        "newtitle": "Na naslov:",
        "move-watch": "Opazuj to stran",
        "movepagebtn": "Prestavi stran",
        "newimages-summary": "Ta posebna stran prikazuje najnovejše naložene datoteke.",
        "newimages-legend": "Filter",
        "newimages-label": "Ime datoteke (ali njen del):",
-       "showhidebots": "($1 bote)",
+       "newimages-showbots": "Prikaži nalaganja botov",
        "noimages": "Nič ni videti.",
        "ilsubmit": "Išči",
        "bydate": "po datumu",
        "watchlistedit-normal-explain": "Strani na vašem spisku nadzorov so prikazane spodaj.\nDa odstranite stran, označite kvadratek poleg nje in kliknite »{{int:Watchlistedit-normal-submit}}«.\nLahko tudi [[Special:EditWatchlist/raw|uredite gol spisek]].",
        "watchlistedit-normal-submit": "Odstrani strani",
        "watchlistedit-normal-done": "Z vašega spiska nadzorov {{PLURAL:$1|je bila odstranjena $1 stran|sta bili odstranjeni $1 strani|so bile odstranjene $1 strani|je bilo odstranjenih $1 strani}}:",
-       "watchlistedit-raw-title": "urejanje golega spiska nadzorov",
+       "watchlistedit-raw-title": "Urejanje golega spiska nadzorov",
        "watchlistedit-raw-legend": "Uredi gol spisek nadzorov",
        "watchlistedit-raw-explain": "Strani na vašem spisku nadzorov so prikazane spodaj in jih lahko urejate z dodajanjem in odstranjevanjem s seznama; vsak naslov je v svoji vrstici.\nKo končate, kliknite »{{int:Watchlistedit-raw-submit}}«.\nUporabite lahko tudi [[Special:EditWatchlist|standardni urejevalnik]].",
        "watchlistedit-raw-titles": "Strani:",
        "watchlistedit-raw-done": "Vaš spisek nadzorov je bil posodobljen.",
        "watchlistedit-raw-added": "{{PLURAL:$1|Dodana je bila $1 stran|Dodani sta bili $1 strani|Dodane so bile $1 strani|Dodanih je bilo $1 strani}}:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|Odstranjena je bila $1 stran|Odstranjeni sta bili 2 strani|Odstranjene so bile $1 strani|Odstranjenih je bilo $1 strani}}:",
-       "watchlisttools-view": "oglej si ustrezne spremembe",
-       "watchlisttools-edit": "prikaz in urejanje spiska nadzorov",
+       "watchlistedit-clear-title": "Čiščenje spiska nadzorov",
+       "watchlistedit-clear-legend": "Počistite spisek nadzorov",
+       "watchlistedit-clear-explain": "Vse naslove bomo odstranili z vašega spiska nadzorov",
+       "watchlistedit-clear-titles": "Naslovi:",
+       "watchlistedit-clear-submit": "Počisti spisek nadzorov (To je trajno!)",
+       "watchlistedit-clear-done": "Vaš spisek nadzorov smo počistili.",
+       "watchlistedit-clear-removed": "Odstranili smo $1 {{PLURAL:$1|naslov|naslova|naslove|naslovov}}:",
+       "watchlistedit-too-many": "Obstaja preveč strani, da bi jih tukaj prikazali.",
+       "watchlisttools-clear": "Počisti spisek nadzorov",
+       "watchlisttools-view": "Oglej si ustrezne spremembe",
+       "watchlisttools-edit": "Prikaz in urejanje spiska nadzorov",
        "watchlisttools-raw": "Uredi gol spisek nadzorov",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|pogovor]])",
        "unknown_extension_tag": "Neznana razširitvena etiketa »$1«",
index aca2189..7d6655c 100644 (file)
        "logout": "Ka bax",
        "userlogout": "Ka bax",
        "notloggedin": "Gudaha kuma jirtid",
-       "userlogin-noaccount": "Akoon ma heysatid?",
+       "userlogin-noaccount": "Akoon ma lihid?",
        "userlogin-joinproject": "Ku biir {{SITENAME}}",
-       "nologin": "Akoon ma heysatid? $1.",
+       "nologin": "Akoon ma lihid? $1.",
        "nologinlink": "Akoon sameyso",
        "createaccount": "Sameey gudagale",
        "gotaccount": "Waan heystaa gudagale? '''$1'''.",
        "gotaccountlink": "Gudaha gal",
        "userlogin-resetlink": "Ma ilaawday tafaasiisha gudagalahaada?",
        "userlogin-resetpassword-link": "Dib usoo cesho erey sirtaada",
+       "userlogin-helplink2": "Caawinaad habka gudagalka",
        "createacct-emailoptional": "Ciwaanka e-mail-ka (dooqasho)",
        "createacct-email-ph": "Gali Ciwaankaada e-mail-ka",
        "createaccountmail": "E-mail ahaan",
        "login-throttled": "wax badan ayaa isku dayday in aad soo gasho.\nFadlan waxyar sug intii aadan soo gelin.",
        "login-abort-generic": "Ma u soo gali karin gudaha - waa la noqay",
        "loginlanguagelabel": "Luqada: $1",
+       "pt-login": "Gudaha gal",
+       "pt-createaccount": "Samayso gudagal",
        "pt-userlogout": "Ka bax",
        "user-mail-no-addy": "Isku dayday in aa dirto e-mail ayada oo ciwaan e-mail la'aan ah.",
        "changepassword": "Bedel ereysirta",
        "prefs-emailconfirm-label": "Hubinta Email-ka:",
        "youremail": "E-mail:",
        "username": "Gudagal:",
-       "uid": "Lambarka isticmaalaha:",
+       "prefs-memberingroups": "{{GENDER:$2|Xubin}} ka mid ah {{PLURAL:$1|kooxda|kooxaha}}:",
        "yourrealname": "Magacaaga runta ah:",
        "yourlanguage": "luqad:",
        "yournick": "Saxiix cusub:",
        "prefs-help-email": "E-mail waa wax aad xor u leedahay. laakiin waa loo baahanyahay hadii aad eraysirka badaleesid, hadii aad ilaawdo eraygaaga sirta ah",
        "prefs-help-email-others": "Waxaa kale oo aad u isticmaali kartaa in ee dadka kale kugula soo xiriiraan e-mail ayaga oo isticmaalaayo linki isticmaalahaada ama bogga wadahadalka.\nE-mailkaada mala sheegaayo markii ee dadka kale kula soo xiriirayaan.",
        "prefs-help-email-required": "Waxaa loo baahanyahay e-mail.",
+       "prefs-info": "Macluumaadka asaasiga ah",
        "saveusergroups": "Kaydi kooxaha isticmaalayaasha",
        "userrights-groupsmember": "Ka mid ah:",
        "userrights-reason": "Sababta:",
        "group": "Koox:",
        "group-user": "Isticmaalada",
-       "group-autoconfirmed": "Gude galayaasha la hubiyey si iskeed ah",
+       "group-autoconfirmed": "Gudagale la aqoonsaday",
        "group-bot": "botyada",
        "group-sysop": "Maamulada",
        "group-all": "(dhamaan)",
        "group-bot-member": "{{GENDER:$1|bot}}",
        "group-sysop-member": "{{GENDER:$1|maamulaha}}",
        "grouppage-user": "{{ns:project}}:Isticmaalada",
-       "grouppage-autoconfirmed": "{{ns:project}}:Adeegsade la hubiyey",
+       "grouppage-autoconfirmed": "{{ns:project}}:Gudagale la aqoonsaday",
        "grouppage-sysop": "{{ns:project}}:Maamulada",
        "right-read": "Akhri maqaalada",
        "right-edit": "Wax ka bedel bogyaalo",
+       "right-createpage": "Samaynta bogag (taasoo aan lahayn bogag wadahadal)",
+       "right-createtalk": "Samaynta bogagga wadahadalka",
+       "right-createaccount": "Samaynta akoon isticmaale cusub",
+       "right-minoredit": "Calaamaynta bedelka yar",
        "right-move": "Wareeji maqaalada",
        "right-upload": "Soo geli fayl",
+       "right-writeapi": "Adeegsiga API ee qorista",
        "right-delete": "Tirtir maqaalada",
        "right-bigdelete": "Tirtir maqaalada taariikhda dheer leh",
        "right-browsearchive": "Raadi maqaalada la tirtiray",
        "right-undelete": "Ha tirtirin bog",
+       "right-editmyusercss": "Bedel galalka CSS ee isticmaalaha laftiisa",
+       "right-editmyuserjs": "Bedel galalka JavaScript ee isticmaalaha laftiisa",
+       "right-viewmywatchlist": "Egista liiska waardiyaha",
+       "right-editmywatchlist": "Bedel liiska waardiyaha. Eeg qaybo ka mid ah dhaqdhaqaaqa in aan weli lagu kordhin haddi uusan jirin xitaa xaqaan.",
+       "right-viewmyprivateinfo": "Eegista macluumaadka gaarka ah (sida ciwaanka e-mail-ka, iyo magaca saxda ah)",
+       "right-editmyprivateinfo": "Bedel macluumaadka gaarka ah (sida. ciwaanka e-mail-ka , iyo magaca saxda ah)",
+       "right-editmyoptions": "Bedelka dooqyada",
        "newuserlogpage": "Gudagalaha Isticmaale sameeyay",
        "action-read": "akhri boggaan",
        "action-edit": "wax ka bedel boggaan",
        "action-createpage": "sameey bogyaalo",
+       "action-createtalk": "Samaynta bogagga wadahadalka",
        "action-upload": "soo geli file'kaan",
        "action-delete": "tirtir boggaan",
        "action-browsearchive": "Raadi maqaalada la tirtiray",
        "booksources-go": "Soco",
        "log": "Guda galayaasha",
        "allpages": "Dhamaan bogagga",
-       "alphaindexline": "$1 ilaa $2",
        "nextpage": "Bogga ku xiga ($1)",
        "prevpage": "Bogga ka horeeyo ($1)",
        "allpagesfrom": "Soosaar boggaga ka bilaawda:",
        "listusers-submit": "I'tus",
        "listusers-noresult": "Lama helin isticmaale.",
        "listusers-blocked": "(waa la mamnuucay)",
+       "listgrouprights": "Xuquuqaha koox isticmaalada",
+       "listgrouprights-summary": "Kani waa liiska koox isticmaale yaal ah ee la aqoonsaday wikigaan, in ay leeyihiin xuquuqdaan.\nWaxaa laga yaabaa in ay halkaan ku jiraan [[{{MediaWiki:Listgrouprights-helppage}}|macluumaad dheeraad ah]] ee ku saabsan xuquuqaha kala gadisan.",
+       "listgrouprights-key": "Ciwaanka:\n* <span class=\"listgrouprights-granted\">Xuquuq la siiyey</span>\n* <span class=\"listgrouprights-revoked\">Xuquuq laga qaaday</span>",
+       "listgrouprights-group": "Kooxda",
+       "listgrouprights-rights": "Xuquuqaha",
        "listgrouprights-members": "(Inta ka mid ah liiskooda)",
        "mailnologin": "Ma'jiro cinwaan wax lagu diro",
        "mailnologintext": "Waa in aad [[Special:UserLogin|gudaha ku jirtaa]]\nkuna haysatid E-boosto sax ah [[Special:Preferences|dooqyadaada]],\nsi aad ugu dirto E-boosto isticmaalayaasha kale.",
        "lastmodifiedatby": "Bogaan waxaa ugu dambeyntii wax laga bedelay $2, $1 kana bedelay $3.",
        "othercontribs": "Waxay ku saleysantahay shaqada $1.",
        "pageinfo-title": "Macluumaad ku saabsan \"$1\"",
-       "pageinfo-header-basic": "Macaaluumaadka asaasiga ah",
+       "pageinfo-header-basic": "Macluumaadka asaasiga ah",
        "pageinfo-toolboxlink": "Macluumad ku saabsan",
        "previousdiff": "← bedelkii ka duqsanaa",
        "nextdiff": "Bedelkii ugu cusbaa →",
        "metadata-help": "Faylkaan wuxuu leeyahay  faah faahin dheeraad ah,waxaa laga yaabaa in lagu  isticmaalay digital kaamiro ama skanner oo lagu sameeyo sawir ama lagu digitilays gareeyay.\nHadii faylka wax laga badalay sida oo markiisa hore ahaa, waxaa laga yaabaa in ee  faah faahinta faylkaan eesan dhameestirneen.",
        "metadata-fields": "Sawirka qeybihiisa metadata oo ku tixan fariintaan waxaa lagu dari doonaa bogga sawirka meesha laga arko markii miiska metadata la qariyo.Kuwa kale waxaa loo qarinaa sida default.\n* make\n* model\n* datetimeoriginal\n* exposuretime\n* fnumber\n* isospeedratings\n* focallength\n* artist\n* copyright\n* imagedescription\n* gpslatitude\n* gpslongitude\n* gpsaltitude",
        "exif-iimcategory": "Qeybta",
+       "exif-dc-rights": "Xuquuqaha",
        "watchlistall2": "dhamaan",
        "namespacesall": "dhamaan",
        "monthsall": "Dhamaan",
        "fileduplicatesearch-legend": "Raadi mid tusaale ah",
        "fileduplicatesearch-submit": "Raadi",
        "specialpages": "bogagga khaaska ah",
+       "specialpages-note-top": "Furaha",
        "specialpages-group-pages": "liiska maqaalada",
        "blankpage": "Bog masaxan",
        "tag-filter": "[[Special:Tags|Filtaraha]] tag:",
index 505a1b1..ae8507d 100644 (file)
        "newimages-summary": "Kjo faqe speciale tregon skedat e ngarkuara së fundmi.",
        "newimages-legend": "Filtrues",
        "newimages-label": "Emri i skedës (ose një pjesë e tij):",
-       "showhidebots": "($1 robotët)",
        "noimages": "S'ka gjë për të parë.",
        "ilsubmit": "Kërko",
        "bydate": "datës",
index 172891a..c0ac8e6 100644 (file)
        "retypenew": "Потврда лозинке:",
        "resetpass_submit": "Постави лозинку и пријави ме",
        "changepassword-success": "Ваша лозинка је успешно промењена!",
+       "changepassword-throttled": "Превише пута сте покушали да се пријавите.\nМолимо вас да сачекате $1 пре него што покушате поново.",
        "resetpass_forbidden": "Лозинка не може бити промењена",
        "resetpass-no-info": "Морате бити пријављени да бисте приступили овој страници.",
        "resetpass-submit-loggedin": "Промени лозинку",
        "invalid-content-data": "Неисправни подаци садржаја",
        "content-not-allowed-here": "Садржај модела „$1“ није дозвољен на страници [[$2]]",
        "editwarning-warning": "Ако напустите ову страницу, изгубићете све измене које сте направили.\nАко сте пријављени, можете онемогућити ово упозорење у својим подешавањима, у одељку „{{int:prefs-editing}}“.",
+       "editpage-notsupportedcontentformat-title": "Формат садржаја није подржан",
        "content-model-wikitext": "викитекст",
        "content-model-text": "чист текст",
        "content-model-javascript": "јаваскрипт",
        "prefs-emailconfirm-label": "Потврда е-адресе:",
        "youremail": "Е-адреса:",
        "username": "{{GENDER:$1|Корисничко име}}:",
-       "uid": "{{GENDER:$1|Кориснички}} ID:",
        "prefs-memberingroups": "{{PLURAL:$1|Група|Групе}}:",
        "prefs-memberingroups-type": "$1",
        "prefs-registration": "Време уписа:",
        "listredirects": "Списак преусмерења",
        "listduplicatedfiles": "Списак дупликата датотека",
        "listduplicatedfiles-summary": "Ово је списак датотека које су дупликат неких других датотека. Само локалне датотеке су приказане.",
+       "listduplicatedfiles-entry": "[[:File:$1|$1]] има [[$3|{{PLURAL:$2|један дупликат|$2 дупликата}}]].",
        "unusedtemplates": "Некоришћени шаблони",
        "unusedtemplatestext": "Ова страница наводи све странице у именском простору {{ns:template}} које нису укључене ни на једној другој страници.\nПре брисања проверите да ли друге странице воде до тих шаблона.",
        "unusedtemplateswlh": "остале везе",
        "log-title-wildcard": "тражи наслове који почињу с овим текстом",
        "showhideselectedlogentries": "Прикажи/сакриј изабране записе",
        "allpages": "Све странице",
-       "alphaindexline": "$1 до $2",
        "nextpage": "Следећа страница ($1)",
        "prevpage": "Претходна страница ($1)",
        "allpagesfrom": "Прикажи странице почев од:",
        "watchlistanontext": "Морате бити $1 да бисте гледали и уређивали ставке на вашем списку надгледања.",
        "watchnologin": "Нисте пријављени",
        "addwatch": "Додај на списак надгледања",
-       "addedwatchtext": "Страница „[[:$1]]“ је додата на ваш [[Special:Watchlist|списак надгледања]].\nБудуће измене ове странице и њене странице за разговор биће наведене овде.",
+       "addedwatchtext": "Страница „[[:$1]]“ је додата на ваш [[Special:Watchlist|списак надгледања]].\nБудуће измене ове странице и њене странице за разговор биће наведене тамо.",
        "removewatch": "Уклони са списка надгледања",
        "removedwatchtext": "Страница „[[:$1]]“ је уклоњена с вашег [[Special:Watchlist|списка надгледања]].",
        "watch": "Надгледај",
        "exbeforeblank": "садржај пре брисања је био: „$1“",
        "delete-confirm": "Брисање странице „$1“",
        "delete-legend": "Обриши",
-       "historywarning": "'''Упозорење:''' страница коју желите да обришете има историју с приближно $1 {{PLURAL:$1|изменом|измене|измена}}:",
+       "historywarning": "<strong>Упозорење:</strong> страница коју желите да обришете има историју с приближно $1 {{PLURAL:$1|изменом|измене|измена}}:",
        "confirmdeletetext": "Управо ћете обрисати страницу, укључујући и њену историју.\nПотврдите своју намеру, да разумете последице и да ово радите у складу с [[{{MediaWiki:Policy-url}}|правилима]].",
        "actioncomplete": "Радња је завршена",
        "actionfailed": "Радња није успела",
        "contributions-title": "Доприноси {{GENDER:$1|корисника|кориснице}} $1",
        "mycontris": "Доприноси",
        "contribsub2": "За {{GENDER:$3|$1}} ($2)",
+       "contributions-userdoesnotexist": "Кориснички налог „$1“ није регистрован.",
        "nocontribs": "Нема измена које одговарају наведеним критеријумима.",
        "uctop": "(последња)",
        "month": "од месеца (и раније):",
        "newimages-summary": "Ова посебна страница приказује последње послате датотеке.",
        "newimages-legend": "Филтер",
        "newimages-label": "Назив датотеке (или њен део):",
-       "showhidebots": "($1 ботове)",
        "noimages": "Нема ништа.",
        "ilsubmit": "Претражи",
        "bydate": "по датуму",
index cb42678..7ac235d 100644 (file)
        "recentchangesdays-max": "(najviše $1 {{PLURAL:$1|dan|dana|dana}})",
        "recentchangescount": "Broj izmena za prikaz:",
        "prefs-help-recentchangescount": "Podrazumeva skorašnje izmene, istorije stranica i dnevnike.",
+       "prefs-help-watchlist-token2": "Ovo je tajni ključ za veb dovod vašeg spiska nadgledanja.\nSvako ko zna ovaj ključ biće u mogućnosti da vidi vaša nadgledanja stoga nemojte ga odavati nikome.\nAko je potrebno možete ga [[Special:ResetTokens|resetovati]].",
        "savedprefs": "Vaša podešavanja su sačuvana.",
        "timezonelegend": "Vremenska zona:",
        "localtime": "Lokalno vreme:",
        "prefs-emailconfirm-label": "Potvrda e-adrese:",
        "youremail": "E-adresa:",
        "username": "{{GENDER:$1|Korisničko ime}}:",
-       "uid": "{{GENDER:$1|Korisnički}} ID:",
        "prefs-memberingroups": "{{PLURAL:$1|Grupa|Grupe}}:",
        "prefs-memberingroups-type": "$1",
        "prefs-registration": "Vreme upisa:",
        "log-title-wildcard": "traži naslove koji počinju s ovim tekstom",
        "showhideselectedlogentries": "Prikaži/sakrij izabrane zapise",
        "allpages": "Sve stranice",
-       "alphaindexline": "$1 do $2",
        "nextpage": "Sledeća stranica ($1)",
        "prevpage": "Prethodna stranica ($1)",
        "allpagesfrom": "Prikaži stranice počev od:",
        "watchlistanontext": "Morate biti $1 da biste gledali i uređivali stavke na vašem spisku nadgledanja.",
        "watchnologin": "Niste prijavljeni",
        "addwatch": "Dodaj na spisak nadgledanja",
-       "addedwatchtext": "Stranica „[[:$1]]“ je dodata na vaš [[Special:Watchlist|spisak nadgledanja]].\nBuduće izmene ove stranice i njene stranice za razgovor biće navedene ovde.",
+       "addedwatchtext": "Stranica „[[:$1]]“ je dodata na vaš [[Special:Watchlist|spisak nadgledanja]].\nBuduće izmene ove stranice i njene stranice za razgovor biće navedene tamo.",
        "removewatch": "Ukloni sa spiska nadgledanja",
        "removedwatchtext": "Stranica „[[:$1]]“ je uklonjena s vašeg [[Special:Watchlist|spiska nadgledanja]].",
        "watch": "Nadgledaj",
        "exbeforeblank": "sadržaj pre brisanja je bio: „$1“",
        "delete-confirm": "Brisanje stranice „$1“",
        "delete-legend": "Obriši",
-       "historywarning": "'''Upozorenje:''' stranica koju želite da obrišete ima istoriju s približno $1 {{PLURAL:$1|izmenom|izmene|izmena}}:",
+       "historywarning": "<strong>Upozorenje:</strong> stranica koju želite da obrišete ima istoriju s približno $1 {{PLURAL:$1|izmenom|izmene|izmena}}:",
        "confirmdeletetext": "Upravo ćete obrisati stranicu, uključujući i njenu istoriju.\nPotvrdite svoju nameru, da razumete posledice i da ovo radite u skladu s [[{{MediaWiki:Policy-url}}|pravilima]].",
        "actioncomplete": "Radnja je završena",
        "actionfailed": "Radnja nije uspela",
        "newimages-summary": "Ova posebna stranica prikazuje poslednje poslate datoteke.",
        "newimages-legend": "Filter",
        "newimages-label": "Naziv datoteke (ili njen deo):",
-       "showhidebots": "($1 botove)",
        "noimages": "Nema ništa.",
        "ilsubmit": "Pretraži",
        "bydate": "po datumu",
index 37ed035..cedcb88 100644 (file)
        "newimages-summary": "Disse Spezioalsiede wiest do toulääst hoochleedene Doatäie an.",
        "newimages-legend": "Filter",
        "newimages-label": "Doatäinoome (of n Paat deerfon):",
-       "showhidebots": "(Bots $1)",
        "noimages": "neen Bielden fuunen.",
        "ilsubmit": "Säik",
        "bydate": "ätter Doatum",
index 265f54d..be38bf4 100644 (file)
        "imagelisttext": "Di handap ieu daptar '''$1''' {{PLURAL:$1|gambar|gambar}} nu disusun $2.",
        "newimages-summary": "Ieu kaca husus ngabéréndélkeun koropak nu alanyar dimuat.",
        "newimages-label": "Ngaran berkas (atawa sawaréh tina ngaranna):",
-       "showhidebots": "($1 bot)",
        "noimages": "Taya nanaon.",
        "ilsubmit": "Sungsi",
        "bydate": "dumasar titimangsa",
index e8c506a..16ae384 100644 (file)
        "prefs-emailconfirm-label": "E-postbekräftelse:",
        "youremail": "E-post:",
        "username": "{{GENDER:$1|Användarnamn}}:",
-       "uid": "{{GENDER:$1|Användar}}-ID:",
        "prefs-memberingroups": "{{GENDER:$2|Medlem}} av {{PLURAL:$1|gruppen|grupperna}}:",
        "prefs-registration": "Registreringstid:",
        "yourrealname": "Riktigt namn:",
        "right-move": "Flytta sidor",
        "right-move-subpages": "Flytta sidor med deras undersidor",
        "right-move-rootuserpages": "Flytta root-användarsidor",
+       "right-move-categorypages": "Flytta kategorisidor",
        "right-movefile": "Flytta filer",
        "right-suppressredirect": "Skapa inte omdirigeringar från ursprungssidan vid sidflyttning",
        "right-upload": "Ladda upp filer",
        "action-move": "flytta denna sida",
        "action-move-subpages": "flytta denna sida, och dess undersidor",
        "action-move-rootuserpages": "flytta root-användarsidor",
+       "action-move-categorypages": "flytta kategorisidor",
        "action-movefile": "flytta den här filen",
        "action-upload": "ladda upp denna fil",
        "action-reupload": "skriva över denna existerade fil",
        "log-title-wildcard": "Sök efter sidtitlar som börjar med texten",
        "showhideselectedlogentries": "Visa/Dölj markerade loggposter",
        "allpages": "Alla sidor",
-       "alphaindexline": "$1 till $2",
        "nextpage": "Nästa sida ($1)",
        "prevpage": "Föregående sida ($1)",
        "allpagesfrom": "Visa sidor från och med:",
        "movepagetalktext": "Diskussionssidan kommer att även den automatiskt flyttas '''om inte''':\n*Det redan finns en diskussionssida som inte är tom med det nya namnet, eller\n*Du avmarkerar rutan nedan.\n\nI de fallen måste du flytta eller sammanfoga sidan manuellt, om det önskas.",
        "movearticle": "Flytta sidan:",
        "moveuserpage-warning": "'''Varning:''' Du håller på att flytta en användarsida. Observera att endast sidan kommer att flyttas och att användaren ''inte'' kommer att byta namn.",
+       "movecategorypage-warning": "<strong>Varning:</strong> Du är på väg att flytta ebn kategorisida. Observera att endast sidan kommer att flyttas och eventuella sidor i den gamla kategorin kommer <em>inte</em> att kategoriseras om till den nya kategorin.",
        "movenologintext": "För att flytta en sida måste du vara registrerad användare och [[Special:UserLogin|inloggad]].",
        "movenotallowed": "Du har inte behörighet att flytta sidor på den här wikin.",
        "movenotallowedfile": "Du har inte tillåtelse att flytta filer.",
        "cant-move-user-page": "Du har inte behörighet att flytta användarsidor (bortsett från undersidor).",
        "cant-move-to-user-page": "Du har inte behörighet att flytta en sida till en användarsida (förutom till en användarundersida).",
+       "cant-move-category-page": "Du har inte behörighet att flytta kategorisidor.",
+       "cant-move-to-category-page": "Du har inte behörighet att en sida till en kategorisida.",
        "newtitle": "Till nya titeln:",
        "move-watch": "Bevaka denna sida",
        "movepagebtn": "Flytta sidan",
        "newimages-summary": "Den här specialsidan visar de senast uppladdade filerna.",
        "newimages-legend": "Filter",
        "newimages-label": "Filnamn (eller en del av det):",
-       "showhidebots": "($1 robotar)",
+       "newimages-showbots": "Visa uppladdningar av botar",
        "noimages": "Ingenting att se.",
        "ilsubmit": "Sök",
        "bydate": "efter datum",
        "watchlistedit-raw-done": "Din bevakningslista har uppdaterats.",
        "watchlistedit-raw-added": "{{PLURAL:$1|1 sida|$1 sidor}} lades till:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|1 sida|$1 sidor}} togs bort:",
+       "watchlistedit-clear-title": "Rensa bevakningslistan",
+       "watchlistedit-clear-legend": "Rensa bevakningslistan",
+       "watchlistedit-clear-explain": "Alla titlar kommer att tas bort från din bevakningslista",
+       "watchlistedit-clear-titles": "Titlar:",
+       "watchlistedit-clear-submit": "Rensa bevakningslistan (Detta är permanent!)",
+       "watchlistedit-clear-done": "Din bevakningslista har rensats.",
+       "watchlistedit-clear-removed": "{{PLURAL:$1|1 titel|$1 titlar}} togs bort:",
+       "watchlistedit-too-many": "Det finns för många sidor att visa här.",
+       "watchlisttools-clear": "Rensa bevakningslistan",
        "watchlisttools-view": "Visa relevanta ändringar",
        "watchlisttools-edit": "Visa och redigera bevakningslistan",
        "watchlisttools-raw": "Redigera bevakningslistan i råformat",
index a32256e..660df9c 100644 (file)
        "prefs-emailconfirm-label": "Kuhakikisha barua pepe:",
        "youremail": "Barua pepe yako:",
        "username": "Jina la mtumiaji:",
-       "uid": "Namba ya mtumiaji:",
        "prefs-memberingroups": "Mwanachama wa {{PLURAL:$1|kundi la|makundi ya}}:",
        "prefs-registration": "Wakati wa kusajili:",
        "yourrealname": "Jina lako halisi:",
        "logempty": "Vitu vyenye vipengele hivi havipo kwenye kumbukumbu.",
        "log-title-wildcard": "Tafuta kurasa zenye vichwa vinavyoanza na maandishi haya",
        "allpages": "Kurasa zote",
-       "alphaindexline": "$1 hadi $2",
        "nextpage": "Ukurasa ujao ($1)",
        "prevpage": "Ukurasa uliotangulia ($1)",
        "allpagesfrom": "Onyesha kurasa zinazoanza kutoka:",
        "newimages-summary": "Ukurasa maalum huu unaonyesha mafaili yaliyopakiwa hivi karibuni.",
        "newimages-legend": "Chuja",
        "newimages-label": "Jina la faili (au sehemu yake):",
-       "showhidebots": "(roboti $1)",
        "noimages": "Hakuna picha.",
        "ilsubmit": "Tafuta",
        "bydate": "kwa tarehe",
index 6edd8a0..64158b3 100644 (file)
        "newimages-summary": "Na tyj ekstra zajće prezyntowane sům uostatńo wćepńynte pliki.",
        "newimages-legend": "Filtruj",
        "newimages-label": "Mjano plika (abo jygo tajla):",
-       "showhidebots": "($1 boty)",
        "noimages": "Brak plikůw do pokozańo.",
        "ilsubmit": "Šnupej",
        "bydate": "wedle daty",
index 10d9de5..7117def 100644 (file)
        "newimages-summary": "இச்சிறப்புப் பக்கம் கடைசியாக பதிவேற்றப்பட்ட பக்கங்களைப் பட்டியலிடுகிறது.",
        "newimages-legend": "வடிகட்டி",
        "newimages-label": "கோப்பின் பெயர் (அல்லது அதன் பகுதி):",
-       "showhidebots": "(தானியங்கிகளை $1)",
        "noimages": "பார்வைக்கு ஓன்றுமில்லை.",
        "ilsubmit": "தேடுக",
        "bydate": "நாள் வழி",
index 0e1514c..777299d 100644 (file)
@@ -37,7 +37,7 @@
        "tog-watchdefault": "నేను మార్చే పేజీలను మరియు దస్త్రాలను నా వీక్షణ జాబితాకు చేర్చు",
        "tog-watchmoves": "నేను తరలించిన పేజీలను మరియు దస్త్రాలను నా వీక్షణ జాబితాకు చేర్చు",
        "tog-watchdeletion": "నేను తొలగించిన పేజీలను మరియు దస్త్రాలను నా వీక్షణ జాబితాకు చేర్చు",
-       "tog-minordefault": "డిఫాలà±\8dà°\9fà±\81గా నా మార్పులను చిన్న మార్పులుగా గుర్తించు",
+       "tog-minordefault": "à°\85à°ªà±\8dà°°à°®à±\87à°¯à°\82గా నా మార్పులను చిన్న మార్పులుగా గుర్తించు",
        "tog-previewontop": "వ్యాసం మార్పుల మునుచూపును ఎడిట్ పెట్టె పైన చూపు",
        "tog-previewonfirst": "మొదటి  దిద్దుబాటు చేసినపుడు వ్యాసపు మునుచూపు చూపించు",
        "tog-enotifwatchlistpages": "నా వీక్షణాజాబితా లోని పేజీ లేదా దస్త్రం మారినపుడు నాకు ఈ-మెయిలు పంపు",
@@ -63,7 +63,7 @@
        "tog-prefershttps": "లాగిన్ అయి ఉన్నప్పుడెల్లా భద్ర కనెక్షనునే వాడు",
        "underline-always": "ఎల్లప్పుడూ",
        "underline-never": "ఎప్పటికీ వద్దు",
-       "underline-default": "à°°à±\82à°ªà±\81 à°¯à±\8aà°\95à±\8dà°\95 à°²à±\87దా à°µà°¿à°¹à°¾à°°à°¿à°£à°¿ à°¯à±\8aà°\95à±\8dà°\95 అప్రమేయం",
+       "underline-default": "à°\85à°²à°\82à°\95ారపà±\81 à°²à±\87దా à°µà°¿à°¹à°¾à°°à°¿à°£à°¿ అప్రమేయం",
        "editfont-style": "దిద్దుబాటు పెట్టె ఫాంటు శైలి:",
        "editfont-default": "విహరిణి అప్రమేయం",
        "editfont-monospace": "మోనోస్పేస్‍డ్ ఫాంట్",
        "nocookiesnew": "ఖాతాని సృష్టించాం, కానీ మీరు ఇంకా లోనికి ప్రవేశించలేదు.\nవాడుకరుల ప్రవేశానికి {{SITENAME}} కూకీలను వాడుతుంది.\nమీరు కూకీలని అచేతనం చేసివున్నారు.\nదయచేసి వాటిని చేతనంచేసి, మీ కొత్త వాడుకరి పేరు మరియు సంకేతపదాలతో లోనికి ప్రవేశించండి.",
        "nocookieslogin": "వాడుకరుల ప్రవేశానికై {{SITENAME}} కూకీలను వాడుతుంది.\nమీరు కుకీలని అచేతనం చేసివున్నారు.\nవాటిని చేతనంచేసి ప్రయత్నించండి.",
        "nocookiesfornew": "మూలాన్ని కనుక్కోలేకపోయాం కాబట్టి, ఈ వాడుకరి ఖాతాను సృష్టించలేకపోయాం.\nమీ కంప్యూటర్లో కూకీలు చేతనమై ఉన్నాయని నిశ్చయించుకొని, ఈ పేజీని తిరిగి లోడు చేసి, మళ్ళీ ప్రయత్నించండి.",
-       "noname": "మీరు సరైన వాడుకరిపేరు ఇవ్వలేదు.",
+       "noname": "మీరు సరైన వాడుకరి పేరు ఇవ్వలేదు.",
        "loginsuccesstitle": "ప్రవేశం విజయవంతమైంది",
        "loginsuccess": "<strong>మీరు ఇప్పుడు {{SITENAME}}లోనికి \"$1\"గా ప్రవేశించారు.</strong>",
        "nosuchuser": "\"$1\" అనే పేరుతో వాడుకరులు లేరు.\nవాడుకరి పేర్లు కేస్ సెన్సిటివ్.\nఅక్షరక్రమం సరిచూసుకోండి, లేదా [[Special:UserLogin/signup|కొత్త ఖాతా సృష్టించుకోండి]].",
        "prefs-emailconfirm-label": "ఈ-మెయిల్ నిర్ధారణ:",
        "youremail": "ఈమెయిలు:",
        "username": "{{GENDER:$1|వాడుకరి పేరు}}:",
-       "uid": "{{GENDER:$1|వాడుకరి}} ID:",
        "prefs-memberingroups": "ఈ {{PLURAL:$1|గుంపులో|గుంపులలో}} {{GENDER:$2|సభ్యుడు|సభ్యురాలు}}:",
        "prefs-registration": "నమోదైన సమయం:",
        "yourrealname": "అసలు పేరు:",
        "log-title-wildcard": "ఈ పాఠ్యంతో మొదలయ్యే పుస్తకాల కొరకు వెతుకు",
        "showhideselectedlogentries": "ఎంచుకున్న చిట్టా పద్దులను చూపించు/దాచు",
        "allpages": "అన్ని పేజీలు",
-       "alphaindexline": "$1 నుండి $2 వరకు",
        "nextpage": "తరువాతి పేజీ ($1)",
        "prevpage": "మునుపటి పేజీ ($1)",
        "allpagesfrom": "ఇక్కడ మొదలు పెట్టి పేజీలు చూపించు:",
        "newimages-summary": "ఇటీవలే ఎగుమతైన ఫైళ్ళను ఈ ప్రత్యేక పేజీ చూపిస్తుంది.",
        "newimages-legend": "పడపోత",
        "newimages-label": "ఫైలుపేరు (లేదా దానిలోని భాగం):",
-       "showhidebots": "($1 బాట్లు)",
        "noimages": "చూసేందుకు ఏమీ లేదు.",
        "ilsubmit": "వెతుకు",
        "bydate": "తేదీ వారీగ",
index ca201fb..1d84b32 100644 (file)
        "imagelisttext": "Дар зер феҳристи '''$1''' {{PLURAL:$1|парвандаи|парвандаҳои}} ба тартиб оварда шуда, омадааст $2.",
        "newimages-summary": "Ин саҳифаи вижа охирин парвандаҳои боршударо намоиш медиҳад.",
        "newimages-legend": "Филтр",
-       "showhidebots": "($1 ботҳо)",
        "noimages": "Чизе барои дидан нест.",
        "ilsubmit": "Ҷустуҷӯи",
        "bydate": "аз рӯи сана",
index 576bf6c..79c6d4c 100644 (file)
        "portal-url": "Project:ศูนย์รวมชุมชน",
        "privacy": "นโยบายสิทธิส่วนบุคคล",
        "privacypage": "Project:นโยบายสิทธิส่วนบุคคล",
-       "badaccess": "มีข้อผิดพลาดในการใช้สิทธิ",
+       "badaccess": "มีข้อผิดพลาดในการใช้สิทธิ",
        "badaccess-group0": "คุณไม่ได้รับอนุญาตให้ดำเนินการตามที่ขอ",
        "badaccess-groups": "ปฏิบัติการที่คุณขอนี้สงวนไว้เฉพาะผู้ใช้ใน{{PLURAL:$2|กลุ่ม|กลุ่ม}}: $1",
        "versionrequired": "ต้องการมีเดียวิกิรุ่น $1",
        "noemail": "ไม่มีที่อยู่อีเมลบันทึกไว้สำหรับผู้ใช้ \"$1\"",
        "noemailcreate": "คุณจำต้องใส่ที่อยู่อีเมลให้ถูกต้อง",
        "passwordsent": "รหัสผ่านใหม่ถูกส่งไปยังที่อยู่อีเมลที่ลงทะเบียนไว้ของ \"$1\"\nกรุณาล็อกอินอีกครั้งหลังได้รับอีเมล",
-       "blocked-mailpassword": "à¹\80ลà¸\82à¸\97ีà¹\88อยูà¹\88à¹\84อà¸\9eีà¸\82อà¸\87à¸\84ุà¸\93à¸\96ูà¸\81à¸\9aลà¹\87อà¸\81มิà¹\83หà¹\89à¹\81à¸\81à¹\89à¹\84à¸\82 à¸\89ะà¸\99ัà¹\89à¸\99 à¸\88ึà¸\87à¹\84มà¹\88à¹\84à¸\94à¹\89รัà¸\9aอà¸\99ุà¸\8dาà¸\95à¹\83หà¹\89à¹\83à¸\8aà¹\89à¸\9fัà¸\87à¸\81à¹\8cà¸\8aัà¸\99à¸\82อà¸\81ูà¹\89รหัสà¸\9cà¹\88าà¸\99à¹\80à¸\9eืà¹\88อà¸\9bà¹\89อà¸\87à¸\81ัà¸\99à¸\81ารà¸\81ระà¸\97ำผิด",
+       "blocked-mailpassword": "à¹\80ลà¸\82à¸\97ีà¹\88อยูà¹\88à¹\84อà¸\9eีà¸\82อà¸\87à¸\84ุà¸\93à¸\96ูà¸\81à¸\9aลà¹\87อà¸\81มิà¹\83หà¹\89à¹\81à¸\81à¹\89à¹\84à¸\82 à¸\97ำà¹\83หà¹\89à¹\84มà¹\88สามารà¸\96à¸\97ำà¹\80รืà¹\88อà¸\87à¸\82อรหัสà¸\9cà¹\88าà¸\99à¹\83หมà¹\88à¹\84à¸\94à¹\89 à¹\80à¸\9eืà¹\88อà¸\9bà¹\89อà¸\87à¸\81ัà¸\99à¸\81ารà¹\83à¸\8aà¹\89à¹\83à¸\99à¸\97าà¸\87à¸\97ีà¹\88ผิด",
        "eauthentsent": "อีเมลยืนยันได้ถูกส่งไปที่อยู่อีเมลที่เสนอ ก่อนที่อีเมลจะถูกส่งไปที่ชื่อบัญชีนั้น คุณต้องปฏิบัติตามคำแนะนำในอีเมลเพื่อยืนยันว่าบัญชีนั้นเป็นของคุณจริง ๆ",
        "throttled-mailpassword": "อีเมลตั้งรหัสผ่านใหม่ถูกส่งไปแล้วใน $1 ชั่วโมงที่ผ่านมา \nอีเมลตั้งรหัสผ่านใหม่จะส่งไปหนึ่งครั้งต่อ $1 ชั่วโมงเท่านั้น เพื่อป้องกันการกระทำที่ไม่ถูกต้อง",
        "mailerror": "ข้อผิดพลาดในการส่งเมล: $1",
        "prefs-emailconfirm-label": "การยืนยันอีเมล:",
        "youremail": "อีเมล:",
        "username": "{{GENDER:$1|ชื่อผู้ใช้}}:",
-       "uid": "รหัสประจำตัว{{GENDER:$1|ผู้ใช้}}:",
        "prefs-memberingroups": "{{GENDER:$2|สมาชิก}}ใน{{PLURAL:$1|กลุ่ม|กลุ่ม}}:",
        "prefs-registration": "เวลาลงทะเบียน:",
        "yourrealname": "ชื่อจริง:",
        "action-createpage": "สร้างหน้า",
        "action-createtalk": "สร้างหน้าอภิปราย",
        "action-createaccount": "สร้างบัญชีผู้ใช้นี้",
+       "action-history": "ดูประวัติของหน้านี้",
        "action-minoredit": "ทำเครื่องหมายการแก้ไขนี้เป็นการแก้ไขเล็กน้อย",
        "action-move": "ย้ายหน้านี้",
        "action-move-subpages": "ย้ายหน้านี้ รวมทั้งหน้าย่อย",
        "log-title-wildcard": "ค้นหาชื่อเรื่องด้วยข้อความนี้",
        "showhideselectedlogentries": "แสดง/ซ่อนหน่วยปูมที่เลือก",
        "allpages": "หน้าทั้งหมด",
-       "alphaindexline": "$1 ถึง $2",
        "nextpage": "หน้าถัดไป ($1)",
        "prevpage": "หน้าก่อนหน้า ($1)",
        "allpagesfrom": "แสดงหน้าโดยเริ่มจาก:",
        "allinnamespace": "หน้าทุกหน้า (เนมสเปซ $1)",
        "allpagessubmit": "ดู",
        "allpagesprefix": "แสดงหน้าที่ขึ้นต้นด้วย:",
-       "allpagesbadtitle": "à¸\8aืà¹\88อà¹\80รืà¹\88อà¸\87à¸\99ีà¹\89à¹\84มà¹\88à¸\96ูà¸\81à¸\95à¹\89อà¸\87 à¸­à¸²à¸\88สะà¸\81à¸\94à¸\9cิà¸\94 à¸¥à¸´à¸\87à¸\81à¹\8cมาà¸\88าà¸\81ภาษาอืà¹\88à¸\99หรือวิà¸\81ิอืà¹\88à¸\99 หรือมีตัวอักษรที่ไม่สามารถใช้เป็นชื่อเรื่องได้",
+       "allpagesbadtitle": "à¸\8aืà¹\88อà¹\80รืà¹\88อà¸\87à¸\99ีà¹\89à¹\84มà¹\88à¸\96ูà¸\81à¸\95à¹\89อà¸\87 à¸­à¸²à¸\88สะà¸\81à¸\94à¸\9cิà¸\94 à¸«à¸£à¸·à¸­à¹\80à¸\9bà¹\87à¸\99ลิà¸\87à¸\81à¹\8cà¸\82à¹\89ามภาษา หรือมีตัวอักษรที่ไม่สามารถใช้เป็นชื่อเรื่องได้",
        "allpages-bad-ns": "{{SITENAME}} ไม่มีเนมสเปซ \"$1\"",
        "allpages-hide-redirects": "ซ่อนการเปลี่ยนทาง",
        "cachedspecial-viewing-cached-ttl": "คุณกำลังดูรุ่นที่เก็บหน่วยความจำแคชของหน้านี้ ซึ่งอาจมีอายุ $1",
        "spam_reverting": "ย้อนกลับไปรุ่นก่อนหน้าที่ไม่มีลิงก์ไปยังเว็บ $1",
        "spam_blanking": "รุ่นการปรับปรุงทุกรุ่นประกอบไปด้วยลิงก์ไปยังเว็บ $1 (ทำหน้าว่าง)",
        "spam_deleting": "ทุกรุ่นที่มีลิงก์ไปยัง $1 กำลังลบ",
+       "simpleantispam-label": "การตรวจสอบสแปม\n<strong>อย่า</strong>กรอกช่องนี้!",
        "pageinfo-title": "ข้อมูลสำหรับ \"$1\"",
        "pageinfo-not-current": "ขออภัย ไม่สามารถให้ข้อมูลนี้สำหรับรุ่นเก่าได้",
        "pageinfo-header-basic": "ข้อมูลเบื้องต้น",
        "newimages-summary": "หน้าพิเศษนี้แสดงไฟล์ที่ถูกอัปโหลดล่าสุด",
        "newimages-legend": "ตัวกรอง",
        "newimages-label": "ชื่อไฟล์ (หรือส่วนหนึ่งของชื่อ):",
-       "showhidebots": "($1 บอต)",
+       "newimages-showbots": "แสดงไฟล์ที่บอตอัปโหลด",
        "noimages": "ไม่มีให้ดู",
        "ilsubmit": "สืบค้น",
        "bydate": "ตามวันที่",
        "confirmemail_send": "ส่งรหัสยืนยันทางอีเมล",
        "confirmemail_sent": "ส่งอีเมลสำหรับการยืนยันแล้ว",
        "confirmemail_oncreate": "รหัสยืนยันถูกส่งไปยังที่อยู่อีเมลของคุณ\nรหัสนี้ไม่กำหนดให้ต้องล็อกอิน แต่คุณต้องระบุรหัสก่อนเปิดใช้งานคุณลักษณะที่อาศัยอีเมลทั้งหมดในวิกินี้",
-       "confirmemail_sendfailed": "{{SITENAME}}à¹\84มà¹\88สามารà¸\96สà¹\88à¸\87อีà¹\80มลยืà¸\99ยัà¸\99à¹\84à¸\94à¹\89\nà¹\82à¸\9bรà¸\94à¸\95รวà¸\88สอà¸\9aà¸\97ีà¹\88อยูà¹\88อีà¹\80มลวà¹\88าà¹\84มà¹\88มีอัà¸\81à¸\82ระà¸\97ีà¹\88à¹\84มà¹\88ถูกต้อง\n\nข้อความตีกลับ: $1",
+       "confirmemail_sendfailed": "{{SITENAME}}à¹\84มà¹\88สามารà¸\96สà¹\88à¸\87อีà¹\80มลยืà¸\99ยัà¸\99à¹\84à¸\94à¹\89\nà¹\82à¸\9bรà¸\94à¸\95รวà¸\88สอà¸\9aà¸\97ีà¹\88อยูà¹\88อีà¹\80มลวà¹\88าอัà¸\81à¸\82ระà¸\97ัà¹\89à¸\87หมà¸\94ถูกต้อง\n\nข้อความตีกลับ: $1",
        "confirmemail_invalid": "รหัสยืนยันไม่ถูกต้อง \nรหัสอาจหมดอายุแล้ว",
        "confirmemail_needlogin": "คุณต้อง $1 เพื่อยืนยันที่อยู่อีเมลของคุณ",
        "confirmemail_success": "อีเมลคุณได้รับการยืนยันแล้ว\nคุณอาจ[[Special:UserLogin|ล็อกอิน]]ตอนนี้และสนุกกับการแก้ไขวิกิ",
index 769e2eb..9a27692 100644 (file)
        "newimages-summary": "Bu ýörite sahypa iň soňky ýüklenen faýllary görkezýär.",
        "newimages-legend": "Filtr",
        "newimages-label": "Faýlyň ady (ýa-da bir bölegi):",
-       "showhidebots": "(botlary $1)",
        "noimages": "Görmäge zat ýok.",
        "ilsubmit": "Gözle",
        "bydate": "sene boýunça",
index ed08be2..0c39b04 100644 (file)
        "prefs-emailconfirm-label": "Kumpirmasyon ng e-liham:",
        "youremail": "E-liham:",
        "username": "{{GENDER:$1|Bansag}}:",
-       "uid": "ID ng {{GENDER:$1|tagagamit}}:",
        "prefs-memberingroups": "{{GENDER:$2|Kasapi}} ng {{PLURAL:$1|na pangkat|na mga pangkat}}:",
        "prefs-memberingroups-type": "$1",
        "prefs-registration": "Oras ng pagtatala:",
        "log-title-wildcard": "Hanapin ang mga pamagat na nagsisimula sa tekstong ito",
        "showhideselectedlogentries": "Ipakita/itago ang napiling mga lahok sa talaan",
        "allpages": "Lahat ng pahina",
-       "alphaindexline": "$1 hanggang $2",
        "nextpage": "Susunod na pahina ($1)",
        "prevpage": "Nakaraang pahina ($1)",
        "allpagesfrom": "Pinapakita ang mga pahina na nagsisimula sa:",
        "newimages-summary": "Nagpapakita ang natatanging pahinang ito ng huling naikargang mga talaksan.",
        "newimages-legend": "Pansala",
        "newimages-label": "Pangalan ng talaksan (o bahagi nito):",
-       "showhidebots": "($1 mga ''bot'')",
        "noimages": "Walang makikita dito.",
        "ilsubmit": "Hanapin",
        "bydate": "ayon sa petsa",
index d6d5221..8df60af 100644 (file)
        "edit-gone-missing": "Sayfa güncellenemiyor.\nSilinmiş görünüyor.",
        "edit-conflict": "Değişiklik çakışması.",
        "edit-no-change": "Değişikliğiniz yoksayıldı, çünkü metinde bir değişiklik yapılmadı.",
+       "postedit-confirmation-created": "Sayfa oluşturuldu.",
        "postedit-confirmation-saved": "Değişikliğiniz kaydedildi.",
        "edit-already-exists": "Yeni sayfa oluşturulamıyor.\nSayfa zaten mevcut.",
        "defaultmessagetext": "Varsayılan mesaj metni",
        "prefs-emailconfirm-label": "E-posta doğrulaması:",
        "youremail": "E-posta:",
        "username": "{{GENDER:$1|Kullanıcı adı}}:",
-       "uid": "{{GENDER:$1|Kullanıcı}} kimliği:",
        "prefs-memberingroups": "{{GENDER:$2|Üye}} {{PLURAL:$1|group|grupları}}:",
        "prefs-registration": "Kayıt zamanı:",
        "yourrealname": "Gerçek adınız:",
        "log-title-wildcard": "Bu metinle başlayan başlıklar ara",
        "showhideselectedlogentries": "Seçili günlük girdilerinin görünürlüğünü değiştir",
        "allpages": "Tüm sayfalar",
-       "alphaindexline": "$1 sayfasından $2 sayfasına kadar",
        "nextpage": "Sonraki sayfa ($1)",
        "prevpage": "Önceki sayfa ($1)",
        "allpagesfrom": "Listelemeye başlanılacak harfler:",
        "newimages-summary": "Bu özel sayfa, en son yüklenen dosyaları göstermektedir.",
        "newimages-legend": "Filtre",
        "newimages-label": "Dosya adı (ya da bir parçası):",
-       "showhidebots": "(botları $1)",
        "noimages": "Görecek bir şey yok.",
        "ilsubmit": "Ara",
        "bydate": "kronolojik sırayla",
index e5c021e..3812afb 100644 (file)
        "show-big-image": "Тулы ачыклык",
        "newimages": "Яңа сүрәтләр җыелмасы",
        "newimages-legend": "Фильтр",
-       "showhidebots": "($1 бот)",
        "ilsubmit": "Эзләү",
        "bad_image_list": "Киләчәк рәвеш кирәк:\n\nИсемлек кисәкләре генә (* символыннан башланучы юллар) саналырлар.\nЮлның беренче сылтамасы куйма өчен тыелган рәсемгә сылтама булырга тиеш.\nШул ук юлның киләчәк сылтамалары чыгармалар, рәсемгә тыелмаган битләре, саналырлар.",
        "metadata": "Мета мәгълүматлар",
index 634117f..206af30 100644 (file)
        "show-big-image": "Tulı açıqlıq",
        "newimages": "Yaña sürätlär cıyılması",
        "newimages-legend": "Filtr",
-       "showhidebots": "($1 bot)",
        "ilsubmit": "Ezläw",
        "bydate": "waqıt buyınça",
        "bad_image_list": "Kiläçäk räweş kiräk:\n\nİsemlek kisäkläre genä (* simvolınnan başlanuçı yullar) sanalırlar.\nYulnıñ berençe sıltaması quyma öçen tıyılğan räsemgä sıltama bulırğa tieş.\nŞul uq yulnıñ kiläçäk sıltamaları çığarmalar, räsemgä tıyılmağan bitläre, sanalırlar.",
index d9277ce..2e329dc 100644 (file)
        "newimages-summary": "بۇ ئالاھىدە بەتتە ئەڭ ئاخىرىدا يۈكلەنگەن ھۆججەت كۆرسىتىلىدۇ.",
        "newimages-legend": "سۈزگۈچ",
        "newimages-label": "ھۆججەت ئاتى (ياكى ئۇنىڭ پارچىسى):",
-       "showhidebots": "($1 ماشىنا ئادەم)",
        "noimages": "كۆرۈدىغان ھېچنېمە يوق.",
        "ilsubmit": "ئىزدەش",
        "bydate": "چېسلا بويىچە",
index 83d42e1..10b7901 100644 (file)
        "newimages-summary": "Ця спеціальна сторінка показує останні завантажені файли.",
        "newimages-legend": "Фільтр",
        "newimages-label": "Назва файлу (або її частина):",
-       "showhidebots": "($1 ботів)",
        "noimages": "Файли відсутні.",
        "ilsubmit": "Шукати",
        "bydate": "за датою",
index 903e062..6ae2b30 100644 (file)
        "show-big-image": "Toʻliq hajmdagi tasvir",
        "noimages": "Tasvir mavjud emas.",
        "ilsubmit": "Qidirish",
+       "variantname-uz-latn": "lotincha",
+       "variantname-uz-cyrl": "кириллча",
        "metadata": "Metama’lumot",
        "metadata-expand": "Batafsil axborotni koʻrsatish",
        "metadata-collapse": "Batafsil axborotni yashirish",
index cb6915b..23d8abd 100644 (file)
        "newimages-summary": "Sta pagina speciale la mostra i file cargà piassè reçentemente.",
        "newimages-legend": "Filtro",
        "newimages-label": "Nome del file (o na parte de élo):",
-       "showhidebots": "($1 i bot)",
        "noimages": "No ghè gnente da vardare.",
        "ilsubmit": "Serca",
        "bydate": "data",
index 18bcc82..dcb3994 100644 (file)
        "newimages-summary": "Necil specialižel lehtpolel ozutadas tantoi jügutoittud failoid.",
        "newimages-legend": "Fil'tr",
        "newimages-label": "Failan nimi (vai sen pala):",
-       "showhidebots": "($1 botad)",
        "noimages": "Ei ole uzid kuvid.",
        "ilsubmit": "Ectä",
        "bydate": "datan mödhe",
index 95165da..5f868d7 100644 (file)
@@ -24,7 +24,8 @@
                        "Vương Ngân Hà",
                        "Withoutaname",
                        "לערי ריינהארט",
-                       "아라"
+                       "아라",
+                       "Tranquanganh"
                ]
        },
        "tog-underline": "Gạch chân liên kết:",
        "jumptonavigation": "chuyển hướng",
        "jumptosearch": "tìm kiếm",
        "view-pool-error": "Xin lỗi, máy chủ hiện đang bị quá tải.\nCó quá nhiều thành viên đang cố gắng xem trang này.\nXin hãy đợi một lát rồi thử truy cập lại vào trang.\n\n$1",
+       "generic-pool-error": "Xin lỗi, các máy chủ hiện đang bị quá tải.\nCó quá nhiều người dùng đang cố gắng xem tài nguyên này.\nXin hãy đợi một lát rồi thử truy cập lại vào tài nguyên.",
        "pool-timeout": "Hết thời gian chờ đợi khóa",
        "pool-queuefull": "Đầy hàng đợi khối ứng dụng (pool queue)",
        "pool-errorunknown": "Lỗi lạ",
        "passwordreset-capture": "Xem thư điện tử có mật khẩu tạm",
        "passwordreset-capture-help": "Nếu bạn kiểm hộp này, bạn sẽ xem thư điện tử có mật khẩu tạm lúc khi nó được gửi cho người dùng.",
        "passwordreset-email": "Địa chỉ thư điện tử:",
-       "passwordreset-emailtitle": "Thông tin tài khoản tại {{SITENAM}}",
+       "passwordreset-emailtitle": "Thông tin tài khoản tại {{SITENAME}}",
        "passwordreset-emailtext-ip": "Ai đó (có thể là bạn, từ địa chỉ IP $1) đã yêu cầu tái tạo mật khẩu của bạn \ntại {{SITENAME}} ($4). {{PLURAL:$3|Tài khoản|Các tài khoản}} dưới đây gắn liền \nvới địa chỉ thư điện tử này:\n\n$2\n\n{{PLURAL:$3|Mật khẩu|Các mật khẩu}} tạm này sẽ hết hạn trong vòng {{PLURAL:$5|một ngày|$5 ngày}}. Bạn nên đăng nhập\nngay bây giờ để chọn mật khẩu mới. Nếu bạn không phải là người yêu cầu\nhoặc đã nhớ lại mật khẩu hiện hành, và bạn không còn\nmuốn thay đổi nó, xin vui lòng bỏ qua thông điệp này và tiếp tục sử dụng\nmật khẩu cũ.",
        "passwordreset-emailtext-user": "Thành viên $1 tại {{SITENAME}} đã yêu cầu tái tạo mật khẩu tại {{SITENAME}} \n($4). {{PLURAL:$3|Tài khoản|Các tài khoản}} dưới đây gắn liền với địa chỉ thư điện tử này:\n\n$2\n\n{{PLURAL:$3|Mật khẩu|Các mật khẩu}} tạm này sẽ hết hạn trong vòng {{PLURAL:$5|một ngày|$5 ngày}}. Bạn nên đăng nhập\nngay bây giờ để chọn mật khẩu mới. Nếu bạn không phải là người yêu cầu hoặc đã nhớ lại mật khẩu hiện hành, và bạn không còn\nmuốn thay đổi nó, xin vui lòng bỏ qua thông điệp này và tiếp tục sử dụng\nmật khẩu cũ.",
        "passwordreset-emailelement": "Tên người dùng: $1\nMật khẩu tạm: $2",
        "edit-gone-missing": "Không thể cập nhật trang.\nDường như trang này đã bị xóa.",
        "edit-conflict": "Sửa đổi mâu thuẫn.",
        "edit-no-change": "Sửa đổi của bạn không được tính đến, vì nó không làm thay đổi nội dung.",
+       "postedit-confirmation-created": "Trang đã được tạo ra.",
+       "postedit-confirmation-restored": "Trang đã được phục hồi.",
        "postedit-confirmation-saved": "Sửa đổi của bạn đã được lưu.",
        "edit-already-exists": "Không thể tạo trang mới.\nNó đã tồn tại.",
        "defaultmessagetext": "Nội dung mặc định",
        "prefs-emailconfirm-label": "Xác nhận thư điện tử:",
        "youremail": "Thư điện tử:",
        "username": "{{GENDER:$1}}Tên người dùng:",
-       "uid": "{{GENDER:$1}}Số thứ tự thành viên:",
        "prefs-memberingroups": "{{GENDER:$2}}Thành viên của {{PLURAL:$1|nhóm|các nhóm}}:",
        "prefs-registration": "Lúc mở tài khoản:",
        "yourrealname": "Tên thật:",
        "action-createpage": "tạo trang",
        "action-createtalk": "tạo trang thảo luận",
        "action-createaccount": "mở tài khoản này",
+       "action-history": "xem lịch sử của trang này",
        "action-minoredit": "đánh dấu đây là sửa đổi nhỏ",
        "action-move": "di chuyển trang này",
        "action-move-subpages": "di chuyển trang này và các trang con",
        "recentchanges-legend-heading": "'''Chú giải:'''",
        "recentchanges-legend-newpage": "(xem thêm [[Special:NewPages|danh sách các trang mới]])",
        "recentchanges-legend-plusminus": "(''±123'')",
-       "rcnotefrom": "Thay đổi từ <strong>$2</strong> (hiển thị tối đa <strong>$1</strong> thay đổi).",
-       "rclistfrom": "Hiển thị các thay đổi từ $3 $2.",
+       "rcnotefrom": "Các thay đổi từ <strong>$2</strong> (hiển thị tối đa <strong>$1</strong> thay đổi).",
+       "rclistfrom": "Xem các thay đổi từ $2 $3 trở về sau",
        "rcshowhideminor": "$1 sửa đổi nhỏ",
        "rcshowhideminor-show": "Hiện",
        "rcshowhideminor-hide": "Ẩn",
        "protectedpages-cascade": "Chỉ hiển thị khóa theo tầng",
        "protectedpages-noredirect": "Ẩn trang đổi hướng",
        "protectedpagesempty": "Hiện không có trang nào bị khóa với các thông số này.",
-       "protectedpages-timestamp": "Dấu thời gian",
+       "protectedpages-timestamp": "Thời gian",
        "protectedpages-page": "Trang",
        "protectedpages-expiry": "Hết hạn",
        "protectedpages-performer": "Người dùng khóa",
        "log-title-wildcard": "Tìm các tựa trang bắt đầu bằng các chữ này",
        "showhideselectedlogentries": "Thay đổi mức khả kiến của các mục nhật trình đã chọn",
        "allpages": "Mọi trang",
-       "alphaindexline": "$1 đến $2",
        "nextpage": "Trang sau ($1)",
        "prevpage": "Trang trước ($1)",
        "allpagesfrom": "Xem trang từ:",
        "newimages-summary": "Trang đặc biệt này hiển thị các tập tin được tải lên gần đây nhất.",
        "newimages-legend": "Bộ lọc",
        "newimages-label": "Tên tập tin (hoặc một phần tên):",
-       "showhidebots": "($1 robot)",
        "noimages": "Chưa có hình.",
        "ilsubmit": "Tìm kiếm",
        "bydate": "theo ngày",
-       "sp-newimages-showfrom": "Trưng bày những tập tin mới, bắt đầu từ lúc $2, ngày $1",
+       "sp-newimages-showfrom": "Trưng bày các tập tin từ $2 $1 trở về sau",
        "video-dims": "$1, $2×$3",
        "seconds-abbrev": "$1 s",
        "minutes-abbrev": "$1 min",
        "htmlform-no": "Không",
        "htmlform-yes": "Có",
        "htmlform-chosen-placeholder": "Chọn một tùy chọn",
+       "htmlform-cloner-create": "Tiếp tục thêm",
+       "htmlform-cloner-delete": "Loại bỏ",
+       "htmlform-cloner-required": "Cần ít nhất một giá trị.",
        "sqlite-has-fts": "$1 với sự hỗ trợ tìm kiếm toàn văn",
        "sqlite-no-fts": "$1 không có hỗ trợ tìm kiếm toàn văn",
        "logentry-delete-delete": "$1 {{GENDER:$2}}đã xóa trang “$3”",
index 2bd297c..ecc53f1 100644 (file)
        "newimages-summary": "Pad patik at lisedon ragivis pelöpüköl lätik.",
        "newimages-legend": "Sul",
        "newimages-label": "Ragivanem (u dil ona):",
-       "showhidebots": "($1 mäikamenis)",
        "noimages": "Nos ad logön.",
        "ilsubmit": "Sukolöd",
        "bydate": "ma dät",
index 005f970..19909f8 100644 (file)
        "show-big-image": "Algteedüstü",
        "newimages": "Vahtsõq pildiq",
        "imagelisttext": "Pilte nimekirän $1 (sordiduq $2).",
-       "showhidebots": "($1 robodiq)",
        "noimages": "Olõ-i vahtsit pilte.",
        "ilsubmit": "Otsminõ",
        "bydate": "kuupäävä perrä",
index 6615cd8..13ea5e4 100644 (file)
        "show-big-image": "Imådje a si grandeur d' oridjinne",
        "newimages": "Galreye des nouvès imådjes",
        "imagelisttext": "Chal pa dzo c' est ene djivêye di '''$1''' {{PLURAL:$1|imådje relîte|imådjes relîtes}} $2.",
-       "showhidebots": "($1 robots)",
        "noimages": "I n' a rén a vey.",
        "ilsubmit": "Cweri",
        "bydate": "pazès dates",
index f76364d..e35ecc3 100644 (file)
        "prefs-emailconfirm-label": "ע-פאסט באַשטעטיקונג:",
        "youremail": "ע-פאסט:",
        "username": "{{GENDER:$1|באַניצער־נאָמען}}:",
-       "uid": "{{GENDER:$1|באַנוצער־נומער}}:",
        "prefs-memberingroups": "{{GENDER:$2|מיטגליד}} אין {{PLURAL:$1|גרופע|גרופעס}}:",
        "prefs-registration": "אײַנשרײַבן צײַט:",
        "yourrealname": "עכטער נאמען *:",
        "log-title-wildcard": "זוכן טיטלען וואס הייבן אָן מיט דעם טעקסט",
        "showhideselectedlogentries": "ווײַזן/באַהאַלטן געקליבענע לאגבוך אקציעס",
        "allpages": "אַלע בלעטער",
-       "alphaindexline": "$1 ביז $2",
        "nextpage": "קומענדיקער בלאַט ($1)",
        "prevpage": "פֿריִערדיקער בלאַט ($1)",
        "allpagesfrom": "ווייזן בלעטער אנגעהויבן פון:",
        "newimages-summary": "דער באַזונדערער בלאַט ווײַזט די לעצטע ארויפֿגעלאָדענע טעקעס.",
        "newimages-legend": "פֿילטער",
        "newimages-label": "טעקע נאָמען (אדער אַ טײל דערפֿון):",
-       "showhidebots": "($1 ראָבאָטן)",
        "noimages": "נישטא קיין בילדער.",
        "ilsubmit": "זוכן",
        "bydate": "לויטן דאטום",
index 7cfd361..5be55de 100644 (file)
        "newimages-summary": "Ojúewé pàtàkì yìí ṣe àfihàn àwọn fáìlì ìrùsókè gbẹ̀yìn.",
        "newimages-legend": "Ajọ̀",
        "newimages-label": "Orúkọ faili (tàbí apá kan rẹ̀):",
-       "showhidebots": "(àwọn bot $1)",
        "noimages": "Kò sí àwòrán.",
        "ilsubmit": "Ṣàwárí",
        "bydate": "bíi ọjọ́ọdún",
index 9fa042b..4c37bd6 100644 (file)
        "newimages-summary": "呢個特別頁顯示最後上載咗嘅檔案。",
        "newimages-legend": "過濾",
        "newimages-label": "檔名(或佢嘅一部份):",
-       "showhidebots": "($1 機械人)",
        "noimages": "冇嘢去睇。",
        "ilsubmit": "搵嘢",
        "bydate": "以時間",
index f5dc04d..cbaec05 100644 (file)
        "parser-template-recursion-depth-warning": "模板递归深度越限($1)",
        "language-converter-depth-warning": "字词转换器深度越限($1)",
        "node-count-exceeded-category": "页面的节点数超出限制",
+       "node-count-exceeded-category-desc": "节点数溢出页面的分类。",
        "node-count-exceeded-warning": "页面超出了节点数",
        "expansion-depth-exceeded-category": "扩展深度超出限制的页面",
+       "expansion-depth-exceeded-category-desc": "这是超出拓展深度页面的分类。",
        "expansion-depth-exceeded-warning": "页面超过了扩展深度",
        "parser-unstrip-loop-warning": "检测到回圈",
        "parser-unstrip-recursion-limit": "递归超过限制 ($1)",
        "prefs-emailconfirm-label": "电子邮件确认:",
        "youremail": "电子邮件:",
        "username": "{{GENDER:$1|用户名}}:",
-       "uid": "{{GENDER:$1|用户}}ID:",
        "prefs-memberingroups": "{{GENDER:$2|用户}}{{PLURAL:$1|组}}:",
        "prefs-registration": "注册时间:",
        "yourrealname": "真实姓名:",
        "right-move": "移动页面",
        "right-move-subpages": "移动页面及其子页面",
        "right-move-rootuserpages": "移动根用户页面",
+       "right-move-categorypages": "移动分类页面",
        "right-movefile": "移动文件",
        "right-suppressredirect": "移动页面时不创建来源页面的重定向",
        "right-upload": "上传文件",
        "action-move": "移动本页",
        "action-move-subpages": "移动本页及其子页面",
        "action-move-rootuserpages": "移动根用户页面",
+       "action-move-categorypages": "移动分类页面",
        "action-movefile": "移动本文件",
        "action-upload": "上传本文件",
        "action-reupload": "覆盖本文件",
        "log-title-wildcard": "搜索以该文字开头的标题",
        "showhideselectedlogentries": "显示/隐藏所选日志项",
        "allpages": "所有页面",
-       "alphaindexline": "$1到$2",
        "nextpage": "下一页($1)",
        "prevpage": "上一页($1)",
        "allpagesfrom": "显示页面开始于:",
        "movepagetalktext": "有关的讨论页将被自动与该页面一起移动,'''除非''':\n*新页面已经有一个包含内容的讨论页,或者\n*您不勾选下面的复选框。\n\n在这些情况下,您在必要时必须手工移动或合并页面。",
        "movearticle": "移动页面:",
        "moveuserpage-warning": "'''警告:'''你将移动一个用户页面。请注意,只有该页面会被移动,该用户''不''会被更名。",
+       "movecategorypage-warning": "<strong>警告:</strong>您将移动分类页面。请注意只有此页面将会移动,旧有分类的任何页面将<em>不会</em>同步移动。",
        "movenologintext": "您必须是一名登记用户并且[[Special:UserLogin|登录]]\n后才可移动一个页面。",
        "movenotallowed": "你没有权限移动页面。",
        "movenotallowedfile": "你没有权限移动文件。",
        "cant-move-user-page": "你没有权限移动用户页面(子页面除外)。",
        "cant-move-to-user-page": "你没有权限移动页面至用户页面(用户子页面除外)。",
+       "cant-move-category-page": "您没有权限移动分类页面。",
+       "cant-move-to-category-page": "您没有权限移动页面至分类页面。",
        "newtitle": "新标题:",
        "move-watch": "监视来源页面和目标页面",
        "movepagebtn": "移动页面",
        "newimages-summary": "本特殊页面展示最后上传的文件。",
        "newimages-legend": "过滤",
        "newimages-label": "文件名(或它的一部份):",
-       "showhidebots": "($1机器人)",
+       "newimages-showbots": "显示机器人上传",
        "noimages": "无可查看文件。",
        "ilsubmit": "搜索",
        "bydate": "按日期",
        "watchlistedit-raw-done": "您的监视列表已经更新。",
        "watchlistedit-raw-added": "$1个标题被添加:",
        "watchlistedit-raw-removed": "$1个标题被删除:",
+       "watchlistedit-clear-title": "清空监视列表",
+       "watchlistedit-clear-legend": "清空监视列表",
+       "watchlistedit-clear-explain": "所有标题将从您的监视列表中移除",
+       "watchlistedit-clear-titles": "标题:",
+       "watchlistedit-clear-submit": "清空监视列表(永久!)",
+       "watchlistedit-clear-done": "您的监视列表已清空。",
+       "watchlistedit-clear-removed": "$1个标题已移除:",
+       "watchlistedit-too-many": "这里显示了太多页面。",
+       "watchlisttools-clear": "清空监视列表",
        "watchlisttools-view": "查看相关更改",
        "watchlisttools-edit": "查看并编辑监视列表",
        "watchlisttools-raw": "编辑原始监视列表",
index 083bd63..63bfec2 100644 (file)
        "toc": "目錄",
        "showtoc": "顯示",
        "hidetoc": "隱藏",
-       "collapsible-collapse": "摺",
+       "collapsible-collapse": "摺",
        "collapsible-expand": "展開",
        "thisisdeleted": "檢視或還原 $1 ?",
        "viewdeleted": "檢視 $1?",
        "parser-template-recursion-depth-warning": "超出樣版遞迴深度限制 ($1)",
        "language-converter-depth-warning": "已超過字詞轉換器深度限制($1)",
        "node-count-exceeded-category": "頁面的節點數超出限制",
+       "node-count-exceeded-category-desc": "超過節點計數頁面分類。",
        "node-count-exceeded-warning": "頁面超出節點數",
        "expansion-depth-exceeded-category": "擴展深度超出限制的頁面",
+       "expansion-depth-exceeded-category-desc": "這是超出展開深度頁面的分類。",
        "expansion-depth-exceeded-warning": "頁面超出擴展深度",
        "parser-unstrip-loop-warning": "檢測到迴圈",
        "parser-unstrip-recursion-limit": "遞歸超過限制 ($1)",
        "converter-manual-rule-error": "手動語言轉換規則中檢測到錯誤",
-       "undo-success": "該編輯可以被撤銷。請檢查以下對比以核實這正是您想做的,然後儲存以下更改以完成撤銷編輯。",
-       "undo-failure": "由於中途的編輯不一致,此編輯不能撤銷。",
+       "undo-success": "此編輯可以被還原。\n請檢查以下比較表,確認您是否要還原,然後儲存以下變更以完成編輯還原。",
+       "undo-failure": "由於編輯的修訂間有衝突,此編輯不能還原。",
        "undo-norev": "由於其修訂版本不存在或已刪除,此編輯不能撤銷。",
-       "undo-nochange": "æ\98¯æ¬¡ç·¨è¼¯ä¼¼ä¹\8eå·²ç¶\93被æ\92¤é\8a·。",
+       "undo-nochange": "此編輯å\8f¯è\83½å·²è¢«é\82\84å\8e\9f。",
        "undo-summary": "取消由 [[Special:Contributions/$2|$2]] ([[User talk:$2|對話]]) 所作出的修訂 $1",
        "undo-summary-username-hidden": "還原隱藏使用者的修訂 $1",
        "cantcreateaccounttitle": "無法建立帳號",
        "lineno": "行 $1:",
        "compareselectedversions": "比較已選擇的修訂",
        "showhideselectedversions": "顯示/隱藏已選擇的修訂",
-       "editundo": "原",
+       "editundo": "原",
        "diff-empty": "(無差異)",
        "diff-multi-sameuser": "(未顯示相同使用者於中間所作的 $1 次修訂)",
        "diff-multi-otherusers": "(未顯示由 $2 位使用者於中間所作的 $1 次修訂)",
        "titlematches": "頁面標題相符",
        "textmatches": "頁面內容相符",
        "notextmatches": "沒有頁面內容匹配",
-       "prevn": "前 $1 ",
-       "nextn": "後 {{PLURAL:$1|$1}} ",
-       "prevn-title": "前 $1 結果",
-       "nextn-title": "後 $1 結果",
+       "prevn": "前 $1 ",
+       "nextn": "後 {{PLURAL:$1|$1}} ",
+       "prevn-title": "前 $1 結果",
+       "nextn-title": "後 $1 結果",
        "shown-title": "每頁顯示 $1 項結果",
        "viewprevnext": "檢視 ($1 {{int:pipe-separator}} $2) ($3)",
        "searchmenu-exists": "'''在這個 wiki 上已有一頁面叫做「[[:$1]]」。'''",
        "search-relatedarticle": "相關",
        "searcheverything-enable": "搜尋所有命名空間",
        "searchrelated": "相關",
-       "searchall": "所有",
+       "searchall": "全部",
        "showingresults": "下面顯示從第 <b>$2</b> 條開始的 <b>$1</b> 條結果:",
-       "showingresultsinrange": "以下顯示於#<strong>$2</strong>至#<strong>$3</strong>之<strong>$1</strong>個搜尋結果。",
+       "showingresultsinrange": "以下顯示第 <strong>$2</strong> 筆至第 <strong>$3</strong> 筆,共 <strong>$1</strong> 筆搜尋結果。",
        "showingresultsnum": "下面顯示從第 '''$2''' 條開始的 '''{{PLURAL:$3|1|$3}}''' 條結果。",
        "showingresultsheader": "對'''$4'''的{{PLURAL:$5|第 '''$1''' 至第 '''$3''' 項結果|第 '''$1 - $2''' 項,共 '''$3''' 項結果}}",
        "search-nonefound": "在查詢中無結果相符。",
        "powersearch-legend": "進階搜尋",
        "powersearch-ns": "搜尋以下命名空間:",
-       "powersearch-togglelabel": "核取:",
-       "powersearch-toggleall": "所有",
+       "powersearch-togglelabel": "勾選:",
+       "powersearch-toggleall": "全部",
        "powersearch-togglenone": "無",
        "search-external": "外部搜尋",
        "searchdisabled": "{{SITENAME}}由於性能方面的原因,全文搜索已被暫時停用。您可以暫時透過Google搜索。請留意他們的索引可能會過時。",
        "prefs-rc": "最近變更",
        "prefs-watchlist": "監視列表",
        "prefs-watchlist-days": "監視列表中顯示的天數:",
-       "prefs-watchlist-days-max": "最多$1{{PLURAL:$1|天}}",
-       "prefs-watchlist-edits": "擴充監視列表中顯示變更次數的上限:",
+       "prefs-watchlist-days-max": "最多 $1 {{PLURAL:$1|天}}",
+       "prefs-watchlist-edits": "展開的監視列表中顯示變更次數上限:",
        "prefs-watchlist-edits-max": "最大數量:1000",
        "prefs-watchlist-token": "監視列表密鑰:",
        "prefs-misc": "雜項",
        "stub-threshold": "<a href=\"#\" class=\"stub\">短頁面連結</a>格式門檻值 (位元組):",
        "stub-threshold-disabled": "已停用",
        "recentchangesdays": "最近變更的顯示日數:",
-       "recentchangesdays-max": "最多$1{{PLURAL:$1|天}}",
+       "recentchangesdays-max": "最多 $1 {{PLURAL:$1|天}}",
        "recentchangescount": "預設顯示的編輯數:",
        "prefs-help-recentchangescount": "這包含最近變更、頁面歷史以及日誌。",
        "prefs-help-watchlist-token2": "這是一個秘密的密鑰,用於訂源您的監視列表。\n知道它的人將能夠讀取您的監視列表,所以您不應該分享它。[[Special:ResetTokens|如有需要重設此密鑰,請點擊這裡]]。",
        "prefs-emailconfirm-label": "電子郵件確認:",
        "youremail": "電子郵件:",
        "username": "{{GENDER:$1|使用者名稱}}:",
-       "uid": "{{GENDER:$1|使用者 ID}}:",
        "prefs-memberingroups": "{{GENDER:$2|所屬}}{{PLURAL:$1|群組}}:",
        "prefs-registration": "註冊時間:",
        "yourrealname": "真實姓名:",
        "editinguser": "變更使用者 '''[[User:$1|$1]]''' 的使用者權限 $2",
        "userrights-editusergroup": "編輯使用者群組",
        "saveusergroups": "儲存使用者群組",
-       "userrights-groupsmember": "屬於:",
-       "userrights-groupsmember-auto": "固有屬於:",
-       "userrights-groups-help": "您可以更改此使用者所屬的群組:\n* 已勾選的核選方塊代表該使用者屬於該群組。\n* 勾選的核選方塊代表該使用者不屬於該群組。\n* 有 * 號標示代表一旦加入該群組後便不能移除,反之亦然。",
+       "userrights-groupsmember": "所屬群組:",
+       "userrights-groupsmember-auto": "所屬隱含群組:",
+       "userrights-groups-help": "您可以更改此使用者所屬的群組:\n* 已勾選的核選方塊代表該使用者屬於該群組。\n* 勾選的核選方塊代表該使用者不屬於該群組。\n* 有 * 號標示代表一旦加入該群組後便不能移除,反之亦然。",
        "userrights-reason": "原因:",
        "userrights-no-interwiki": "您沒有權限去編輯其它使用者在 Wiki 上的權限。",
        "userrights-nodatabase": "資料庫$1不存在或並非為本地的。",
        "userrights-nologin": "您必須 [[Special:UserLogin|登入]] 管理員帳號以指定使用者權限。",
        "userrights-notallowed": "你無權加入或刪除使用者權限。",
-       "userrights-changeable-col": "您可以更改的群組",
-       "userrights-unchangeable-col": "您不可以更改的群組",
+       "userrights-changeable-col": "您可變更的群組",
+       "userrights-unchangeable-col": "您不可變更的群組",
        "userrights-conflict": "使用者權限更改發生衝突!請重新檢視並確認你的更改。",
        "userrights-removed-self": "您已成功移除自己的權限,故此您沒法再次訪問此頁。",
        "group": "群組:",
        "right-createpage": "建立頁面 (不含討論頁面)",
        "right-createtalk": "建立討論頁面",
        "right-createaccount": "建立新的使用者帳號",
-       "right-minoredit": "標示編輯為小修訂",
+       "right-minoredit": "標示編輯為小修訂",
        "right-move": "移動頁面",
        "right-move-subpages": "移動頁面與其子頁面",
        "right-move-rootuserpages": "移動根使用者頁面",
+       "right-move-categorypages": "移動分類頁面",
        "right-movefile": "移動檔案",
        "right-suppressredirect": "移動頁面時不建立來源的重新導向頁面",
        "right-upload": "上傳檔案",
        "right-reupload-own": "覆蓋由同一位上載的檔案",
        "right-reupload-shared": "於本地無視共用媒體檔案庫上的檔案",
        "right-upload_by_url": "由一個URL上載檔案",
-       "right-purge": "不需要確認之下清除網站快取",
-       "right-autoconfirmed": "不受基於IP的頻率限制",
+       "right-purge": "不確認清除網站快取",
+       "right-autoconfirmed": "不受以 IP 為基礎的註冊頻率限制",
        "right-bot": "視為一個自動程序",
        "right-nominornewtalk": "若討論頁面為小修訂,則不顯示新訊息提示",
-       "right-apihighlimits": "在API查詢中使用更高的上限",
-       "right-writeapi": "使用API編寫",
+       "right-apihighlimits": "API 查詢中可使用較高上限值",
+       "right-writeapi": "使用寫入 API",
        "right-delete": "刪除頁面",
        "right-bigdelete": "刪除大量歷史之頁面",
        "right-deletelogentry": "刪除及恢復特定的日誌項目",
        "right-protect": "更改保護等級以及編輯被連鎖保護的頁面",
        "right-editprotected": "編輯保護層級為「{{int:protect-level-sysop}}」的頁面",
        "right-editsemiprotected": "編輯保護層級為「{{int:protect-level-autoconfirmed}}」的頁面",
-       "right-editinterface": "編輯使用者面",
+       "right-editinterface": "編輯使用者面",
        "right-editusercssjs": "編輯其他使用者的 CSS 和 JavaScript 檔案",
        "right-editusercss": "編輯其他使用者的 CSS 檔案",
        "right-edituserjs": "編輯其他使用者的 JavaScript 檔案",
        "action-move": "移動這個頁面",
        "action-move-subpages": "移動這個頁面跟它的子頁面",
        "action-move-rootuserpages": "移動使用者根頁面",
+       "action-move-categorypages": "移動分類頁面",
        "action-movefile": "移動這個檔案",
        "action-upload": "上載這個檔案",
        "action-reupload": "覆蓋這個現有的檔案",
        "enhancedrc-history": "歷史",
        "recentchanges": "最近變更",
        "recentchanges-legend": "最近變更選項",
-       "recentchanges-summary": "追蹤該 Wiki 在此頁面的最近變更。",
+       "recentchanges-summary": "追蹤 Wiki 中此頁面的最近變更。",
        "recentchanges-noresult": "在所選擇的時間裡沒有任何更改與所給條件吻合。",
        "recentchanges-feed-description": "追蹤該 Wiki 在此頁面的最近變更。",
-       "recentchanges-label-newpage": "這次編輯建立了一個新頁面",
-       "recentchanges-label-minor": "是一個小修訂",
-       "recentchanges-label-bot": "這次編輯是由機器人進行",
+       "recentchanges-label-newpage": "該次編輯建立了新頁面",
+       "recentchanges-label-minor": "該次編輯是一個小修訂",
+       "recentchanges-label-bot": "該次編輯為機器人所執行",
        "recentchanges-label-unpatrolled": "這次編輯尚未巡查過",
-       "recentchanges-label-plusminus": "更改前後頁面位元組大小的變化",
+       "recentchanges-label-plusminus": "頁面更改的位元組大小",
        "recentchanges-legend-heading": "'''說明:'''",
-       "recentchanges-legend-newpage": "(è¦\8b[[Special:NewPages|æ\96°é \81é\9d¢å\88\97表]])",
+       "recentchanges-legend-newpage": "(è«\8bå\8f\83è\80\83 [[Special:NewPages|æ\9c\80æ\96°é \81é\9d¢]])",
        "recentchanges-legend-plusminus": "(''±123'')",
-       "rcnotefrom": "ä¸\8bé\9d¢æ\98¯è\87ª<strong>$2</strong>èµ·ä¹\8bæ\9b´æ\94¹ï¼\88è\87³å¤\9a顯示<strong>$1</strong>å\80\8bï¼\89。",
-       "rclistfrom": "顯示è\87ª $3 $2 ä»¥ä¾\86ç\9a\84æ\96°變更",
-       "rcshowhideminor": "$1 小修訂",
+       "rcnotefrom": "以ä¸\8bç\82ºè\87ª <strong>$2</strong> èµ·ç\9a\84æ\9b´æ\94¹ (æ\9c\80å¤\9a顯示<strong>$1</strong> ç­\86)。",
+       "rclistfrom": "顯示è\87ª $3 $2 ä»¥ä¾\86ç\9a\84æ\9c\80è¿\91變更",
+       "rcshowhideminor": "$1 小修訂",
        "rcshowhideminor-show": "顯示",
        "rcshowhideminor-hide": "隱藏",
-       "rcshowhidebots": "$1機器人的編輯",
+       "rcshowhidebots": "$1 機器人的編輯",
        "rcshowhidebots-show": "顯示",
        "rcshowhidebots-hide": "隱藏",
-       "rcshowhideliu": "$1 已註冊的使用者",
+       "rcshowhideliu": "$1 已註冊的使用者",
        "rcshowhideliu-show": "顯示",
        "rcshowhideliu-hide": "隱藏",
-       "rcshowhideanons": "$1 匿名的使用者",
+       "rcshowhideanons": "$1 匿名的使用者",
        "rcshowhideanons-show": "顯示",
        "rcshowhideanons-hide": "隱藏",
-       "rcshowhidepatr": "$1巡查過的編輯",
+       "rcshowhidepatr": "$1 巡查過的編輯",
        "rcshowhidepatr-show": "顯示",
        "rcshowhidepatr-hide": "隱藏",
-       "rcshowhidemine": "$1我的編輯",
+       "rcshowhidemine": "$1 我的編輯",
        "rcshowhidemine-show": "顯示",
        "rcshowhidemine-hide": "隱藏",
-       "rclinks": "顯示最近$2天內最新的$1次改動。<br />$3",
+       "rclinks": "顯示最近 $2 天內的 $1 次更改。<br />$3",
        "diff": "差異",
        "hist": "歷史",
        "hide": "隱藏",
        "upload_directory_read_only": "上傳目錄($1)不存在或無寫權限。",
        "uploaderror": "上傳錯誤",
        "upload-recreate-warning": "'''警告:一個相同名字的檔案曾經被刪除或者移動至別處。'''\n\n這個頁面的刪除和移動日誌在這裏提供以便參考:",
-       "uploadtext": "使用下面的表單來上傳檔案。\n要檢視或搜尋以前上傳的檔案,可以進入[[Special:FileList|檔案上傳清單]],(重新)上傳也將在[[Special:Log/upload|上傳日誌]]中記錄,而刪除將在[[Special:Log/delete|刪除日誌]]中記錄。\n\n要在頁面中加入檔案,使用以下其中一種形式的連結:\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code>'''使用檔案的完整版本\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|替換文字]]</nowiki></code>'''使用放置於左側的一個框內的 200 像素寬的圖片,同時使用「替換文字」作為描述\n* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>'''直接連結到檔案而不顯示檔案",
-       "upload-permitted": "å\87\86許的檔案類型:$1。",
+       "uploadtext": "使用下面的表單來上傳檔案。\n要檢視或搜尋以前上傳的檔案,可至 [[Special:FileList|檔案上傳清單]],(重新)上傳會在 [[Special:Log/upload|上傳日誌]] 中記錄,而刪除則會在 [[Special:Log/delete|刪除日誌]] 中記錄。\n\n要在頁面中引用檔案,可使用以下其中一種方式連結:\n* <strong><code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code></strong> 顯示完整尺吋的圖片\n* <strong><code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|alt text]]</nowiki></code></strong> 會在左方放置一張 200 像素寬的圖片於框中,並顯示 \"alt text\" 作為描述\n* <strong><code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code></strong> 直接連結到圖片而不顯示預覽",
+       "upload-permitted": "å\85\81許的檔案類型:$1。",
        "upload-preferred": "建議的檔案類型:$1。",
        "upload-prohibited": "禁止的檔案類型:$1。",
        "uploadlogpage": "上傳日誌",
-       "uploadlogpagetext": "以ä¸\8bæ\98¯æ\9c\80è¿\91ä¸\8aè¼\89ç\9a\84æª\94æ¡\88ç\9a\84ä¸\80覽表ã\80\82\n檢è¦\96[[Special:NewFiles|æ\96°æª\94æ¡\88ç\95«å»\8a]]å\8e»ç\9c\8bæ\9b´å¯\8cå\9c\96ç\89\87ç\9a\84總覽。",
+       "uploadlogpagetext": "以ä¸\8bæ¸\85å\96®ç\82ºæ\9c\80è¿\91ä¸\8aå\82³ç\9a\84æª\94æ¡\88ã\80\82\nè«\8b檢è¦\96 [[Special:NewFiles|æ\9c\80æ\96°æª\94æ¡\88å\9c\96庫]] ä»¥è¦\96覺å\8c\96ç\9a\84æ\96¹å¼\8f檢è¦\96。",
        "filename": "檔案名稱",
        "filedesc": "檔案摘要",
        "fileuploadsummary": "檔案摘要:",
        "uploadvirus": "該檔案包含有病毒!\n詳情:$1",
        "uploadjava": "該檔案是 ZIP 檔案,其中包含 Java 的.class 檔案。\n不允許上傳 Java 檔案,是因為他們可能會跳過安全限制。",
        "upload-source": "來源檔案",
-       "sourcefilename": "來源檔案名:",
+       "sourcefilename": "來源檔案名:",
        "sourceurl": "來源網址:",
-       "destfilename": "目標檔案名:",
-       "upload-maxfilesize": "檔案最大限制大小:$1",
+       "destfilename": "目標檔案名:",
+       "upload-maxfilesize": "檔案大小限制:$1",
        "upload-description": "檔案描述",
-       "upload-options": "上選項",
+       "upload-options": "上選項",
        "watchthisupload": "監視這個檔案",
        "filewasdeleted": "之前已經有一個同名檔案被上傳後又被刪除了。在上傳此檔案之前您需要檢查$1。",
        "filename-bad-prefix": "您上傳的檔案名稱是以'''「$1」'''作為開頭,通常這種沒有含意的檔案名稱是由數碼相機中自動編排。請在您的檔案中重新選擇一個更加有意義的檔案名稱。",
        "upload-file-error": "內部錯誤",
        "upload-file-error-text": "嘗試在伺服器上建立臨時檔案時發生內部錯誤。\n請連絡 [[Special:ListUsers/sysop|管理員]]。",
        "upload-misc-error": "未知的上傳錯誤",
-       "upload-misc-error-text": "在上傳時發生未知的錯誤。請驗証使用了正確並可訪問的 URL,然後進行重試。如果問題仍然存在,請與[[Special:ListUsers/sysop|管理員]]聯繫。",
+       "upload-misc-error-text": "上傳時發生不明錯誤。\n請檢查您的 URL 位置是否有效且可存取,然後再重試一次。\n如果仍有問題,請聯絡 [[Special:ListUsers/sysop|管理員]]。",
        "upload-too-many-redirects": "URL 中包含太多重新導向資訊",
-       "upload-http-error": "已發生一個HTTP錯誤:$1",
-       "upload-copy-upload-invalid-domain": "不能從該域名上載檔案副本。",
-       "backend-fail-stream": "無法流傳送文件「$1」。",
-       "backend-fail-backup": "ç\84¡æ³\95å\82\99份æ\96\87件ã\80\8c$1ã\80\8d。",
-       "backend-fail-notexists": "æ¢\9dç\9b®$1不存在。",
-       "backend-fail-hashes": "比較無法獲取文件hashes",
-       "backend-fail-notsame": "「$1」已存在不同的檔案。",
-       "backend-fail-invalidpath": "「$1」不是有效的存儲路徑。",
-       "backend-fail-delete": "無法刪除「$1」檔案。",
-       "backend-fail-describe": "無法修改檔案 \"$1\" 的 metadata。",
-       "backend-fail-alreadyexists": "檔案「$1」已存在。",
-       "backend-fail-store": "ç\84¡æ³\95å\9c¨$2å­\98å\84²æ\96\87件$1。",
-       "backend-fail-copy": "ç\84¡æ³\95è¤\87製æ\96\87件$1å\88°$2。",
-       "backend-fail-move": "ç\84¡æ³\95移å\8b\95æ\96\87件$1å\88°$2。",
-       "backend-fail-opentemp": "無法打開臨時文件。",
-       "backend-fail-writetemp": "無法寫臨時文件。",
-       "backend-fail-closetemp": "無法創建臨時文件。",
-       "backend-fail-read": "找不到檔案「$1」。",
-       "backend-fail-create": "無法寫入檔案「$1」。",
-       "backend-fail-maxsize": "ç\84¡æ³\95寫å\85¥æª\94æ¡\88ã\80\8c$1ã\80\8dâ\80\8bâ\80\8bï¼\8cå\9b ç\82ºå®\83大æ\96¼$2å­\97ç¯\80。",
-       "backend-fail-readonly": "「$1」儲存後端目前是唯讀模式,因為:「$2」",
-       "backend-fail-synced": "æ\96\87件ã\80\8c$1ã\80\8då\9c¨å\85§é\83¨å­\98å\84²å¾\8c端æ\98¯ä¸\8dä¸\80è\87´ç\9a\84å\8d\80å\9f\9f。",
-       "backend-fail-connect": "ç\84¡æ³\95é\80£çµ\90è\87³å­\98å\84²å¾\8cæ\96¹ã\80\8c$1ã\80\8d。",
-       "backend-fail-internal": "å­\98å\84²å¾\8cæ\96¹ã\80\8c$1ã\80\8dç\99¼ç\94\9fäº\86ä¸\80å\80\8bæ\9cªç\9f¥錯誤。",
-       "backend-fail-contenttype": "無法確定檔案的內容類型以存儲於「$1」。",
+       "upload-http-error": "發生 HTTP 錯誤:$1",
+       "upload-copy-upload-invalid-domain": "不允許此網域複製上傳的檔案。",
+       "backend-fail-stream": "無法傳輸檔案 \"$1\"。",
+       "backend-fail-backup": "ç\84¡æ³\95å\82\99份æª\94æ¡\88 \"$1\"。",
+       "backend-fail-notexists": "æª\94æ¡\88 $1 不存在。",
+       "backend-fail-hashes": "無法取得檔案雜湊值(Hash)進行比較。",
+       "backend-fail-notsame": "於 \"$1\" 已存在另一個不相同的檔案。",
+       "backend-fail-invalidpath": "\"$1\" 不是有效的儲存路徑。",
+       "backend-fail-delete": "無法刪除檔案 \"$1\"。",
+       "backend-fail-describe": "無法修改檔案 \"$1\" 的資料定義。",
+       "backend-fail-alreadyexists": "檔案 \"$1\" 已存在。",
+       "backend-fail-store": "ç\84¡æ³\95å\84²å­\98æª\94æ¡\88 \"$1\" æ\96¼ \"$2\"。",
+       "backend-fail-copy": "ç\84¡æ³\95è¤\87製æª\94æ¡\88 \"$1\" è\87³ \"$2\"。",
+       "backend-fail-move": "ç\84¡æ³\95移å\8b\95æª\94æ¡\88 \"$1\" è\87³ \"$2\"。",
+       "backend-fail-opentemp": "無法開啟暫存檔案。",
+       "backend-fail-writetemp": "無法寫入暫存檔案。",
+       "backend-fail-closetemp": "無法關閉暫存檔案。",
+       "backend-fail-read": "無法讀取檔案 \"$1\"。",
+       "backend-fail-create": "無法寫入檔案 \"$1\"。",
+       "backend-fail-maxsize": "ç\94±æ\96¼æª\94æ¡\88大å°\8fè¶\85é\81\8e $2 ä½\8då\85\83çµ\84ï¼\8cç\84¡æ³\95寫å\85¥æª\94æ¡\88 \"$1\"â\80\8bâ\80\8b。",
+       "backend-fail-readonly": "儲存庫的後端 \"$1\" 目前為唯讀模式。原因為:\"<em>$2</em>\"",
+       "backend-fail-synced": "æª\94æ¡\88 \"$1\" è\88\87å\85§é\83¨å\84²å­\98庫å¾\8c端å\85§ç\9a\84ç\8b\80æ\85\8bä¸\8dä¸\80è\87´。",
+       "backend-fail-connect": "ç\84¡æ³\95é\80£çµ\90è\87³å\84²å­\98庫å¾\8c端 \"$1\"。",
+       "backend-fail-internal": "å\84²å­\98庫å¾\8c端 \"$1\" ç\99¼ç\94\9fäº\86ä¸\8dæ\98\8eç\9a\84錯誤。",
+       "backend-fail-contenttype": "無法辨識儲存於 \"$1\" 的檔案內容類型。",
        "backend-fail-batchsize": "存儲後端被給予了「$1」次檔案 {{PLURAL:$1|操作}} ;限制是$2次{{PLURAL:$2|操作}}。",
-       "backend-fail-usable": "ç\94±æ\96¼æ²\92æ\9c\89足夠ç\9a\84æ¬\8aé\99\90æ\88\96缺å°\91è·¯å¾\91/容å\99¨ï¼\8cæ\89\80以ç\84¡æ³\95è®\80å\8f\96æ\88\96寫å\85¥æª\94æ¡\88 $1 。",
-       "filejournal-fail-dbconnect": "ç\84¡æ³\95é\80£æ\8e¥å\88°å¾\8c端å­\98å\84²ç\9a\84æ\97¥èª\8cè³\87æ\96\99庫\" $1 \"。",
-       "filejournal-fail-dbquery": "ç\84¡æ³\95æ\9b´æ\96°å¾\8c端å­\98å\84²ç\9a\84æ\97¥èª\8cè³\87æ\96\99庫\" $1 \"。",
-       "lockmanager-notlocked": "ç\84¡æ³\95解é\8e\96ã\80\8c$1ã\80\8dï¼\9bå®\83æ²\92æ\9c\89被鎖定。",
-       "lockmanager-fail-closelock": "無法關閉「$1」的鎖文件。",
-       "lockmanager-fail-deletelock": "無法刪除「$1」的鎖文件。",
-       "lockmanager-fail-acquirelock": "無法為「$1」獲取鎖。",
-       "lockmanager-fail-openlock": "無法打開「$1」的鎖文件。",
-       "lockmanager-fail-releaselock": "無法為「$1」釋放鎖。",
+       "backend-fail-usable": "ç\94±æ\96¼æ¬\8aé\99\90ä¸\8d足æ\88\96ç\9b®é\8c\84/容å\99¨é\81ºå¤±ï¼\8cç\84¡æ³\95è®\80å\8f\96æ\88\96寫å\85¥æª\94æ¡\88 \"$1\"。",
+       "filejournal-fail-dbconnect": "ç\84¡æ³\95é\80£æ\8e¥å\88°å\84²å­\98庫å¾\8c端 \"$1\" ç\9a\84æ\97¥èª\8cè³\87æ\96\99庫。",
+       "filejournal-fail-dbquery": "ç\84¡æ³\95æ\9b´æ\96°å\84²å­\98庫å¾\8c端 \"$1\" ç\9a\84æ\97¥èª\8cè³\87æ\96\99庫。",
+       "lockmanager-notlocked": "ç\84¡æ³\95解é\99¤é\8e\96å®\9a \"$1\"ï¼\9b該æª\94æ¡\88並æ\9cª被鎖定。",
+       "lockmanager-fail-closelock": "無法關閉 \"$1\" 的鎖定檔案。",
+       "lockmanager-fail-deletelock": "無法刪除 \"$1\" 的鎖定檔案。",
+       "lockmanager-fail-acquirelock": "無法取得 \"$1\" 的鎖定狀態。",
+       "lockmanager-fail-openlock": "無法開啟 \"$1\" 的鎖定檔案。",
+       "lockmanager-fail-releaselock": "無法釋放 \"$1\" 的鎖定狀態。",
        "lockmanager-fail-db-bucket": "不能在$1池中聯繫到足夠鎖數據庫。",
-       "lockmanager-fail-db-release": "不能在數據庫$1上釋放鎖。",
-       "lockmanager-fail-svr-acquire": "無法取得伺服器$1上的鎖。",
-       "lockmanager-fail-svr-release": "不能在服務器$1上釋放鎖。",
-       "zip-file-open-error": "打開檔案的 ZIP 檢查時遇到一個錯誤。",
-       "zip-wrong-format": "指定的檔案不是ZIP檔案。",
-       "zip-bad": "該檔案是已損壞或以其它方式無法讀取的 ZIP 檔案。\n不能正確檢查安全。",
-       "zip-unsupported": "該檔案是 ZIP 檔案,其中使用 MediaWiki 不支持的ZIP功能。\n不能正確檢查安全。",
-       "uploadstash": "上傳貯藏",
-       "uploadstash-summary": "此頁面可存取已上傳或還在上傳程序但尚未在 Wiki 公開的檔案,這些檔案除了上傳的使用者本身外,其他人無法查看。",
-       "uploadstash-clear": "清除貯藏檔案",
-       "uploadstash-nofiles": "{{GENDER:|ä½ |妳|ä½ }}æ²\92æ\9c\89已貯藏的檔案。",
-       "uploadstash-badtoken": "進行這個動作不成功,或者{{GENDER:|你|妳|你}}的編輯資訊已經過期。請再試。",
-       "uploadstash-errclear": "清除檔案不成功。",
+       "lockmanager-fail-db-release": "無法釋放資料庫 $1 的鎖定狀態。",
+       "lockmanager-fail-svr-acquire": "無法取得伺服器 $1 的鎖定狀態。",
+       "lockmanager-fail-svr-release": "無法釋放伺服器 $1 的鎖定狀態。",
+       "zip-file-open-error": "開啟檔案進行 ZIP 檢查時發生錯誤。",
+       "zip-wrong-format": "指定的檔案不是 ZIP 檔案。",
+       "zip-bad": "ZIP 檔案已損毀或無法讀取,\n無法正常執行安全檢查。",
+       "zip-unsupported": "ZIP 檔案使用了 MediaWiki 目前不支援的功能。\n無法正常執行安全檢查。",
+       "uploadstash": "上傳儲藏庫",
+       "uploadstash-summary": "此頁面可存取已上傳或還在上傳程序但尚未在 Wiki 公開的檔案,這些檔案除了上傳的使用者本身外,其他人無法查看。",
+       "uploadstash-clear": "清除儲藏庫檔案",
+       "uploadstash-nofiles": "{{GENDER:|ä½ |妳|ä½ }}æ²\92æ\9c\89å\84²藏的檔案。",
+       "uploadstash-badtoken": "執行動作失敗,{{GENDER:|你|妳|你}}的編輯資訊可能已經過期,請重新再試。",
+       "uploadstash-errclear": "清除檔案失敗。",
        "uploadstash-refresh": "更新檔案清單",
        "invalid-chunk-offset": "無效區塊偏移量",
        "img-auth-accessdenied": "拒絕存取",
-       "img-auth-nopathinfo": "PATH_INFO缺失。\n您的服務器尚未設置傳送該信息。\n它可能是基於CGI的,因而不支持img_auth。\n請參見 https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization",
-       "img-auth-notindir": "所請求的路徑不在已經設定的上載目錄。",
-       "img-auth-badtitle": "不能夠由「$1」建立一個有效標題。",
-       "img-auth-nologinnWL": "您而家並未登入,「$1」不在白名單上。",
-       "img-auth-nofile": "檔案「$1」不存在。",
-       "img-auth-isdir": "您嘗試過存取一個目錄「$1」。\n只是可以存取檔案。",
-       "img-auth-streaming": "串流「$1」中。",
-       "img-auth-public": "img_auth.php的功能是由一個公共wiki中輸出檔案。\n這個wiki是已經設定做一個公共wiki。\n基於保安最佳化,img_auth.php已經停用。",
+       "img-auth-nopathinfo": "缺少 PATH_INFO。\n您的伺服器環境未傳遞此資訊,\n可能為以 CGI 為基礎並不支持 img_auth。\n詳情請參考 https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization。",
+       "img-auth-notindir": "所指定的路徑不在已設定的上傳目錄清單。",
+       "img-auth-badtitle": "無法由 \"$1\" 建立有效的標題。",
+       "img-auth-nologinnWL": "您尚未登入,且 \"$1\" 並未在允許清單上。",
+       "img-auth-nofile": "檔案 \"$1\" 不存在。",
+       "img-auth-isdir": "您正嘗試存取目錄 \"$1\",\n僅允許存取檔案。",
+       "img-auth-streaming": "傳輸 \"$1\" 中。",
+       "img-auth-public": "img_auth.php 的用途是讓非公開的 Wiki 可輸出檔案,\n此 Wiki 已設定為公開的 Wiki。\n基於安全性的考量,已停用 img_auth.php。",
        "img-auth-noread": "使用者沒有權限讀取 \"$1\"。",
-       "http-invalid-url": "無效的URL:$1",
-       "http-invalid-scheme": "不支援含有「$1」的URL。",
-       "http-request-error": "未知的錯誤令到HTTP請求失敗。",
-       "http-read-error": "HTTP讀取錯誤。",
-       "http-timed-out": "HTTP請求已過時。",
-       "http-curl-error": "擷取URL時出錯:$1",
-       "http-bad-status": "進行HTTP請求時出現問題:$1 $2",
-       "upload-curl-error6": "無法訪問 URL",
-       "upload-curl-error6-text": "無法訪問所提供的 URL。請再次檢查該 URL 是否正確,並且網站的訪問是否正常。",
-       "upload-curl-error28": "上傳時",
-       "upload-curl-error28-text": "網站回應時間過長。請檢查此網站的訪問是否正常,過一會再進行嘗試。您可能需要在網路訪問空閒時間再次進行嘗試。",
-       "license": "授權:",
-       "license-header": "授權",
-       "nolicense": "未選定",
+       "http-invalid-url": "無效的 URL:$1",
+       "http-invalid-scheme": "不支援 \"$1\" 協定的 URL。",
+       "http-request-error": "發生不明錯誤,HTTP 請求失敗。",
+       "http-read-error": "HTTP 讀取錯誤。",
+       "http-timed-out": "HTTP 請求已逾時。",
+       "http-curl-error": "擷取 URL 時錯誤:$1",
+       "http-bad-status": "進行 HTTP 請求發生問題:$1 $2",
+       "upload-curl-error6": "無法連線 URL",
+       "upload-curl-error6-text": "無法連線指定的 URL。\n請重新檢查 URL 是否正確,且確認網站是否正常運作。",
+       "upload-curl-error28": "上傳時",
+       "upload-curl-error28-text": "網站超出回應時間限制。\n請檢查該網站是否正常運作,並稍候一會再試一次。\n建議您可在非網路尖峰時段再嘗試連線。",
+       "license": "授權條款:",
+       "license-header": "授權條款",
+       "nolicense": "尚未選擇",
        "license-nopreview": "(不可預覽)",
        "upload_source_url": "(有效,可公開存取的 URL)",
        "upload_source_file": "(在您電腦上的檔案)",
        "listfiles-summary": "此特殊頁面顯示所有上傳過的檔案。",
-       "listfiles_search_for": "æ\8c\89æª\94æ¡\88å\90\8d稱æ\90\9cç´¢:",
+       "listfiles_search_for": "æ\90\9cå°\8båª\92é«\94å\90\8d稱:",
        "imgfile": "檔案",
        "listfiles": "檔案列表",
        "listfiles_thumb": "縮圖",
        "listfiles_size": "大小",
        "listfiles_description": "描述",
        "listfiles_count": "版本",
-       "listfiles-show-all": "包圖片的舊版本",
+       "listfiles-show-all": "包圖片的舊版本",
        "listfiles-latestversion": "目前版本",
        "listfiles-latestversion-yes": "是",
        "listfiles-latestversion-no": "否",
        "file-anchor-link": "檔案",
        "filehist": "檔案歷史",
-       "filehist-help": "點擊日期/時間以檢視當時出現過的檔案。",
+       "filehist-help": "點選日期/時間以檢視該時間的檔案版本。",
        "filehist-deleteall": "刪除全部",
        "filehist-deleteone": "刪除",
-       "filehist-revert": "恢復",
+       "filehist-revert": "還原",
        "filehist-current": "目前",
-       "filehist-datetime": "日期時間",
+       "filehist-datetime": "日期/時間",
        "filehist-thumb": "縮圖",
        "filehist-thumbtext": "於$1的縮圖版本",
        "filehist-nothumb": "沒有縮圖",
        "filehist-user": "使用者",
-       "filehist-dimensions": "維度",
+       "filehist-dimensions": "尺寸",
        "filehist-filesize": "檔案大小",
        "filehist-comment": "註解",
-       "imagelinks": "檔案使用情況",
-       "linkstoimage": "以ä¸\8bç\9a\84$1å\80\8bé \81é\9d¢é\80£æ\8e¥å\88°æ\9c¬æª\94æ¡\88:",
+       "imagelinks": "檔案使用",
+       "linkstoimage": "ä¸\8bå\88\97 $1 å\80\8bé \81é\9d¢é\80£çµ\90å\88°æ­¤æª\94æ¡\88ï¼\9a",
        "linkstoimage-more": "超過$1個頁面連接到這個檔案。\n此處只列出首$1個連接到此檔案的頁面。\n您也可以查看[[Special:WhatLinksHere/$2|完整的清單]]。",
        "nolinkstoimage": "沒有頁面連接到本檔案。",
        "morelinkstoimage": "檢視連接到這個檔案的[[Special:WhatLinksHere/$1|更多連結]]。",
        "linkstoimage-redirect": "$1 (檔案重新導向至) $2",
-       "duplicatesoffile": "以下的$1個檔案跟這個檔案重覆([[Special:FileDuplicateSearch/$2|更多細節]]):",
+       "duplicatesoffile": "以下 $1 個檔案與此檔案重覆 ([[Special:FileDuplicateSearch/$2|了解詳細資訊]]):",
        "sharedupload": "此檔案來自 $1 且可能被其他專案所使用。",
-       "sharedupload-desc-there": "該檔案來自於$1,它可能在其它計劃項目中被應用。\n請參閱在[$2 檔案描述頁面]以了解其相關資訊。",
+       "sharedupload-desc-there": "此檔案來自 $1 且可能被其他專案所使用。\n請參考 [$2 檔案描述頁面] 了解進一步資訊。",
        "sharedupload-desc-here": "此檔案來自 $1 且可能被其他專案所使用。\n以下為該檔案於 [$2 檔案描述頁面] 的內容描述。",
-       "sharedupload-desc-edit": "該檔案來自$1,它可能在其它計劃項目中被使用。\n或許您可以在其[$2 檔案描述頁面]上編輯說明。",
+       "sharedupload-desc-edit": "此檔案來自 $1 且可能被其他專案所使用。\n您可在該檔案的 [$2 檔案描述頁面] 上編輯內容描述。",
        "sharedupload-desc-create": "此檔案來自 $1 且可能被其他專案所使用。\n若您想要編輯內容描述可至 [$2 檔案描述頁面]。",
        "filepage-nofile": "不存在此名稱的檔案。",
-       "filepage-nofile-link": "不存在此名稱的檔案,但您可以[$1 上傳它]。",
-       "uploadnewversion-linktext": "上傳檔案的新版本",
+       "filepage-nofile-link": "不存在此名稱的檔案,您可以 [$1 上傳]。",
+       "uploadnewversion-linktext": "上傳檔案的新版本",
        "shared-repo-from": "來自 $1",
        "shared-repo": "一個共用檔案庫",
        "shared-repo-name-wikimediacommons": "維基共享資源",
        "upload-disallowed-here": "您不可以覆蓋此檔案。",
-       "filerevert": "恢復$1",
-       "filerevert-legend": "恢復檔案",
-       "filerevert-intro": "您現正在恢復檔案'''[[Media:$1|$1]]'''到[$4 於$2 $3的版本]。",
-       "filerevert-comment": "理由:",
-       "filerevert-defaultcomment": "已經恢復到於$1 $2的版本",
-       "filerevert-submit": "恢復",
-       "filerevert-success": "'''[[Media:$1|$1]]'''已經恢復到[$4 於$2 $3的版本]。",
-       "filerevert-badversion": "這個檔案所提供的時間截記並無先前的本地版本。",
-       "filedelete": "刪除$1",
+       "filerevert": "還原 $1",
+       "filerevert-legend": "還原檔案",
+       "filerevert-intro": "您現正在還原檔案 <strong>[[Media:$1|$1]]</strong> 至 [$4 於 $2 $3 的版本]。",
+       "filerevert-comment": "原因:",
+       "filerevert-defaultcomment": "已還原到於 $1 $2 的版本",
+       "filerevert-submit": "還原",
+       "filerevert-success": "<strong>[[Media:$1|$1]]</strong> 已經還原到 [$4 於 $2 $3 的版本]。",
+       "filerevert-badversion": "查無此檔案先前於指定時間的本地版本。",
+       "filedelete": "刪除 $1",
        "filedelete-legend": "刪除檔案",
-       "filedelete-intro": "您現正刪除檔案'''[[Media:$1|$1]]'''。",
-       "filedelete-intro-old": "{{GENDER:|你|妳|你}}現正刪除'''[[Media:$1|$1]]'''於[$4 $2 $3]的版本。",
-       "filedelete-comment": "理由:",
+       "filedelete-intro": "您現正要刪除檔案 <strong>[[Media:$1|$1]]</strong> 與其所有歷史版本。",
+       "filedelete-intro-old": "您現正要刪除 <strong>[[Media:$1|$1]]</strong> 於 [$4 $2 $3] 的版本。",
+       "filedelete-comment": "原因:",
        "filedelete-submit": "刪除",
-       "filedelete-success": "'''$1'''已經刪除。",
-       "filedelete-success-old": "'''[[Media:$1|$1]]'''於 $2 $3 的版本已經刪除。",
-       "filedelete-nofile": "'''$1'''不存在。",
-       "filedelete-nofile-old": "在已指定屬性的情況下,這裡沒有'''$1'''的保存版本。",
-       "filedelete-otherreason": "其它/附加的理由:",
-       "filedelete-reason-otherlist": "其它理由",
-       "filedelete-reason-dropdown": "*常見的刪除原因\n** 侵犯版權\n** 重覆的檔案",
-       "filedelete-edit-reasonlist": "編輯å\88ªé\99¤å\9f\8bç\94±",
-       "filedelete-maintenance": "ç\95¶å\9c¨ç¶­è­·æ\99\82å·²ç¶\93æ\9a«æ\99\82å\81\9cç\94¨æª\94æ¡\88å\88ªé\99¤å\92\8cæ\81¢å¾©。",
-       "filedelete-maintenance-title": "ç\84¡æ³\95å\88ªé\99¤æ\96\87件",
+       "filedelete-success": "已刪除 <strong>$1</strong>。",
+       "filedelete-success-old": "已刪除 <strong>[[Media:$1|$1]]</strong> 於 $2 $3 的版本。",
+       "filedelete-nofile": "<strong>$1</strong> 不存在。",
+       "filedelete-nofile-old": "查無 <strong>$1</strong> 擁有指定的屬性的封存版本。",
+       "filedelete-otherreason": "其它/額外的原因:",
+       "filedelete-reason-otherlist": "其它原因",
+       "filedelete-reason-dropdown": "*常見的刪除原因\n** 侵犯版權\n** 檔案重覆",
+       "filedelete-edit-reasonlist": "編輯å\88ªé\99¤å\8e\9få\9b ",
+       "filedelete-maintenance": "維護æ\9c\9fé\96\93æª\94æ¡\88å\88ªé\99¤å\92\8cé\82\84å\8e\9fæ\9a«å\81\9c使ç\94¨。",
+       "filedelete-maintenance-title": "ç\84¡æ³\95å\88ªé\99¤æª\94æ¡\88",
        "mimesearch": "MIME 搜尋",
-       "mimesearch-summary": "æ\9c¬é \81é\9d¢å\95\9fç\94¨æª\94æ¡\88MIMEé¡\9eå\9e\8bé\81\8e濾å\99¨ã\80\82輸å\85¥ï¸°內容類型/子類型,如 <code>image/jpeg</code>。",
-       "mimetype": "MIME 類型:",
+       "mimesearch-summary": "æ\9c¬é \81é\9d¢å\8f¯æ\90\9cå°\8bæª\94æ¡\88ç\9a\84 MIME é¡\9eå\9e\8bã\80\82\n輸å\85¥æ ¼å¼\8fï¼\9a內容類型/子類型,如 <code>image/jpeg</code>。",
+       "mimetype": "MIME 類型",
        "download": "下載",
        "unwatchedpages": "未被監視的頁面",
-       "listredirects": "重新導向清單",
+       "listredirects": "重新導向頁面清單",
        "listduplicatedfiles": "重複檔案列表",
        "listduplicatedfiles-summary": "以下列表中某檔案之最新版本與其他檔案之最新版本重複。進包含本地檔案",
-       "listduplicatedfiles-entry": "檔案[[:File:$1|$1]]與[[$3|其他$2個重複]]。",
+       "listduplicatedfiles-entry": "[[:File:$1|$1]] 有[[$3|其他 $2 個重複檔案]]。",
        "unusedtemplates": "未使用的樣版",
-       "unusedtemplatestext": "此頁列出所有於 {{ns:template}} 命名空間下未被其他頁面引用的頁面。\n請在刪除這些樣版前檢查其他使用該樣版的頁面。",
+       "unusedtemplatestext": "此頁面列出所有於 {{ns:template}} 命名空間下未被其他頁面引用的樣版。\n在刪除前,仍需檢查是否有連結這些樣版的其他頁面。",
        "unusedtemplateswlh": "其他連結",
        "randompage": "隨機頁面",
        "randompage-nopages": "在{{PLURAL:$2|命名空間}}中沒有任何頁面:$1。",
        "randomincategory-invalidcategory": "\"$1\" 不是一個有效的分類名稱。",
        "randomincategory-nopages": "[[:Category:$1]]中沒有頁面。",
        "randomincategory-selectcategory": "從分類中獲取隨機頁面:$1 $2",
-       "randomincategory-selectcategory-submit": "顯示",
+       "randomincategory-selectcategory-submit": "前往",
        "randomredirect": "隨機重新導向",
        "randomredirect-nopages": "在命名空間 \"$1\" 中沒有重新導向頁面。",
        "statistics": "統計",
        "statistics-views-total-desc": "不存在頁面和特殊頁面的查看數未計入",
        "statistics-views-peredit": "每次編輯檢視數",
        "statistics-users": "已註冊的 [[Special:ListUsers|使用者]]",
-       "statistics-users-active": "活使用者",
+       "statistics-users-active": "活使用者",
        "statistics-users-active-desc": "在最近 $1 天操作過的使用者",
        "statistics-mostpopular": "被查閱次數最多的頁面",
-       "pageswithprop": "æ\9c\89é \81é\9d¢屬性的頁面",
+       "pageswithprop": "æ\93\81æ\9c\89屬性的頁面",
        "pageswithprop-legend": "有頁面屬性的頁面",
        "pageswithprop-text": "此頁列出所有頁面使用了特定的頁面屬性。",
        "pageswithprop-prop": "屬性名稱:",
        "double-redirect-fixed-move": "[[$1]] 已完成移動。\n此頁面已自動更新並重新導向至 [[$2]]。",
        "double-redirect-fixed-maintenance": "作為維護工作自動修復於[[$1]]至[[$2]]之雙重重定向。",
        "double-redirect-fixer": "重新導向修正器",
-       "brokenredirects": "中斷的重新導向頁面",
+       "brokenredirects": "損壞的重新導向頁面",
        "brokenredirectstext": "以下的重新導向頁面連結到不存在的頁面:",
        "brokenredirects-edit": "編輯",
        "brokenredirects-delete": "刪除",
        "withoutinterwiki": "未有語言連結的頁面",
-       "withoutinterwiki-summary": "以ä¸\8bç\9a\84é \81é\9d¢æ\98¯æ\9cªæ\9c\89èª\9eè¨\80é\80£çµ\90å\88°å\85¶å®\83èª\9eè¨\80ç\89\88æ\9c¬。",
-       "withoutinterwiki-legend": "å\89\8d綴",
+       "withoutinterwiki-summary": "ä¸\8bå\88\97æ\98¯æ²\92æ\9c\89é\80£çµ\90å\88°å\85¶å®\83èª\9eè¨\80ç\89\88æ\9c¬ç\9a\84é \81é\9d¢。",
+       "withoutinterwiki-legend": "å­\97é¦\96",
        "withoutinterwiki-submit": "顯示",
        "fewestrevisions": "最少修訂的頁面",
        "nbytes": "$1 個位元組",
        "ncategories": "$1 個分類",
        "ninterwikis": "$1 個跨維基",
-       "nlinks": "$1個連結",
+       "nlinks": "$1 個連結",
        "nmembers": "$1個成員",
        "nmemberschanged": "$1 → $2個成員",
        "nrevisions": "$1個修訂",
        "ntransclusions": "用於$1個頁面中",
        "specialpage-empty": "這個報告的結果為空。",
        "lonelypages": "孤立頁面",
-       "lonelypagestext": "以ä¸\8bé \81é\9d¢å°\9aæ\9cªè¢«{{SITENAME}}中ç\9a\84å\85¶å®\83é \81é\9d¢é\80£çµ\90æ\88\96被ä¹\8bå\8c\85å\90«。",
+       "lonelypagestext": "ä¸\8bå\88\97é \81é\9d¢å°\9aæ\9cªè¢« {{SITENAME}} ä¸­ç\9a\84å\85¶å®\83é \81é\9d¢é\80£çµ\90æ\88\96å¼\95ç\94¨。",
        "uncategorizedpages": "待分類頁面",
        "uncategorizedcategories": "待分類類別",
        "uncategorizedimages": "待分類檔案",
        "uncategorizedtemplates": "待分類樣版",
        "unusedcategories": "未使用的分類",
-       "unusedimages": "未使用圖片",
+       "unusedimages": "未使用的檔案",
        "popularpages": "熱點頁面",
        "wantedcategories": "需要的分類",
-       "wantedpages": "待撰頁面",
+       "wantedpages": "需要的頁面",
        "wantedpages-badtitle": "在結果組上的無效標題: $1",
        "wantedfiles": "需要的檔案",
        "wantedfiletext-cat": "以下檔案被使用,但不存在。外部儲存庫的文件儘管現有,但可能會在此列出,任何此類的誤報將被<del>剔除</del>。此外,內嵌了不存在的檔案的網頁將在[[:$1]]列出。",
        "mostimages": "最多連結檔案",
        "mostinterwikis": "最多跨維基頁面",
        "mostrevisions": "最多修訂頁面",
-       "prefixindex": "所有有前綴的頁面",
+       "prefixindex": "所有頁面與字首",
        "prefixindex-namespace": "所有含字首的頁面 ($1 命名空間)",
-       "prefixindex-strip": "於列表中省略前綴",
-       "shortpages": "頁面",
-       "longpages": "é\95·頁面",
-       "deadendpages": "斷連頁面",
-       "deadendpagestext": "以下頁面沒有連結到{{SITENAME}}中的其它頁面。",
+       "prefixindex-strip": "於清單中省略字首",
+       "shortpages": "過短的頁面",
+       "longpages": "é\81\8eé\95·ç\9a\84頁面",
+       "deadendpages": "無連結頁面",
+       "deadendpagestext": "以下在 {{SITENAME}} 中的頁面未連結到其他頁面。",
        "protectedpages": "受保護頁面",
-       "protectedpages-indef": "只有無期之保護頁面",
-       "protectedpages-summary": "æ­¤é \81é\9d¢å\88\97å\87ºç\95¶å\89\8då\8f\97ä¿\9dè­·ä¹\8bé \81é\9d¢ã\80\82欲訪å\95\8få\8f\97ç\99½ç´\99ä¿\9dè­·ä¹\8bæ¨\99é¡\8cå\88\97表ï¼\8cè«\8bå\8f\83è¦\8b[[{{#special:ProtectedTitles}}|{{int:protectedtitles}}]]。",
-       "protectedpages-cascade": "只有連鎖之保護頁面",
+       "protectedpages-indef": "只顯示無限期的保護頁面",
+       "protectedpages-summary": "æ­¤é \81é\9d¢å\88\97å\87ºç\9b®å\89\8då\8f\97ä¿\9dè­·ç\9a\84é \81é\9d¢ã\80\82 æ¬²æ\9f¥è©¢å\8f\97ä¿\9dè­·æ¨\99é¡\8cæ¸\85å\96®ï¼\8cè«\8bå\8f\83è\80\83 [[{{#special:ProtectedTitles}}|{{int:protectedtitles}}]]。",
+       "protectedpages-cascade": "只顯示連鎖的保護頁面",
        "protectedpages-noredirect": "隱藏重新導向頁面",
        "protectedpagesempty": "在這些參數下沒有頁面正在保護。",
-       "protectedpages-timestamp": "æ\99\82é\96\93æ\88³",
+       "protectedpages-timestamp": "æ\97¥æ\9c\9fæ\99\82é\96\93",
        "protectedpages-page": "頁面",
        "protectedpages-expiry": "期限",
        "protectedpages-performer": "保護使用者",
        "protectedpages-unknown-timestamp": "未知",
        "protectedpages-unknown-performer": "不明的使用者",
        "protectedtitles": "受保護標題",
-       "protectedtitles-summary": "æ­¤é \81é\9d¢å\88\97å\87ºç\95¶å\89\8då\8f\97ç\99½ç´\99ä¿\9dè­·ä¹\8bæ¨\99é¡\8cã\80\82欲訪å\95\8få\8f\97ä¿\9dè­·é \81é\9d¢ä¹\8bå\88\97表ï¼\8cè«\8bå\8f\83è¦\8b[[{{#special:ProtectedPages}}|{{int:protectedpages}}]]。",
+       "protectedtitles-summary": "æ­¤é \81é\9d¢å\88\97å\87ºç\9b®å\89\8då\8f\97ä¿\9dè­·ç\9a\84æ¨\99é¡\8cã\80\82 æ¬²æ\9f¥è©¢å\8f\97ä¿\9dè­·é \81é\9d¢æ¸\85å\96®ï¼\8cè«\8bå\8f\83è\80\83 [[{{#special:ProtectedPages}}|{{int:protectedpages}}]]。",
        "protectedtitlesempty": "在這些參數之下並無標題正在保護。",
        "listusers": "使用者清單",
        "listusers-editsonly": "只顯示有編輯的使用者",
-       "listusers-creationsort": "建立日期排序",
+       "listusers-creationsort": "建立日期排序",
        "listusers-desc": "使用降冪排序",
        "usereditcount": "$1 次{{PLURAL:$1|編輯}}",
        "usercreated": "於 $1 $2 {{GENDER:$3|建立}}",
        "ancientpages": "最舊頁面",
        "move": "移動",
        "movethispage": "移動本頁",
-       "unusedimagestext": "下列檔案未有嵌入任何頁面但它仍然存在。\n請注意其它網站可能直接透過 URL 連結此檔案,所以這裡列出的圖片有可能依然被使用。",
-       "unusedcategoriestext": "é\9b\96ç\84¶æ²\92æ\9c\89被å\85¶å®\83é \81é\9d¢æ\88\96è\80\85å\88\86é¡\9eæ\89\80æ\8e¡ç\94¨ï¼\8cä½\86å\88\97表中ç\9a\84å\88\86é¡\9eé \81ä¾\9dç\84¶å­\98å\9c¨ã\80\82",
+       "unusedimagestext": "下列為未被任何頁面使用的檔案。\n請注意,其它網站可能直接透過 URL 連結至檔案,所以這裡列出的檔案仍有可能被使用。",
+       "unusedcategoriestext": "ä¸\8bå\88\97å\88\86é¡\9eæ²\92æ\9c\89被å\85¶å®\83é \81é\9d¢æ\88\96è\80\85å\88\86é¡\9eæ\89\80使ç\94¨ã\80\82",
        "notargettitle": "無目標",
        "notargettext": "您尚未指定目標頁面或使用者以進行此項操作。",
        "nopagetitle": "無目標頁面",
        "pager-older-n": "較舊 $1 筆",
        "suppress": "監督",
        "querypage-disabled": "此特殊頁面基於效能的原因已經被停用。",
-       "booksources": "網路書源",
-       "booksources-search-legend": "尋找網路書源",
+       "booksources": "圖書資源",
+       "booksources-search-legend": "尋找圖書資源",
        "booksources-isbn": "國際標準書號:",
        "booksources-go": "送出",
        "booksources-text": "以下是一份銷售新書或二手書的列表,並可能有{{GENDER:|你|妳|你}}正尋找的書的進一步訊息:",
        "log-title-wildcard": "搜尋以這個文字開始的標題",
        "showhideselectedlogentries": "顯示/隱藏所選的日誌項目",
        "allpages": "所有頁面",
-       "alphaindexline": "$1 到 $2",
        "nextpage": "下一頁 ($1)",
        "prevpage": "上一頁 ($1)",
        "allpagesfrom": "顯示從此處開始的頁面:",
        "allarticles": "所有頁面",
        "allinnamespace": "所有頁面 ($1 命名空間)",
        "allpagessubmit": "提交",
-       "allpagesprefix": "顯示有此前綴的頁面:",
-       "allpagesbadtitle": "給定的頁面標題是非法的,或者具有一個內部語言或內部 wiki 的前綴。它可能包含一個或更多的不能用於標題的字元。",
+       "allpagesprefix": "顯示以此為字首頁面:",
+       "allpagesbadtitle": "指定的頁面標題無效、包含內部語言或內部 Wiki 的字首。\n它可能包含一個或多個的不能用於標題的字元。",
        "allpages-bad-ns": "{{SITENAME}} 沒有 \"$1\" 命名空間。",
        "allpages-hide-redirects": "隱藏重新導向頁面",
        "cachedspecial-viewing-cached-ttl": "你正在瀏覽本頁的緩存版本,至多可能存在$1的延遲。",
        "cachedspecial-viewing-cached-ts": "您正在閱讀此頁的緩存版本,這可能不是完整的版本。",
        "cachedspecial-refresh-now": "查看最新。",
        "categories": "頁面分類",
-       "categoriespagetext": "以ä¸\8bç\9a\84{{PLURAL:$1|å\88\86é¡\9e}}中å\8c\85å\90«äº\86é \81é\9d¢æ\88\96åª\92é«\94ã\80\82\n[[Special:UnusedCategories|æ\9cªç\94¨å\88\86é¡\9e]]ä¸\8dæ\9c\83å\9c¨é\80\99è£\8få\88\97示ã\80\82\nè«\8bå\90\8cæ\99\82å\8f\83é\96±[[Special:WantedCategories|需要的分類]]。",
+       "categoriespagetext": "ä¸\8bå\88\97ç\82ºå\8c\85å\90«é \81é\9d¢æ\88\96åª\92é«\94ç\9a\84{{PLURAL:$1|å\88\86é¡\9e}}ã\80\82\n[[Special:UnusedCategories|æ\9cªä½¿ç\94¨ç\9a\84å\88\86é¡\9e]] ä¸\8dæ\9c\83å\9c¨æ­¤é¡¯ç¤ºã\80\82\nè«\8bå\8f\83è\80\83 [[Special:WantedCategories|需要的分類]]。",
        "categoriesfrom": "顯示由此項起之分類:",
        "special-categories-sort-count": "按數量排列",
        "special-categories-sort-abc": "按字母排列",
        "listusers-submit": "顯示",
        "listusers-noresult": "查無使用者。",
        "listusers-blocked": "(已封鎖)",
-       "activeusers": "æ\9c\89æ´»å\8b\95ç\9a\84使ç\94¨è\80\85æ¸\85å\96®",
+       "activeusers": "活動的使用者清單",
        "activeusers-intro": "此清單為最近 $1 天有活動的使用者。",
-       "activeusers-count": "最近$3天內有$1次編輯",
+       "activeusers-count": "最近 $3 天內有 $1 次動作",
        "activeusers-from": "顯示使用者開始自:",
        "activeusers-hidebots": "隱藏機器人",
        "activeusers-hidesysops": "隱藏管理員",
        "activeusers-noresult": "查無使用者。",
        "listgrouprights": "使用者群組權限",
        "listgrouprights-summary": "以下為此 Wiki 的使用者群組清單,以及相關的存取權限。\n您可以在 [[{{MediaWiki:Listgrouprights-helppage}}|詳細資訊]] 找到有關個別權限的資訊。",
-       "listgrouprights-key": "* <span class=\"listgrouprights-granted\">已授予的權限</span>\n* <span class=\"listgrouprights-revoked\">被吊銷的權限</span>",
+       "listgrouprights-key": "說明:\n* <span class=\"listgrouprights-granted\">已授予的權限</span>\n* <span class=\"listgrouprights-revoked\">已撤銷的權限</span>",
        "listgrouprights-group": "群組",
        "listgrouprights-rights": "權限",
        "listgrouprights-helppage": "Help:群組權限",
        "trackingcategories": "跟蹤分類",
        "trackingcategories-summary": "此頁面列出由 MediaWiki 系統自動產生用來追蹤頁面的分類,這些分類的名稱可由命名空間 {{ns:8}} 中的相關系統訊息中修改。",
        "trackingcategories-msg": "跟蹤分類",
-       "trackingcategories-name": "è³\87è¨\8aå\90\8d",
+       "trackingcategories-name": "è¨\8aæ\81¯å\90\8d稱",
        "trackingcategories-desc": "分類收錄準則",
        "noindex-category-desc": "命名空間允許,且含有魔術字 <code><nowiki>__NOINDEX__</nowiki></code> 未被機器人列入索引的頁面。",
        "index-category-desc": "命名空間允許,且含有魔術字 <code><nowiki>__INDEX__</nowiki></code> 被機器人列入索引的頁面。",
        "dellogpage": "刪除紀錄",
        "dellogpagetext": "以下是最近的刪除的列表。",
        "deletionlog": "刪除紀錄",
-       "reverted": "恢復到早期版本",
+       "reverted": "還原到較早的版本",
        "deletecomment": "理由:",
        "deleteotherreason": "其它/附加的理由:",
        "deletereasonotherlist": "其它理由",
        "rollbacklinkcount": "還原 $1 次編輯",
        "rollbacklinkcount-morethan": "回退多過 $1 次{{PLURAL:$1|編輯}}",
        "rollbackfailed": "還原失敗",
-       "cantrollback": "無法恢復編輯;最後的貢獻者是本篇的唯一作者。",
+       "cantrollback": "無法還原編輯;\n此頁面的最後貢獻者是唯一的作者。",
        "alreadyrolled": "無法還原由 [[User:$2|$2]] ([[User talk:$2|對話]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]] 所作的最後一次編輯 [[:$1]],已有其他人編輯或還原了該頁面。\n\n最後一次編輯該頁面的使用者是 [[User:$3|$3]] ([[User talk:$3|對話]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]])。",
        "editcomment": "編輯摘要: \"''$1''\"。",
        "revertpage": "已還原 [[Special:Contributions/$2|$2]] ([[User talk:$2|對話]]) 的編輯為最後由 [[User:$1|$1]] 所修訂的版本",
        "protect-otherreason-op": "其它理由",
        "protect-dropdown": "*通用保護理由\n** 過量的破壞\n** 過量的灌水\n** 反生產性編輯戰\n** 高流量頁面",
        "protect-edit-reasonlist": "編輯保護理由",
-       "protect-expiry-options": "1小時:1 hour,1天:1 day,1周:1 week,2周:2 weeks,1個月:1 month,3個月:3 months,6個月:6 months,1年:1 year,不限期:infinite",
-       "restriction-type": "權限:",
-       "restriction-level": "限制級別:",
-       "minimum-size": "最小大小",
-       "maximum-size": "最大大小:",
+       "protect-expiry-options": "1 小時:1 hour,1 天:1 day,1 週:1 week,2 週:2 weeks,1 個月:1 month,3 個月:3 months,6 個月:6 months,1 年:1 year,不限期:infinite",
+       "restriction-type": "權限",
+       "restriction-level": "限制級別",
+       "minimum-size": "大小下限",
+       "maximum-size": "大小上限:",
        "pagesize": "(位元組)",
        "restriction-edit": "編輯",
        "restriction-move": "移動",
        "isredirect": "重新導向頁面",
        "istemplate": "包含",
        "isimage": "檔案連結",
-       "whatlinkshere-prev": "前$1個",
-       "whatlinkshere-next": "後$1個",
+       "whatlinkshere-prev": "前 $1 筆",
+       "whatlinkshere-next": "後 $1 筆",
        "whatlinkshere-links": "← 連入",
-       "whatlinkshere-hideredirs": "重新導向 $1 次",
+       "whatlinkshere-hideredirs": "$1 重新導向頁面",
        "whatlinkshere-hidetrans": "$1嵌入",
        "whatlinkshere-hidelinks": "$1連結",
        "whatlinkshere-hideimages": "$1檔案連結",
        "blocklist-tempblocks": "隱藏暫時封鎖",
        "blocklist-addressblocks": "隱藏單一 IP 封鎖",
        "blocklist-rangeblocks": "隱藏 IP 範圍封鎖",
-       "blocklist-timestamp": "時間",
+       "blocklist-timestamp": "æ\97¥æ\9c\9fæ\99\82é\96\93",
        "blocklist-target": "目標",
        "blocklist-expiry": "期限",
        "blocklist-by": "封鎖的管理員",
        "unblocklink": "解除封鎖",
        "change-blocklink": "變更封鎖",
        "contribslink": "貢獻",
-       "emaillink": "傳送電郵",
+       "emaillink": "發送電子郵件",
        "autoblocker": "您的 IP 位址因最近被 [[User:$1|$1]] 使用過而被自動封鎖。\n封鎖 $1 的原因為 \"$2\"",
        "blocklogpage": "查封日誌",
        "blocklog-showlog": "此使用者先前被封鎖過。\n以下為封鎖紀錄以供參考:",
        "lockedbyandtime": "在$2的$3由$1",
        "move-page": "移動$1",
        "move-page-legend": "移動頁面",
-       "movepagetext": "使用以下表單來重新命名一個頁面的名稱,並將所有頁面的歷史記錄一併移至新的頁面,\n舊標題的頁面將會變成重新導向頁面,導向至使用新標題的頁面。\n您可以選擇自動更新將所有導向至舊頁面的重新導向頁面改導向到新的頁面,\n若您選擇不使用自動更新,請記得檢查 [[Special:DoubleRedirects|雙重導向頁面]] 或 [[Special:BrokenRedirects|中斷的導向頁面]],\n您有責任讓連結維持有效並且能夠繼續連結到正確的新頁面。\n\n請注意,若新的頁面名稱已經被使用,則此頁面將<strong>不會</strong>被移動,除非新名稱存在的是重新導向頁面且沒有任何的編修記錄。\n這個意思指的是,您可將因失誤而移動至其他名稱的頁面復原為舊的名稱,並且您不可以覆蓋任何已存在的頁面。\n\n<strong>警告!</strong>\n這個動作對受歡迎的頁面可能是一個重大與唐突的更改;\n請在行動前確認您已了解可能帶來後果。",
+       "movepagetext": "使用以下表單來重新命名一個頁面的名稱,並將所有頁面的歷史記錄一併移至新的頁面,\n舊標題的頁面將會變成重新導向頁面,導向至使用新標題的頁面。\n您可以選擇自動更新將所有導向至舊頁面的重新導向頁面改導向到新的頁面,\n若您選擇不使用自動更新,請記得檢查 [[Special:DoubleRedirects|雙重的重新導向頁面]] 或 [[Special:BrokenRedirects|損壞的重新導向頁面]],\n您有責任讓連結維持有效並且能夠繼續連結到正確的新頁面。\n\n請注意,若新的頁面名稱已經被使用,則此頁面將<strong>不會</strong>被移動,除非新名稱存在的是重新導向頁面且沒有任何的編修記錄。\n這個意思指的是,您可將因失誤而移動至其他名稱的頁面復原為舊的名稱,並且您不可以覆蓋任何已存在的頁面。\n\n<strong>警告!</strong>\n這個動作對受歡迎的頁面可能是一個重大與唐突的更改;\n請在行動前確認您已了解可能帶來後果。",
        "movepagetext-noredirectfixer": "使用以下表單來重新命名一個頁面的名稱,並將所有頁面的歷史記錄一併移至新的頁面,\n舊標題的頁面將會變成重新導向頁面,導向至使用新標題的頁面。\n請記得檢查 [[Special:DoubleRedirects|雙重導向頁面]] 或 [[Special:BrokenRedirects|中斷的導向頁面]],\n您有責任讓連結維持有效並且能夠繼續連結到正確的新頁面。\n\n請注意,若新的頁面名稱已經被使用,則此頁面將<strong>不會</strong>被移動,除非新名稱存在的是重新導向頁面且沒有任何的編修記錄。\n這個意思指的是,您可將因失誤而移動至其他名稱的頁面復原為舊的名稱,並且您不可以覆蓋任何已存在的頁面。\n\n<strong>警告!</strong>\n這個動作對受歡迎的頁面可能是一個重大與唐突的更改;\n請在行動前確認您已了解可能帶來後果。",
        "movepagetalktext": "相關的的對話頁面 (如果有的話) 會自動與該頁面一起移動,<strong>除非:</strong>\n*新的名稱已有一個存在的對話頁面,或\n*您未勾選此核選方塊。\n\n在上述情況下,若有必要您必須手動移動或合併已存在的頁面。",
        "movearticle": "移動頁面:",
        "moveuserpage-warning": "<strong>警告:</strong> 您正要移動使用者頁面,請注意只有使用者頁面會變更名稱,並<em>不會</em>重新命名使用者。",
+       "movecategorypage-warning": "<strong>警告:</strong>您將要移動分類頁面。請注意此操作只頁面,舊分類中的頁面將<em>不會</em>移動到新的分類。",
        "movenologintext": "您必須是已註冊的使用者並且 [[Special:UserLogin|登入]] 才可移動頁面。",
        "movenotallowed": "您並沒有許可權去移動頁面。",
        "movenotallowedfile": "您並沒有許可權去移動檔案。",
        "cant-move-user-page": "您沒有權限去移動使用者頁面 (除了它的子頁面)。",
        "cant-move-to-user-page": "您沒有權限去移動頁面至使用者頁面 (除了使用者子頁面)。",
+       "cant-move-category-page": "您沒有移動分類頁面的權限。",
+       "cant-move-to-category-page": "您沒有權限移動頁面去分類頁面。",
        "newtitle": "新標題:",
        "move-watch": "監視來源以及目標頁",
        "movepagebtn": "移動頁面",
        "movesubpagetext": "這個頁面有$1個子頁面列示如下。",
        "movenosubpage": "這個頁面沒有子頁面。",
        "movereason": "原因",
-       "revertmove": "恢復該移動",
+       "revertmove": "還原",
        "delete_and_move": "刪除並移動",
        "delete_and_move_text": "==需要刪除==\n\n目標頁面\"[[:$1]]\"已經存在。{{GENDER:|你|妳|你}}確認需要刪除原頁面並以進行移動嗎?",
        "delete_and_move_confirm": "是的,刪除此頁面",
        "allmessages-filter-legend": "搜尋",
        "allmessages-filter": "以自定狀況過濾:",
        "allmessages-filter-unmodified": "未修改",
-       "allmessages-filter-all": "所有",
+       "allmessages-filter-all": "全部",
        "allmessages-filter-modified": "曾修改",
-       "allmessages-prefix": "以å\89\8d綴é\81\8e濾:",
+       "allmessages-prefix": "以å­\97é¦\96æ\90\9cå°\8b:",
        "allmessages-language": "語言:",
        "allmessages-filter-submit": "往",
        "allmessages-filter-translate": "翻譯",
        "tooltip-recreate": "重建該頁面,無論是否被刪除。",
        "tooltip-upload": "開始上傳",
        "tooltip-rollback": "點選 \"還原\" 還原至上位貢獻者對此頁面的編輯",
-       "tooltip-undo": "「復原」可以在編輯模式上開啟編輯表格以便恢復。它容許在摘要中加入原因。",
+       "tooltip-undo": "\"還原\" 可還原此編輯並以預覽模式開啟編輯表單,讓您可在摘要中加入原因。",
        "tooltip-preferences-save": "儲存偏好設定",
        "tooltip-summary": "輸入一個簡短的摘要",
        "interlanguage-link-title": "$1 – $2",
        "spamprotectiontext": "您欲儲存的文字內容已被垃圾過濾器封鎖,\n可能因您的內容包含了已封鎖的外部連結。",
        "spamprotectionmatch": "觸發了我們的垃圾過濾器的文本如下:$1",
        "spambot_username": "MediaWiki 廣告清除",
-       "spam_reverting": "恢復到不包含連結至$1的最近修訂版本",
+       "spam_reverting": "還原到未包含連結至 $1 的最新修訂",
        "spam_blanking": "所有包含連結至$1的修訂,清空",
        "spam_deleting": "所有包含連結至$1的修訂,刪除中",
        "simpleantispam-label": "反濫發電郵檢查。\n'''不要'''加入這個!",
        "filedelete-old-unregistered": "所指定的檔案修訂「$1」在資料庫中不存在。",
        "filedelete-current-unregistered": "所指定的檔案「$1」在資料庫中不存在。",
        "filedelete-archive-read-only": "存檔目錄「$1」在網頁伺服器中不可寫。",
-       "previousdiff": "←上一版本",
-       "nextdiff": "下一版本→",
-       "mediawarning": "'''警告''': 該檔案類型可能包含惡意代碼。\n執行它可能對您的系統帶來危險。",
-       "imagemaxsize": "å½±å\83\8f大å°\8fé\99\90å\88¶ï¼\9a<br />''ï¼\88ç\94¨å\9c¨æª\94æ¡\88æ\8f\8fè¿°é \81é\9d¢ä¸­ï¼\89''",
-       "thumbsize": "縮圖大小:",
-       "widthheightpage": "$1 × $2, $3頁",
-       "file-info": "檔案大小: $1, MIME 類型: $2",
-       "file-info-size": "$1 × $2 像素,檔案大小:$3,MIME類型:$4",
-       "file-info-size-pages": "$1 × $2像素,檔案大小: $3,檔案類型: $4, $5 {{PLURAL:$5|頁}}",
+       "previousdiff": "← 較舊編輯",
+       "nextdiff": "較新編輯 →",
+       "mediawarning": "<strong>警告</strong>:此檔案類型可能包含惡意代碼。\n若執行可能對您的系統造成損害。",
+       "imagemaxsize": "å\9c\96ç\89\87大å°\8fé\99\90å\88¶ï¼\9a<br /><em>(ç\94¨æ\96¼æª\94æ¡\88æ\8f\8fè¿°é \81é\9d¢)</em>",
+       "thumbsize": "縮圖大小:",
+       "widthheightpage": "$1 × $2,$3 頁",
+       "file-info": "檔案大小:$1,MIME 類型:$2",
+       "file-info-size": "$1 × $2 像素,檔案大小:$3,MIME 類型:$4",
+       "file-info-size-pages": "$1 × $2 像素,檔案大小:$3,MIME 類型:$4,$5 {{PLURAL:$5|頁}}",
        "file-nohires": "無更高解像度可提供。",
        "svg-long-desc": "SVG 檔案,表面大小:$1 × $2 像素,檔案大小:$3",
        "svg-long-desc-animated": "SVG 動畫檔案,表面大小:$1 × $2 像素,檔案大小:$3",
-       "svg-long-error": "無效的SVG檔案:$1",
+       "svg-long-error": "無效的 SVG 檔案:$1",
        "show-big-image": "原始檔案",
-       "show-big-image-preview": "此預覽的大小:$1.",
+       "show-big-image-preview": "預覽大小:$1。",
        "show-big-image-other": "其他{{PLURAL:$2||}}解析度:$1。",
        "show-big-image-size": "$1 × $2 像素",
        "file-info-gif-looped": "循環",
-       "file-info-gif-frames": "$1",
+       "file-info-gif-frames": "$1 畫格",
        "file-info-png-looped": "循環",
-       "file-info-png-repeat": "已播放$1次",
-       "file-info-png-frames": "$1",
-       "file-no-thumb-animation": "'''注意: 由於技術限制,不能播放此檔案縮圖的動畫。'''",
-       "file-no-thumb-animation-gif": "'''注意: 由於技術限制,不能播放此高解析度GIF圖像縮圖的動畫。'''",
-       "newimages": "æ\96°å»ºå\9c\96ç\89\87ç\95«å»\8a",
+       "file-info-png-repeat": "已播放 $1 次",
+       "file-info-png-frames": "$1 畫格",
+       "file-no-thumb-animation": "<strong>注意:由於技術限制,此檔案縮圖無動畫效果。</strong>",
+       "file-no-thumb-animation-gif": "<strong>注意:由於技術限制,此類型高解析度 GIF 圖片無動畫效果。</strong>",
+       "newimages": "æ\9c\80æ\96°æª\94æ¡\88å\9c\96庫",
        "imagelisttext": "以下是按$2排列的'''$1'''個檔案列表。",
-       "newimages-summary": "這個特殊頁面中顯示最後已上傳的檔案。",
+       "newimages-summary": "此特殊頁面中顯示最新上傳的檔案。",
        "newimages-legend": "搜尋",
-       "newimages-label": "檔案名稱(或它的一部份):",
-       "showhidebots": "(機器人$1)",
+       "newimages-label": "檔案名稱 (或部份):",
+       "newimages-showbots": "顯示機械人上載",
        "noimages": "無可檢視圖片。",
        "ilsubmit": "搜尋",
        "bydate": "按日期",
        "sp-newimages-showfrom": "從$1 $2開始顯示新檔案",
-       "seconds": "$1秒",
-       "minutes": "$1分鍾",
-       "hours": "$1小時",
-       "days": "$1天",
-       "weeks": "{{PLURAL:$1|$1}}",
-       "months": "{{PLURAL:$1|$1個月}}",
-       "years": "{{PLURAL:$1|$1年}}",
-       "ago": "$1前",
+       "seconds": "$1 秒",
+       "minutes": "$1 分鍾",
+       "hours": "$1 小時",
+       "days": "$1 天",
+       "weeks": "{{PLURAL:$1|$1 週}}",
+       "months": "{{PLURAL:$1|$1 個月}}",
+       "years": "{{PLURAL:$1|$1 年}}",
+       "ago": "$1 前",
        "just-now": "剛才",
-       "hours-ago": "$1小時前",
-       "minutes-ago": "$1分鐘前",
-       "seconds-ago": "$1秒前",
-       "monday-at": "於星期一$1",
-       "tuesday-at": "於星期二$1",
-       "wednesday-at": "於星期三$1",
-       "thursday-at": "於星期四$1",
-       "friday-at": "於星期五$1",
-       "saturday-at": "於星期六$1",
-       "sunday-at": "於星期日$1",
-       "yesterday-at": "昨天$1",
+       "hours-ago": "$1 小時前",
+       "minutes-ago": "$1 分鐘前",
+       "seconds-ago": "$1 秒前",
+       "monday-at": "於星期一 $1",
+       "tuesday-at": "於星期二 $1",
+       "wednesday-at": "於星期三 $1",
+       "thursday-at": "於星期四 $1",
+       "friday-at": "於星期五 $1",
+       "saturday-at": "於星期六 $1",
+       "sunday-at": "於星期日 $1",
+       "yesterday-at": "昨天 $1",
        "bad_image_list": "請按照下列格式編寫:\n\n只有(以 * 開頭)列出的項目會被考慮。\n每一行的第一個連結必須是損毀檔案的連結。\n然後同一行後方的連結會被視為例外,即是該檔案可以在哪些頁面內被顯示。",
        "variantname-zh-hans": "‪中文(简体)",
        "variantname-zh-hant": "‪繁體中文",
        "variantname-zh": "不轉換",
        "variantname-gan-hans": "‪中文(简体)",
        "variantname-gan-hant": "‪中文(繁體)",
-       "metadata": "元數據",
+       "metadata": "資料定義",
        "metadata-help": "此檔案包含額外的資訊,可能由數位相機或掃描機所建立的。\n若修改此檔案,部份資訊將無法保留。",
        "metadata-expand": "顯示詳細資料",
        "metadata-collapse": "隱藏詳細資料",
        "exif-serialnumber": "相機的序號",
        "exif-cameraownername": "相機持有人",
        "exif-label": "標籤",
-       "exif-datetimemetadata": "元數據最後修改日期",
+       "exif-datetimemetadata": "資料定義最後修改日期",
        "exif-nickname": "非正式圖片名",
        "exif-rating": "評分(最高5分)",
        "exif-rightscertificate": "權利管理證書",
        "comma-separator": "、",
        "colon-separator": ":",
        "word-separator": "",
-       "parentheses": "($1)",
+       "parentheses": " ($1)",
        "quotation-marks": "「$1」",
        "imgmultipageprev": "← 上一頁",
        "imgmultipagenext": "下一頁 →",
        "table_pager_first": "第一頁",
        "table_pager_last": "最末頁",
        "table_pager_limit": "每頁顯示 $1 筆記錄",
-       "table_pager_limit_label": "每頁項目數︰",
+       "table_pager_limit_label": "每頁數︰",
        "table_pager_limit_submit": "送出",
        "table_pager_empty": "沒有結果",
        "autosumm-blank": "清空頁面",
        "watchlistedit-raw-done": "您的監視列表已經更新。",
        "watchlistedit-raw-added": "已經加入了$1個標題:",
        "watchlistedit-raw-removed": "已經移除了$1個標題:",
+       "watchlistedit-clear-title": "已清除監視列表",
+       "watchlistedit-clear-legend": "清除監視列表",
+       "watchlistedit-clear-explain": "所有標題將會從你的監視列表中刪除",
+       "watchlistedit-clear-titles": "標題:",
+       "watchlistedit-clear-submit": "清除監視列表(這是永久!)",
+       "watchlistedit-clear-done": "您的監視列表已經清除。",
+       "watchlistedit-clear-removed": "已經移除了$1個標題:",
+       "watchlistedit-too-many": "有太多的頁面要在此處顯示。",
+       "watchlisttools-clear": "清除監視列表",
        "watchlisttools-view": "檢視相關更改",
        "watchlisttools-edit": "檢視並編輯監視列表",
        "watchlisttools-raw": "編輯原始監視列表",
        "unknown_extension_tag": "不明的擴展標籤「$1」",
        "duplicate-defaultsort": "警告: 預設的排序鍵「$2」覆蓋先前的預設排序鍵「$1」。",
        "version": "版本",
-       "version-extensions": "已經安裝的擴展",
+       "version-extensions": "已安裝的擴充套件",
        "version-specialpages": "特殊頁面",
-       "version-parserhooks": "èª\9eæ³\95é\88\8e",
+       "version-parserhooks": "èª\9eæ³\95é\80£çµ\90(Hook)",
        "version-variables": "變數",
-       "version-antispam": "垃圾防止",
+       "version-antispam": "垃圾訊息防止",
        "version-skins": "外觀",
        "version-other": "其他",
        "version-mediahandlers": "媒體處理器",
-       "version-hooks": "é\88\8e",
-       "version-parser-extensiontags": "èª\9eæ³\95æ\93´å±\95標籤",
-       "version-parser-function-hooks": "èª\9eæ³\95å\87½æ\95¸é\88\8e",
-       "version-hook-name": "é\88\8eå\90\8d",
-       "version-hook-subscribedby": "利用於",
+       "version-hooks": "é\80£çµ\90(Hooks)",
+       "version-parser-extensiontags": "èª\9eæ³\95æ\93´å\85\85標籤",
+       "version-parser-function-hooks": "èª\9eæ³\95å\87½æ\95¸é\80£çµ\90",
+       "version-hook-name": "é\80£çµ\90å\90\8d稱",
+       "version-hook-subscribedby": "署名",
        "version-version": "(版本 $1)",
-       "version-license": "MediaWiki許可證",
-       "version-ext-license": "授權",
-       "version-ext-colheader-name": "æ\93´å±\95",
+       "version-license": "MediaWiki 授權條款",
+       "version-ext-license": "授權條款",
+       "version-ext-colheader-name": "æ\93´å\85\85å¥\97件",
        "version-ext-colheader-version": "版本",
-       "version-ext-colheader-license": "許可證",
+       "version-ext-colheader-license": "授權條款",
        "version-ext-colheader-description": "說明",
        "version-ext-colheader-credits": "作者",
-       "version-license-title": "用於$1之許可證",
-       "version-license-not-found": "並無與此拓展相關之許可證資訊。",
-       "version-credits-title": "用於$1之信用",
-       "version-credits-not-found": "並無與此拓展相關之信用資訊。",
-       "version-poweredby-credits": "此維基由'''[https://www.mediawiki.org/ MediaWiki]'''驅動,版權所有 © 2001-$1 $2。",
+       "version-license-title": "$1 的授權條款",
+       "version-license-not-found": "查無此擴充套件的詳細授權條款資訊。",
+       "version-credits-title": "$1 的製作群",
+       "version-credits-not-found": "查無此擴充套件的詳細製作群資訊。",
+       "version-poweredby-credits": "此 Wiki 由 <strong>[https://www.mediawiki.org/ MediaWiki]</strong> 開發,版權所有 © 2001-$1 $2。",
        "version-poweredby-others": "其他",
-       "version-poweredby-translators": "translatewiki.net 上的翻譯者",
-       "version-credits-summary": "我們感謝以下人士為[[Special:Version|MediaWiki]]作出的貢獻。",
-       "version-license-info": "MediaWiki為自由軟件;您可依據自由軟件基金會所發表的GNU通用公共授權條款規定,就本程式再為發佈與/或修改;無論您依據的是本授權的第二版或(您自行選擇的)任一日後發行的版本。\n\nMediaWiki是基於使用目的而加以發佈,然而不負任何擔保責任;亦無對適售性或特定目的適用性所為的默示性擔保。詳情請參照GNU通用公共授權。\n\n您應已收到附隨於本程式的[{{SERVER}}{{SCRIPTPATH}}/COPYING GNU通用公共授權的副本];如果沒有,請寫信至自由軟件基金會:51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA,或[//www.gnu.org/licenses/old-licenses/gpl-2.0.html 線上閱讀]。",
-       "version-software": "已經安裝的軟",
+       "version-poweredby-translators": " translatewiki.net 翻譯人員",
+       "version-credits-summary": "我們感謝以下人士為 [[Special:Version|MediaWiki]] 作出的貢獻。",
+       "version-license-info": "MediaWiki 為自由軟體;您可依據自由軟體基金會所發表的 GNU 通用公共授權條款規定,將本程式重新發佈與/或修改;無論您依據的是本授權條款的第二版或 (您可自行選擇) 之後的任何版本。\n\n本程式發佈的目的是希望可以提供幫助,但不負任何擔保責任;亦無隱含對適售性或 特定用途的適用性的情形擔保。詳情請參照 GNU 通用公共授權。\n\n您應已隨本程式收到 [{{SERVER}}{{SCRIPTPATH}}/COPYING GNU 通用公共授權條款的副本];如果沒有,請信件通知自由軟體基金會,51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA,或 [//www.gnu.org/licenses/old-licenses/gpl-2.0.html 線上閱讀]。",
+       "version-software": "已經安裝的軟",
        "version-software-product": "產品",
        "version-software-version": "版本",
-       "version-entrypoints": "入口URL",
-       "version-entrypoints-header-entrypoint": "入口",
+       "version-entrypoints": "入口 URL",
+       "version-entrypoints-header-entrypoint": "入口",
        "version-entrypoints-header-url": "URL",
        "version-entrypoints-articlepath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgArticlePath 條目路徑]",
        "redirect": "依檔案、使用者、頁面或修訂 ID 重新導向",
        "redirect-lookup": "尋找:",
        "redirect-value": "值:",
        "redirect-user": "使用者 ID",
-       "redirect-page": "頁面ID",
-       "redirect-revision": "頁面修訂ID",
+       "redirect-page": "頁面 ID",
+       "redirect-revision": "頁面修訂 ID",
        "redirect-file": "檔案名稱",
        "redirect-not-exists": "找不到",
-       "fileduplicatesearch": "選擇重覆檔案",
-       "fileduplicatesearch-summary": "用重覆檔案的切細值去找出檔案是否重覆。",
-       "fileduplicatesearch-legend": "æ\89¾重覆",
+       "fileduplicatesearch": "搜尋重覆檔案",
+       "fileduplicatesearch-summary": "依據雜湊值(Hash)來搜尋重複的檔案。",
+       "fileduplicatesearch-legend": "æ\90\9cå°\8b重覆",
        "fileduplicatesearch-filename": "檔案名稱:",
        "fileduplicatesearch-submit": "搜尋",
        "fileduplicatesearch-info": "$1 × $2 像素<br />檔案大小:$3<br />MIME 類型:$4",
-       "fileduplicatesearch-result-1": "檔案「$1」無完全相同的重覆。",
-       "fileduplicatesearch-result-n": "檔案「$1」有$2項完全相同的重覆。",
-       "fileduplicatesearch-noresults": "æ²\92æ\9c\89ç\99¼ç\8f¾å\90\8dç\82ºã\80\8c$1ã\80\8dç\9a\84æ\96\87件。",
+       "fileduplicatesearch-result-1": "檔案 $1 無重覆的檔案。",
+       "fileduplicatesearch-result-n": "檔案 $1 有 $2 筆重覆的檔案。",
+       "fileduplicatesearch-noresults": "æ\9f¥ç\84¡å\90\8d稱ç\82º \"$1\" ç\9a\84æª\94æ¡\88。",
        "specialpages": "特殊頁面",
-       "specialpages-note-top": "圖例",
-       "specialpages-note": "* 標準特殊頁面。\n* <span class=\"mw-specialpagerestricted\">用於重新整理的特殊頁面(可能過時)。</span>",
-       "specialpages-group-maintenance": "維護報",
+       "specialpages-note-top": "說明",
+       "specialpages-note": "* 一般特殊頁面。\n* <span class=\"mw-specialpagerestricted\">受限制的特殊頁面。</span>",
+       "specialpages-group-maintenance": "維護報",
        "specialpages-group-other": "其它特殊頁面",
        "specialpages-group-login": "登入/建立新帳號",
        "specialpages-group-changes": "最近變更與日誌",
-       "specialpages-group-media": "媒體報告和上傳",
+       "specialpages-group-media": "媒體上傳與報表",
        "specialpages-group-users": "使用者與權限",
        "specialpages-group-highuse": "常用頁面",
        "specialpages-group-pages": "頁面清單",
        "specialpages-group-pagetools": "頁面工具",
        "specialpages-group-wiki": "資料和工具",
-       "specialpages-group-redirects": "重新導向特殊頁面",
-       "specialpages-group-spam": "反垃圾工具",
+       "specialpages-group-redirects": "重新導向相關特殊頁面",
+       "specialpages-group-spam": "反垃圾訊息工具",
        "blankpage": "空白頁面",
-       "intentionallyblankpage": "這個頁面是為空白",
+       "intentionallyblankpage": "此頁面被故意設為空白。",
        "external_image_whitelist": " #留下這行一樣的文字<pre>\n#在下面(//之中間部份)輸入正規表達式\n#這些將會跟外部(已超連結的)圖片配合\n#那些配合到出來的會顯示成圖片,否則就只會顯示成連結\n#有 # 開頭的行會當成註解\n#大小寫並無區分\n\n#在這行上面輸入所有的regex。留下這行一樣的文字</pre>",
-       "tags": "有效標籤",
-       "tag-filter": "[[Special:Tags|標籤]]過濾器:",
+       "tags": "有效變更標籤",
+       "tag-filter": "[[Special:Tags|標籤]]搜尋:",
        "tag-filter-submit": "搜尋",
        "tag-list-wrapper": "([[Special:Tags|標籤]]:$2)",
        "tags-title": "標籤",
        "tags-intro": "這個頁面列示出在軟件中已標示的編輯,以及它們的解釋。",
        "tags-tag": "標籤名稱",
        "tags-display-header": "在更改清單中的出現方式",
-       "tags-description-header": "解釋完整描述",
+       "tags-description-header": "完整含意說明",
        "tags-active-header": "存檔?",
        "tags-hitcount-header": "已加上標籤的更改",
        "tags-active-yes": "是",
        "tags-active-no": "否",
        "tags-edit": "編輯",
-       "tags-hitcount": "$1次更改",
+       "tags-hitcount": "$1 次變更",
        "comparepages": "比較頁面",
-       "compare-page1": "第1頁",
-       "compare-page2": "第2頁",
-       "compare-rev1": "修訂版本1",
-       "compare-rev2": "修訂版本2",
+       "compare-page1": "第 1 頁",
+       "compare-page2": "第 2 頁",
+       "compare-rev1": "修訂 1",
+       "compare-rev2": "修訂 2",
        "compare-submit": "比較",
        "compare-invalid-title": "所指定標題無效。",
        "compare-title-not-exists": "所指定的話題不存在。",
        "htmlform-int-toohigh": "您所指定的值高於最大值$1",
        "htmlform-required": "此值是必填項",
        "htmlform-submit": "提交",
-       "htmlform-reset": "撤銷更改",
+       "htmlform-reset": "還原更改",
        "htmlform-selectorother-other": "其他",
        "htmlform-no": "否",
        "htmlform-yes": "是",
        "api-error-unknownerror": "未知錯誤:$1。",
        "api-error-uploaddisabled": "本wiki的上傳檔案功能已停用。",
        "api-error-verification-error": "本檔案可能已損壞,或副檔名錯誤。",
-       "duration-seconds": "$1秒",
-       "duration-minutes": "$1",
-       "duration-hours": "$1小時",
-       "duration-days": "$1天",
-       "duration-weeks": "$1週",
-       "duration-years": "$1年",
-       "duration-decades": "$1十年",
-       "duration-centuries": "$1世紀",
-       "duration-millennia": "$1千年",
+       "duration-seconds": "$1 秒",
+       "duration-minutes": "$1 分鐘",
+       "duration-hours": "$1 小時",
+       "duration-days": "$1 天",
+       "duration-weeks": "$1 週",
+       "duration-years": "$1 年",
+       "duration-decades": "$1{{PLURAL:$1|0 年|0 年}}",
+       "duration-centuries": "$1 世紀",
+       "duration-millennia": "$1 千年",
        "rotate-comment": "順時針旋轉圖像$1{{PLURAL:$1|度}}",
        "limitreport-title": "分析器分析資料:",
-       "limitreport-cputime": "CPU使用時間",
-       "limitreport-cputime-value": "$1秒",
+       "limitreport-cputime": "CPU 使用時間",
+       "limitreport-cputime-value": "$1 秒",
        "limitreport-walltime": "實際使用時間",
-       "limitreport-walltime-value": "$1秒",
-       "limitreport-ppvisitednodes": "預處理器訪問節點數",
-       "limitreport-ppgeneratednodes": "é \90è\99\95ç\90\86å\99¨ç\94\9fæ\88\90ç¯\80é»\9eè¨\88數",
-       "limitreport-postexpandincludesize": "展開後大小",
+       "limitreport-walltime-value": "$1 秒",
+       "limitreport-ppvisitednodes": "預處理器訪問節點數",
+       "limitreport-ppgeneratednodes": "é \90è\99\95ç\90\86å\99¨ç\94¢ç\94\9fç¯\80é»\9e次數",
+       "limitreport-postexpandincludesize": "展開後的引用大小",
        "limitreport-postexpandincludesize-value": "$1/$2 個{{PLURAL:$2|位元組}}",
        "limitreport-templateargumentsize": "樣版參數大小",
        "limitreport-templateargumentsize-value": "$1/$2 個{{PLURAL:$2|位元組}}",
        "limitreport-expansiondepth": "最高展開深度",
-       "limitreport-expensivefunctioncount": "高開銷分析函數數位",
+       "limitreport-expensivefunctioncount": "高分析函數次數",
        "expandtemplates": "展開樣版",
        "expand_templates_intro": "本特殊頁面會將文字中的樣版展開,可以包含支援的分析程式語法,如 <code><nowiki>{{</nowiki>#language:…}}</code> 與變數如 <code><nowiki>{{</nowiki>CURRENTDAY}}</code>。\n實際上,絕大部分在雙括號中的內容都會被展開。",
        "expand_templates_title": "上下文標題,用於 {{FULLPAGENAME}} 等:",
        "expand_templates_input": "輸入文字:",
        "expand_templates_output": "結果:",
-       "expand_templates_xml_output": "XML輸出",
-       "expand_templates_html_output": "原始HTML輸出",
+       "expand_templates_xml_output": "XML 輸出",
+       "expand_templates_html_output": "原始 HTML 輸出",
        "expand_templates_ok": "確定",
        "expand_templates_remove_comments": "移除評論",
        "expand_templates_remove_nowiki": "在結果中禁止顯示 <nowiki> 標籤",
-       "expand_templates_generate_xml": "顯示XML語法樹",
-       "expand_templates_generate_rawhtml": "顯示原始HTML",
+       "expand_templates_generate_xml": "顯示 XML 解析樹",
+       "expand_templates_generate_rawhtml": "顯示原始 HTML",
        "expand_templates_preview": "預覽"
 }
index 479030f..e316d9e 100644 (file)
@@ -731,7 +731,7 @@ abstract class Maintenance {
                        return;
                }
 
-               $screenWidth = 80; // TODO: Caculate this!
+               $screenWidth = 80; // TODO: Calculate this!
                $tab = "    ";
                $descWidth = $screenWidth - ( 2 * strlen( $tab ) );
 
diff --git a/maintenance/compareParserCache.php b/maintenance/compareParserCache.php
new file mode 100644 (file)
index 0000000..97fd3ff
--- /dev/null
@@ -0,0 +1,101 @@
+<?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
+ */
+
+require_once __DIR__ . '/Maintenance.php';
+
+/**
+ * @ingroup Maintenance
+ */
+class CompareParserCache extends Maintenance {
+       public function __construct() {
+               parent::__construct();
+               $this->mDescription = "Parse random pages and compare output to cache.";
+               $this->addOption( 'namespace', 'Page namespace number', true, true );
+               $this->addOption( 'maxpages', 'Number of pages to try', true, true );
+       }
+
+       public function execute() {
+               $pages = $this->getOption( 'maxpages' );
+
+               $dbr = $this->getDB( DB_SLAVE );
+
+               $totalsec = 0.0;
+               $scanned = 0;
+               $withcache = 0;
+               while ( $pages-- > 0 ) {
+                       $row = $dbr->selectRow( 'page', '*',
+                               array(
+                                       'page_namespace' => $this->getOption( 'namespace' ),
+                                       'page_is_redirect' => 0,
+                                       'page_random >= ' . wfRandom()
+                               ),
+                               __METHOD__,
+                               array(
+                                       'ORDER BY' => 'page_random',
+                               )
+                       );
+
+                       if ( !$row ) {
+                               continue;
+                       }
+                       ++$scanned;
+
+                       $title = Title::newFromRow( $row );
+                       $page = WikiPage::factory( $title );
+                       $revision = $page->getRevision();
+                       $content = $revision->getContent( Revision::RAW );
+
+                       $parserOptions = $page->makeParserOptions( 'canonical' );
+
+                       $parserOutputOld = ParserCache::singleton()->get( $page, $parserOptions );
+
+                       $t1 = microtime( true );
+                       $parserOutputNew = $content->getParserOutput(
+                               $title, $revision->getId(), $parserOptions, false );
+                       $sec = microtime( true ) - $t1;
+                       $totalsec += $sec;
+
+                       $this->output( "Parsed '{$title->getPrefixedText()}' in $sec seconds.\n" );
+
+                       if ( $parserOutputOld ) {
+                               $this->output( "Found cache entry found for '{$title->getPrefixedText()}'..." );
+                               $oldHtml = trim( preg_replace( '#<!-- .+-->#Us', '', $parserOutputOld->getText() ) );
+                               $newHtml = trim( preg_replace( '#<!-- .+-->#Us', '',$parserOutputNew->getText() ) );
+                               $diff = wfDiff( $oldHtml, $newHtml );
+                               if ( strlen( $diff ) ) {
+                                       $this->output( "differences found:\n\n$diff\n\n" );
+                               } else {
+                                       $this->output( "No differences found.\n" );
+                               }
+                               ++$withcache;
+                       } else {
+                               $this->output( "No parser cache entry found for '{$title->getPrefixedText()}'.\n" );
+                       }
+               }
+
+               $ave = $scanned ? $totalsec / $scanned : 0;
+               $this->output( "Checked $scanned pages; $withcache had prior cache entries.\n" );
+               $this->output( "Average parse time: $ave sec\n" );
+       }
+}
+
+$maintClass = "CompareParserCache";
+require_once RUN_MAINTENANCE_IF_MAIN;
index 7fe3bd9..83e731a 100644 (file)
@@ -36,17 +36,76 @@ class GenerateJsonI18n extends Maintenance {
        public function __construct() {
                parent::__construct();
                $this->mDescription = "Build JSON messages files from a PHP messages file";
-               $this->addArg( 'phpfile', 'PHP file defining a $messages array', true );
-               $this->addArg( 'jsondir', 'Directory to write JSON files to. ' .
-                       'Required unless <phpfile> exists and --shim-only is specified', false );
+
+               $this->addArg( 'phpfile', 'PHP file defining a $messages array', false );
+               $this->addArg( 'jsondir', 'Directory to write JSON files to', false );
                $this->addOption( 'langcode', 'Language code; only needed for converting core i18n files',
                        false, true );
+               $this->addOption( 'extension', 'Perform default conversion on an extension',
+                       false, true );
                $this->addOption( 'shim-only', 'Only create or update the backward-compatibility shim' );
+               $this->addOption( 'supplementary', 'Find supplementary i18n files in subdirs and convert those',
+                       false, false );
        }
 
        public function execute() {
+               global $IP;
+
                $phpfile = $this->getArg( 0 );
                $jsondir = $this->getArg( 1 );
+               $extension = $this->getOption( 'extension' );
+               $convertSupplementaryI18nFiles = $this->hasOption( 'supplementary' );
+
+               if ( $extension ) {
+                       if ( $phpfile ) {
+                               $this->error( "The phpfile is already specified, conflicts with --extension.\n", 1 );
+                       }
+                       $phpfile = "$IP/extensions/$extension/$extension.i18n.php";
+               }
+
+               if ( !$phpfile ) {
+                       $this->error( "I'm here for an argument!\n" );
+                       $this->maybeHelp( true );
+                       // dies.
+               }
+
+               if ( $convertSupplementaryI18nFiles ) {
+                       if ( is_readable( $phpfile ) ) {
+                               $this->transformI18nFile( $phpfile, $jsondir );
+                       } else {
+                               // This is non-fatal because we might want to continue searching for
+                               // i18n files in subdirs even if the extension does not include a
+                               // primary i18n.php.
+                               $this->error( "Warning: no primary i18n file was found." );
+                       }
+                       $this->output( "Searching for supplementary i18n files...\n" );
+                       $dir_iterator = new RecursiveDirectoryIterator( dirname( $phpfile ) );
+                       $iterator = new RecursiveIteratorIterator( $dir_iterator, RecursiveIteratorIterator::LEAVES_ONLY );
+                       foreach ( $iterator as $path => $fileObject ) {
+                               if ( fnmatch( "*.i18n.php", $fileObject->getFilename() ) ) {
+                                       $this->output( "Converting $path.\n" );
+                                       $this->transformI18nFile( $path );
+                               }
+                       }
+               } else {
+                       // Just convert the primary i18n file.
+                       $this->transformI18nFile( $phpfile, $jsondir );
+               }
+       }
+
+       public function transformI18nFile( $phpfile, $jsondir = null ) {
+               if ( !$jsondir ) {
+                       // Assume the json directory should be in the same directory as the
+                       // .i18n.php file.
+                       $jsondir = dirname( $phpfile ) . "/i18n";
+               }
+               if ( !is_dir( $jsondir ) ) {
+                       $this->output( "Creating directory $jsondir.\n" );
+                       $success = mkdir( $jsondir );
+                       if ( !$success ) {
+                               $this->error( "Could not create directory $jsondir\n", 1 );
+                       }
+               }
 
                if ( $this->hasOption( 'shim-only' ) ) {
                        $this->shimOnly( $phpfile, $jsondir );
index 20d6ad5..5a3e00c 100644 (file)
@@ -29,11 +29,14 @@ if ( !function_exists( 'version_compare' ) || ( version_compare( phpversion(), '
 define( 'MW_CONFIG_CALLBACK', 'Installer::overrideConfig' );
 define( 'MEDIAWIKI_INSTALL', true );
 
-require_once dirname( __DIR__ ) . "/maintenance/Maintenance.php";
+require_once dirname( __DIR__ ) . '/maintenance/Maintenance.php';
 
 /**
  * Maintenance script to install and configure MediaWiki
  *
+ * Default values for the options are defined in DefaultSettings.php (see the mapping in CliInstaller.php)
+ * Default for --dbpath (SQLite-specific) is defined in SqliteInstaller::getGlobalDefaults
+ *
  * @ingroup Maintenance
  */
 class CommandLineInstaller extends Maintenance {
@@ -41,9 +44,12 @@ class CommandLineInstaller extends Maintenance {
                parent::__construct();
                global $IP;
 
-               $this->addArg( 'name', 'The name of the wiki', true );
+               $this->addDescription( "CLI-based MediaWiki installation and configuration.\n" .
+                       "Defaut options are indicated in parenthesis." );
+
+               $this->addArg( 'name', 'The name of the wiki (MediaWiki)', false );
 
-               $this->addArg( 'admin', 'The username of the wiki administrator (WikiSysop)', true );
+               $this->addArg( 'admin', 'The username of the wiki administrator.' );
                $this->addOption( 'pass', 'The password for the wiki administrator.', false, true );
                $this->addOption(
                        'passfile',
@@ -66,22 +72,22 @@ class CommandLineInstaller extends Maintenance {
                $this->addOption( 'dbserver', 'The database host (localhost)', false, true );
                $this->addOption( 'dbport', 'The database port; only for PostgreSQL (5432)', false, true );
                $this->addOption( 'dbname', 'The database name (my_wiki)', false, true );
-               $this->addOption( 'dbpath', 'The path for the SQLite DB (/var/data)', false, true );
+               $this->addOption( 'dbpath', 'The path for the SQLite DB ($IP/data)', false, true );
                $this->addOption( 'dbprefix', 'Optional database table name prefix', false, true );
                $this->addOption( 'installdbuser', 'The user to use for installing (root)', false, true );
-               $this->addOption( 'installdbpass', 'The pasword for the DB user to install as.', false, true );
+               $this->addOption( 'installdbpass', 'The password for the DB user to install as.', false, true );
                $this->addOption( 'dbuser', 'The user to use for normal operations (wikiuser)', false, true );
-               $this->addOption( 'dbpass', 'The pasword for the DB user for normal operations', false, true );
+               $this->addOption( 'dbpass', 'The password for the DB user for normal operations', false, true );
                $this->addOption(
                        'dbpassfile',
                        'An alternative way to provide dbpass option, as the contents of this file',
                        false,
                        true
                );
-               $this->addOption( 'confpath', "Path to write LocalSettings.php to, default $IP", false, true );
+               $this->addOption( 'confpath', "Path to write LocalSettings.php to ($IP)", false, true );
                /*
                $this->addOption( 'dbschema', 'The schema for the MediaWiki DB in pg (mediawiki)', false, true );
-               $this->addOption( 'namespace', 'The project namespace (same as the name)', false, true );
+               $this->addOption( 'namespace', 'The project namespace (same as the "name" argument)', false, true );
                */
                $this->addOption( 'env-checks', "Run environment checks only, don't change anything" );
        }
@@ -89,18 +95,17 @@ class CommandLineInstaller extends Maintenance {
        function execute() {
                global $IP;
 
-               // Will not be set if used with --env-checks
-               $siteName = isset( $this->mArgs[0] ) ? $this->mArgs[0] : "Don't care";
-               $adminName = isset( $this->mArgs[1] ) ? $this->mArgs[1] : null;
+               $siteName = $this->getArg( 0, 'MediaWiki' ); // Will not be set if used with --env-checks
+               $adminName = $this->getArg( 1 );
 
-               $dbpassfile = $this->getOption( 'dbpassfile', false );
-               if ( $dbpassfile !== false ) {
-                       if ( $this->getOption( 'dbpass', false ) !== false ) {
-                               $this->error( 'WARNING: You provide the options "dbpass" and "dbpassfile". '
-                                       . 'The content of "dbpassfile" overwrites "dbpass".' );
+               $dbpassfile = $this->getOption( 'dbpassfile' );
+               if ( $dbpassfile !== null ) {
+                       if ( $this->getOption( 'dbpass' ) !== null ) {
+                               $this->error( 'WARNING: You have provided the options "dbpass" and "dbpassfile". '
+                                       . 'The content of "dbpassfile" overrides "dbpass".' );
                        }
                        wfSuppressWarnings();
-                       $dbpass = file_get_contents( $dbpassfile );
+                       $dbpass = file_get_contents( $dbpassfile ); // returns false on failure
                        wfRestoreWarnings();
                        if ( $dbpass === false ) {
                                $this->error( "Couldn't open $dbpassfile", true );
@@ -108,25 +113,24 @@ class CommandLineInstaller extends Maintenance {
                        $this->mOptions['dbpass'] = trim( $dbpass, "\r\n" );
                }
 
-               $passfile = $this->getOption( 'passfile', false );
-               if ( $passfile !== false ) {
-                       if ( $this->getOption( 'pass', false ) !== false ) {
-                               $this->error( 'WARNING: You provide the options "pass" and "passfile". '
-                                       . 'The content of "passfile" overwrites "pass".' );
+               $passfile = $this->getOption( 'passfile' );
+               if ( $passfile !== null ) {
+                       if ( $this->getOption( 'pass' ) !== null ) {
+                               $this->error( 'WARNING: You have provided the options "pass" and "passfile". '
+                                       . 'The content of "passfile" overrides "pass".' );
                        }
                        wfSuppressWarnings();
-                       $pass = file_get_contents( $passfile );
+                       $pass = file_get_contents( $passfile ); // returns false on failure
                        wfRestoreWarnings();
                        if ( $pass === false ) {
                                $this->error( "Couldn't open $passfile", true );
                        }
-                       $this->mOptions['pass'] = str_replace( array( "\n", "\r" ), "", $pass );
-               } elseif ( $this->getOption( 'pass', false ) === false ) {
+                       $this->mOptions['pass'] = trim( $pass, "\r\n" );
+               } elseif ( $this->getOption( 'pass' ) === null ) {
                        $this->error( 'You need to provide the option "pass" or "passfile"', true );
                }
 
-               $installer =
-                       InstallerOverrides::getCliInstaller( $siteName, $adminName, $this->mOptions );
+               $installer = InstallerOverrides::getCliInstaller( $siteName, $adminName, $this->mOptions );
 
                $status = $installer->doEnvironmentChecks();
                if ( $status->isGood() ) {
@@ -149,6 +153,6 @@ class CommandLineInstaller extends Maintenance {
        }
 }
 
-$maintClass = "CommandLineInstaller";
+$maintClass = 'CommandLineInstaller';
 
 require_once RUN_MAINTENANCE_IF_MAIN;
index 69b04ce..d6163bd 100644 (file)
@@ -25,7 +25,8 @@
                                        "mw.Notification_",
                                        "mw.user",
                                        "mw.util",
-                                       "mw.plugin.*"
+                                       "mw.plugin.*",
+                                       "mw.cookie"
                                ]
                        },
                        {
index 6e5b29d..9c9b7ff 100644 (file)
@@ -61,17 +61,10 @@ class Languages {
        /**
         * Load the list of languages: all the Messages*.php
         * files in the languages directory.
-        *
-        * @param bool $exif Treat the Exif messages?
         */
-       function __construct( $exif = true ) {
-               require __DIR__ . '/messageTypes.inc';
-               $this->mIgnoredMessages = $wgIgnoredMessages;
-               if ( $exif ) {
-                       $this->mOptionalMessages = array_merge( $wgOptionalMessages );
-               } else {
-                       $this->mOptionalMessages = array_merge( $wgOptionalMessages, $wgEXIFMessages );
-               }
+       function __construct() {
+               wfRunHooks( 'LocalisationIgnoredOptionalMessages',
+                       array( &$this->mIgnoredMessages, &$this->mOptionalMessages ) );
 
                $this->mLanguages = array_keys( Language::fetchLanguageNames( null, 'mwfile' ) );
                sort( $this->mLanguages );
diff --git a/maintenance/language/messageTypes.inc b/maintenance/language/messageTypes.inc
deleted file mode 100644 (file)
index 9f73c80..0000000
+++ /dev/null
@@ -1,877 +0,0 @@
-<?php
-/**
- * Several types of messages.
- *
- * 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 MaintenanceLanguage
- */
-
-/** Ignored messages, which should exist only in the English messages file. */
-$wgIgnoredMessages = array(
-       'sidebar',
-       'accesskey-pt-userpage',
-       'accesskey-pt-anonuserpage',
-       'accesskey-pt-mytalk',
-       'accesskey-pt-anontalk',
-       'accesskey-pt-preferences',
-       'accesskey-pt-watchlist',
-       'accesskey-pt-mycontris',
-       'accesskey-pt-login',
-       'accesskey-pt-logout',
-       'accesskey-ca-talk',
-       'accesskey-ca-edit',
-       'accesskey-ca-addsection',
-       'accesskey-ca-viewsource',
-       'accesskey-ca-history',
-       'accesskey-ca-protect',
-       'accesskey-ca-unprotect',
-       'accesskey-ca-delete',
-       'accesskey-ca-undelete',
-       'accesskey-ca-move',
-       'accesskey-ca-watch',
-       'accesskey-ca-unwatch',
-       'accesskey-search',
-       'accesskey-search-go',
-       'accesskey-search-fulltext',
-       'accesskey-p-logo',
-       'accesskey-n-mainpage',
-       'accesskey-n-mainpage-description',
-       'accesskey-n-portal',
-       'accesskey-n-currentevents',
-       'accesskey-n-recentchanges',
-       'accesskey-n-randompage',
-       'accesskey-n-help',
-       'accesskey-t-whatlinkshere',
-       'accesskey-t-recentchangeslinked',
-       'accesskey-feed-rss',
-       'accesskey-feed-atom',
-       'accesskey-t-contributions',
-       'accesskey-t-emailuser',
-       'accesskey-t-permalink',
-       'accesskey-t-print',
-       'accesskey-t-upload',
-       'accesskey-t-specialpages',
-       'accesskey-ca-nstab-main',
-       'accesskey-ca-nstab-user',
-       'accesskey-ca-nstab-media',
-       'accesskey-ca-nstab-special',
-       'accesskey-ca-nstab-project',
-       'accesskey-ca-nstab-image',
-       'accesskey-ca-nstab-mediawiki',
-       'accesskey-ca-nstab-template',
-       'accesskey-ca-nstab-help',
-       'accesskey-ca-nstab-category',
-       'accesskey-minoredit',
-       'accesskey-save',
-       'accesskey-preview',
-       'accesskey-diff',
-       'accesskey-compareselectedversions',
-       'accesskey-watch',
-       'accesskey-upload',
-       'accesskey-preferences-save',
-       'accesskey-summary',
-       'accesskey-userrights-set',
-       'accesskey-blockip-block',
-       'accesskey-export',
-       'accesskey-import',
-       'accesskey-watchlistedit-normal-submit',
-       'accesskey-watchlistedit-raw-submit',
-       'addsection',
-       'talkpageheader',
-       'anonnotice',
-       'autoblock_whitelist',
-       'searchmenu-new-nocreate',
-       'googlesearch',
-       'opensearch-desc',
-       'exif-make-value',
-       'exif-model-value',
-       'exif-software-value',
-       'exif-software-version-value',
-       'history_copyright',
-       'licenses',
-       'loginstart',
-       'loginend-https',
-       'loginend',
-       'loginlanguagelinks',
-       'pear-mail-error',
-       'php-mail-error',
-       'markaspatrolledlink',
-       'newarticletextanon',
-       'newsectionheaderdefaultlevel',
-       'mainpage-nstab',
-       'newtalkseparator',
-       'noarticletextanon',
-       'number_of_watching_users_RCview',
-       'pagecategorieslink',
-       'pubmedurl',
-       'randompage-url',
-       'recentchanges-url',
-       'recentchangestext',
-       'revision-info-current',
-       'createaccount-hook-aborted',
-       'revision-nav',
-       'rfcurl',
-       'shareddescriptionfollows',
-       'signature-anon',
-       'signupstart',
-       'signupend',
-       'signupend-https',
-       'emailsender',
-       'sitenotice',
-       'sitesubtitle',
-       'sitetitle',
-       'sp-contributions-footer',
-       'sp-contributions-footer-anon',
-       'sp-contributions-footer-newbies',
-       'statistics-summary',
-       'statistics-footer',
-       'talkpagetext',
-       'uploadfooter',
-       'upload-default-description',
-       'listgrouprights-link',
-       'search-interwiki-custom',
-       'allpages-summary',
-       'booksources-summary',
-       'categories-summary',
-       'blocklist-summary',
-       'listusers-summary',
-       'longpages-summary',
-       'preferences-summary',
-       'specialpages-summary',
-       'whatlinkshere-summary',
-       'listredirects-summary',
-       'uncategorizedpages-summary',
-       'uncategorizedcategories-summary',
-       'uncategorizedimages-summary',
-       'uncategorizedtemplates-summary',
-       'popularpages-summary',
-       'wantedcategories-summary',
-       'wantedfiles-summary',
-       'wantedpages-summary',
-       'watchlist-summary',
-       'mostlinked-summary',
-       'mostlinkedcategories-summary',
-       'mostlinkedtemplates-summary',
-       'mostcategories-summary',
-       'mostimages-summary',
-       'mostinterwikis-summary',
-       'mostrevisions-summary',
-       'prefixindex-summary',
-       'shortpages-summary',
-       'newpages-summary',
-       'ancientpages-summary',
-       'unwatchedpages-summary',
-       'userrights-summary',
-       'brokenredirects-summary',
-       'deadendpages-summary',
-       'protectedpages-unknown-reason',
-       'disambiguations-summary',
-       'pageswithprop-summary',
-       'doubleredirects-summary',
-       'lonelypages-summary',
-       'unusedtemplates-summary',
-       'fewestrevisions-summary',
-       'upload-summary',
-       'wantedtemplates-summary',
-       'activeusers-summary',
-       'search-summary',
-       'editpage-head-copy-warn',
-       'editpage-tos-summary',
-       'addsection-preload',
-       'addsection-editintro',
-       'longpage-hint',
-       'javascripttest-backlink',
-       'javascripttest-qunit-name',
-       'revdelete-logentry',
-       'logdelete-logentry',
-       'revdelete-content',
-       'revdelete-summary',
-       'revdelete-uname',
-       'revdelete-hid',
-       'revdelete-unhid',
-       'revdelete-log-message',
-       'logdelete-log-message',
-       'deletedarticle',
-       'suppressedarticle',
-       'undeletedarticle',
-       'patrol-log-line',
-       'patrol-log-auto',
-       'patrol-log-diff',
-       '1movedto2',
-       '1movedto2_redir',
-       'move-redirect-suppressed',
-       'newuserlog-create-entry',
-       'newuserlog-create2-entry',
-       'newuserlog-autocreate-entry',
-       'rightslogentry',
-       'rightslogentry-autopromote',
-       'suppressedarticle',
-       'deletedarticle',
-       // 'uploadedimage',
-       // 'overwroteimage',
-       'createacct-helpusername',
-       'createacct-imgcaptcha-help',
-       'userlogout-summary',
-       'changeemail-summary',
-       'changepassword-summary',
-       'unusedcategories-summary',
-       'unusedimages-summary',
-       'deletedcontributions-summary',
-       'linksearch-summary',
-       'emailuser-summary',
-       'undelete-summary',
-       'contributions-summary',
-       'unblock-summary',
-       'movepage-summary',
-       'export-summary',
-       'import-summary',
-       'editwatchlist-summary',
-       'version-summary',
-       'tags-summary',
-       'comparepages-summary',
-       'resettokens-summary',
-       'version-db-mysql-url',
-       'version-db-mariadb-url',
-       'version-db-percona-url',
-       'version-db-postgres-url',
-       'version-db-oracle-url',
-       'version-db-sqlite-url',
-       'version-db-mssql-url',
-       'version-entrypoints-index-php',
-       'version-entrypoints-api-php',
-       'version-entrypoints-load-php',
-       'ipb-default-expiry',
-       'pageinfo-header',
-       'pageinfo-footer',
-       'createacct-benefit-head1',
-       'createacct-benefit-icon1',
-       'createacct-benefit-head2',
-       'createacct-benefit-icon2',
-       'createacct-benefit-head3',
-       'createacct-benefit-icon3',
-       'today-at',
-       'redirect-text',
-       'helppage',
-       'edithelppage',
-       'helplogin-url',
-       'autocomment-prefix',
-       'move-redirect-text',
-       'interlanguage-link-title-langonly',
-       'createaccount-hook-abort',
-);
-
-/** Optional messages, which may be translated only if changed in the target language. */
-$wgOptionalMessages = array(
-       'feed-atom',
-       'feed-rss',
-       'unit-pixel',
-       'userrights-irreversible-marker',
-       'variantname-zh-hans',
-       'variantname-zh-hant',
-       'variantname-zh-cn',
-       'variantname-zh-tw',
-       'variantname-zh-hk',
-       'variantname-zh-mo',
-       'variantname-zh-my',
-       'variantname-zh-sg',
-       'variantname-zh',
-       'variantname-gan-hans',
-       'variantname-gan-hant',
-       'variantname-gan',
-       'variantname-sr-ec',
-       'variantname-sr-el',
-       'variantname-sr',
-       'variantname-kk-arab',
-       'variantname-kk-cyrl',
-       'variantname-kk-latn',
-       'variantname-kk-tr',
-       'variantname-kk-kz',
-       'variantname-kk-cn',
-       'variantname-kk',
-       'variantname-ku-latn',
-       'variantname-ku-arab',
-       'variantname-ku',
-       'variantname-tg-cyrl',
-       'variantname-tg-latn',
-       'variantname-tg',
-       'variantname-ike-cans',
-       'variantname-ike-latn',
-       'variantname-iu',
-       'variantname-shi-tfng',
-       'variantname-shi-latn',
-       'variantname-shi',
-       'rc-change-size',
-       'resetpass_text',
-       'image_sample',
-       'media_sample',
-       'skinname-cologneblue',
-       'skinname-monobook',
-       'skinname-modern',
-       'skinname-vector',
-       'common.css',
-       'cologneblue.css',
-       'monobook.css',
-       'modern.css',
-       'vector.css',
-       'print.css',
-       'noscript.css',
-       'group-autoconfirmed.css',
-       'group-user.css',
-       'group-bot.css',
-       'group-sysop.css',
-       'group-bureaucrat.css',
-       'common.js',
-       'cologneblue.js',
-       'monobook.js',
-       'modern.js',
-       'vector.js',
-       'group-autoconfirmed.js',
-       'group-user.js',
-       'group-bot.js',
-       'group-sysop.js',
-       'group-bureaucrat.js',
-       'widthheight',
-       'exif-fnumber-format',
-       'exif-focallength-format',
-       'exif-compression-5',
-       'exif-compression-6',
-       'exif-compression-7',
-       'exif-compression-8',
-       'exif-compression-32773',
-       'exif-compression-32946',
-       'exif-compression-34712',
-       'exif-photometricinterpretation-2',
-       'exif-photometricinterpretation-6',
-       'exif-xyresolution-i',
-       'exif-xyresolution-c',
-       'exif-colorspace-1',
-       'exif-componentsconfiguration-1',
-       'exif-componentsconfiguration-2',
-       'exif-componentsconfiguration-3',
-       'exif-componentsconfiguration-4',
-       'exif-componentsconfiguration-5',
-       'exif-componentsconfiguration-6',
-       'exif-contact-value',
-       'exif-coordinate-format',
-       'exif-lightsource-20',
-       'exif-lightsource-21',
-       'exif-lightsource-22',
-       'exif-lightsource-23',
-       'exif-maxaperturevalue-value',
-       'exif-subjectnewscode-value',
-       'booksources-isbn',
-       'protect-summary-desc',
-       'sp-contributions-explain',
-       'sorbs',
-       'video-dims',
-       'seconds-abbrev',
-       'minutes-abbrev',
-       'hours-abbrev',
-       'days-abbrev',
-       'pagetitle',
-       'filename-prefix-blacklist',
-       'edittools',
-       'edittools-upload',
-       'size-bytes',
-       'size-kilobytes',
-       'size-megabytes',
-       'size-gigabytes',
-       'size-terabytes',
-       'size-petabytes',
-       'size-exabytes',
-       'size-zetabytes',
-       'size-yottabytes',
-       'bitrate-bits',
-       'bitrate-kilobits',
-       'bitrate-megabits',
-       'bitrate-gigabits',
-       'bitrate-terabits',
-       'bitrate-petabits',
-       'bitrate-exabits',
-       'bitrate-zetabits',
-       'bitrate-yottabits',
-       'iranian-calendar-m1',
-       'iranian-calendar-m2',
-       'iranian-calendar-m3',
-       'iranian-calendar-m4',
-       'iranian-calendar-m5',
-       'iranian-calendar-m6',
-       'iranian-calendar-m7',
-       'iranian-calendar-m8',
-       'iranian-calendar-m9',
-       'iranian-calendar-m10',
-       'iranian-calendar-m11',
-       'iranian-calendar-m12',
-       '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-calendar-m1',
-       'hebrew-calendar-m2',
-       'hebrew-calendar-m3',
-       'hebrew-calendar-m4',
-       'hebrew-calendar-m5',
-       'hebrew-calendar-m6',
-       'hebrew-calendar-m6a',
-       'hebrew-calendar-m6b',
-       'hebrew-calendar-m7',
-       'hebrew-calendar-m8',
-       'hebrew-calendar-m9',
-       'hebrew-calendar-m10',
-       'hebrew-calendar-m11',
-       'hebrew-calendar-m12',
-       'hebrew-calendar-m1-gen',
-       'hebrew-calendar-m2-gen',
-       'hebrew-calendar-m3-gen',
-       'hebrew-calendar-m4-gen',
-       'hebrew-calendar-m5-gen',
-       'hebrew-calendar-m6-gen',
-       'hebrew-calendar-m6a-gen',
-       'hebrew-calendar-m6b-gen',
-       'hebrew-calendar-m7-gen',
-       'hebrew-calendar-m8-gen',
-       'hebrew-calendar-m9-gen',
-       'hebrew-calendar-m10-gen',
-       'hebrew-calendar-m11-gen',
-       'hebrew-calendar-m12-gen',
-       'version-api',
-       'version-version',
-       'version-svn-revision',
-       'semicolon-separator',
-       'comma-separator',
-       'colon-separator',
-       'pipe-separator',
-       'word-separator',
-       'ellipsis',
-       'percent',
-       'parentheses',
-       'brackets',
-       'listgrouprights-right-display',
-       'listgrouprights-right-revoked',
-       'timezone-utc',
-       'unpatrolledletter',
-       'diff-with-additional',
-       'pagetitle-view-mainpage',
-       'backlinksubtitle',
-       'prefs-registration-date-time',
-       'prefs-memberingroups-type',
-       'userrights-groupsmember-type',
-       'shared-repo-name-wikimediacommons',
-       'usermessage-template',
-       'filepage.css',
-       'metadata-langitem',
-       'metadata-langitem-default',
-       'nocookiesforlogin',
-       'version-entrypoints-articlepath',
-       'version-entrypoints-scriptpath',
-       'mergehistory-revisionrow',
-       'categoryviewer-pagedlinks',
-       'undelete-revision-row',
-       'pageinfo-redirects-value',
-       'created', // @deprecated. Remove in MediaWiki 1.23.
-       'changed', // @deprecated. Remove in MediaWiki 1.23.
-       'limitreport-ppvisitednodes-value',
-       'limitreport-ppgeneratednodes-value',
-       'limitreport-expansiondepth-value',
-       'limitreport-expensivefunctioncount-value',
-       'interlanguage-link-title',
-       'img-lang-opt',
-       'recentchanges-legend-plusminus',
-);
-
-/** Exif messages, which may be set as optional in several checks, but are generally mandatory */
-$wgEXIFMessages = array(
-       'exif-imagewidth',
-       'exif-imagelength',
-       'exif-bitspersample',
-       'exif-compression',
-       'exif-photometricinterpretation',
-       'exif-orientation',
-       'exif-samplesperpixel',
-       'exif-planarconfiguration',
-       'exif-ycbcrsubsampling',
-       'exif-ycbcrpositioning',
-       'exif-xresolution',
-       'exif-yresolution',
-       'exif-stripoffsets',
-       'exif-rowsperstrip',
-       'exif-stripbytecounts',
-       'exif-jpeginterchangeformat',
-       'exif-jpeginterchangeformatlength',
-       'exif-whitepoint',
-       'exif-primarychromaticities',
-       'exif-ycbcrcoefficients',
-       'exif-referenceblackwhite',
-       'exif-datetime',
-       'exif-imagedescription',
-       'exif-make',
-       'exif-model',
-       'exif-software',
-       'exif-artist',
-       'exif-copyright',
-       'exif-exifversion',
-       'exif-flashpixversion',
-       'exif-colorspace',
-       'exif-componentsconfiguration',
-       'exif-compressedbitsperpixel',
-       'exif-pixelydimension',
-       'exif-pixelxdimension',
-       'exif-usercomment',
-       'exif-relatedsoundfile',
-       'exif-datetimeoriginal',
-       'exif-datetimedigitized',
-       'exif-subsectime',
-       'exif-subsectimeoriginal',
-       'exif-subsectimedigitized',
-       'exif-exposuretime',
-       'exif-exposuretime-format',
-       'exif-fnumber',
-       'exif-fnumber-format',
-       'exif-exposureprogram',
-       'exif-spectralsensitivity',
-       'exif-isospeedratings',
-       'exif-shutterspeedvalue',
-       'exif-aperturevalue',
-       'exif-brightnessvalue',
-       'exif-exposurebiasvalue',
-       'exif-maxaperturevalue',
-       'exif-subjectdistance',
-       'exif-meteringmode',
-       'exif-lightsource',
-       'exif-flash',
-       'exif-focallength',
-       'exif-focallength-format',
-       'exif-subjectarea',
-       'exif-flashenergy',
-       'exif-focalplanexresolution',
-       'exif-focalplaneyresolution',
-       'exif-focalplaneresolutionunit',
-       'exif-subjectlocation',
-       'exif-exposureindex',
-       'exif-sensingmethod',
-       'exif-filesource',
-       'exif-scenetype',
-       'exif-customrendered',
-       'exif-exposuremode',
-       'exif-whitebalance',
-       'exif-digitalzoomratio',
-       'exif-focallengthin35mmfilm',
-       'exif-scenecapturetype',
-       'exif-gaincontrol',
-       'exif-contrast',
-       'exif-saturation',
-       'exif-sharpness',
-       'exif-devicesettingdescription',
-       'exif-subjectdistancerange',
-       'exif-imageuniqueid',
-       'exif-gpsversionid',
-       'exif-gpslatituderef',
-       'exif-gpslatitude',
-       'exif-gpslongituderef',
-       'exif-gpslongitude',
-       'exif-gpsaltituderef',
-       'exif-gpsaltitude',
-       'exif-gpstimestamp',
-       'exif-gpssatellites',
-       'exif-gpsstatus',
-       'exif-gpsmeasuremode',
-       'exif-gpsdop',
-       'exif-gpsspeedref',
-       'exif-gpsspeed',
-       'exif-gpstrackref',
-       'exif-gpstrack',
-       'exif-gpsimgdirectionref',
-       'exif-gpsimgdirection',
-       'exif-gpsmapdatum',
-       'exif-gpsdestlatituderef',
-       'exif-gpsdestlatitude',
-       'exif-gpsdestlongituderef',
-       'exif-gpsdestlongitude',
-       'exif-gpsdestbearingref',
-       'exif-gpsdestbearing',
-       'exif-gpsdestdistanceref',
-       'exif-gpsdestdistance',
-       'exif-gpsprocessingmethod',
-       'exif-gpsareainformation',
-       'exif-gpsdatestamp',
-       'exif-gpsdifferential',
-       'exif-coordinate-format',
-       'exif-jpegfilecomment',
-       'exif-keywords',
-       'exif-worldregioncreated',
-       'exif-countrycreated',
-       'exif-countrycodecreated',
-       'exif-provinceorstatecreated',
-       'exif-citycreated',
-       'exif-sublocationcreated',
-       'exif-worldregiondest',
-       'exif-countrydest',
-       'exif-countrycodedest',
-       'exif-provinceorstatedest',
-       'exif-citydest',
-       'exif-sublocationdest',
-       'exif-objectname',
-       'exif-specialinstructions',
-       'exif-headline',
-       'exif-credit',
-       'exif-source',
-       'exif-editstatus',
-       'exif-urgency',
-       'exif-fixtureidentifier',
-       'exif-locationdest',
-       'exif-locationdestcode',
-       'exif-objectcycle',
-       'exif-contact',
-       'exif-writer',
-       'exif-languagecode',
-       'exif-iimversion',
-       'exif-iimcategory',
-       'exif-iimsupplementalcategory',
-       'exif-datetimeexpires',
-       'exif-datetimereleased',
-       'exif-originaltransmissionref',
-       'exif-identifier',
-       'exif-lens',
-       'exif-serialnumber',
-       'exif-cameraownername',
-       'exif-label',
-       'exif-datetimemetadata',
-       'exif-nickname',
-       'exif-rating',
-       'exif-rightscertificate',
-       'exif-copyrighted',
-       'exif-copyrightowner',
-       'exif-usageterms',
-       'exif-webstatement',
-       'exif-originaldocumentid',
-       'exif-licenseurl',
-       'exif-morepermissionsurl',
-       'exif-attributionurl',
-       'exif-preferredattributionname',
-       'exif-pngfilecomment',
-       'exif-disclaimer',
-       'exif-contentwarning',
-       'exif-giffilecomment',
-       'exif-intellectualgenre',
-       'exif-subjectnewscode',
-       'exif-scenecode',
-       'exif-event',
-       'exif-organisationinimage',
-       'exif-personinimage',
-       'exif-originalimageheight',
-       'exif-originalimagewidth',
-       'exif-make-value',
-       'exif-model-value',
-       'exif-software-value',
-       'exif-software-version-value',
-       'exif-contact-value',
-       'exif-subjectnewscode-value',
-       'exif-compression-1',
-       'exif-compression-2',
-       'exif-compression-3',
-       'exif-compression-4',
-       'exif-compression-5',
-       'exif-compression-6',
-       'exif-compression-7',
-       'exif-compression-8',
-       'exif-compression-32773',
-       'exif-compression-32946',
-       'exif-compression-34712',
-       'exif-copyrighted-true',
-       'exif-copyrighted-false',
-       'exif-photometricinterpretation-2',
-       'exif-photometricinterpretation-6',
-       'exif-unknowndate',
-       'exif-orientation-1',
-       'exif-orientation-2',
-       'exif-orientation-3',
-       'exif-orientation-4',
-       'exif-orientation-5',
-       'exif-orientation-6',
-       'exif-orientation-7',
-       'exif-orientation-8',
-       'exif-planarconfiguration-1',
-       'exif-planarconfiguration-2',
-       'exif-xyresolution-i',
-       'exif-xyresolution-c',
-       'exif-colorspace-1',
-       'exif-colorspace-65535',
-       'exif-componentsconfiguration-0',
-       'exif-componentsconfiguration-1',
-       'exif-componentsconfiguration-2',
-       'exif-componentsconfiguration-3',
-       'exif-componentsconfiguration-4',
-       'exif-componentsconfiguration-5',
-       'exif-componentsconfiguration-6',
-       'exif-exposureprogram-0',
-       'exif-exposureprogram-1',
-       'exif-exposureprogram-2',
-       'exif-exposureprogram-3',
-       'exif-exposureprogram-4',
-       'exif-exposureprogram-5',
-       'exif-exposureprogram-6',
-       'exif-exposureprogram-7',
-       'exif-exposureprogram-8',
-       'exif-subjectdistance-value',
-       'exif-meteringmode-0',
-       'exif-meteringmode-1',
-       'exif-meteringmode-2',
-       'exif-meteringmode-3',
-       'exif-meteringmode-4',
-       'exif-meteringmode-5',
-       'exif-meteringmode-6',
-       'exif-meteringmode-255',
-       'exif-lightsource-0',
-       'exif-lightsource-1',
-       'exif-lightsource-2',
-       'exif-lightsource-3',
-       'exif-lightsource-4',
-       'exif-lightsource-9',
-       'exif-lightsource-10',
-       'exif-lightsource-11',
-       'exif-lightsource-12',
-       'exif-lightsource-13',
-       'exif-lightsource-14',
-       'exif-lightsource-15',
-       'exif-lightsource-17',
-       'exif-lightsource-18',
-       'exif-lightsource-19',
-       'exif-lightsource-20',
-       'exif-lightsource-21',
-       'exif-lightsource-22',
-       'exif-lightsource-23',
-       'exif-lightsource-24',
-       'exif-lightsource-255',
-       'exif-flash-fired-0',
-       'exif-flash-fired-1',
-       'exif-flash-return-0',
-       'exif-flash-return-2',
-       'exif-flash-return-3',
-       'exif-flash-mode-1',
-       'exif-flash-mode-2',
-       'exif-flash-mode-3',
-       'exif-flash-function-1',
-       'exif-flash-redeye-1',
-       'exif-focalplaneresolutionunit-2',
-       'exif-sensingmethod-1',
-       'exif-sensingmethod-2',
-       'exif-sensingmethod-3',
-       'exif-sensingmethod-4',
-       'exif-sensingmethod-5',
-       'exif-sensingmethod-7',
-       'exif-sensingmethod-8',
-       'exif-filesource-3',
-       'exif-scenetype-1',
-       'exif-customrendered-0',
-       'exif-customrendered-1',
-       'exif-exposuremode-0',
-       'exif-exposuremode-1',
-       'exif-exposuremode-2',
-       'exif-whitebalance-0',
-       'exif-whitebalance-1',
-       'exif-scenecapturetype-0',
-       'exif-scenecapturetype-1',
-       'exif-scenecapturetype-2',
-       'exif-scenecapturetype-3',
-       'exif-gaincontrol-0',
-       'exif-gaincontrol-1',
-       'exif-gaincontrol-2',
-       'exif-gaincontrol-3',
-       'exif-gaincontrol-4',
-       'exif-contrast-0',
-       'exif-contrast-1',
-       'exif-contrast-2',
-       'exif-saturation-0',
-       'exif-saturation-1',
-       'exif-saturation-2',
-       'exif-sharpness-0',
-       'exif-sharpness-1',
-       'exif-sharpness-2',
-       'exif-subjectdistancerange-0',
-       'exif-subjectdistancerange-1',
-       'exif-subjectdistancerange-2',
-       'exif-subjectdistancerange-3',
-       'exif-gpslatitude-n',
-       'exif-gpslatitude-s',
-       'exif-gpslongitude-e',
-       'exif-gpslongitude-w',
-       'exif-gpsaltitude-above-sealevel',
-       'exif-gpsaltitude-below-sealevel',
-       'exif-gpsstatus-a',
-       'exif-gpsstatus-v',
-       'exif-gpsmeasuremode-2',
-       'exif-gpsmeasuremode-3',
-       'exif-gpsspeed-k',
-       'exif-gpsspeed-m',
-       'exif-gpsspeed-n',
-       'exif-gpsdestdistance-k',
-       'exif-gpsdestdistance-m',
-       'exif-gpsdestdistance-n',
-       'exif-gpsdop-excellent',
-       'exif-gpsdop-good',
-       'exif-gpsdop-moderate',
-       'exif-gpsdop-fair',
-       'exif-gpsdop-poor',
-       'exif-objectcycle-a',
-       'exif-objectcycle-p',
-       'exif-objectcycle-b',
-       'exif-gpsdirection-t',
-       'exif-gpsdirection-m',
-       'exif-ycbcrpositioning-1',
-       'exif-ycbcrpositioning-2',
-       'exif-dc-contributor',
-       'exif-dc-coverage',
-       'exif-dc-date',
-       'exif-dc-publisher',
-       'exif-dc-relation',
-       'exif-dc-rights',
-       'exif-dc-source',
-       'exif-dc-type',
-       'exif-rating-rejected',
-       'exif-isospeedratings-overflow',
-       'exif-maxaperturevalue-value',
-       'exif-iimcategory-ace',
-       'exif-iimcategory-clj',
-       'exif-iimcategory-dis',
-       'exif-iimcategory-fin',
-       'exif-iimcategory-edu',
-       'exif-iimcategory-evn',
-       'exif-iimcategory-hth',
-       'exif-iimcategory-hum',
-       'exif-iimcategory-lab',
-       'exif-iimcategory-lif',
-       'exif-iimcategory-pol',
-       'exif-iimcategory-rel',
-       'exif-iimcategory-sci',
-       'exif-iimcategory-soi',
-       'exif-iimcategory-spo',
-       'exif-iimcategory-war',
-       'exif-iimcategory-wea',
-       'exif-urgency-normal',
-       'exif-urgency-low',
-       'exif-urgency-high',
-       'exif-urgency-other',
-);
diff --git a/maintenance/language/messages.inc b/maintenance/language/messages.inc
deleted file mode 100644 (file)
index 62d1fa6..0000000
+++ /dev/null
@@ -1,4301 +0,0 @@
-<?php
-/**
- * Define the messages structure in the messages file, for an automated rewriting.
- *
- * 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 MaintenanceLanguage
- */
-
-/** The structure of the messages, divided to blocks */
-$wgMessageStructure = array(
-       'sidebar' => array(
-               'sidebar',
-       ),
-       'toggles' => array(
-               'tog-underline',
-               'tog-hideminor',
-               'tog-hidepatrolled',
-               'tog-newpageshidepatrolled',
-               'tog-extendwatchlist',
-               'tog-usenewrc',
-               'tog-numberheadings',
-               'tog-showtoolbar',
-               'tog-editondblclick',
-               'tog-editsectiononrightclick',
-               'tog-watchcreations',
-               'tog-watchdefault',
-               'tog-watchmoves',
-               'tog-watchdeletion',
-               'tog-minordefault',
-               'tog-previewontop',
-               'tog-previewonfirst',
-               'tog-enotifwatchlistpages',
-               'tog-enotifusertalkpages',
-               'tog-enotifminoredits',
-               'tog-enotifrevealaddr',
-               'tog-shownumberswatching',
-               'tog-oldsig',
-               'tog-fancysig',
-               'tog-uselivepreview',
-               'tog-forceeditsummary',
-               'tog-watchlisthideown',
-               'tog-watchlisthidebots',
-               'tog-watchlisthideminor',
-               'tog-watchlisthideliu',
-               'tog-watchlisthideanons',
-               'tog-watchlisthidepatrolled',
-               'tog-ccmeonemails',
-               'tog-diffonly',
-               'tog-showhiddencats',
-               'tog-norollbackdiff',
-               'tog-useeditwarning',
-               'tog-prefershttps'
-       ),
-       'underline' => array(
-               'underline-always',
-               'underline-never',
-               'underline-default',
-       ),
-       'editfont' => array(
-               'editfont-style',
-               'editfont-default',
-               'editfont-monospace',
-               'editfont-sansserif',
-               'editfont-serif',
-       ),
-       'dates' => array(
-               'sunday',
-               'monday',
-               'tuesday',
-               'wednesday',
-               'thursday',
-               'friday',
-               'saturday',
-               'sun',
-               'mon',
-               'tue',
-               'wed',
-               'thu',
-               'fri',
-               'sat',
-               'january',
-               'february',
-               'march',
-               'april',
-               'may_long',
-               'june',
-               'july',
-               'august',
-               'september',
-               'october',
-               'november',
-               'december',
-               'january-gen',
-               'february-gen',
-               'march-gen',
-               'april-gen',
-               'may-gen',
-               'june-gen',
-               'july-gen',
-               'august-gen',
-               'september-gen',
-               'october-gen',
-               'november-gen',
-               'december-gen',
-               'jan',
-               'feb',
-               'mar',
-               'apr',
-               'may',
-               'jun',
-               'jul',
-               'aug',
-               'sep',
-               'oct',
-               'nov',
-               'dec',
-               'january-date',
-               'february-date',
-               'march-date',
-               'april-date',
-               'may-date',
-               'june-date',
-               'july-date',
-               'august-date',
-               'september-date',
-               'october-date',
-               'november-date',
-               'december-date',
-       ),
-       'categorypages' => array(
-               'pagecategories',
-               'pagecategorieslink',
-               'category_header',
-               'subcategories',
-               'category-media-header',
-               'category-empty',
-               'hidden-categories',
-               'hidden-category-category',
-               'category-subcat-count',
-               'category-subcat-count-limited',
-               'category-article-count',
-               'category-article-count-limited',
-               'category-file-count',
-               'category-file-count-limited',
-               'listingcontinuesabbrev',
-               'index-category',
-               'noindex-category',
-               'broken-file-category',
-               'categoryviewer-pagedlinks',
-       ),
-       'miscellaneous1' => array(
-               'about',
-               'article',
-               'newwindow',
-               'cancel',
-               'moredotdotdot',
-               'morenotlisted',
-               'mypage',
-               'mytalk',
-               'anontalk',
-               'navigation',
-               'and',
-       ),
-       'cologneblue' => array(
-               'qbfind',
-               'qbbrowse',
-               'qbedit',
-               'qbpageoptions',
-               'qbmyoptions',
-               'faq',
-               'faqpage',
-               'sitetitle',
-               'sitesubtitle',
-       ),
-       'vector' => array(
-               'vector-action-addsection',
-               'vector-action-delete',
-               'vector-action-move',
-               'vector-action-protect',
-               'vector-action-undelete',
-               'vector-action-unprotect',
-               'vector-view-create',
-               'vector-view-edit',
-               'vector-view-history',
-               'vector-view-view',
-               'vector-view-viewsource',
-               'actions',
-               'namespaces',
-               'variants',
-       ),
-       'miscellaneous2' => array(
-               'navigation-heading',
-               'errorpagetitle',
-               'returnto',
-               'tagline',
-               'help',
-               'search',
-               'searchbutton',
-               'go',
-               'searcharticle',
-               'history',
-               'history_short',
-               'updatedmarker',
-               'printableversion',
-               'permalink',
-               'print',
-               'view',
-               'edit',
-               'create',
-               'editthispage',
-               'create-this-page',
-               'delete',
-               'deletethispage',
-               'undeletethispage',
-               'undelete_short',
-               'viewdeleted_short',
-               'protect',
-               'protect_change',
-               'protectthispage',
-               'unprotect',
-               'unprotectthispage',
-               'newpage',
-               'talkpage',
-               'talkpagelinktext',
-               'specialpage',
-               'personaltools',
-               'postcomment',
-               'addsection',
-               'articlepage',
-               'talk',
-               'views',
-               'toolbox',
-               'userpage',
-               'projectpage',
-               'imagepage',
-               'mediawikipage',
-               'templatepage',
-               'viewhelppage',
-               'categorypage',
-               'viewtalkpage',
-               'otherlanguages',
-               'redirectedfrom',
-               'redirectpagesub',
-               'talkpageheader',
-               'lastmodifiedat',
-               'viewcount',
-               'protectedpage',
-               'jumpto',
-               'jumptonavigation',
-               'jumptosearch',
-               'view-pool-error',
-               'generic-pool-error',
-               'pool-timeout',
-               'pool-queuefull',
-               'pool-errorunknown',
-               'pool-servererror',
-       ),
-       'links' => array(
-               'aboutsite',
-               'aboutpage',
-               'copyright',
-               'copyrightpage',
-               'currentevents',
-               'currentevents-url',
-               'disclaimers',
-               'disclaimerpage',
-               'edithelp',
-               'edithelppage',
-               'helppage',
-               'mainpage',
-               'mainpage-description',
-               'policy-url',
-               'portal',
-               'portal-url',
-               'privacy',
-               'privacypage',
-       ),
-       'badaccess' => array(
-               'badaccess',
-               'badaccess-group0',
-               'badaccess-groups',
-       ),
-       'versionrequired' => array(
-               'versionrequired',
-               'versionrequiredtext',
-       ),
-       'miscellaneous3' => array(
-               'ok',
-               'pagetitle',
-               'pagetitle-view-mainpage',
-               'backlinksubtitle',
-               'retrievedfrom',
-               'youhavenewmessages',
-               'youhavenewmessagesfromusers',
-               'youhavenewmessagesmanyusers',
-               'newmessageslinkplural',
-               'newmessagesdifflinkplural',
-               'youhavenewmessagesmulti',
-               'newtalkseparator',
-               'editsection',
-               'editold',
-               'viewsourceold',
-               'editlink',
-               'viewsourcelink',
-               'editsectionhint',
-               'toc',
-               'showtoc',
-               'hidetoc',
-               'collapsible-collapse',
-               'collapsible-expand',
-               'thisisdeleted',
-               'viewdeleted',
-               'restorelink',
-               'feedlinks',
-               'feed-invalid',
-               'feed-unavailable',
-               'site-rss-feed',
-               'site-atom-feed',
-               'page-rss-feed',
-               'page-atom-feed',
-               'feed-atom',
-               'feed-rss',
-               'sitenotice',
-               'anonnotice',
-               'newsectionheaderdefaultlevel',
-               'red-link-title',
-               'sort-descending',
-               'sort-ascending',
-
-       ),
-       'nstab' => array(
-               'nstab-main',
-               'nstab-user',
-               'nstab-media',
-               'nstab-special',
-               'nstab-project',
-               'nstab-image',
-               'nstab-mediawiki',
-               'nstab-template',
-               'nstab-help',
-               'nstab-category',
-               'mainpage-nstab',
-       ),
-       'main' => array(
-               'nosuchaction',
-               'nosuchactiontext',
-               'nosuchspecialpage',
-               'nospecialpagetext',
-       ),
-       'errors' => array(
-               'error',
-               'databaseerror',
-               'databaseerror-text',
-               'databaseerror-textcl',
-               'databaseerror-query',
-               'databaseerror-function',
-               'databaseerror-error',
-               'laggedslavemode',
-               'readonly',
-               'enterlockreason',
-               'readonlytext',
-               'missing-article', // not used anymore in core, but kept for extensions
-               'missingarticle-rev', // not used anymore in core, but kept for extensions
-               'missingarticle-diff', // not used anymore in core, but kept for extensions
-               'readonly_lag',
-               'internalerror',
-               'internalerror_info',
-               'fileappenderrorread',
-               'fileappenderror',
-               'filecopyerror',
-               'filerenameerror',
-               'filedeleteerror',
-               'directorycreateerror',
-               'filenotfound',
-               'fileexistserror',
-               'unexpected',
-               'formerror',
-               'badarticleerror',
-               'cannotdelete',
-               'cannotdelete-title',
-               'delete-hook-aborted',
-               'no-null-revision',
-               'badtitle',
-               'badtitletext',
-               'perfcached',
-               'perfcachedts',
-               'querypage-no-updates',
-               'viewsource',
-               'viewsource-title',
-               'actionthrottled',
-               'actionthrottledtext',
-               'protectedpagetext',
-               'viewsourcetext',
-               'viewyourtext',
-               'protectedinterface',
-               'editinginterface',
-               'cascadeprotected',
-               'namespaceprotected',
-               'customcssprotected',
-               'customjsprotected',
-               'mycustomcssprotected',
-               'mycustomjsprotected',
-               'myprivateinfoprotected',
-               'mypreferencesprotected',
-               'ns-specialprotected',
-               'titleprotected',
-               'filereadonlyerror',
-               'invalidtitle-knownnamespace',
-               'invalidtitle-unknownnamespace',
-               'exception-nologin',
-               'exception-nologin-text',
-               'exception-nologin-text-manual',
-       ),
-       'virus' => array(
-               'virus-badscanner',
-               'virus-scanfailed',
-               'virus-unknownscanner',
-       ),
-       'login' => array(
-               'logouttext',
-               'welcomeuser',
-               'welcomecreation-msg',
-               'yourname',
-               'userlogin-yourname',
-               'userlogin-yourname-ph',
-               'createacct-another-username-ph',
-               'createacct-helpusername',
-               'yourpassword',
-               'userlogin-yourpassword',
-               'userlogin-yourpassword-ph',
-               'createacct-yourpassword-ph',
-               'yourpasswordagain',
-               'createacct-yourpasswordagain',
-               'createacct-yourpasswordagain-ph',
-               'remembermypassword',
-               'userlogin-remembermypassword',
-               'userlogin-signwithsecure',
-               'yourdomainname',
-               'password-change-forbidden',
-               'externaldberror',
-               'login',
-               'nav-login-createaccount',
-               'loginprompt',
-               'userlogin',
-               'userloginnocreate',
-               'logout',
-               'userlogout',
-               'userlogout-summary',
-               'notloggedin',
-               'userlogin-noaccount',
-               'userlogin-joinproject',
-               'nologin',
-               'nologinlink',
-               'createaccount',
-               'gotaccount',
-               'gotaccountlink',
-               'userlogin-resetlink',
-               'userlogin-resetpassword-link',
-               'helplogin-url',
-               'userlogin-helplink2',
-               'userlogin-loggedin',
-               'userlogin-createanother',
-               'createacct-join',
-               'createacct-another-join',
-               'createacct-emailrequired',
-               'createacct-emailoptional',
-               'createacct-email-ph',
-               'createacct-another-email-ph',
-               'createaccountmail',
-               'createacct-realname',
-               'createaccountreason',
-               'createacct-reason',
-               'createacct-reason-ph',
-               'createacct-captcha',
-               'createacct-imgcaptcha-help',
-               'createacct-imgcaptcha-ph',
-               'createacct-submit',
-               'createacct-another-submit',
-               'createacct-benefit-heading',
-               'createacct-benefit-icon1',
-               'createacct-benefit-head1',
-               'createacct-benefit-body1',
-               'createacct-benefit-icon2',
-               'createacct-benefit-head2',
-               'createacct-benefit-body2',
-               'createacct-benefit-icon3',
-               'createacct-benefit-head3',
-               'createacct-benefit-body3',
-               'badretype',
-               'userexists',
-               'loginerror',
-               'createacct-error',
-               'createaccounterror',
-               'nocookiesnew',
-               'nocookieslogin',
-               'nocookiesfornew',
-               'nocookiesforlogin',
-               'noname',
-               'loginsuccesstitle',
-               'loginsuccess',
-               'nosuchuser',
-               'nosuchusershort',
-               'nouserspecified',
-               'login-userblocked',
-               'wrongpassword',
-               'wrongpasswordempty',
-               'passwordtooshort',
-               'password-name-match',
-               'password-login-forbidden',
-               'mailmypassword',
-               'passwordremindertitle',
-               'passwordremindertext',
-               'noemail',
-               'noemailcreate',
-               'passwordsent',
-               'blocked-mailpassword',
-               'eauthentsent',
-               'throttled-mailpassword',
-               'loginstart',
-               'loginend',
-               'loginend-https',
-               'signupstart',
-               'signupend',
-               'signupend-https',
-               'mailerror',
-               'acct_creation_throttle_hit',
-               'emailauthenticated',
-               'emailnotauthenticated',
-               'noemailprefs',
-               'emailconfirmlink',
-               'invalidemailaddress',
-               'cannotchangeemail',
-               'emaildisabled',
-               'emailsender',
-               'accountcreated',
-               'accountcreatedtext',
-               'createaccount-title',
-               'createaccount-text',
-               'usernamehasherror',
-               'login-throttled',
-               'login-abort-generic',
-               'loginlanguagelabel',
-               'loginlanguagelinks',
-               'suspicious-userlogout',
-               'createacct-another-realname-tip',
-               'pt-login',
-               'pt-login-button',
-               'pt-createaccount',
-               'pt-userlogout',
-       ),
-       'mail' => array(
-               'pear-mail-error',
-               'php-mail-error',
-               'php-mail-error-unknown',
-               'user-mail-no-addy',
-               'user-mail-no-body',
-       ),
-       'resetpass' => array(
-               'changepassword',
-               'changepassword-summary',
-               'resetpass_announce',
-               'resetpass_text',
-               'resetpass_header',
-               'oldpassword',
-               'newpassword',
-               'retypenew',
-               'resetpass_submit',
-               'changepassword-success',
-               'changepassword-throttled',
-               'resetpass_forbidden',
-               'resetpass-no-info',
-               'resetpass-submit-loggedin',
-               'resetpass-submit-cancel',
-               'resetpass-wrong-oldpass',
-               'resetpass-recycled',
-               'resetpass-temp-emailed',
-               'resetpass-temp-password',
-               'resetpass-abort-generic',
-               'resetpass-expired',
-               'resetpass-expired-soft',
-               'resetpass-validity-soft',
-       ),
-       'passwordreset' => array(
-               'passwordreset',
-               'passwordreset-text-one',
-               'passwordreset-text-many',
-               'passwordreset-legend',
-               'passwordreset-disabled',
-               'passwordreset-emaildisabled',
-               'passwordreset-username',
-               'passwordreset-domain',
-               'passwordreset-capture',
-               'passwordreset-capture-help',
-               'passwordreset-email',
-               'passwordreset-emailtitle',
-               'passwordreset-emailtext-ip',
-               'passwordreset-emailtext-user',
-               'passwordreset-emailelement',
-               'passwordreset-emailsent',
-               'passwordreset-emailsent-capture',
-               'passwordreset-emailerror-capture',
-       ),
-       'changeemail' => array(
-               'changeemail',
-               'changeemail-summary',
-               'changeemail-header',
-               'changeemail-text',
-               'changeemail-no-info',
-               'changeemail-oldemail',
-               'changeemail-newemail',
-               'changeemail-none',
-               'changeemail-password',
-               'changeemail-submit',
-               'changeemail-cancel',
-               'changeemail-throttled'
-       ),
-       'resettokens' => array(
-               'resettokens',
-               'resettokens-summary',
-               'resettokens-text',
-               'resettokens-no-tokens',
-               'resettokens-legend',
-               'resettokens-tokens',
-               'resettokens-token-label',
-               'resettokens-watchlist-token',
-               'resettokens-done',
-               'resettokens-resetbutton',
-       ),
-       'toolbar' => array(
-               'bold_sample',
-               'bold_tip',
-               'italic_sample',
-               'italic_tip',
-               'link_sample',
-               'link_tip',
-               'extlink_sample',
-               'extlink_tip',
-               'headline_sample',
-               'headline_tip',
-               'nowiki_sample',
-               'nowiki_tip',
-               'image_sample',
-               'image_tip',
-               'media_sample',
-               'media_tip',
-               'sig_tip',
-               'hr_tip',
-       ),
-       'edit' => array(
-               'summary',
-               'subject',
-               'minoredit',
-               'watchthis',
-               'savearticle',
-               'preview',
-               'showpreview',
-               'showlivepreview',
-               'showdiff',
-               'anoneditwarning',
-               'anonpreviewwarning',
-               'missingsummary',
-               'missingcommenttext',
-               'missingcommentheader',
-               'summary-preview',
-               'subject-preview',
-               'blockedtitle',
-               'blockedtext',
-               'autoblockedtext',
-               'blockednoreason',
-               'whitelistedittext',
-               'confirmedittext',
-               'nosuchsectiontitle',
-               'nosuchsectiontext',
-               'loginreqtitle',
-               'loginreqlink',
-               'loginreqpagetext',
-               'accmailtitle',
-               'accmailtext',
-               'newarticle',
-               'newarticletext',
-               'newarticletextanon',
-               'talkpagetext',
-               'anontalkpagetext',
-               'noarticletext',
-               'noarticletext-nopermission',
-               'noarticletextanon',
-               'missing-revision',
-               'userpage-userdoesnotexist',
-               'userpage-userdoesnotexist-view',
-               'blocked-notice-logextract',
-               'clearyourcache',
-               'usercssyoucanpreview',
-               'userjsyoucanpreview',
-               'usercsspreview',
-               'userjspreview',
-               'sitecsspreview',
-               'sitejspreview',
-               'userinvalidcssjstitle',
-               'updated',
-               'note',
-               'previewnote',
-               'continue-editing',
-               'previewconflict',
-               'session_fail_preview',
-               'session_fail_preview_html',
-               'token_suffix_mismatch',
-               'edit_form_incomplete',
-               'editing',
-               'creating',
-               'editingsection',
-               'editingcomment',
-               'editconflict',
-               'explainconflict',
-               'yourtext',
-               'storedversion',
-               'nonunicodebrowser',
-               'editingold',
-               'yourdiff',
-               'copyrightwarning',
-               'copyrightwarning2',
-               'editpage-head-copy-warn',
-               'editpage-tos-summary',
-               'longpage-hint',
-               'longpageerror',
-               'readonlywarning',
-               'protectedpagewarning',
-               'semiprotectedpagewarning',
-               'cascadeprotectedwarning',
-               'titleprotectedwarning',
-               'templatesused',
-               'templatesusedpreview',
-               'templatesusedsection',
-               'template-protected',
-               'template-semiprotected',
-               'hiddencategories',
-               'edittools',
-               'edittools-upload',
-               'nocreatetext',
-               'nocreate-loggedin',
-               'sectioneditnotsupported-title',
-               'sectioneditnotsupported-text',
-               'permissionserrors',
-               'permissionserrorstext',
-               'permissionserrorstext-withaction',
-               'recreate-moveddeleted-warn',
-               'moveddeleted-notice',
-               'log-fulllog',
-               'edit-hook-aborted',
-               'edit-gone-missing',
-               'edit-conflict',
-               'edit-no-change',
-               'postedit-confirmation',
-               'edit-already-exists',
-               'addsection-preload',
-               'addsection-editintro',
-               'defaultmessagetext',
-               'content-failed-to-parse',
-               'invalid-content-data',
-               'content-not-allowed-here',
-               'editwarning-warning',
-               'editpage-notsupportedcontentformat-title',
-               'editpage-notsupportedcontentformat-text',
-       ),
-       'contentmodels' => array(
-               'content-model-wikitext',
-               'content-model-text',
-               'content-model-javascript',
-               'content-model-css',
-       ),
-       'parserwarnings' => array(
-               'expensive-parserfunction-warning',
-               'expensive-parserfunction-category',
-               'post-expand-template-inclusion-warning',
-               'post-expand-template-inclusion-category',
-               'post-expand-template-argument-warning',
-               'post-expand-template-argument-category',
-               'parser-template-loop-warning',
-               'parser-template-recursion-depth-warning',
-               'language-converter-depth-warning',
-               'node-count-exceeded-category',
-               'node-count-exceeded-warning',
-               'expansion-depth-exceeded-category',
-               'expansion-depth-exceeded-warning',
-               'parser-unstrip-loop-warning',
-               'parser-unstrip-recursion-limit',
-               'converter-manual-rule-error',
-       ),
-       'undo' => array(
-               'undo-success',
-               'undo-failure',
-               'undo-norev',
-               'undo-nochange',
-               'undo-summary',
-               'undo-summary-username-hidden',
-       ),
-       'cantcreateaccount' => array(
-               'cantcreateaccounttitle',
-               'cantcreateaccount-text',
-               'cantcreateaccount-range-text',
-               'createaccount-hook-aborted',
-       ),
-       'history' => array(
-               'viewpagelogs',
-               'nohistory',
-               'currentrev',
-               'currentrev-asof',
-               'revisionasof',
-               'revision-info',
-               'revision-info-current',
-               'revision-nav',
-               'previousrevision',
-               'nextrevision',
-               'currentrevisionlink',
-               'cur',
-               'next',
-               'last',
-               'page_first',
-               'page_last',
-               'histlegend',
-               'history-fieldset-title',
-               'history-show-deleted',
-               'history_copyright',
-               'histfirst',
-               'histlast',
-               'historysize',
-               'historyempty',
-       ),
-       'history-feed' => array(
-               'history-feed-title',
-               'history-feed-description',
-               'history-feed-item-nocomment',
-               'history-feed-empty',
-       ),
-       'revdelete' => array(
-               'rev-deleted-comment',
-               'rev-deleted-user',
-               'rev-deleted-event',
-               'rev-deleted-user-contribs',
-               'rev-deleted-text-permission',
-               'rev-deleted-text-unhide',
-               'rev-suppressed-text-unhide',
-               'rev-deleted-text-view',
-               'rev-suppressed-text-view',
-               'rev-deleted-no-diff',
-               'rev-suppressed-no-diff',
-               'rev-deleted-unhide-diff',
-               'rev-suppressed-unhide-diff',
-               'rev-deleted-diff-view',
-               'rev-suppressed-diff-view',
-               'rev-delundel',
-               'rev-showdeleted',
-               'revisiondelete',
-               'revdelete-nooldid-title',
-               'revdelete-nooldid-text',
-               'revdelete-no-file',
-               'revdelete-show-file-confirm',
-               'revdelete-show-file-submit',
-               'revdelete-selected-text',
-               'revdelete-selected-file',
-               'logdelete-selected',
-               'revdelete-text-text',
-               'revdelete-text-file',
-               'logdelete-text',
-               'revdelete-text-others',
-               'revdelete-confirm',
-               'revdelete-suppress-text',
-               'revdelete-legend',
-               'revdelete-hide-text',
-               'revdelete-hide-image',
-               'revdelete-hide-name',
-               'revdelete-hide-comment',
-               'revdelete-hide-user',
-               'revdelete-hide-restricted',
-               'revdelete-radio-same',
-               'revdelete-radio-set',
-               'revdelete-radio-unset',
-               'revdelete-suppress',
-               'revdelete-unsuppress',
-               'revdelete-log',
-               'revdelete-submit',
-               'revdelete-success',
-               'revdelete-failure',
-               'logdelete-success',
-               'logdelete-failure',
-               'revdel-restore',
-               'pagehist',
-               'deletedhist',
-               'revdelete-hide-current',
-               'revdelete-show-no-access',
-               'revdelete-modify-no-access',
-               'revdelete-modify-missing',
-               'revdelete-no-change',
-               'revdelete-concurrent-change',
-               'revdelete-only-restricted',
-               'revdelete-reason-dropdown',
-               'revdelete-otherreason',
-               'revdelete-reasonotherlist',
-               'revdelete-edit-reasonlist',
-               'revdelete-offender',
-       ),
-       'suppression' => array(
-               'suppressionlog',
-               'suppressionlogtext',
-       ),
-       'mergehistory' => array(
-               'mergehistory',
-               'mergehistory-header',
-               'mergehistory-box',
-               'mergehistory-from',
-               'mergehistory-into',
-               'mergehistory-list',
-               'mergehistory-merge',
-               'mergehistory-go',
-               'mergehistory-submit',
-               'mergehistory-empty',
-               'mergehistory-success',
-               'mergehistory-fail',
-               'mergehistory-no-source',
-               'mergehistory-no-destination',
-               'mergehistory-invalid-source',
-               'mergehistory-invalid-destination',
-               'mergehistory-autocomment',
-               'mergehistory-comment',
-               'mergehistory-same-destination',
-               'mergehistory-reason',
-               'mergehistory-revisionrow'
-       ),
-       'mergelog' => array(
-               'mergelog',
-               'pagemerge-logentry',
-               'revertmerge',
-               'mergelogpagetext',
-       ),
-       'diffs' => array(
-               'history-title',
-               'difference-title',
-               'difference-title-multipage',
-               'difference-multipage',
-               'lineno',
-               'compareselectedversions',
-               'showhideselectedversions',
-               'editundo',
-               'diff-empty',
-               'diff-multi-sameuser',
-               'diff-multi-otherusers',
-               'diff-multi-manyusers',
-               'difference-missing-revision',
-       ),
-       'search' => array(
-               'search-summary',
-               'searchresults',
-               'searchresults-title',
-               'toomanymatches',
-               'titlematches',
-               'textmatches',
-               'notextmatches',
-               'prevn',
-               'nextn',
-               'prevn-title',
-               'nextn-title',
-               'shown-title',
-               'viewprevnext',
-               'searchmenu-exists',
-               'searchmenu-new',
-               'searchmenu-new-nocreate',
-               'searchprofile-articles',
-               'searchprofile-project',
-               'searchprofile-images',
-               'searchprofile-everything',
-               'searchprofile-advanced',
-               'searchprofile-articles-tooltip',
-               'searchprofile-project-tooltip',
-               'searchprofile-images-tooltip',
-               'searchprofile-everything-tooltip',
-               'searchprofile-advanced-tooltip',
-               'search-result-size',
-               'search-result-category-size',
-               'search-result-score',
-               'search-redirect',
-               'search-section',
-               'search-file-match',
-               'search-suggest',
-               'search-interwiki-caption',
-               'search-interwiki-default',
-               'search-interwiki-custom',
-               'search-interwiki-more',
-               'search-relatedarticle',
-               'searcheverything-enable',
-               'searchrelated',
-               'searchall',
-               'showingresults',
-               'showingresultsinrange',
-               'showingresultsnum',
-               'showingresultsheader',
-               'search-nonefound',
-               'powersearch-legend',
-               'powersearch-ns',
-               'powersearch-redir',
-               'powersearch-togglelabel',
-               'powersearch-toggleall',
-               'powersearch-togglenone',
-               'search-external',
-               'searchdisabled',
-               'googlesearch',
-               'search-error',
-       ),
-       'opensearch' => array(
-               'opensearch-desc',
-       ),
-       'preferences' => array(
-               'preferences',
-               'preferences-summary',
-               'mypreferences',
-               'prefs-edits',
-               'prefsnologintext2',
-               'prefs-skin',
-               'skin-preview',
-               'datedefault',
-               'prefs-datetime',
-               'prefs-labs',
-               'prefs-user-pages',
-               'prefs-personal',
-               'prefs-rc',
-               'prefs-watchlist',
-               'prefs-watchlist-days',
-               'prefs-watchlist-days-max',
-               'prefs-watchlist-edits',
-               'prefs-watchlist-edits-max',
-               'prefs-watchlist-token',
-               'prefs-misc', // continue checking if used from here on (r49916)
-               'prefs-resetpass',
-               'prefs-changeemail',
-               'prefs-setemail',
-               'prefs-email',
-               'prefs-rendering',
-               'saveprefs',
-               'restoreprefs',
-               'prefs-editing',
-               'rows',
-               'columns',
-               'searchresultshead',
-               'stub-threshold',
-               'stub-threshold-disabled',
-               'recentchangesdays',
-               'recentchangesdays-max',
-               'recentchangescount',
-               'prefs-help-recentchangescount',
-               'prefs-help-watchlist-token2',
-               'savedprefs',
-               'timezonelegend',
-               'localtime',
-               'timezoneuseserverdefault',
-               'timezoneuseoffset',
-               'servertime',
-               'guesstimezone',
-               'timezoneregion-africa',
-               'timezoneregion-america',
-               'timezoneregion-antarctica',
-               'timezoneregion-arctic',
-               'timezoneregion-asia',
-               'timezoneregion-atlantic',
-               'timezoneregion-australia',
-               'timezoneregion-europe',
-               'timezoneregion-indian',
-               'timezoneregion-pacific',
-               'allowemail',
-               'prefs-searchoptions',
-               'prefs-namespaces',
-               'defaultns',
-               'default',
-               'prefs-files',
-               'prefs-custom-css',
-               'prefs-custom-js',
-               'prefs-common-css-js',
-               'prefs-reset-intro',
-               'prefs-emailconfirm-label',
-               'youremail',
-               'username',
-               'uid',
-               'prefs-memberingroups',
-               'prefs-memberingroups-type',
-               'prefs-registration',
-               'prefs-registration-date-time',
-               'yourrealname',
-               'yourlanguage',
-               'yourvariant',
-               'prefs-help-variant',
-               'yournick',
-               'prefs-help-signature',
-               'badsig',
-               'badsiglength',
-               'yourgender',
-               'gender-unknown',
-               'gender-male',
-               'gender-female',
-               'prefs-help-gender',
-               'email',
-               'prefs-help-realname',
-
-               # 3 messages depending upon $wgEmailConfirmToEdit and $wgEnableUserEmail
-               'prefs-help-email',
-               'prefs-help-email-others',
-               'prefs-help-email-required',
-
-               'prefs-info',
-               'prefs-i18n',
-               'prefs-signature',
-               'prefs-dateformat',
-               'prefs-timeoffset',
-               'prefs-advancedediting',
-               'prefs-editor',
-               'prefs-preview',
-               'prefs-advancedrc',
-               'prefs-advancedrendering',
-               'prefs-advancedsearchoptions',
-               'prefs-advancedwatchlist',
-               'prefs-displayrc',
-               'prefs-displaysearchoptions',
-               'prefs-displaywatchlist',
-               'prefs-tokenwatchlist',
-               'prefs-diffs',
-               'prefs-help-prefershttps',
-               'prefs-tabs-navigation-hint',
-       ),
-       'preferences-email' => array(
-               'email-address-validity-valid',
-               'email-address-validity-invalid',
-       ),
-       'userrights' => array(
-               'userrights',
-               'userrights-summary',
-               'userrights-lookup-user',
-               'userrights-user-editname',
-               'editusergroup',
-               'editinguser',
-               'userrights-editusergroup',
-               'saveusergroups',
-               'userrights-groupsmember',
-               'userrights-groupsmember-auto',
-               'userrights-groupsmember-type',
-               'userrights-groups-help',
-               'userrights-reason',
-               'userrights-no-interwiki',
-               'userrights-nodatabase',
-               'userrights-nologin',
-               'userrights-notallowed',
-               'userrights-changeable-col',
-               'userrights-unchangeable-col',
-               'userrights-irreversible-marker',
-               'userrights-conflict',
-               'userrights-removed-self',
-       ),
-       'group' => array(
-               'group',
-               'group-user',
-               'group-autoconfirmed',
-               'group-bot',
-               'group-sysop',
-               'group-bureaucrat',
-               'group-suppress',
-               'group-all',
-       ),
-       'group-member' => array(
-               'group-user-member',
-               'group-autoconfirmed-member',
-               'group-bot-member',
-               'group-sysop-member',
-               'group-bureaucrat-member',
-               'group-suppress-member',
-       ),
-       'grouppage' => array(
-               'grouppage-user',
-               'grouppage-autoconfirmed',
-               'grouppage-bot',
-               'grouppage-sysop',
-               'grouppage-bureaucrat',
-               'grouppage-suppress',
-       ),
-       'right' => array(
-               'right-read',
-               'right-edit',
-               'right-createpage',
-               'right-createtalk',
-               'right-createaccount',
-               'right-minoredit',
-               'right-move',
-               'right-move-subpages',
-               'right-move-rootuserpages',
-               'right-movefile',
-               'right-suppressredirect',
-               'right-upload',
-               'right-reupload',
-               'right-reupload-own',
-               'right-reupload-shared',
-               'right-upload_by_url',
-               'right-purge',
-               'right-autoconfirmed',
-               'right-bot',
-               'right-nominornewtalk',
-               'right-apihighlimits',
-               'right-writeapi',
-               'right-delete',
-               'right-bigdelete',
-               'right-deletelogentry',
-               'right-deleterevision',
-               'right-deletedhistory',
-               'right-deletedtext',
-               'right-browsearchive',
-               'right-undelete',
-               'right-suppressrevision',
-               'right-suppressionlog',
-               'right-block',
-               'right-blockemail',
-               'right-hideuser',
-               'right-ipblock-exempt',
-               'right-proxyunbannable',
-               'right-unblockself',
-               'right-protect',
-               'right-editprotected',
-               'right-editsemiprotected',
-               'right-editinterface',
-               'right-editusercssjs',
-               'right-editusercss',
-               'right-edituserjs',
-               'right-editmyusercss',
-               'right-editmyuserjs',
-               'right-viewmywatchlist',
-               'right-editmywatchlist',
-               'right-viewmyprivateinfo',
-               'right-editmyprivateinfo',
-               'right-editmyoptions',
-               'right-rollback',
-               'right-markbotedits',
-               'right-noratelimit',
-               'right-import',
-               'right-importupload',
-               'right-patrol',
-               'right-autopatrol',
-               'right-patrolmarks',
-               'right-unwatchedpages',
-               'right-mergehistory',
-               'right-userrights',
-               'right-userrights-interwiki',
-               'right-siteadmin',
-               'right-override-export-depth',
-               'right-sendemail',
-               'right-passwordreset',
-       ),
-       'newuserlog' => array(
-               'newuserlogpage',
-               'newuserlogpagetext',
-       ),
-       'rightslog' => array(
-               'rightslog',
-               'rightslogtext',
-       ),
-       'action' => array(
-               'action-read',
-               'action-edit',
-               'action-createpage',
-               'action-createtalk',
-               'action-createaccount',
-               'action-minoredit',
-               'action-move',
-               'action-move-subpages',
-               'action-move-rootuserpages',
-               'action-movefile',
-               'action-upload',
-               'action-reupload',
-               'action-reupload-shared',
-               'action-upload_by_url',
-               'action-writeapi',
-               'action-delete',
-               'action-deleterevision',
-               'action-deletedhistory',
-               'action-browsearchive',
-               'action-undelete',
-               'action-suppressrevision',
-               'action-suppressionlog',
-               'action-block',
-               'action-protect',
-               'action-rollback',
-               'action-import',
-               'action-importupload',
-               'action-patrol',
-               'action-autopatrol',
-               'action-unwatchedpages',
-               'action-mergehistory',
-               'action-userrights',
-               'action-userrights-interwiki',
-               'action-siteadmin',
-               'action-sendemail',
-               'action-editmywatchlist',
-               'action-viewmywatchlist',
-               'action-viewmyprivateinfo',
-               'action-editmyprivateinfo',
-       ),
-       'recentchanges' => array(
-               'nchanges',
-               'enhancedrc-since-last-visit',
-               'enhancedrc-history',
-               'recentchanges',
-               'recentchanges-url',
-               'recentchanges-legend',
-               'recentchanges-summary',
-               'recentchangestext',
-               'recentchanges-noresult',
-               'recentchanges-feed-description',
-               'recentchanges-label-newpage',
-               'recentchanges-label-minor',
-               'recentchanges-label-bot',
-               'recentchanges-label-unpatrolled',
-               'recentchanges-label-plusminus',
-               'recentchanges-legend-heading',
-               'recentchanges-legend-newpage',
-               'recentchanges-legend-plusminus',
-               'rcnotefrom',
-               'rclistfrom',
-               'rcshowhideminor',
-               'rcshowhideminor-show',
-               'rcshowhideminor-hide',
-               'rcshowhidebots',
-               'rcshowhidebots-show',
-               'rcshowhidebots-hide',
-               'rcshowhideliu',
-               'rcshowhideliu-show',
-               'rcshowhideliu-hide',
-               'rcshowhideanons',
-               'rcshowhideanons-show',
-               'rcshowhideanons-hide',
-               'rcshowhidepatr',
-               'rcshowhidepatr-show',
-               'rcshowhidepatr-hide',
-               'rcshowhidemine',
-               'rcshowhidemine-show',
-               'rcshowhidemine-hide',
-               'rclinks',
-               'diff',
-               'hist',
-               'hide',
-               'show',
-               'minoreditletter',
-               'newpageletter',
-               'boteditletter',
-               'unpatrolledletter',
-               'number_of_watching_users_RCview',
-               'number_of_watching_users_pageview',
-               'rc_categories',
-               'rc_categories_any',
-               'rc-change-size',
-               'rc-change-size-new',
-               'newsectionsummary',
-               'rc-enhanced-expand',
-               'rc-enhanced-hide',
-               'rc-old-title',
-       ),
-       'recentchangeslinked' => array(
-               'recentchangeslinked',
-               'recentchangeslinked-feed',
-               'recentchangeslinked-toolbox',
-               'recentchangeslinked-title',
-               'recentchangeslinked-summary',
-               'recentchangeslinked-page',
-               'recentchangeslinked-to',
-       ),
-       'upload' => array(
-               'upload',
-               'uploadbtn',
-               'reuploaddesc',
-               'upload-tryagain',
-               'uploadnologin',
-               'uploadnologintext',
-               'upload_directory_missing',
-               'upload_directory_read_only',
-               'uploaderror',
-               'upload-summary',
-               'upload-recreate-warning',
-               'uploadtext',
-               'upload-permitted',
-               'upload-preferred',
-               'upload-prohibited',
-               'uploadfooter',
-               'upload-default-description',
-               'uploadlog',
-               'uploadlogpage',
-               'uploadlogpagetext',
-               'filename',
-               'filedesc',
-               'fileuploadsummary',
-               'filereuploadsummary',
-               'filestatus',
-               'filesource',
-               'uploadedfiles',
-               'ignorewarning',
-               'ignorewarnings',
-               'minlength1',
-               'illegalfilename',
-               'filename-toolong',
-               'badfilename',
-               'filetype-mime-mismatch',
-               'filetype-badmime',
-               'filetype-bad-ie-mime',
-               'filetype-unwanted-type',
-               'filetype-banned-type',
-               'filetype-missing',
-               'empty-file',
-               'file-too-large',
-               'filename-tooshort',
-               'filetype-banned',
-               'verification-error',
-               'hookaborted',
-               'illegal-filename',
-               'overwrite',
-               'unknown-error',
-               'tmp-create-error',
-               'tmp-write-error',
-               'large-file',
-               'largefileserver',
-               'emptyfile',
-               'windows-nonascii-filename',
-               'fileexists',
-               'filepageexists',
-               'fileexists-extension',
-               'fileexists-thumbnail-yes',
-               'file-thumbnail-no',
-               'fileexists-forbidden',
-               'fileexists-shared-forbidden',
-               'file-exists-duplicate',
-               'file-deleted-duplicate',
-               'file-deleted-duplicate-notitle',
-               'uploadwarning',
-               'uploadwarning-text',
-               'savefile',
-               'uploadedimage',
-               'overwroteimage',
-               'uploaddisabled',
-               'copyuploaddisabled',
-               'uploadfromurl-queued',
-               'uploaddisabledtext',
-               'php-uploaddisabledtext',
-               'uploadscripted',
-               'uploadscriptednamespace',
-               'uploadinvalidxml',
-               'uploadvirus',
-               'uploadjava',
-               'upload-source',
-               'sourcefilename',
-               'sourceurl',
-               'destfilename',
-               'upload-maxfilesize',
-               'upload-description',
-               'upload-options',
-               'watchthisupload',
-               'filewasdeleted',
-               'filename-bad-prefix',
-               'filename-prefix-blacklist',
-               'upload-success-subj',
-               'upload-success-msg',
-               'upload-failure-subj',
-               'upload-failure-msg',
-               'upload-warning-subj',
-               'upload-warning-msg',
-       ),
-       'upload-errors' => array(
-               'upload-proto-error',
-               'upload-proto-error-text',
-               'upload-file-error',
-               'upload-file-error-text',
-               'upload-misc-error',
-               'upload-misc-error-text',
-               'upload-too-many-redirects',
-               'upload-unknown-size',
-               'upload-http-error',
-               'upload-copy-upload-invalid-domain',
-       ),
-
-       'filebackend-errors' => array(
-               'backend-fail-stream',
-               'backend-fail-backup',
-               'backend-fail-notexists',
-               'backend-fail-hashes',
-               'backend-fail-notsame',
-               'backend-fail-invalidpath',
-               'backend-fail-delete',
-               'backend-fail-describe',
-               'backend-fail-alreadyexists',
-               'backend-fail-store',
-               'backend-fail-copy',
-               'backend-fail-move',
-               'backend-fail-opentemp',
-               'backend-fail-writetemp',
-               'backend-fail-closetemp',
-               'backend-fail-read',
-               'backend-fail-create',
-               'backend-fail-maxsize',
-               'backend-fail-readonly',
-               'backend-fail-synced',
-               'backend-fail-connect',
-               'backend-fail-internal',
-               'backend-fail-contenttype',
-               'backend-fail-batchsize',
-               'backend-fail-usable'
-       ),
-
-       'filejournal-errors' => array(
-               'filejournal-fail-dbconnect',
-               'filejournal-fail-dbquery'
-       ),
-
-       'lockmanager-errors' => array(
-               'lockmanager-notlocked',
-               'lockmanager-fail-closelock',
-               'lockmanager-fail-deletelock',
-               'lockmanager-fail-acquirelock',
-               'lockmanager-fail-openlock',
-               'lockmanager-fail-releaselock',
-               'lockmanager-fail-db-bucket',
-               'lockmanager-fail-db-release',
-               'lockmanager-fail-svr-acquire',
-               'lockmanager-fail-svr-release'
-       ),
-
-       'zip' => array(
-               'zip-file-open-error',
-               'zip-wrong-format',
-               'zip-bad',
-               'zip-unsupported'
-       ),
-
-       'uploadstash' => array(
-               'uploadstash',
-               'uploadstash-summary',
-               'uploadstash-clear',
-               'uploadstash-nofiles',
-               'uploadstash-badtoken',
-               'uploadstash-errclear',
-               'uploadstash-refresh',
-               'invalid-chunk-offset',
-       ),
-
-       'img-auth' => array(
-               'img-auth-accessdenied',
-               'img-auth-desc',
-               'img-auth-nopathinfo',
-               'img-auth-notindir',
-               'img-auth-badtitle',
-               'img-auth-nologinnWL',
-               'img-auth-nofile',
-               'img-auth-isdir',
-               'img-auth-streaming',
-               'img-auth-public',
-               'img-auth-noread',
-               'img-auth-bad-query-string',
-       ),
-
-       'http-errors' => array(
-               'http-invalid-url',
-               'http-invalid-scheme',
-               'http-request-error',
-               'http-read-error',
-               'http-timed-out',
-               'http-curl-error',
-               'http-bad-status',
-       ),
-
-       'upload-curl-errors' => array(
-               'upload-curl-error6',
-               'upload-curl-error6-text',
-               'upload-curl-error28',
-               'upload-curl-error28-text',
-       ),
-       'licenses' => array(
-               'license',
-               'license-header',
-               'nolicense',
-               'licenses',
-               'license-nopreview',
-               'upload_source_url',
-               'upload_source_file',
-       ),
-       'filelist' => array(
-               'listfiles-summary',
-               'listfiles_search_for',
-               'imgfile',
-               'listfiles',
-               'listfiles_thumb',
-               'listfiles_date',
-               'listfiles_name',
-               'listfiles_user',
-               'listfiles_size',
-               'listfiles_description',
-               'listfiles_count',
-               'listfiles-show-all',
-               'listfiles-latestversion',
-               'listfiles-latestversion-yes',
-               'listfiles-latestversion-no',
-       ),
-       'filedescription' => array(
-               'file-anchor-link',
-               'filehist',
-               'filehist-help',
-               'filehist-deleteall',
-               'filehist-deleteone',
-               'filehist-revert',
-               'filehist-current',
-               'filehist-datetime',
-               'filehist-thumb',
-               'filehist-thumbtext',
-               'filehist-nothumb',
-               'filehist-user',
-               'filehist-dimensions',
-               'filehist-filesize',
-               'filehist-comment',
-               'filehist-missing',
-               'imagelinks',
-               'linkstoimage',
-               'linkstoimage-more',
-               'nolinkstoimage',
-               'morelinkstoimage',
-               'linkstoimage-redirect',
-               'duplicatesoffile',
-               'sharedupload',
-               'sharedupload-desc-there',
-               'sharedupload-desc-here',
-               'sharedupload-desc-edit',
-               'sharedupload-desc-create',
-               'shareddescriptionfollows',
-               'filepage-nofile',
-               'filepage-nofile-link',
-               'uploadnewversion-linktext',
-               'shared-repo-from',
-               'shared-repo',
-               'shared-repo-name-wikimediacommons',
-               'filepage.css',
-               'upload-disallowed-here',
-       ),
-       'filerevert' => array(
-               'filerevert',
-               'filerevert-legend',
-               'filerevert-intro',
-               'filerevert-comment',
-               'filerevert-defaultcomment',
-               'filerevert-submit',
-               'filerevert-success',
-               'filerevert-badversion',
-       ),
-       'filedelete' => array(
-               'filedelete',
-               'filedelete-legend',
-               'filedelete-intro',
-               'filedelete-intro-old',
-               'filedelete-comment',
-               'filedelete-submit',
-               'filedelete-success',
-               'filedelete-success-old',
-               'filedelete-nofile',
-               'filedelete-nofile-old',
-               'filedelete-otherreason',
-               'filedelete-reason-otherlist',
-               'filedelete-reason-dropdown',
-               'filedelete-edit-reasonlist',
-               'filedelete-maintenance',
-               'filedelete-maintenance-title',
-       ),
-       'mimesearch' => array(
-               'mimesearch',
-               'mimesearch-summary',
-               'mimetype',
-               'download',
-       ),
-       'unwatchedpages' => array(
-               'unwatchedpages',
-               'unwatchedpages-summary',
-       ),
-       'listredirects' => array(
-               'listredirects',
-               'listredirects-summary',
-       ),
-       'listduplicatedfiles' => array(
-               'listduplicatedfiles',
-               'listduplicatedfiles-summary',
-               'listduplicatedfiles-entry',
-       ),
-       'unusedtemplates' => array(
-               'unusedtemplates',
-               'unusedtemplates-summary',
-               'unusedtemplatestext',
-               'unusedtemplateswlh',
-       ),
-       'randompage' => array(
-               'randompage',
-               'randompage-nopages',
-               'randompage-url',
-       ),
-       'randomincategory' => array(
-               'randomincategory',
-               'randomincategory-invalidcategory',
-               'randomincategory-nopages',
-               'randomincategory-selectcategory',
-               'randomincategory-selectcategory-submit',
-       ),
-       'randomredirect' => array(
-               'randomredirect',
-               'randomredirect-nopages',
-       ),
-       'statistics' => array(
-               'statistics',
-               'statistics-summary',
-               'statistics-header-pages',
-               'statistics-header-edits',
-               'statistics-header-views',
-               'statistics-header-users',
-               'statistics-header-hooks',
-               'statistics-articles',
-               'statistics-pages',
-               'statistics-pages-desc',
-               'statistics-files',
-               'statistics-edits',
-               'statistics-edits-average',
-               'statistics-views-total',
-               'statistics-views-total-desc',
-               'statistics-views-peredit',
-               'statistics-users',
-               'statistics-users-active',
-               'statistics-users-active-desc',
-               'statistics-mostpopular',
-               'statistics-footer',
-       ),
-       'pageswithprop' => array(
-               'pageswithprop',
-               'pageswithprop-summary',
-               'pageswithprop-legend',
-               'pageswithprop-text',
-               'pageswithprop-prop',
-               'pageswithprop-submit',
-               'pageswithprop-prophidden-long',
-               'pageswithprop-prophidden-binary',
-       ),
-       'doubleredirects' => array(
-               'doubleredirects',
-               'doubleredirects-summary',
-               'doubleredirectstext',
-               'double-redirect-fixed-move',
-               'double-redirect-fixed-maintenance',
-               'double-redirect-fixer',
-       ),
-       'brokenredirects' => array(
-               'brokenredirects',
-               'brokenredirects-summary',
-               'brokenredirectstext',
-               'brokenredirects-edit',
-               'brokenredirects-delete',
-       ),
-       'withoutinterwiki' => array(
-               'withoutinterwiki',
-               'withoutinterwiki-summary',
-               'withoutinterwiki-legend',
-               'withoutinterwiki-submit',
-       ),
-       'fewestrevisions' => array(
-               'fewestrevisions',
-               'fewestrevisions-summary',
-       ),
-       'specialpages' => array(
-               'nbytes',
-               'ncategories',
-               'ninterwikis',
-               'nlinks',
-               'nmembers',
-               'nmemberschanged',
-               'nrevisions',
-               'nviews',
-               'nimagelinks',
-               'ntransclusions',
-               'specialpage-empty',
-               'lonelypages',
-               'lonelypages-summary',
-               'lonelypagestext',
-               'uncategorizedpages',
-               'uncategorizedpages-summary',
-               'uncategorizedcategories',
-               'uncategorizedcategories-summary',
-               'uncategorizedimages',
-               'uncategorizedimages-summary',
-               'uncategorizedtemplates',
-               'uncategorizedtemplates-summary',
-               'unusedcategories',
-               'unusedcategories-summary',
-               'unusedimages',
-               'unusedimages-summary',
-               'popularpages',
-               'popularpages-summary',
-               'wantedcategories',
-               'wantedcategories-summary',
-               'wantedpages',
-               'wantedpages-summary',
-               'wantedpages-badtitle',
-               'wantedfiles',
-               'wantedfiles-summary',
-               'wantedfiletext-cat',
-               'wantedfiletext-nocat',
-               'wantedtemplates',
-               'wantedtemplates-summary',
-               'mostlinked',
-               'mostlinked-summary',
-               'mostlinkedcategories',
-               'mostlinkedcategories-summary',
-               'mostlinkedtemplates',
-               'mostlinkedtemplates-summary',
-               'mostcategories',
-               'mostcategories-summary',
-               'mostimages',
-               'mostimages-summary',
-               'mostinterwikis',
-               'mostinterwikis-summary',
-               'mostrevisions',
-               'mostrevisions-summary',
-               'prefixindex',
-               'prefixindex-namespace',
-               'prefixindex-summary',
-               'prefixindex-strip',
-               'shortpages',
-               'shortpages-summary',
-               'longpages',
-               'longpages-summary',
-               'deadendpages',
-               'deadendpages-summary',
-               'deadendpagestext',
-               'protectedpages',
-               'protectedpages-indef',
-               'protectedpages-summary',
-               'protectedpages-cascade',
-               'protectedpages-noredirect',
-               'protectedpagesempty',
-               'protectedpages-timestamp',
-               'protectedpages-page',
-               'protectedpages-expiry',
-               'protectedpages-performer',
-               'protectedpages-params',
-               'protectedpages-reason',
-               'protectedpages-unknown-timestamp',
-               'protectedpages-unknown-performer',
-               'protectedpages-unknown-reason',
-               'protectedtitles',
-               'protectedtitles-summary',
-               'protectedtitlesempty',
-               'listusers',
-               'listusers-summary',
-               'listusers-editsonly',
-               'listusers-creationsort',
-               'listusers-desc',
-               'usereditcount',
-               'usercreated',
-               'newpages',
-               'newpages-summary',
-               'newpages-username',
-               'ancientpages',
-               'ancientpages-summary',
-               'move',
-               'movethispage',
-               'unusedimagestext',
-               'unusedcategoriestext',
-               'notargettitle',
-               'notargettext',
-               'nopagetitle',
-               'nopagetext',
-               'pager-newer-n',
-               'pager-older-n',
-               'suppress',
-               'querypage-disabled',
-       ),
-       'booksources' => array(
-               'booksources',
-               'booksources-summary',
-               'booksources-search-legend',
-               'booksources-isbn',
-               'booksources-go',
-               'booksources-text',
-               'booksources-invalid-isbn',
-       ),
-       'magicwords' => array(
-               'rfcurl',
-               'pubmedurl',
-       ),
-       'logpages' => array(
-               'specialloguserlabel',
-               'speciallogtitlelabel',
-               'log',
-               'all-logs-page',
-               'alllogstext',
-               'logempty',
-               'log-title-wildcard',
-               'showhideselectedlogentries',
-       ),
-       'allpages' => array(
-               'allpages',
-               'allpages-summary',
-               'alphaindexline',
-               'nextpage',
-               'prevpage',
-               'allpagesfrom',
-               'allpagesto',
-               'allarticles',
-               'allinnamespace',
-               'allpagessubmit',
-               'allpagesprefix',
-               'allpagesbadtitle',
-               'allpages-bad-ns',
-               'allpages-hide-redirects',
-       ),
-       'cachedspecial' => array(
-               'cachedspecial-viewing-cached-ttl',
-               'cachedspecial-viewing-cached-ts',
-               'cachedspecial-refresh-now',
-       ),
-       'categories' => array(
-               'categories',
-               'categories-summary',
-               'categoriespagetext',
-               'categoriesfrom',
-               'special-categories-sort-count',
-               'special-categories-sort-abc',
-       ),
-       'deletedcontribs' => array(
-               'deletedcontributions',
-               'deletedcontributions-summary',
-               'deletedcontributions-title',
-               'sp-deletedcontributions-contribs',
-       ),
-       'linksearch' => array(
-               'linksearch',
-               'linksearch-summary',
-               'linksearch-pat',
-               'linksearch-ns',
-               'linksearch-ok',
-               'linksearch-text',
-               'linksearch-line',
-               'linksearch-error',
-       ),
-       'listusers' => array(
-               'listusersfrom',
-               'listusers-submit',
-               'listusers-noresult',
-               'listusers-blocked',
-       ),
-       'activeusers' => array(
-               'activeusers',
-               'activeusers-summary',
-               'activeusers-intro',
-               'activeusers-count',
-               'activeusers-from',
-               'activeusers-hidebots',
-               'activeusers-hidesysops',
-               'activeusers-submit',
-               'activeusers-noresult',
-       ),
-       'listgrouprights' => array(
-               'listgrouprights',
-               'listgrouprights-summary',
-               'listgrouprights-key',
-               'listgrouprights-group',
-               'listgrouprights-rights',
-               'listgrouprights-helppage',
-               'listgrouprights-members',
-               'listgrouprights-right-display',
-               'listgrouprights-right-revoked',
-               'listgrouprights-addgroup',
-               'listgrouprights-removegroup',
-               'listgrouprights-addgroup-all',
-               'listgrouprights-removegroup-all',
-               'listgrouprights-addgroup-self',
-               'listgrouprights-removegroup-self',
-               'listgrouprights-addgroup-self-all',
-               'listgrouprights-removegroup-self-all',
-
-       ),
-       'emailuser' => array(
-               'mailnologin',
-               'mailnologintext',
-               'emailuser',
-               'emailuser-title-target',
-               'emailuser-title-notarget',
-               'emailuser-summary',
-               'emailpage',
-               'emailpagetext',
-               'usermailererror',
-               'defemailsubject',
-               'usermaildisabled',
-               'usermaildisabledtext',
-               'noemailtitle',
-               'noemailtext',
-               'nowikiemailtitle',
-               'nowikiemailtext',
-               'emailnotarget',
-               'emailtarget',
-               'emailusername',
-               'emailusernamesubmit',
-               'email-legend',
-               'emailfrom',
-               'emailto',
-               'emailsubject',
-               'emailmessage',
-               'emailsend',
-               'emailccme',
-               'emailccsubject',
-               'emailsent',
-               'emailsenttext',
-               'emailuserfooter',
-       ),
-       'usermessage' => array(
-               'usermessage-summary',
-               'usermessage-editor',
-               'usermessage-template',
-       ),
-       'watchlist' => array(
-               'watchlist',
-               'watchlist-summary',
-               'mywatchlist',
-               'watchlistfor2',
-               'nowatchlist',
-               'watchlistanontext',
-               'watchnologin',
-               'watchnologintext',
-               'addwatch',
-               'addedwatchtext',
-               'removewatch',
-               'removedwatchtext',
-               'watch',
-               'watchthispage',
-               'unwatch',
-               'unwatchthispage',
-               'notanarticle',
-               'notvisiblerev',
-               'watchlist-details',
-               'wlheader-enotif',
-               'wlheader-showupdated',
-               'watchmethod-recent',
-               'watchmethod-list',
-               'watchlistcontains',
-               'iteminvalidname',
-               'wlnote2',
-               'wlshowlast',
-               'watchlist-options',
-       ),
-       'watching' => array(
-               'watching',
-               'unwatching',
-               'watcherrortext',
-       ),
-       'enotif' => array(
-               'enotif_mailer',
-               'enotif_reset',
-               'enotif_impersonal_salutation',
-               'enotif_subject_deleted',
-               'enotif_subject_created',
-               'enotif_subject_moved',
-               'enotif_subject_restored',
-               'enotif_subject_changed',
-               'enotif_body_intro_deleted',
-               'enotif_body_intro_created',
-               'enotif_body_intro_moved',
-               'enotif_body_intro_restored',
-               'enotif_body_intro_changed',
-               'enotif_lastvisited',
-               'enotif_lastdiff',
-               'enotif_anon_editor',
-               'enotif_body',
-               'created',
-               'changed',
-       ),
-       'delete' => array(
-               'deletepage',
-               'confirm',
-               'excontent',
-               'excontentauthor',
-               'exbeforeblank',
-               'exblank',
-               'delete-confirm',
-               'delete-legend',
-               'historywarning',
-               'confirmdeletetext',
-               'actioncomplete',
-               'actionfailed',
-               'deletedtext',
-               'dellogpage',
-               'dellogpagetext',
-               'deletionlog',
-               'reverted',
-               'deletecomment',
-               'deleteotherreason',
-               'deletereasonotherlist',
-               'deletereason-dropdown',
-               'delete-edit-reasonlist',
-               'delete-toobig',
-               'delete-warning-toobig',
-               'deleting-backlinks-warning',
-       ),
-       'rollback' => array(
-               'rollback',
-               'rollback_short',
-               'rollbacklink',
-               'rollbacklinkcount',
-               'rollbacklinkcount-morethan',
-               'rollbackfailed',
-               'cantrollback',
-               'alreadyrolled',
-               'editcomment',
-               'revertpage',
-               'revertpage-nouser',
-               'rollback-success',
-       ),
-       'edittokens' => array(
-               'sessionfailure-title',
-               'sessionfailure',
-       ),
-       'protect' => array(
-               'protectlogpage',
-               'protectlogtext',
-               'protectedarticle',
-               'modifiedarticleprotection',
-               'unprotectedarticle',
-               'movedarticleprotection',
-               'protect-title',
-               'protect-title-notallowed',
-               'prot_1movedto2',
-               'protect-badnamespace-title',
-               'protect-badnamespace-text',
-               'protect-norestrictiontypes-text',
-               'protect-norestrictiontypes-title',
-               'protect-legend',
-               'protectcomment',
-               'protectexpiry',
-               'protect_expiry_invalid',
-               'protect_expiry_old',
-               'protect-unchain-permissions',
-               'protect-text',
-               'protect-locked-blocked',
-               'protect-locked-dblock',
-               'protect-locked-access',
-               'protect-cascadeon',
-               'protect-default',
-               'protect-fallback',
-               'protect-level-autoconfirmed',
-               'protect-level-sysop',
-               'protect-summary-desc',
-               'protect-summary-cascade',
-               'protect-expiring',
-               'protect-expiring-local',
-               'protect-expiry-indefinite',
-               'protect-cascade',
-               'protect-cantedit',
-               'protect-othertime',
-               'protect-othertime-op',
-               'protect-existing-expiry',
-               'protect-otherreason',
-               'protect-otherreason-op',
-               'protect-dropdown',
-               'protect-edit-reasonlist',
-               'protect-expiry-options',
-               'restriction-type',
-               'restriction-level',
-               'minimum-size',
-               'maximum-size',
-               'pagesize',
-       ),
-       'restrictions' => array(
-               'restriction-edit',
-               'restriction-move',
-               'restriction-create',
-               'restriction-upload',
-       ),
-       'restriction-levels' => array(
-               'restriction-level-sysop',
-               'restriction-level-autoconfirmed',
-               'restriction-level-all',
-       ),
-       'undelete' => array(
-               'undelete',
-               'undelete-summary',
-               'undeletepage',
-               'undeletepagetitle',
-               'viewdeletedpage',
-               'undeletepagetext',
-               'undelete-fieldset-title',
-               'undeleteextrahelp',
-               'undeleterevisions',
-               'undeletehistory',
-               'undeleterevdel',
-               'undeletehistorynoadmin',
-               'undelete-revision',
-               'undeleterevision-missing',
-               'undelete-nodiff',
-               'undeletebtn',
-               'undeletelink',
-               'undeleteviewlink',
-               'undeleteinvert',
-               'undeletecomment',
-               'undeletedrevisions',
-               'undeletedrevisions-files',
-               'undeletedfiles',
-               'cannotundelete',
-               'undeletedpage',
-               'undelete-header',
-               'undelete-search-title',
-               'undelete-search-box',
-               'undelete-search-prefix',
-               'undelete-search-submit',
-               'undelete-no-results',
-               'undelete-filename-mismatch',
-               'undelete-bad-store-key',
-               'undelete-cleanup-error',
-               'undelete-missing-filearchive',
-               'undelete-error',
-               'undelete-error-short',
-               'undelete-error-long',
-               'undelete-show-file-confirm',
-               'undelete-show-file-submit',
-               'undelete-revision-row',
-       ),
-       'nsform' => array(
-               'namespace',
-               'invert',
-               'tooltip-invert',
-               'namespace_association',
-               'tooltip-namespace_association',
-               'blanknamespace',
-       ),
-       'contributions' => array(
-               'contributions',
-               'contributions-summary',
-               'contributions-title',
-               'mycontris',
-               'contribsub2',
-               'nocontribs',
-               'uctop',
-               'month',
-               'year',
-       ),
-       'sp-contributions' => array(
-               'sp-contributions-newbies',
-               'sp-contributions-newbies-sub',
-               'sp-contributions-newbies-title',
-               'sp-contributions-blocklog',
-               'sp-contributions-deleted',
-               'sp-contributions-uploads',
-               'sp-contributions-logs',
-               'sp-contributions-talk',
-               'sp-contributions-userrights',
-               'sp-contributions-blocked-notice',
-               'sp-contributions-blocked-notice-anon',
-               'sp-contributions-search',
-               'sp-contributions-suppresslog',
-               'sp-contributions-username',
-               'sp-contributions-toponly',
-               'sp-contributions-newonly',
-               'sp-contributions-submit',
-               'sp-contributions-explain',
-               'sp-contributions-footer',
-               'sp-contributions-footer-anon',
-               'sp-contributions-footer-newbies',
-       ),
-       'whatlinkshere' => array(
-               'whatlinkshere',
-               'whatlinkshere-title',
-               'whatlinkshere-summary',
-               'whatlinkshere-page',
-               'linkshere',
-               'nolinkshere',
-               'nolinkshere-ns',
-               'isredirect',
-               'istemplate',
-               'isimage',
-               'whatlinkshere-prev',
-               'whatlinkshere-next',
-               'whatlinkshere-links',
-               'whatlinkshere-hideredirs',
-               'whatlinkshere-hidetrans',
-               'whatlinkshere-hidelinks',
-               'whatlinkshere-hideimages',
-               'whatlinkshere-filters',
-       ),
-       'block' => array(
-               'autoblockid',
-               'block',
-               'unblock',
-               'unblock-summary',
-               'blockip',
-               'blockip-legend',
-               'blockiptext',
-               'ipadressorusername',
-               'ipbexpiry',
-               'ipbreason',
-               'ipbreason-dropdown',
-               'ipb-hardblock',
-               'ipbcreateaccount',
-               'ipbemailban',
-               'ipbenableautoblock',
-               'ipbsubmit',
-               'ipbother',
-               'ipboptions',
-               'ipbhidename',
-               'ipbwatchuser',
-               'ipb-disableusertalk',
-               'ipb-change-block',
-               'ipb-confirm',
-               'badipaddress',
-               'blockipsuccesssub',
-               'blockipsuccesstext',
-               'ipb-blockingself',
-               'ipb-confirmhideuser',
-               'ipb-confirmaction',
-               'ipb-edit-dropdown',
-               'ipb-unblock-addr',
-               'ipb-unblock',
-               'ipb-blocklist',
-               'ipb-blocklist-contribs',
-               'unblockip',
-               'unblockiptext',
-               'ipusubmit',
-               'unblocked',
-               'unblocked-range',
-               'unblocked-id',
-               'blocklist',
-               'ipblocklist',
-               'ipblocklist-legend',
-               'blocklist-userblocks',
-               'blocklist-tempblocks',
-               'blocklist-addressblocks',
-               'blocklist-rangeblocks',
-               'blocklist-timestamp',
-               'blocklist-target',
-               'blocklist-expiry',
-               'blocklist-by',
-               'blocklist-params',
-               'blocklist-reason',
-               'blocklist-summary',
-               'ipblocklist-submit',
-               'ipblocklist-localblock',
-               'ipblocklist-otherblocks',
-
-               'infiniteblock',
-               'expiringblock',
-               'anononlyblock',
-               'noautoblockblock',
-               'createaccountblock',
-               'emailblock',
-               'blocklist-nousertalk',
-               'ipblocklist-empty',
-               'ipblocklist-no-results',
-               'blocklink',
-               'unblocklink',
-               'change-blocklink',
-               'contribslink',
-               'emaillink',
-               'autoblocker',
-               'blocklogpage',
-               'blocklog-showlog',
-               'blocklog-showsuppresslog',
-               'blocklogentry',
-               'reblock-logentry',
-               'blocklogtext',
-               'unblocklogentry',
-               'block-log-flags-anononly',
-               'block-log-flags-nocreate',
-               'block-log-flags-noautoblock',
-               'block-log-flags-noemail',
-               'block-log-flags-nousertalk',
-               'block-log-flags-angry-autoblock',
-               'block-log-flags-hiddenname',
-               'range_block_disabled',
-               'ipb_expiry_invalid',
-               'ipb_expiry_temp',
-               'ipb_hide_invalid',
-               'ipb_already_blocked',
-               'ipb-needreblock',
-               'ipb-otherblocks-header',
-               'unblock-hideuser',
-               'ipb_cant_unblock',
-               'ipb_blocked_as_range',
-               'ip_range_invalid',
-               'ip_range_toolarge',
-               'proxyblocker',
-               'proxyblockreason',
-               'sorbs',
-               'sorbsreason',
-               'sorbs_create_account_reason',
-               'xffblockreason',
-               'cant-see-hidden-user',
-               'ipbblocked',
-               'ipbnounblockself',
-               'ipb-default-expiry',
-       ),
-       'developertools' => array(
-               'lockdb',
-               'unlockdb',
-               'lockdbtext',
-               'unlockdbtext',
-               'lockconfirm',
-               'unlockconfirm',
-               'lockbtn',
-               'unlockbtn',
-               'locknoconfirm',
-               'lockdbsuccesssub',
-               'unlockdbsuccesssub',
-               'lockdbsuccesstext',
-               'unlockdbsuccesstext',
-               'lockfilenotwritable',
-               'databasenotlocked',
-               'lockedbyandtime',
-       ),
-       'movepage' => array(
-               'move-page',
-               'movepage-summary',
-               'move-page-legend',
-               'movepagetext',
-               'movepagetext-noredirectfixer',
-               'movepagetalktext',
-               'movearticle',
-               'moveuserpage-warning',
-               'movenologintext',
-               'movenotallowed',
-               'movenotallowedfile',
-               'cant-move-user-page',
-               'cant-move-to-user-page',
-               'newtitle',
-               'move-watch',
-               'movepagebtn',
-               'pagemovedsub',
-               'movepage-moved',
-               'movepage-moved-redirect',
-               'movepage-moved-noredirect',
-               'articleexists',
-               'cantmove-titleprotected',
-               'movetalk',
-               'move-subpages',
-               'move-talk-subpages',
-               'movepage-page-exists',
-               'movepage-page-moved',
-               'movepage-page-unmoved',
-               'movepage-max-pages',
-               'movelogpage',
-               'movelogpagetext',
-               'movesubpage',
-               'movesubpagetext',
-               'movenosubpage',
-               'movereason',
-               'move-redirect-text',
-               'revertmove',
-               'delete_and_move',
-               'delete_and_move_text',
-               'delete_and_move_confirm',
-               'delete_and_move_reason',
-               'selfmove',
-               'immobile-source-namespace',
-               'immobile-target-namespace',
-               'immobile-target-namespace-iw',
-               'immobile-source-page',
-               'immobile-target-page',
-               'bad-target-model',
-               'immobile_namespace',
-               'imagenocrossnamespace',
-               'nonfile-cannot-move-to-file',
-               'imagetypemismatch',
-               'imageinvalidfilename',
-               'fix-double-redirects',
-               'move-leave-redirect',
-               'protectedpagemovewarning',
-               'semiprotectedpagemovewarning',
-               'move-over-sharedrepo',
-               'file-exists-sharedrepo',
-       ),
-       'export' => array(
-               'export',
-               'export-summary',
-               'exporttext',
-               'exportall',
-               'exportcuronly',
-               'exportnohistory',
-               'exportlistauthors',
-               'export-submit',
-               'export-addcattext',
-               'export-addcat',
-               'export-addnstext',
-               'export-addns',
-               'export-download',
-               'export-templates',
-               'export-pagelinks',
-       ),
-       'allmessages' => array(
-               'allmessages',
-               'allmessagesname',
-               'allmessagesdefault',
-               'allmessagescurrent',
-               'allmessagestext',
-               'allmessagesnotsupportedDB',
-               'allmessages-filter-legend',
-               'allmessages-filter',
-               'allmessages-filter-unmodified',
-               'allmessages-filter-all',
-               'allmessages-filter-modified',
-               'allmessages-prefix',
-               'allmessages-language',
-               'allmessages-filter-submit',
-               'allmessages-filter-translate',
-       ),
-       'thumbnails' => array(
-               'thumbnail-more',
-               'filemissing',
-               'thumbnail_error',
-               'thumbnail_error_remote',
-               'djvu_page_error',
-               'djvu_no_xml',
-               'thumbnail-temp-create',
-               'thumbnail-dest-create',
-               'thumbnail_invalid_params',
-               'thumbnail_dest_directory',
-               'thumbnail_image-type',
-               'thumbnail_gd-library',
-               'thumbnail_image-missing',
-               'thumbnail_image-failure-limit'
-       ),
-       'import' => array(
-               'import',
-               'import-summary',
-               'importinterwiki',
-               'import-interwiki-text',
-               'import-interwiki-source',
-               'import-interwiki-history',
-               'import-interwiki-templates',
-               'import-interwiki-submit',
-               'import-interwiki-namespace',
-               'import-interwiki-rootpage',
-               'import-upload-filename',
-               'import-comment',
-               'importtext',
-               'importstart',
-               'import-revision-count',
-               'importnopages',
-               'imported-log-entries',
-               'importfailed',
-               'importunknownsource',
-               'importcantopen',
-               'importbadinterwiki',
-               'importnotext',
-               'importsuccess',
-               'importhistoryconflict',
-               'importnosources',
-               'importnofile',
-               'importuploaderrorsize',
-               'importuploaderrorpartial',
-               'importuploaderrortemp',
-               'import-parse-failure',
-               'import-noarticle',
-               'import-nonewrevisions',
-               'xml-error-string',
-               'import-upload',
-               'import-token-mismatch',
-               'import-invalid-interwiki',
-               'import-error-edit',
-               'import-error-create',
-               'import-error-interwiki',
-               'import-error-special',
-               'import-error-invalid',
-               'import-error-unserialize',
-               'import-error-bad-location',
-               'import-options-wrong',
-               'import-rootpage-invalid',
-               'import-rootpage-nosubpage',
-       ),
-       'importlog' => array(
-               'importlogpage',
-               'importlogpagetext',
-               'import-logentry-upload',
-               'import-logentry-upload-detail',
-               'import-logentry-interwiki',
-               'import-logentry-interwiki-detail',
-       ),
-       'javaccripttest' => array(
-               'javascripttest',
-               'javascripttest-backlink',
-               'javascripttest-title',
-               'javascripttest-pagetext-noframework',
-               'javascripttest-pagetext-unknownframework',
-               'javascripttest-pagetext-frameworks',
-               'javascripttest-pagetext-skins',
-               'javascripttest-qunit-name',
-               'javascripttest-qunit-intro',
-               'javascripttest-qunit-heading',
-       ),
-       'accesskeys' => array(
-               'accesskey-pt-userpage',
-               'accesskey-pt-anonuserpage',
-               'accesskey-pt-mytalk',
-               'accesskey-pt-anontalk',
-               'accesskey-pt-preferences',
-               'accesskey-pt-watchlist',
-               'accesskey-pt-mycontris',
-               'accesskey-pt-login',
-               'accesskey-pt-logout',
-               'accesskey-ca-talk',
-               'accesskey-ca-edit',
-               'accesskey-ca-addsection',
-               'accesskey-ca-viewsource',
-               'accesskey-ca-history',
-               'accesskey-ca-protect',
-               'accesskey-ca-unprotect',
-               'accesskey-ca-delete',
-               'accesskey-ca-undelete',
-               'accesskey-ca-move',
-               'accesskey-ca-watch',
-               'accesskey-ca-unwatch',
-               'accesskey-search',
-               'accesskey-search-go',
-               'accesskey-search-fulltext',
-               'accesskey-p-logo',
-               'accesskey-n-mainpage',
-               'accesskey-n-mainpage-description',
-               'accesskey-n-portal',
-               'accesskey-n-currentevents',
-               'accesskey-n-recentchanges',
-               'accesskey-n-randompage',
-               'accesskey-n-help',
-               'accesskey-t-whatlinkshere',
-               'accesskey-t-recentchangeslinked',
-               'accesskey-t-random',
-               'accesskey-feed-rss',
-               'accesskey-feed-atom',
-               'accesskey-t-contributions',
-               'accesskey-t-emailuser',
-               'accesskey-t-permalink',
-               'accesskey-t-print',
-               'accesskey-t-upload',
-               'accesskey-t-specialpages',
-               'accesskey-ca-nstab-main',
-               'accesskey-ca-nstab-user',
-               'accesskey-ca-nstab-media',
-               'accesskey-ca-nstab-special',
-               'accesskey-ca-nstab-project',
-               'accesskey-ca-nstab-image',
-               'accesskey-ca-nstab-mediawiki',
-               'accesskey-ca-nstab-template',
-               'accesskey-ca-nstab-help',
-               'accesskey-ca-nstab-category',
-               'accesskey-minoredit',
-               'accesskey-save',
-               'accesskey-preview',
-               'accesskey-diff',
-               'accesskey-compareselectedversions',
-               'accesskey-watch',
-               'accesskey-upload',
-               'accesskey-preferences-save',
-               'accesskey-summary',
-               'accesskey-userrights-set',
-               'accesskey-blockip-block',
-               'accesskey-export',
-               'accesskey-import',
-               'accesskey-watchlistedit-normal-submit',
-               'accesskey-watchlistedit-raw-submit',
-       ),
-       'tooltips' => array(
-               'tooltip-pt-userpage',
-               'tooltip-pt-anonuserpage',
-               'tooltip-pt-mytalk',
-               'tooltip-pt-anontalk',
-               'tooltip-pt-preferences',
-               'tooltip-pt-watchlist',
-               'tooltip-pt-mycontris',
-               'tooltip-pt-login',
-               'tooltip-pt-logout',
-               'tooltip-ca-talk',
-               'tooltip-ca-edit',
-               'tooltip-ca-addsection',
-               'tooltip-ca-viewsource',
-               'tooltip-ca-history',
-               'tooltip-ca-protect',
-               'tooltip-ca-unprotect',
-               'tooltip-ca-delete',
-               'tooltip-ca-undelete',
-               'tooltip-ca-move',
-               'tooltip-ca-watch',
-               'tooltip-ca-unwatch',
-               'tooltip-search',
-               'tooltip-search-go',
-               'tooltip-search-fulltext',
-               'tooltip-p-logo',
-               'tooltip-n-mainpage',
-               'tooltip-n-mainpage-description',
-               'tooltip-n-portal',
-               'tooltip-n-currentevents',
-               'tooltip-n-recentchanges',
-               'tooltip-n-randompage',
-               'tooltip-n-help',
-               'tooltip-t-whatlinkshere',
-               'tooltip-t-recentchangeslinked',
-               'tooltip-t-random',
-               'tooltip-feed-rss',
-               'tooltip-feed-atom',
-               'tooltip-t-contributions',
-               'tooltip-t-emailuser',
-               'tooltip-t-upload',
-               'tooltip-t-specialpages',
-               'tooltip-t-print',
-               'tooltip-t-permalink',
-               'tooltip-ca-nstab-main',
-               'tooltip-ca-nstab-user',
-               'tooltip-ca-nstab-media',
-               'tooltip-ca-nstab-special',
-               'tooltip-ca-nstab-project',
-               'tooltip-ca-nstab-image',
-               'tooltip-ca-nstab-mediawiki',
-               'tooltip-ca-nstab-template',
-               'tooltip-ca-nstab-help',
-               'tooltip-ca-nstab-category',
-               'tooltip-minoredit',
-               'tooltip-save',
-               'tooltip-preview',
-               'tooltip-diff',
-               'tooltip-compareselectedversions',
-               'tooltip-watch',
-               'tooltip-watchlistedit-normal-submit',
-               'tooltip-watchlistedit-raw-submit',
-               'tooltip-recreate',
-               'tooltip-upload',
-               'tooltip-rollback',
-               'tooltip-undo',
-               'tooltip-preferences-save',
-               'tooltip-summary',
-               'interlanguage-link-title',
-               'interlanguage-link-title-langonly',
-       ),
-       'stylesheets' => array(
-               'common.css',
-               'cologneblue.css',
-               'monobook.css',
-               'modern.css',
-               'vector.css',
-               'print.css',
-               'noscript.css',
-               'group-autoconfirmed.css',
-               'group-user.css',
-               'group-bot.css',
-               'group-sysop.css',
-               'group-bureaucrat.css',
-       ),
-       'scripts' => array(
-               'common.js',
-               'cologneblue.js',
-               'monobook.js',
-               'modern.js',
-               'vector.js',
-               'group-autoconfirmed.js',
-               'group-user.js',
-               'group-bot.js',
-               'group-sysop.js',
-               'group-bureaucrat.js',
-       ),
-       'metadata_cc' => array(
-               'notacceptable',
-       ),
-       'attribution' => array(
-               'anonymous',
-               'siteuser',
-               'anonuser',
-               'lastmodifiedatby',
-               'othercontribs',
-               'others',
-               'siteusers',
-               'anonusers',
-               'creditspage',
-               'nocredits',
-       ),
-       'spamprotection' => array(
-               'spamprotectiontitle',
-               'spamprotectiontext',
-               'spamprotectionmatch',
-               'spambot_username',
-               'spam_reverting',
-               'spam_blanking',
-               'spam_deleting',
-               'simpleantispam-label',
-       ),
-       'info' => array(
-               'pageinfo-header',
-               'pageinfo-title',
-               'pageinfo-not-current',
-               'pageinfo-header-basic',
-               'pageinfo-header-edits',
-               'pageinfo-header-restrictions',
-               'pageinfo-header-properties',
-               'pageinfo-display-title',
-               'pageinfo-default-sort',
-               'pageinfo-length',
-               'pageinfo-article-id',
-               'pageinfo-language',
-               'pageinfo-content-model',
-               'pageinfo-robot-policy',
-               'pageinfo-robot-index',
-               'pageinfo-robot-noindex',
-               'pageinfo-views',
-               'pageinfo-watchers',
-               'pageinfo-few-watchers',
-               'pageinfo-redirects-name',
-               'pageinfo-redirects-value',
-               'pageinfo-subpages-name',
-               'pageinfo-subpages-value',
-               'pageinfo-firstuser',
-               'pageinfo-firsttime',
-               'pageinfo-lastuser',
-               'pageinfo-lasttime',
-               'pageinfo-edits',
-               'pageinfo-authors',
-               'pageinfo-recent-edits',
-               'pageinfo-recent-authors',
-               'pageinfo-magic-words',
-               'pageinfo-hidden-categories',
-               'pageinfo-templates',
-               'pageinfo-transclusions',
-               'pageinfo-footer',
-               'pageinfo-toolboxlink',
-               'pageinfo-redirectsto',
-               'pageinfo-redirectsto-info',
-               'pageinfo-contentpage',
-               'pageinfo-contentpage-yes',
-               'pageinfo-protect-cascading',
-               'pageinfo-protect-cascading-yes',
-               'pageinfo-protect-cascading-from',
-               'pageinfo-category-info',
-               'pageinfo-category-pages',
-               'pageinfo-category-subcats',
-               'pageinfo-category-files'
-       ),
-       'skin' => array(
-               'skinname-cologneblue',
-               'skinname-monobook',
-               'skinname-modern',
-               'skinname-vector',
-       ),
-       'patrolling' => array(
-               'markaspatrolleddiff',
-               'markaspatrolledlink',
-               'markaspatrolledtext',
-               'markedaspatrolled',
-               'markedaspatrolledtext',
-               'rcpatroldisabled',
-               'rcpatroldisabledtext',
-               'markedaspatrollederror',
-               'markedaspatrollederrortext',
-               'markedaspatrollederror-noautopatrol',
-               'markedaspatrollednotify',
-               'markedaspatrollederrornotify',
-       ),
-       'patrol-log' => array(
-               'patrol-log-page',
-               'patrol-log-header',
-               'log-show-hide-patrol',
-       ),
-       'imagedeletion' => array(
-               'deletedrevision',
-               'filedeleteerror-short',
-               'filedeleteerror-long',
-               'filedelete-missing',
-               'filedelete-old-unregistered',
-               'filedelete-current-unregistered',
-               'filedelete-archive-read-only',
-       ),
-       'browsediffs' => array(
-               'previousdiff',
-               'nextdiff',
-       ),
-       'media-info' => array(
-               'mediawarning',
-               'imagemaxsize',
-               'thumbsize',
-               'widthheight',
-               'widthheightpage',
-               'file-info',
-               'file-info-size',
-               'file-info-size-pages',
-               'file-nohires',
-               'svg-long-desc',
-               'svg-long-desc-animated',
-               'svg-long-error',
-               'show-big-image',
-               'show-big-image-preview',
-               'show-big-image-other',
-               'show-big-image-size',
-               'file-info-gif-looped',
-               'file-info-gif-frames',
-               'file-info-png-looped',
-               'file-info-png-repeat',
-               'file-info-png-frames',
-               'file-no-thumb-animation',
-               'file-no-thumb-animation-gif',
-       ),
-       'newfiles' => array(
-               'newimages',
-               'imagelisttext',
-               'newimages-summary',
-               'newimages-legend',
-               'newimages-label',
-               'showhidebots',
-               'noimages',
-               'ilsubmit',
-               'bydate',
-               'sp-newimages-showfrom',
-       ),
-       'video-info' => array(
-               'video-dims',
-               'seconds-abbrev',
-               'minutes-abbrev',
-               'hours-abbrev',
-               'days-abbrev',
-               'seconds',
-               'minutes',
-               'hours',
-               'days',
-               'weeks',
-               'months',
-               'years',
-               'ago',
-               'just-now',
-       ),
-       'human-timestamps' => array(
-               'hours-ago',
-               'minutes-ago',
-               'seconds-ago',
-               'monday-at',
-               'tuesday-at',
-               'wednesday-at',
-               'thursday-at',
-               'friday-at',
-               'saturday-at',
-               'sunday-at',
-               'today-at',
-               'yesterday-at',
-       ),
-       'badimagelist' => array(
-               'bad_image_list',
-       ),
-       'variantname-zh' => array(
-               'variantname-zh-hans',
-               'variantname-zh-hant',
-               'variantname-zh-cn',
-               'variantname-zh-tw',
-               'variantname-zh-hk',
-               'variantname-zh-mo',
-               'variantname-zh-sg',
-               'variantname-zh-my',
-               'variantname-zh',
-       ),
-       'variantname-gan' => array(
-               'variantname-gan-hans',
-               'variantname-gan-hant',
-               'variantname-gan',
-       ),
-       'variantname-sr' => array(
-               'variantname-sr-ec',
-               'variantname-sr-el',
-               'variantname-sr',
-       ),
-       'variantname-kk' => array(
-               'variantname-kk-kz',
-               'variantname-kk-tr',
-               'variantname-kk-cn',
-               'variantname-kk-cyrl',
-               'variantname-kk-latn',
-               'variantname-kk-arab',
-               'variantname-kk',
-       ),
-       'variantname-ku' => array(
-               'variantname-ku-arab',
-               'variantname-ku-latn',
-               'variantname-ku',
-       ),
-       'variantname-tg' => array(
-               'variantname-tg-cyrl',
-               'variantname-tg-latn',
-               'variantname-tg',
-       ),
-       'variantname-iu' => array(
-               'variantname-ike-cans',
-               'variantname-ike-latn',
-               'variantname-iu',
-       ),
-       'variantname-shi' => array(
-               'variantname-shi-tfng',
-               'variantname-shi-latn',
-               'variantname-shi',
-       ),
-       'metadata' => array(
-               'metadata',
-               'metadata-help',
-               'metadata-expand',
-               'metadata-collapse',
-               'metadata-fields',
-               'metadata-langitem',
-               'metadata-langitem-default',
-       ),
-       'exif' => array(
-               'exif-imagewidth',
-               'exif-imagelength',
-               'exif-bitspersample',
-               'exif-compression',
-               'exif-photometricinterpretation',
-               'exif-orientation',
-               'exif-samplesperpixel',
-               'exif-planarconfiguration',
-               'exif-ycbcrsubsampling',
-               'exif-ycbcrpositioning',
-               'exif-xresolution',
-               'exif-yresolution',
-               'exif-resolutionunit',
-               'exif-stripoffsets',
-               'exif-rowsperstrip',
-               'exif-stripbytecounts',
-               'exif-jpeginterchangeformat',
-               'exif-jpeginterchangeformatlength',
-               'exif-whitepoint',
-               'exif-primarychromaticities',
-               'exif-ycbcrcoefficients',
-               'exif-referenceblackwhite',
-               'exif-datetime',
-               'exif-imagedescription',
-               'exif-make',
-               'exif-model',
-               'exif-software',
-               'exif-artist',
-               'exif-copyright',
-               'exif-exifversion',
-               'exif-flashpixversion',
-               'exif-colorspace',
-               'exif-componentsconfiguration',
-               'exif-compressedbitsperpixel',
-               'exif-pixelydimension',
-               'exif-pixelxdimension',
-               'exif-usercomment',
-               'exif-relatedsoundfile',
-               'exif-datetimeoriginal',
-               'exif-datetimedigitized',
-               'exif-subsectime',
-               'exif-subsectimeoriginal',
-               'exif-subsectimedigitized',
-               'exif-exposuretime',
-               'exif-exposuretime-format',
-               'exif-fnumber',
-               'exif-fnumber-format',
-               'exif-exposureprogram',
-               'exif-spectralsensitivity',
-               'exif-isospeedratings',
-               'exif-shutterspeedvalue',
-               'exif-aperturevalue',
-               'exif-brightnessvalue',
-               'exif-exposurebiasvalue',
-               'exif-maxaperturevalue',
-               'exif-subjectdistance',
-               'exif-meteringmode',
-               'exif-lightsource',
-               'exif-flash',
-               'exif-focallength',
-               'exif-focallength-format',
-               'exif-subjectarea',
-               'exif-flashenergy',
-               'exif-focalplanexresolution',
-               'exif-focalplaneyresolution',
-               'exif-focalplaneresolutionunit',
-               'exif-subjectlocation',
-               'exif-exposureindex',
-               'exif-sensingmethod',
-               'exif-filesource',
-               'exif-scenetype',
-               'exif-customrendered',
-               'exif-exposuremode',
-               'exif-whitebalance',
-               'exif-digitalzoomratio',
-               'exif-focallengthin35mmfilm',
-               'exif-scenecapturetype',
-               'exif-gaincontrol',
-               'exif-contrast',
-               'exif-saturation',
-               'exif-sharpness',
-               'exif-devicesettingdescription',
-               'exif-subjectdistancerange',
-               'exif-imageuniqueid',
-               'exif-gpsversionid',
-               'exif-gpslatituderef',
-               'exif-gpslatitude',
-               'exif-gpslongituderef',
-               'exif-gpslongitude',
-               'exif-gpsaltituderef',
-               'exif-gpsaltitude',
-               'exif-gpstimestamp',
-               'exif-gpssatellites',
-               'exif-gpsstatus',
-               'exif-gpsmeasuremode',
-               'exif-gpsdop',
-               'exif-gpsspeedref',
-               'exif-gpsspeed',
-               'exif-gpstrackref',
-               'exif-gpstrack',
-               'exif-gpsimgdirectionref',
-               'exif-gpsimgdirection',
-               'exif-gpsmapdatum',
-               'exif-gpsdestlatituderef',
-               'exif-gpsdestlatitude',
-               'exif-gpsdestlongituderef',
-               'exif-gpsdestlongitude',
-               'exif-gpsdestbearingref',
-               'exif-gpsdestbearing',
-               'exif-gpsdestdistanceref',
-               'exif-gpsdestdistance',
-               'exif-gpsprocessingmethod',
-               'exif-gpsareainformation',
-               'exif-gpsdatestamp',
-               'exif-gpsdifferential',
-               'exif-coordinate-format',
-               'exif-jpegfilecomment',
-               'exif-keywords',
-               'exif-worldregioncreated',
-               'exif-countrycreated',
-               'exif-countrycodecreated',
-               'exif-provinceorstatecreated',
-               'exif-citycreated',
-               'exif-sublocationcreated',
-               'exif-worldregiondest',
-               'exif-countrydest',
-               'exif-countrycodedest',
-               'exif-provinceorstatedest',
-               'exif-citydest',
-               'exif-sublocationdest',
-               'exif-objectname',
-               'exif-specialinstructions',
-               'exif-headline',
-               'exif-credit',
-               'exif-source',
-               'exif-editstatus',
-               'exif-urgency',
-               'exif-fixtureidentifier',
-               'exif-locationdest',
-               'exif-locationdestcode',
-               'exif-objectcycle',
-               'exif-contact',
-               'exif-writer',
-               'exif-languagecode',
-               'exif-iimversion',
-               'exif-iimcategory',
-               'exif-iimsupplementalcategory',
-               'exif-datetimeexpires',
-               'exif-datetimereleased',
-               'exif-originaltransmissionref',
-               'exif-identifier',
-               'exif-lens',
-               'exif-serialnumber',
-               'exif-cameraownername',
-               'exif-label',
-               'exif-datetimemetadata',
-               'exif-nickname',
-               'exif-rating',
-               'exif-rightscertificate',
-               'exif-copyrighted',
-               'exif-copyrightowner',
-               'exif-usageterms',
-               'exif-webstatement',
-               'exif-originaldocumentid',
-               'exif-licenseurl',
-               'exif-morepermissionsurl',
-               'exif-attributionurl',
-               'exif-preferredattributionname',
-               'exif-pngfilecomment',
-               'exif-disclaimer',
-               'exif-contentwarning',
-               'exif-giffilecomment',
-               'exif-intellectualgenre',
-               'exif-subjectnewscode',
-               'exif-scenecode',
-               'exif-event',
-               'exif-organisationinimage',
-               'exif-personinimage',
-               'exif-originalimageheight',
-               'exif-originalimagewidth',
-       ),
-       'exif-values' => array(
-               'exif-make-value',
-               'exif-model-value',
-               'exif-software-value',
-               'exif-software-version-value',
-               'exif-contact-value',
-               'exif-subjectnewscode-value',
-       ),
-       'exif-compression' => array(
-               'exif-compression-1',
-               'exif-compression-2',
-               'exif-compression-3',
-               'exif-compression-4',
-               'exif-compression-5',
-               'exif-compression-6',
-               'exif-compression-7',
-               'exif-compression-8',
-               'exif-compression-32773',
-               'exif-compression-32946',
-               'exif-compression-34712',
-       ),
-       'exif-copyrighted' => array(
-               'exif-copyrighted-true',
-               'exif-copyrighted-false',
-       ),
-       'exif-photometricinterpretation' => array(
-               'exif-photometricinterpretation-2',
-               'exif-photometricinterpretation-6',
-       ),
-       'exif-unknowndate' => array(
-               'exif-unknowndate',
-       ),
-       'exif-orientation' => array(
-               'exif-orientation-1',
-               'exif-orientation-2',
-               'exif-orientation-3',
-               'exif-orientation-4',
-               'exif-orientation-5',
-               'exif-orientation-6',
-               'exif-orientation-7',
-               'exif-orientation-8',
-       ),
-       'exif-planarconfiguration' => array(
-               'exif-planarconfiguration-1',
-               'exif-planarconfiguration-2',
-       ),
-       'exif-xyresolution' => array(
-               'exif-xyresolution-i',
-               'exif-xyresolution-c',
-       ),
-       'exif-colorspace' => array(
-               'exif-colorspace-1',
-               'exif-colorspace-65535',
-       ),
-       'exif-componentsconfiguration' => array(
-               'exif-componentsconfiguration-0',
-               'exif-componentsconfiguration-1',
-               'exif-componentsconfiguration-2',
-               'exif-componentsconfiguration-3',
-               'exif-componentsconfiguration-4',
-               'exif-componentsconfiguration-5',
-               'exif-componentsconfiguration-6',
-       ),
-       'exif-exposureprogram' => array(
-               'exif-exposureprogram-0',
-               'exif-exposureprogram-1',
-               'exif-exposureprogram-2',
-               'exif-exposureprogram-3',
-               'exif-exposureprogram-4',
-               'exif-exposureprogram-5',
-               'exif-exposureprogram-6',
-               'exif-exposureprogram-7',
-               'exif-exposureprogram-8',
-       ),
-       'exif-subjectdistance-value' => array(
-               'exif-subjectdistance-value',
-       ),
-       'exif-meteringmode' => array(
-               'exif-meteringmode-0',
-               'exif-meteringmode-1',
-               'exif-meteringmode-2',
-               'exif-meteringmode-3',
-               'exif-meteringmode-4',
-               'exif-meteringmode-5',
-               'exif-meteringmode-6',
-               'exif-meteringmode-255',
-       ),
-       'exif-lightsource' => array(
-               'exif-lightsource-0',
-               'exif-lightsource-1',
-               'exif-lightsource-2',
-               'exif-lightsource-3',
-               'exif-lightsource-4',
-               'exif-lightsource-9',
-               'exif-lightsource-10',
-               'exif-lightsource-11',
-               'exif-lightsource-12',
-               'exif-lightsource-13',
-               'exif-lightsource-14',
-               'exif-lightsource-15',
-               'exif-lightsource-17',
-               'exif-lightsource-18',
-               'exif-lightsource-19',
-               'exif-lightsource-20',
-               'exif-lightsource-21',
-               'exif-lightsource-22',
-               'exif-lightsource-23',
-               'exif-lightsource-24',
-               'exif-lightsource-255',
-       ),
-       'exif-flash' => array(
-               'exif-flash-fired-0',
-               'exif-flash-fired-1',
-               'exif-flash-return-0',
-               'exif-flash-return-2',
-               'exif-flash-return-3',
-               'exif-flash-mode-1',
-               'exif-flash-mode-2',
-               'exif-flash-mode-3',
-               'exif-flash-function-1',
-               'exif-flash-redeye-1',
-       ),
-       'exif-focalplaneresolutionunit' => array(
-               'exif-focalplaneresolutionunit-2',
-       ),
-       'exif-sensingmethod' => array(
-               'exif-sensingmethod-1',
-               'exif-sensingmethod-2',
-               'exif-sensingmethod-3',
-               'exif-sensingmethod-4',
-               'exif-sensingmethod-5',
-               'exif-sensingmethod-7',
-               'exif-sensingmethod-8',
-       ),
-       'exif-filesource' => array(
-               'exif-filesource-3',
-       ),
-       'exif-scenetype' => array(
-               'exif-scenetype-1',
-       ),
-       'exif-customrendered' => array(
-               'exif-customrendered-0',
-               'exif-customrendered-1',
-       ),
-       'exif-exposuremode' => array(
-               'exif-exposuremode-0',
-               'exif-exposuremode-1',
-               'exif-exposuremode-2',
-       ),
-       'exif-whitebalance' => array(
-               'exif-whitebalance-0',
-               'exif-whitebalance-1',
-       ),
-       'exif-scenecapturetype' => array(
-               'exif-scenecapturetype-0',
-               'exif-scenecapturetype-1',
-               'exif-scenecapturetype-2',
-               'exif-scenecapturetype-3',
-       ),
-       'exif-gaincontrol' => array(
-               'exif-gaincontrol-0',
-               'exif-gaincontrol-1',
-               'exif-gaincontrol-2',
-               'exif-gaincontrol-3',
-               'exif-gaincontrol-4',
-       ),
-       'exif-contrast' => array(
-               'exif-contrast-0',
-               'exif-contrast-1',
-               'exif-contrast-2',
-       ),
-       'exif-saturation' => array(
-               'exif-saturation-0',
-               'exif-saturation-1',
-               'exif-saturation-2',
-       ),
-       'exif-sharpness' => array(
-               'exif-sharpness-0',
-               'exif-sharpness-1',
-               'exif-sharpness-2',
-       ),
-       'exif-subjectdistancerange' => array(
-               'exif-subjectdistancerange-0',
-               'exif-subjectdistancerange-1',
-               'exif-subjectdistancerange-2',
-               'exif-subjectdistancerange-3',
-       ),
-       'exif-gpslatitude' => array(
-               'exif-gpslatitude-n',
-               'exif-gpslatitude-s',
-       ),
-       'exif-gpslongitude' => array(
-               'exif-gpslongitude-e',
-               'exif-gpslongitude-w',
-       ),
-       'exif-altituderef' => array(
-               'exif-gpsaltitude-above-sealevel',
-               'exif-gpsaltitude-below-sealevel',
-       ),
-       'exif-gpsstatus' => array(
-               'exif-gpsstatus-a',
-               'exif-gpsstatus-v',
-       ),
-       'exif-gpsmeasuremode' => array(
-               'exif-gpsmeasuremode-2',
-               'exif-gpsmeasuremode-3',
-       ),
-       'exif-gpsspeed' => array(
-               'exif-gpsspeed-k',
-               'exif-gpsspeed-m',
-               'exif-gpsspeed-n',
-       ),
-       'exif-gpsdestdistanceref' => array(
-               'exif-gpsdestdistance-k',
-               'exif-gpsdestdistance-m',
-               'exif-gpsdestdistance-n',
-       ),
-       'exif-gdop' => array(
-               'exif-gpsdop-excellent',
-               'exif-gpsdop-good',
-               'exif-gpsdop-moderate',
-               'exif-gpsdop-fair',
-               'exif-gpsdop-poor',
-       ),
-       'exif-objectcycle' => array(
-               'exif-objectcycle-a',
-               'exif-objectcycle-p',
-               'exif-objectcycle-b',
-       ),
-       'exif-gpsdirection' => array(
-               'exif-gpsdirection-t',
-               'exif-gpsdirection-m',
-       ),
-       'exif-ycbcrpositioning' => array(
-               'exif-ycbcrpositioning-1',
-               'exif-ycbcrpositioning-2',
-       ),
-       'exif-dc' => array(
-               'exif-dc-contributor',
-               'exif-dc-coverage',
-               'exif-dc-date',
-               'exif-dc-publisher',
-               'exif-dc-relation',
-               'exif-dc-rights',
-               'exif-dc-source',
-               'exif-dc-type',
-       ),
-       'exif-rating' => array(
-               'exif-rating-rejected',
-       ),
-       'exif-isospeedratings' => array(
-               'exif-isospeedratings-overflow',
-       ),
-       'exif-maxaperturevalue' => array(
-               'exif-maxaperturevalue-value',
-       ),
-       'exif-iimcategory' => array(
-               'exif-iimcategory-ace',
-               'exif-iimcategory-clj',
-               'exif-iimcategory-dis',
-               'exif-iimcategory-fin',
-               'exif-iimcategory-edu',
-               'exif-iimcategory-evn',
-               'exif-iimcategory-hth',
-               'exif-iimcategory-hum',
-               'exif-iimcategory-lab',
-               'exif-iimcategory-lif',
-               'exif-iimcategory-pol',
-               'exif-iimcategory-rel',
-               'exif-iimcategory-sci',
-               'exif-iimcategory-soi',
-               'exif-iimcategory-spo',
-               'exif-iimcategory-war',
-               'exif-iimcategory-wea',
-       ),
-       'exif-urgency' => array(
-               'exif-urgency-normal',
-               'exif-urgency-low',
-               'exif-urgency-high',
-               'exif-urgency-other',
-       ),
-       'all' => array(
-               'watchlistall2',
-               'namespacesall',
-               'monthsall',
-       ),
-       'confirmemail' => array(
-               'confirmemail',
-               'confirmemail_noemail',
-               'confirmemail_text',
-               'confirmemail_pending',
-               'confirmemail_send',
-               'confirmemail_sent',
-               'confirmemail_oncreate',
-               'confirmemail_sendfailed',
-               'confirmemail_invalid',
-               'confirmemail_needlogin',
-               'confirmemail_success',
-               'confirmemail_loggedin',
-               'confirmemail_subject',
-               'confirmemail_body',
-               'confirmemail_body_changed',
-               'confirmemail_body_set',
-               'confirmemail_invalidated',
-               'invalidateemail',
-       ),
-       'scarytransclusion' => array(
-               'scarytranscludedisabled',
-               'scarytranscludefailed',
-               'scarytranscludefailed-httpstatus',
-               'scarytranscludetoolong',
-       ),
-       'deleteconflict' => array(
-               'deletedwhileediting',
-               'confirmrecreate',
-               'confirmrecreate-noreason',
-               'recreate',
-       ),
-       'unit-pixel' => array(
-               'unit-pixel',
-       ),
-       'purge' => array(
-               'confirm_purge_button',
-               'confirm-purge-top',
-               'confirm-purge-bottom',
-       ),
-       'watch-unwatch' => array(
-               'confirm-watch-button',
-               'confirm-watch-top',
-               'confirm-unwatch-button',
-               'confirm-unwatch-top',
-       ),
-       'separators' => array(
-               'semicolon-separator',
-               'comma-separator',
-               'colon-separator',
-               'autocomment-prefix',
-               'pipe-separator',
-               'word-separator',
-               'ellipsis',
-               'percent',
-               'parentheses',
-               'brackets',
-               'quotation-marks',
-       ),
-       'imgmulti' => array(
-               'imgmultipageprev',
-               'imgmultipagenext',
-               'imgmultigo',
-               'imgmultigoto',
-       ),
-       'img-lang' => array(
-               'img-lang-opt',
-               'img-lang-default',
-               'img-lang-info',
-               'img-lang-go',
-       ),
-       'tablepager' => array(
-               'ascending_abbrev',
-               'descending_abbrev',
-               'table_pager_next',
-               'table_pager_prev',
-               'table_pager_first',
-               'table_pager_last',
-               'table_pager_limit',
-               'table_pager_limit_label',
-               'table_pager_limit_submit',
-               'table_pager_empty',
-       ),
-       'autosumm' => array(
-               'autosumm-blank',
-               'autosumm-replace',
-               'autoredircomment',
-               'autosumm-new',
-       ),
-       'autoblock_whitelist' => array(
-               'autoblock_whitelist',
-       ),
-       'sizeunits' => array(
-               'size-bytes',
-               'size-kilobytes',
-               'size-megabytes',
-               'size-gigabytes',
-               'size-terabytes',
-               'size-petabytes',
-               'size-exabytes',
-               'size-zetabytes',
-               'size-yottabytes',
-       ),
-       'bitrateunits' => array(
-               'bitrate-bits',
-               'bitrate-kilobits',
-               'bitrate-megabits',
-               'bitrate-gigabits',
-               'bitrate-terabits',
-               'bitrate-petabits',
-               'bitrate-exabits',
-               'bitrate-zetabits',
-               'bitrate-yottabits',
-       ),
-       'livepreview' => array(
-               'livepreview-loading',
-               'livepreview-ready',
-               'livepreview-failed',
-               'livepreview-error',
-       ),
-       'lagwarning' => array(
-               'lag-warn-normal',
-               'lag-warn-high',
-       ),
-       'watchlisteditor' => array(
-               'editwatchlist-summary',
-               'watchlistedit-numitems',
-               'watchlistedit-noitems',
-               'watchlistedit-normal-title',
-               'watchlistedit-normal-legend',
-               'watchlistedit-normal-explain',
-               'watchlistedit-normal-submit',
-               'watchlistedit-normal-done',
-               'watchlistedit-raw-title',
-               'watchlistedit-raw-legend',
-               'watchlistedit-raw-explain',
-               'watchlistedit-raw-titles',
-               'watchlistedit-raw-submit',
-               'watchlistedit-raw-done',
-               'watchlistedit-raw-added',
-               'watchlistedit-raw-removed',
-       ),
-       'watchlisttools' => array(
-               'watchlisttools-view',
-               'watchlisttools-edit',
-               'watchlisttools-raw',
-       ),
-       'iranian-dates' => array(
-               'iranian-calendar-m1',
-               'iranian-calendar-m2',
-               'iranian-calendar-m3',
-               'iranian-calendar-m4',
-               'iranian-calendar-m5',
-               'iranian-calendar-m6',
-               'iranian-calendar-m7',
-               'iranian-calendar-m8',
-               'iranian-calendar-m9',
-               'iranian-calendar-m10',
-               'iranian-calendar-m11',
-               'iranian-calendar-m12',
-       ),
-       'hijri-dates' => array(
-               '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-dates' => array(
-               'hebrew-calendar-m1',
-               'hebrew-calendar-m2',
-               'hebrew-calendar-m3',
-               'hebrew-calendar-m4',
-               'hebrew-calendar-m5',
-               'hebrew-calendar-m6',
-               'hebrew-calendar-m6a',
-               'hebrew-calendar-m6b',
-               'hebrew-calendar-m7',
-               'hebrew-calendar-m8',
-               'hebrew-calendar-m9',
-               'hebrew-calendar-m10',
-               'hebrew-calendar-m11',
-               'hebrew-calendar-m12',
-               'hebrew-calendar-m1-gen',
-               'hebrew-calendar-m2-gen',
-               'hebrew-calendar-m3-gen',
-               'hebrew-calendar-m4-gen',
-               'hebrew-calendar-m5-gen',
-               'hebrew-calendar-m6-gen',
-               'hebrew-calendar-m6a-gen',
-               'hebrew-calendar-m6b-gen',
-               'hebrew-calendar-m7-gen',
-               'hebrew-calendar-m8-gen',
-               'hebrew-calendar-m9-gen',
-               'hebrew-calendar-m10-gen',
-               'hebrew-calendar-m11-gen',
-               'hebrew-calendar-m12-gen',
-       ),
-       'signatures' => array(
-               'signature',
-               'signature-anon',
-               'timezone-utc',
-       ),
-       'CoreParserFunctions' => array(
-               'unknown_extension_tag',
-               'duplicate-defaultsort',
-       ),
-       'version' => array(
-               'version',
-               'version-summary',
-               'version-extensions',
-               'version-specialpages',
-               'version-parserhooks',
-               'version-variables',
-               'version-antispam',
-               'version-skins',
-               'version-api',
-               'version-other',
-               'version-mediahandlers',
-               'version-hooks',
-               'version-parser-extensiontags',
-               'version-parser-function-hooks',
-               'version-hook-name',
-               'version-hook-subscribedby',
-               'version-version',
-               'version-svn-revision',
-               'version-license',
-               'version-ext-license',
-               'version-ext-colheader-name',
-               'version-ext-colheader-version',
-               'version-ext-colheader-license',
-               'version-ext-colheader-description',
-               'version-ext-colheader-credits',
-               'version-license-title',
-               'version-license-not-found',
-               'version-credits-title',
-               'version-credits-not-found',
-               'version-poweredby-credits',
-               'version-poweredby-others',
-               'version-poweredby-translators',
-               'version-credits-summary',
-               'version-license-info',
-               'version-software',
-               'version-software-product',
-               'version-software-version',
-               'version-db-mysql-url',
-               'version-db-mariadb-url',
-               'version-db-percona-url',
-               'version-db-postgres-url',
-               'version-db-oracle-url',
-               'version-db-sqlite-url',
-               'version-db-mssql-url',
-               'version-entrypoints',
-               'version-entrypoints-header-entrypoint',
-               'version-entrypoints-header-url',
-               'version-entrypoints-articlepath',
-               'version-entrypoints-scriptpath',
-               'version-entrypoints-index-php',
-               'version-entrypoints-api-php',
-               'version-entrypoints-load-php',
-       ),
-       'redirect' => array(
-               'redirect',
-               'redirect-legend',
-               'redirect-text',
-               'redirect-summary',
-               'redirect-submit',
-               'redirect-lookup',
-               'redirect-value',
-               'redirect-user',
-               'redirect-page',
-               'redirect-revision',
-               'redirect-file',
-               'redirect-not-exists',
-       ),
-       'fileduplicatesearch' => array(
-               'fileduplicatesearch',
-               'fileduplicatesearch-summary',
-               'fileduplicatesearch-legend',
-               'fileduplicatesearch-filename',
-               'fileduplicatesearch-submit',
-               'fileduplicatesearch-info',
-               'fileduplicatesearch-result-1',
-               'fileduplicatesearch-result-n',
-               'fileduplicatesearch-noresults',
-       ),
-       'special-specialpages' => array(
-               'specialpages',
-               'specialpages-summary',
-               'specialpages-note-top',
-               'specialpages-note',
-               'specialpages-group-maintenance',
-               'specialpages-group-other',
-               'specialpages-group-login',
-               'specialpages-group-changes',
-               'specialpages-group-media',
-               'specialpages-group-users',
-               'specialpages-group-highuse',
-               'specialpages-group-pages',
-               'specialpages-group-pagetools',
-               'specialpages-group-wiki',
-               'specialpages-group-redirects',
-               'specialpages-group-spam',
-       ),
-       'special-blank' => array(
-               'blankpage',
-               'intentionallyblankpage',
-       ),
-       'external_images' => array(
-               'external_image_whitelist',
-       ),
-       'special-tags' => array(
-               'tags',
-               'tags-summary',
-               'tag-filter',
-               'tag-filter-submit',
-               'tag-list-wrapper',
-               'tags-title',
-               'tags-intro',
-               'tags-tag',
-               'tags-display-header',
-               'tags-description-header',
-               'tags-active-header',
-               'tags-hitcount-header',
-               'tags-active-yes',
-               'tags-active-no',
-               'tags-edit',
-               'tags-hitcount',
-       ),
-       'comparepages' => array(
-               'comparepages',
-               'comparepages-summary',
-               'compare-page1',
-               'compare-page2',
-               'compare-rev1',
-               'compare-rev2',
-               'compare-submit',
-               'compare-invalid-title',
-               'compare-title-not-exists',
-               'compare-revision-not-exists',
-       ),
-       'db-error-messages' => array(
-               'dberr-header',
-               'dberr-problems',
-               'dberr-again',
-               'dberr-info',
-               'dberr-info-hidden',
-               'dberr-usegoogle',
-               'dberr-outofdate',
-               'dberr-cachederror',
-       ),
-       'html-forms' => array(
-               'htmlform-invalid-input',
-               'htmlform-select-badoption',
-               'htmlform-int-invalid',
-               'htmlform-float-invalid',
-               'htmlform-int-toolow',
-               'htmlform-int-toohigh',
-               'htmlform-required',
-               'htmlform-submit',
-               'htmlform-reset',
-               'htmlform-selectorother-other',
-               'htmlform-no',
-               'htmlform-yes',
-               'htmlform-chosen-placeholder',
-               'htmlform-cloner-create',
-               'htmlform-cloner-delete',
-               'htmlform-cloner-required',
-       ),
-       'sqlite' => array(
-               'sqlite-has-fts',
-               'sqlite-no-fts',
-       ),
-       'logging' => array(
-               'logentry-delete-delete',
-               'logentry-delete-restore',
-               'logentry-delete-event',
-               'logentry-delete-revision',
-               'logentry-delete-event-legacy',
-               'logentry-delete-revision-legacy',
-               'logentry-suppress-delete',
-               'logentry-suppress-event',
-               'logentry-suppress-revision',
-               'logentry-suppress-event-legacy',
-               'logentry-suppress-revision-legacy',
-               'revdelete-content-hid',
-               'revdelete-summary-hid',
-               'revdelete-uname-hid',
-               'revdelete-content-unhid',
-               'revdelete-summary-unhid',
-               'revdelete-uname-unhid',
-               'revdelete-restricted',
-               'revdelete-unrestricted',
-               'logentry-move-move',
-               'logentry-move-move-noredirect',
-               'logentry-move-move_redir',
-               'logentry-move-move_redir-noredirect',
-               'logentry-patrol-patrol',
-               'logentry-patrol-patrol-auto',
-               'logentry-newusers-newusers',
-               'logentry-newusers-create',
-               'logentry-newusers-create2',
-               'logentry-newusers-byemail',
-               'logentry-newusers-autocreate',
-               'logentry-rights-rights',
-               'logentry-rights-rights-legacy',
-               'logentry-rights-autopromote',
-               'rightsnone',
-       ),
-       'logging-irc' => array(
-               'revdelete-logentry',
-               'logdelete-logentry',
-               'revdelete-content',
-               'revdelete-summary',
-               'revdelete-uname',
-               'revdelete-hid',
-               'revdelete-unhid',
-               'revdelete-log-message',
-               'logdelete-log-message',
-               'deletedarticle',
-               'suppressedarticle',
-               'undeletedarticle',
-               'patrol-log-line',
-               'patrol-log-auto',
-               'patrol-log-diff',
-               '1movedto2',
-               '1movedto2_redir',
-               'move-redirect-suppressed',
-               'newuserlog-create-entry',
-               'newuserlog-create2-entry',
-               'newuserlog-autocreate-entry',
-               // 'uploadedimage',
-               // 'overwroteimage',
-               'rightslogentry',
-               'rightslogentry-autopromote',
-       ),
-       'feedback' => array(
-               'feedback-bugornote',
-               'feedback-subject',
-               'feedback-message',
-               'feedback-cancel',
-               'feedback-submit',
-               'feedback-adding',
-               'feedback-error1',
-               'feedback-error2',
-               'feedback-error3',
-               'feedback-thanks',
-               'feedback-close',
-               'feedback-bugcheck',
-               'feedback-bugnew',
-       ),
-       'searchsuggestions' => array(
-               'searchsuggest-search',
-               'searchsuggest-containing',
-       ),
-       'apierrors' => array(
-               'api-error-badaccess-groups',
-               'api-error-badtoken',
-               'api-error-copyuploaddisabled',
-               'api-error-duplicate',
-               'api-error-duplicate-archive',
-               'api-error-duplicate-archive-popup-title',
-               'api-error-duplicate-popup-title',
-               'api-error-empty-file',
-               'api-error-emptypage',
-               'api-error-fetchfileerror',
-               'api-error-fileexists-forbidden',
-               'api-error-fileexists-shared-forbidden',
-               'api-error-file-too-large',
-               'api-error-filename-tooshort',
-               'api-error-filetype-banned',
-               'api-error-filetype-banned-type',
-               'api-error-filetype-missing',
-               'api-error-hookaborted',
-               'api-error-http',
-               'api-error-illegal-filename',
-               'api-error-internal-error',
-               'api-error-invalid-file-key',
-               'api-error-missingparam',
-               'api-error-missingresult',
-               'api-error-mustbeloggedin',
-               'api-error-mustbeposted',
-               'api-error-noimageinfo',
-               'api-error-nomodule',
-               'api-error-ok-but-empty',
-               'api-error-overwrite',
-               'api-error-stashfailed',
-               'api-error-publishfailed',
-               'api-error-stasherror',
-               'api-error-timeout',
-               'api-error-unclassified',
-               'api-error-unknown-code',
-               'api-error-unknown-error',
-               'api-error-unknown-warning',
-               'api-error-unknownerror',
-               'api-error-uploaddisabled',
-               'api-error-verification-error',
-       ),
-       'duration' => array(
-               'duration-seconds',
-               'duration-minutes',
-               'duration-hours',
-               'duration-days',
-               'duration-weeks',
-               'duration-years',
-               'duration-decades',
-               'duration-centuries',
-               'duration-millennia'
-       ),
-       'rotation' => array(
-               'rotate-comment',
-       ),
-       'limitreport' => array(
-               'limitreport-title',
-               'limitreport-cputime',
-               'limitreport-cputime-value',
-               'limitreport-walltime',
-               'limitreport-walltime-value',
-               'limitreport-ppvisitednodes',
-               'limitreport-ppvisitednodes-value',
-               'limitreport-ppgeneratednodes',
-               'limitreport-ppgeneratednodes-value',
-               'limitreport-postexpandincludesize',
-               'limitreport-postexpandincludesize-value',
-               'limitreport-templateargumentsize',
-               'limitreport-templateargumentsize-value',
-               'limitreport-expansiondepth',
-               'limitreport-expansiondepth-value',
-               'limitreport-expensivefunctioncount',
-               'limitreport-expensivefunctioncount-value',
-       ),
-       'expandtemplates' => array(
-               'expandtemplates',
-               'expand_templates_intro',
-               'expand_templates_title',
-               'expand_templates_input',
-               'expand_templates_output',
-               'expand_templates_xml_output',
-               'expand_templates_html_output',
-               'expand_templates_ok',
-               'expand_templates_remove_comments',
-               'expand_templates_remove_nowiki',
-               'expand_templates_generate_xml',
-               'expand_templates_generate_rawhtml',
-               'expand_templates_preview',
-       ),
-       'trackingcategories' => array(
-               'trackingcategories',
-               'trackingcategories-summary',
-               'trackingcategories-msg',
-               'trackingcategories-name',
-               'trackingcategories-desc',
-               'noindex-category-desc',
-               'index-category-desc',
-               'post-expand-template-inclusion-category-desc',
-               'post-expand-template-argument-category-desc',
-               'expensive-parserfunction-category-desc',
-               'broken-file-category-desc',
-               'hidden-category-category-desc',
-               'trackingcategories-nodesc',
-               'trackcategories-disabled',
-       ),
-);
-
-/** Comments for each block */
-$wgBlockComments = array(
-       'sidebar' => "The sidebar for MonoBook is generated from this message, lines that do not
-begin with * or ** are discarded, furthermore lines that do begin with ** and
-do not contain | are also discarded, but do not depend on this behavior for
-future releases. Also note that since each list value is wrapped in a unique
-(X)HTML id it should only appear once and include characters that are legal
-(X)HTML id names.",
-       'toggles' => 'User preference toggles',
-       'underline' => '',
-       'editfont' => 'Font style option in Special:Preferences',
-       'dates' => 'Dates',
-       'categorypages' => 'Categories related messages',
-       'mainpage' => '',
-       'miscellaneous1' => '',
-       'cologneblue' => 'Cologne Blue skin',
-       'vector' => 'Vector skin',
-       'miscellaneous2' => '',
-       'links' => 'All link text and link target definitions of links into project namespace ' .
-               'that get used by other message strings, with the exception of user group pages (see grouppage).',
-       'badaccess' => '',
-       'versionrequired' => '',
-       'miscellaneous3' => '',
-       'nstab' => "Short words for each namespace, by default used in the namespace tab in monobook",
-       'main' => 'Main script and global functions',
-       'errors' => 'General errors',
-       'virus' => 'Virus scanner',
-       'login' => 'Login and logout pages',
-       'mail' => 'Email sending',
-       'passwordstrength' => 'JavaScript password checks',
-       'resetpass' => 'Change password dialog',
-       'passwordreset' => 'Special:PasswordReset',
-       'changeemail' => 'Special:ChangeEmail',
-       'resettokens' => 'Special:ResetTokens',
-       'toolbar' => 'Edit page toolbar',
-       'edit' => 'Edit pages',
-       'parserwarnings' => 'Parser/template warnings',
-       'contentmodels' => 'Content models',
-       'undo' => '"Undo" feature',
-       'cantcreateaccount' => 'Account creation failure',
-       'history' => 'History pages',
-       'history-feed' => 'Revision feed',
-       'revdelete' => 'Revision deletion',
-       'suppression' => 'Suppression log',
-       'mergehistory' => 'History merging',
-       'mergelog' => 'Merge log',
-       'diffs' => 'Diffs',
-       'search' => 'Search results',
-       'opensearch' => 'OpenSearch description',
-       'preferences' => 'Preferences page',
-       'preferences-email' => 'User preference: email validation using jQuery',
-       'userrights' => 'User rights',
-       'group' => 'Groups',
-       'group-member' => '',
-       'grouppage' => '',
-       'right' => 'Rights',
-       'action' => 'Associated actions - in the sentence "You do not have permission to X"',
-       'rightslog' => 'User rights log',
-       'recentchanges' => 'Recent changes',
-       'recentchangeslinked' => 'Recent changes linked',
-       'upload' => 'Upload',
-       'zip' => 'ZipDirectoryReader',
-       'upload-errors' => '',
-       'filebackend-errors' => 'File backend',
-       'filejournal-errors' => 'File journal errors',
-       'lockmanager-errors' => 'Lock manager',
-       'uploadstash' => 'Special:UploadStash',
-       'img-auth' => 'img_auth script messages',
-       'http-errors' => 'HTTP errors',
-       'upload-curl-errors' => 'Some likely curl errors. More could be added from ' .
-               '<http://curl.haxx.se/libcurl/c/libcurl-errors.html>',
-       'licenses' => '',
-       'filelist' => 'Special:ListFiles',
-       'filedescription' => 'File description page',
-       'filerevert' => 'File reversion',
-       'filedelete' => 'File deletion',
-       'mimesearch' => 'MIME search',
-       'unwatchedpages' => 'Unwatched pages',
-       'listduplicatedfiles' => 'List duplicated files special page',
-       'listredirects' => 'List redirects',
-       'unusedtemplates' => 'Unused templates',
-       'randompage' => 'Random page',
-       'randomincategory' => 'Random page in category',
-       'randomredirect' => 'Random redirect',
-       'statistics' => 'Statistics',
-       'pageswithprop' => '',
-       'doubleredirects' => '',
-       'brokenredirects' => '',
-       'withoutinterwiki' => '',
-       'fewestrevisions' => '',
-       'specialpages' => 'Miscellaneous special pages',
-       'booksources' => 'Book sources',
-       'magicwords' => 'Magic words',
-       'logpages' => 'Special:Log',
-       'allpages' => 'Special:AllPages',
-       'categories' => 'Special:Categories',
-       'deletedcontribs' => 'Special:DeletedContributions',
-       'linksearch' => 'Special:LinkSearch',
-       'listusers' => 'Special:ListUsers',
-       'activeusers' => 'Special:ActiveUsers',
-       'newuserlog' => 'Special:Log/newusers',
-       'listgrouprights' => 'Special:ListGroupRights',
-       'emailuser' => 'Email user',
-       'usermessage' => 'User Messenger',
-       'watchlist' => 'Watchlist',
-       'watching' => 'Displayed when you click the "watch" button and it is in the process of watching',
-       'enotif' => '',
-       'delete' => 'Delete',
-       'rollback' => 'Rollback',
-       'edittokens' => 'Edit tokens',
-       'protect' => 'Protect',
-       'restrictions' => 'Restrictions (nouns)',
-       'restriction-levels' => 'Restriction levels',
-       'undelete' => 'Undelete',
-       'nsform' => 'Namespace form on various pages',
-       'contributions' => 'Contributions',
-       'sp-contributions' => '',
-       'whatlinkshere' => 'What links here',
-       'block' => 'Block/unblock',
-       'developertools' => 'Developer tools',
-       'movepage' => 'Move page',
-       'export' => 'Export',
-       'allmessages' => 'Namespace 8 related',
-       'thumbnails' => 'Thumbnails',
-       'import' => 'Special:Import',
-       'importlog' => 'Import log',
-       'javaccripttest' => 'JavaScriptTest',
-       'accesskeys' => 'Keyboard access keys for power users',
-       'tooltips' => 'Tooltip help for the actions',
-       'stylesheets' => 'Stylesheets',
-       'scripts' => 'Scripts',
-       'metadata_cc' => 'Metadata',
-       'attribution' => 'Attribution',
-       'spamprotection' => 'Spam protection',
-       'info' => 'Info page',
-       'skin' => 'Skin names',
-       'patrolling' => 'Patrolling',
-       'patrol-log' => 'Patrol log',
-       'imagedeletion' => 'Image deletion',
-       'browsediffs' => 'Browsing diffs',
-       'newfiles' => 'Special:NewFiles',
-       'video-info' => 'Video information, used by Language::formatTimePeriod() to ' .
-               'format lengths in the above messages',
-       'human-timestamps' => 'Human-readable timestamps',
-       'badimagelist' => 'Bad image list',
-       'variantname-zh' => "Short names for language variants used for language conversion links.
-Variants for Chinese language",
-       'variantname-gan' => 'Variants for Gan language',
-       'variantname-sr' => 'Variants for Serbian language',
-       'variantname-kk' => 'Variants for Kazakh language',
-       'variantname-ku' => 'Variants for Kurdish language',
-       'variantname-tg' => 'Variants for Tajiki language',
-       'variantname-iu' => 'Variants for Inuktitut language',
-       'variantname-shi' => 'Variants for Tachelhit language',
-       'media-info' => 'Media information',
-       'metadata' => 'Metadata',
-       'exif' => 'Exif tags',
-       'exif-values' => 'Make & model, can be wikified in order to link to the camera and model name',
-       'exif-compression' => 'Exif attributes',
-       'exif-copyrighted' => '',
-       'exif-unknowndate' => '',
-       'exif-photometricinterpretation' => '',
-       'exif-orientation' => '',
-       'exif-planarconfiguration' => '',
-       'exif-xyresolution' => '',
-       'exif-colorspace' => '',
-       'exif-componentsconfiguration' => '',
-       'exif-exposureprogram' => '',
-       'exif-subjectdistance-value' => '',
-       'exif-meteringmode' => '',
-       'exif-lightsource' => '',
-       'exif-flash' => 'Flash modes',
-       'exif-focalplaneresolutionunit' => '',
-       'exif-sensingmethod' => '',
-       'exif-filesource' => '',
-       'exif-scenetype' => '',
-       'exif-customrendered' => '',
-       'exif-exposuremode' => '',
-       'exif-whitebalance' => '',
-       'exif-scenecapturetype' => '',
-       'exif-gaincontrol' => '',
-       'exif-contrast' => '',
-       'exif-saturation' => '',
-       'exif-sharpness' => '',
-       'exif-subjectdistancerange' => '',
-       'exif-gpslatitude' => 'Pseudotags used for GPSLatitudeRef and GPSDestLatitudeRef',
-       'exif-gpslongitude' => 'Pseudotags used for GPSLongitudeRef and GPSDestLongitudeRef',
-       'exif-altituderef' => 'Pseudotags used for GPSAltitudeRef',
-       'exif-gpsstatus' => '',
-       'exif-gpsmeasuremode' => '',
-       'exif-gpsspeed' => 'Pseudotags used for GPSSpeedRef',
-       'exif-gpsdestdistanceref' => 'Pseudotags used for GPSDestDistanceRef',
-       'exif-gdop' => '',
-       'exif-objectcycle' => '',
-       'exif-gpsdirection' => 'Pseudotags used for GPSTrackRef, GPSImgDirectionRef and GPSDestBearingRef',
-       'exif-ycbcrpositioning' => '',
-       'exif-dc' => '',
-       'exif-rating' => '',
-       'exif-isospeedratings' => '',
-       'exif-maxaperturevalue' => '',
-       'exif-iimcategory' => '',
-       'exif-urgency' => '',
-       'all' => "'all' in various places, this might be different for inflected languages",
-       'confirmemail' => 'Email address confirmation',
-       'scarytransclusion' => 'Scary transclusion',
-       'deleteconflict' => 'Delete conflict',
-       'unit-pixel' => '',
-       'purge' => 'action=purge',
-       'watch-unwatch' => 'action=watch/unwatch',
-       'separators' => 'Separators for various lists, etc.',
-       'imgmulti' => 'Multipage image navigation',
-       'img-lang' => 'Language selector for translatable SVGs',
-       'tablepager' => 'Table pager',
-       'autosumm' => 'Auto-summaries',
-       'autoblock_whitelist' => 'Autoblock whitelist',
-       'sizeunits' => 'Size units',
-       'bitrateunits' => 'Bitrate units',
-       'livepreview' => 'Live preview',
-       'lagwarning' => 'Friendlier slave lag warnings',
-       'watchlisteditor' => 'Watchlist editor',
-       'watchlisttools' => 'Watchlist editing tools',
-       'iranian-dates' => 'Iranian month names',
-       'hijri-dates' => 'Hijri month names',
-       'hebrew-dates' => 'Hebrew month names',
-       'signatures' => 'Signatures',
-       'CoreParserFunctions' => 'Core parser functions',
-       'version' => 'Special:Version',
-       'redirect' => 'Special:Redirect',
-       'fileduplicatesearch' => 'Special:FileDuplicateSearch',
-       'special-specialpages' => 'Special:SpecialPages',
-       'special-blank' => 'Special:BlankPage',
-       'external_images' => 'External image whitelist',
-       'special-tags' => 'Special:Tags',
-       'comparepages' => 'Special:ComparePages',
-       'db-error-messages' => 'Database error messages',
-       'html-forms' => 'HTML forms',
-       'sqlite' => 'SQLite database support',
-       'logging' => 'New logging system',
-       'logging-irc' => 'For IRC, see bug 34508. Do not change',
-       'feedback' => 'Feedback',
-       'searchsuggestions' => 'Search suggestions',
-       'apierrors' => 'API errors',
-       'duration' => 'Durations',
-       'cachedspecial' => 'SpecialCachedPage',
-       'rotation' => 'Image rotation',
-       'limitreport' => 'Limit report',
-       'expandtemplates' => 'Special:ExpandTemplates',
-       'trackingcategories' => 'Special:TrackingCategories'
-);
diff --git a/maintenance/language/rebuildLanguage.php b/maintenance/language/rebuildLanguage.php
deleted file mode 100644 (file)
index ea55a8e..0000000
+++ /dev/null
@@ -1,156 +0,0 @@
-<?php
-/**
- * Rewrite the messages array in the files languages/messages/MessagesXx.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 MaintenanceLanguage
- * @defgroup MaintenanceLanguage MaintenanceLanguage
- */
-
-require_once __DIR__ . '/../commandLine.inc';
-require_once 'languages.inc';
-require_once 'writeMessagesArray.inc';
-
-/**
- * Rewrite a messages array.
- *
- * @param Languages $languages
- * @param string $code The language code.
- * @param bool $write Write to the messages file?
- * @param bool $listUnknown List the unknown messages?
- * @param bool $removeUnknown Remove the unknown messages?
- * @param bool $removeDupes Remove the duplicated messages?
- * @param string $dupeMsgSource The source file intended to remove from the array.
- * @param string $messagesFolder Path to a folder to store the MediaWiki messages.
- */
-function rebuildLanguage( $languages, $code, $write, $listUnknown, $removeUnknown,
-       $removeDupes, $dupeMsgSource, $messagesFolder
-) {
-       $messages = $languages->getMessages( $code );
-       $messages = $messages['all'];
-       if ( $removeDupes ) {
-               $messages = removeDupes( $messages, $dupeMsgSource );
-       }
-       MessageWriter::writeMessagesToFile(
-               $messages,
-               $code,
-               $write,
-               $listUnknown,
-               $removeUnknown,
-               $messagesFolder
-       );
-}
-
-/**
- * Remove duplicates from a message array.
- *
- * @param array $oldMsgArray The input message array.
- * @param string $dupeMsgSource The source file path for duplicates.
- * @return array The output message array, with duplicates removed.
- */
-function removeDupes( $oldMsgArray, $dupeMsgSource ) {
-       if ( file_exists( $dupeMsgSource ) ) {
-               include $dupeMsgSource;
-               if ( !isset( $dupeMessages ) ) {
-                       echo "There are no duplicated messages in the source file provided.";
-                       exit( 1 );
-               }
-       } else {
-               echo "The specified file $dupeMsgSource cannot be found.";
-               exit( 1 );
-       }
-       $newMsgArray = $oldMsgArray;
-       foreach ( $oldMsgArray as $key => $value ) {
-               if ( array_key_exists( $key, $dupeMessages ) ) {
-                       unset( $newMsgArray[$key] );
-               }
-       }
-
-       return $newMsgArray;
-}
-
-# Show help
-if ( isset( $options['help'] ) ) {
-       echo <<<TEXT
-Run this script to rewrite the messages array in the files
-languages/messages/MessagesXX.php.
-Parameters:
-       * lang: Language code (default: the installation default language).
-         You can also specify "all" to check all the languages.
-       * help: Show this help.
-Options:
-       * dry-run: Do not write the array to the file.
-       * no-unknown: Do not list the unknown messages.
-       * remove-unknown: Remove unknown messages.
-       * remove-duplicates: Remove duplicated messages based on a PHP source file.
-       * messages-folder: An alternative folder with MediaWiki messages.
-
-TEXT;
-       exit( 1 );
-}
-
-# Get the language code
-if ( isset( $options['lang'] ) ) {
-       $wgCode = $options['lang'];
-} else {
-       $wgCode = $wgContLang->getCode();
-}
-
-# Get the duplicate message source
-if ( isset( $options['remove-duplicates'] ) && ( strcmp( $options['remove-duplicates'], '' ) ) ) {
-       $wgDupeMessageSource = $options['remove-duplicates'];
-} else {
-       $wgDupeMessageSource = '';
-}
-
-# Get the options
-$wgWriteToFile = !isset( $options['dry-run'] );
-$wgListUnknownMessages = !isset( $options['no-unknown'] );
-$wgRemoveUnknownMessages = isset( $options['remove-unknown'] );
-$wgRemoveDuplicateMessages = isset( $options['remove-duplicates'] );
-$messagesFolder = isset( $options['messages-folder'] ) ? $options['messages-folder'] : false;
-
-# Get language objects
-$languages = new Languages();
-
-# Write all the language
-if ( $wgCode == 'all' ) {
-       foreach ( $languages->getLanguages() as $languageCode ) {
-               rebuildLanguage(
-                       $languages,
-                       $languageCode,
-                       $wgWriteToFile,
-                       $wgListUnknownMessages,
-                       $wgRemoveUnknownMessages,
-                       $wgRemoveDuplicateMessages,
-                       $wgDupeMessageSource,
-                       $messagesFolder
-               );
-       }
-} else {
-       rebuildLanguage(
-               $languages,
-               $wgCode,
-               $wgWriteToFile,
-               $wgListUnknownMessages,
-               $wgRemoveUnknownMessages,
-               $wgRemoveDuplicateMessages,
-               $wgDupeMessageSource,
-               $messagesFolder
-       );
-}
diff --git a/maintenance/language/writeMessagesArray.inc b/maintenance/language/writeMessagesArray.inc
deleted file mode 100644 (file)
index aa2067e..0000000
+++ /dev/null
@@ -1,306 +0,0 @@
-<?php
-/**
- * Write a messages array as a PHP text.
- *
- * 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 MaintenanceLanguage
- */
-
-/**
- * @ingroup MaintenanceLanguage
- */
-class MessageWriter {
-       protected static $optionalComment =
-               'only translate this message to other languages if you have to change it';
-       protected static $ignoredComment = "do not translate or duplicate this message to other languages";
-
-       protected static $messageStructure;
-       protected static $blockComments;
-       protected static $ignoredMessages;
-       protected static $optionalMessages;
-
-       /**
-        * Write a messages array as a PHP text and write it to the messages file.
-        *
-        * @param array $messages The messages array.
-        * @param string $code The language code.
-        * @param bool $write Write to the messages file?
-        * @param bool $listUnknown List the unknown messages?
-        * @param bool $removeUnknown Whether to remove unkown messages
-        * @param string $messagesFolder Path to a folder to store the MediaWiki messages.
-        *   Defaults to the current install.
-        */
-       public static function writeMessagesToFile( $messages, $code, $write, $listUnknown,
-               $removeUnknown, $messagesFolder = false
-       ) {
-               # Rewrite the messages array
-               $messages = self::writeMessagesArray( $messages, $code == 'en', false, $removeUnknown );
-               $messagesText = $messages[0];
-               $sortedMessages = $messages[1];
-
-               # Write to the file
-               if ( $messagesFolder ) {
-                       $filename = Language::getFileName( "$messagesFolder/Messages", $code );
-               } else {
-                       $filename = Language::getMessagesFileName( $code );
-               }
-
-               if ( file_exists( $filename ) ) {
-                       $contents = file_get_contents( $filename );
-               } else {
-                       $contents = '<?php
-$messages = array(
-);
-';
-               }
-
-               if ( strpos( $contents, '$messages' ) !== false ) {
-                       $contents = explode( '$messages', $contents );
-                       if ( $messagesText == '$messages' . $contents[1] ) {
-                               echo "Generated messages for language $code. Same as the current file.\n";
-                       } else {
-                               if ( $write ) {
-                                       $new = $contents[0];
-                                       $new .= $messagesText;
-                                       file_put_contents( $filename, $new );
-                                       echo "Generated and wrote messages for language $code.\n";
-                               } else {
-                                       echo "Generated messages for language $code.\n" .
-                                               "Please run the script again (without the parameter \"dry-run\") " .
-                                               "to write the array to the file.\n";
-                               }
-                       }
-                       if ( $listUnknown && isset( $sortedMessages['unknown'] ) &&
-                               !empty( $sortedMessages['unknown'] )
-                       ) {
-                               if ( $removeUnknown ) {
-                                       echo "\nThe following " . count( $sortedMessages['unknown'] ) .
-                                               " unknown messages have been removed:\n";
-                               } else {
-                                       echo "\nThere are " . count( $sortedMessages['unknown'] ) .
-                                               " unknown messages, please check them:\n";
-                               }
-                               foreach ( $sortedMessages['unknown'] as $key => $value ) {
-                                       echo "* " . $key . "\n";
-                               }
-                       }
-               } else {
-                       echo "Generated messages for language $code. There seem to be no messages array in the file.\n";
-               }
-       }
-
-       /**
-        * Write a messages array as a PHP text.
-        *
-        * @param array $messages The messages array.
-        * @param bool $ignoredComments Show comments about ignored and optional
-        *   messages? (For English.)
-        * @param string $prefix Base path for messages.inc and messageTypes.inc files
-        *   or false for default path (this directory)
-        * @param bool $removeUnknown Whether to remove unkown messages
-        *
-        * @return array Array of the PHP text and the sorted messages array.
-        */
-       public static function writeMessagesArray( $messages, $ignoredComments = false,
-               $prefix = false, $removeUnknown = false
-       ) {
-               # Load messages
-               $dir = $prefix ? $prefix : __DIR__;
-
-               require $dir . '/messages.inc';
-               self::$messageStructure = $wgMessageStructure;
-               self::$blockComments = $wgBlockComments;
-
-               require $dir . '/messageTypes.inc';
-               self::$ignoredMessages = $wgIgnoredMessages;
-               self::$optionalMessages = $wgOptionalMessages;
-
-               # Sort messages to blocks
-               $sortedMessages['unknown'] = $messages;
-               foreach ( self::$messageStructure as $blockName => $block ) {
-                       /**
-                        * @var $block array
-                        */
-                       foreach ( $block as $key ) {
-                               if ( array_key_exists( $key, $sortedMessages['unknown'] ) ) {
-                                       $sortedMessages[$blockName][$key] = $sortedMessages['unknown'][$key];
-                                       unset( $sortedMessages['unknown'][$key] );
-                               }
-                       }
-               }
-
-               # Write all the messages
-               $messagesText = "\$messages = array(
-";
-               foreach ( $sortedMessages as $block => $messages ) {
-                       # Skip if it's the block of unknown messages - handle that in the end of file
-                       if ( $block == 'unknown' ) {
-                               continue;
-                       }
-
-                       if ( $ignoredComments ) {
-                               $ignored = self::$ignoredMessages;
-                               $optional = self::$optionalMessages;
-                       } else {
-                               $ignored = array();
-                               $optional = array();
-                       }
-                       $comments = self::makeComments( array_keys( $messages ), $ignored, $optional );
-
-                       # Write the block
-                       $messagesText .= self::writeMessagesBlock( self::$blockComments[$block], $messages, $comments );
-               }
-
-               # Write the unknown messages, alphabetically sorted.
-               # Of course, we don't have any comments for them, because they are unknown.
-               if ( !$removeUnknown ) {
-                       ksort( $sortedMessages['unknown'] );
-                       $messagesText .= self::writeMessagesBlock( 'Unknown messages', $sortedMessages['unknown'] );
-               }
-               $messagesText .= ");
-";
-
-               return array( $messagesText, $sortedMessages );
-       }
-
-       /**
-        * Generates an array of comments for messages.
-        *
-        * @param array $messages Key of messages.
-        * @param array $ignored List of ingored message keys.
-        * @param array $optional List of optional message keys.
-        * @return array
-        */
-       public static function makeComments( $messages, $ignored, $optional ) {
-               # Comment collector
-               $commentArray = array();
-
-               # List of keys only
-               foreach ( $messages as $key ) {
-                       if ( in_array( $key, $ignored ) ) {
-                               $commentArray[$key] = ' # ' . self::$ignoredComment;
-                       } elseif ( in_array( $key, $optional ) ) {
-                               $commentArray[$key] = ' # ' . self::$optionalComment;
-                       }
-               }
-
-               return $commentArray;
-       }
-
-       /**
-        * Write a block of messages to PHP.
-        *
-        * @param string $blockComment The comment of whole block.
-        * @param array $messages The block messages.
-        * @param array $messageComments Optional comments for messages in this block.
-        * @param string $prefix Prefix for every line, for indenting purposes.
-        *
-        * @return string The block, formatted in PHP.
-        */
-       public static function writeMessagesBlock( $blockComment, $messages,
-               $messageComments = array(), $prefix = '' ) {
-
-               $blockText = '';
-
-               # Skip the block if it includes no messages
-               if ( empty( $messages ) ) {
-                       return '';
-               }
-
-               # Format the block comment (if exists); check for multiple lines comments
-               if ( !empty( $blockComment ) ) {
-                       if ( strpos( $blockComment, "\n" ) === false ) {
-                               $blockText .= "$prefix# $blockComment
-";
-                       } else {
-                               $blockText .= "$prefix/*
-$blockComment
-*/
-";
-                       }
-               }
-
-               # Get max key length
-               $maxKeyLength = max( array_map( 'strlen', array_keys( $messages ) ) );
-
-               # Format the messages
-               foreach ( $messages as $key => $value ) {
-                       # Add the key name
-                       $blockText .= "$prefix'$key'";
-
-                       # Add the appropriate block whitespace
-                       $blockText .= str_repeat( ' ', $maxKeyLength - strlen( $key ) );
-
-                       # Refer to the value
-                       $blockText .= ' => ';
-
-                       # Check for the appropriate apostrophe and add the value
-                       # Quote \ here, because it needs always escaping
-                       $value = addcslashes( $value, '\\' );
-
-                       # For readability
-                       $single = "'";
-                       $double = '"';
-
-                       if ( strpos( $value, $single ) === false ) {
-                               # Nothing ugly, just use '
-                               $blockText .= $single . $value . $single;
-                       } elseif ( strpos( $value, $double ) === false &&
-                               !preg_match( '/\$[a-zA-Z_\x7f-\xff]/', $value )
-                       ) {
-                               # No "-quotes, no variables that need quoting, use "
-                               $blockText .= $double . $value . $double;
-                       } else {
-                               # Something needs quoting, pick the quote which causes less quoting
-
-                               if ( substr_count( $value, $double ) + substr_count( $value, '$' ) >=
-                                       substr_count( $value, $single )
-                               ) {
-                                       $quote = $single;
-                               } else {
-                                       $quote = $double;
-                               }
-
-                               if ( $quote === $double ) {
-                                       $extra = '$';
-                               } else {
-                                       $extra = '';
-                               }
-                               $blockText .= $quote . addcslashes( $value, $quote . $extra ) . $quote;
-                       }
-
-                       # Comma
-                       $blockText .= ',';
-
-                       # Add comments, if there is any
-                       if ( array_key_exists( $key, $messageComments ) ) {
-                               $blockText .= $messageComments[$key];
-                       }
-
-                       # Newline
-                       $blockText .= "
-";
-               }
-
-               # Newline to end the block
-               $blockText .= "
-";
-
-               return $blockText;
-       }
-}
diff --git a/maintenance/oracle/archives/patch-page_links_updated.sql b/maintenance/oracle/archives/patch-page_links_updated.sql
new file mode 100644 (file)
index 0000000..5360329
--- /dev/null
@@ -0,0 +1,4 @@
+define mw_prefix='{$wgDBprefix}';
+
+ALTER TABLE &mw_prefix.page ADD page_links_updated TIMESTAMP(6) WITH TIME ZONE;
+
diff --git a/maintenance/oracle/archives/patch-rc_source.sql b/maintenance/oracle/archives/patch-rc_source.sql
new file mode 100644 (file)
index 0000000..0c80afa
--- /dev/null
@@ -0,0 +1,3 @@
+define mw_prefix='{$wgDBprefix}';
+
+ALTER TABLE &mw_prefix.recentchanges ADD rc_source VARCHAR2(16);
index 8e752da..824cc82 100644 (file)
@@ -1,3 +1,3 @@
 define mw_prefix='{$wgDBprefix}';
 
-ALTER TABLE &mw_prefix.mwuser ADD user_password_expires TIMESTAMP(6) WITH TIME ZONE NULL DEFAULT NULL;
+ALTER TABLE &mw_prefix.mwuser ADD user_password_expires TIMESTAMP(6) WITH TIME ZONE;
index f05c0cc..ff84858 100644 (file)
@@ -19,7 +19,7 @@ CREATE TABLE &mw_prefix.mwuser ( -- replace reserved word 'user'
   user_touched              TIMESTAMP(6) WITH TIME ZONE,
   user_registration         TIMESTAMP(6) WITH TIME ZONE,
   user_editcount            NUMBER,
-  user_password_expires     TIMESTAMP(6) WITH TIME ZONE NULL DEFAULT NULL
+  user_password_expires     TIMESTAMP(6) WITH TIME ZONE
 );
 ALTER TABLE &mw_prefix.mwuser ADD CONSTRAINT &mw_prefix.mwuser_pk PRIMARY KEY (user_id);
 CREATE UNIQUE INDEX &mw_prefix.mwuser_u01 ON &mw_prefix.mwuser (user_name);
@@ -28,7 +28,8 @@ CREATE INDEX &mw_prefix.mwuser_i02 ON &mw_prefix.mwuser (user_email, user_name);
 
 -- Create a dummy user to satisfy fk contraints especially with revisions
 INSERT INTO &mw_prefix.mwuser
-  VALUES (0,'Anonymous',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, '', current_timestamp, current_timestamp, 0);
+  (user_id, user_name, user_options, user_touched, user_registration, user_editcount)
+  VALUES (0,'Anonymous','', current_timestamp, current_timestamp,0);
 
 CREATE TABLE &mw_prefix.user_groups (
   ug_user   NUMBER      DEFAULT 0 NOT NULL,
@@ -73,6 +74,7 @@ CREATE TABLE &mw_prefix.page (
   page_is_new        CHAR(1)           DEFAULT '0' NOT NULL,
   page_random        NUMBER(15,14) NOT NULL,
   page_touched       TIMESTAMP(6) WITH TIME ZONE,
+  page_links_updated TIMESTAMP(6) WITH TIME ZONE,
   page_latest        NUMBER        DEFAULT 0 NOT NULL, -- FK?
   page_len           NUMBER        DEFAULT 0 NOT NULL,
   page_content_model VARCHAR2(32)
@@ -85,7 +87,7 @@ CREATE INDEX &mw_prefix.page_i03 ON &mw_prefix.page (page_is_redirect, page_name
 
 -- Create a dummy page to satisfy fk contraints especially with revisions
 INSERT INTO &mw_prefix.page
-  VALUES (0, 0, ' ', NULL, 0, 0, 0, 0, current_timestamp, 0, 0, NULL);
+  VALUES (0, 0, ' ', NULL, 0, 0, 0, 0, current_timestamp, NULL, 0, 0, NULL);
 
 /*$mw$*/
 CREATE TRIGGER &mw_prefix.page_set_random BEFORE INSERT ON &mw_prefix.page
@@ -403,7 +405,7 @@ CREATE SEQUENCE recentchanges_rc_id_seq;
 CREATE TABLE &mw_prefix.recentchanges (
   rc_id              NUMBER      NOT NULL,
   rc_timestamp       TIMESTAMP(6) WITH TIME ZONE  NOT NULL,
-  rc_cur_time        TIMESTAMP(6) WITH TIME ZONE  NOT NULL,
+  rc_cur_time        TIMESTAMP(6) WITH TIME ZONE,
   rc_user            NUMBER          DEFAULT 0 NOT NULL,
   rc_user_text       VARCHAR2(255)         NOT NULL,
   rc_namespace       NUMBER     DEFAULT 0 NOT NULL,
@@ -416,6 +418,7 @@ CREATE TABLE &mw_prefix.recentchanges (
   rc_this_oldid      NUMBER      DEFAULT 0 NOT NULL,
   rc_last_oldid      NUMBER      DEFAULT 0 NOT NULL,
   rc_type            CHAR(1)         DEFAULT '0' NOT NULL,
+  rc_source                                     VARCHAR2(16),
   rc_patrolled       CHAR(1)         DEFAULT '0' NOT NULL,
   rc_ip              VARCHAR2(15),
   rc_old_len         NUMBER,
diff --git a/maintenance/pageExists.php b/maintenance/pageExists.php
new file mode 100644 (file)
index 0000000..c4b208a
--- /dev/null
@@ -0,0 +1,54 @@
+<?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
+ */
+
+require_once __DIR__ . '/Maintenance.php';
+
+/**
+ * @ingroup Maintenance
+ */
+class PageExists extends Maintenance {
+       public function __construct() {
+               parent::__construct();
+               $this->mDescription = "Report whether a specific page exists";
+               $this->addArg( 'title', 'Page title to check whether it exists' );
+       }
+
+       public function execute() {
+               $titleArg = $this->getArg();
+               $title = Title::newFromText( $titleArg );
+               $pageExists = $title && $title->exists();
+
+               $text = '';
+               $code = 0;
+               if ( $pageExists ) {
+                       $text = "{$title} exists.";
+               } else {
+                       $text = "{$title} doesn't exist.";
+                       $code = 1;
+               }
+               $this->output( $text );
+               $this->error( '', $code );
+       }
+}
+
+$maintClass = "PageExists";
+require_once RUN_MAINTENANCE_IF_MAIN;
+
index f69a3a3..9b86e1b 100644 (file)
@@ -189,9 +189,11 @@ class RunJobs extends Maintenance {
 
                $seconds = 0;
                if ( $job->workItemCount() > 0 ) {
-                       $seconds = floor( $job->workItemCount() / $itemsPerSecond );
-                       $remainder = $job->workItemCount() % $itemsPerSecond;
-                       $seconds += ( mt_rand( 1, $itemsPerSecond ) <= $remainder ) ? 1 : 0;
+                       $exactSeconds = $job->workItemCount() / $itemsPerSecond;
+                       // use randomized rounding
+                       $seconds = floor( $exactSeconds );
+                       $remainder = $exactSeconds - $seconds;
+                       $seconds += ( mt_rand() / mt_getrandmax() < $remainder ) ? 1 : 0;
                }
 
                return (int)$seconds;
old mode 100644 (file)
new mode 100755 (executable)
index f96ee39..a51564a
@@ -1,3 +1,4 @@
+#!/usr/bin/env php
 <?php
 /**
  * Run all updaters.
index 6057b39..f081868 100644 (file)
@@ -190,7 +190,10 @@ return array(
        /* jQuery */
 
        'jquery' => array(
-               'scripts' => 'resources/lib/jquery/jquery.js',
+               'scripts' => array(
+                       'resources/lib/jquery/jquery.js',
+                       'resources/lib/jquery/jquery.migrate.js',
+               ),
                'debugRaw' => false,
                'targets' => array( 'desktop', 'mobile' ),
        ),
@@ -201,7 +204,9 @@ return array(
                'scripts' => 'resources/src/jquery/jquery.accessKeyLabel.js',
                'dependencies' => array(
                        'jquery.client',
+                       'jquery.mwExtension',
                ),
+               'messages' => array( 'brackets', 'word-separator' ),
                'targets' => array( 'mobile', 'desktop' ),
        ),
        'jquery.appear' => array(
@@ -252,6 +257,7 @@ return array(
        'jquery.colorUtil' => array(
                'scripts' => 'resources/src/jquery/jquery.colorUtil.js',
        ),
+       // Use mediawiki.cookie in new code, rather than jquery.cookie.
        'jquery.cookie' => array(
                'scripts' => 'resources/lib/jquery/jquery.cookie.js',
                'targets' => array( 'desktop', 'mobile' ),
@@ -924,6 +930,12 @@ return array(
                'position' => 'top', // For $wgPreloadJavaScriptMwUtil
                'targets' => array( 'desktop', 'mobile' ),
        ),
+       'mediawiki.cookie' => array(
+               'scripts' => 'resources/src/mediawiki/mediawiki.cookie.js',
+               'dependencies' => array(
+                       'jquery.cookie',
+               ),
+       ),
 
        /* MediaWiki Action */
 
@@ -1136,10 +1148,10 @@ return array(
        'mediawiki.page.watch.ajax' => array(
                'scripts' => 'resources/src/mediawiki.page/mediawiki.page.watch.ajax.js',
                'dependencies' => array(
-                       'mediawiki.page.startup',
                        'mediawiki.api.watch',
-                       'mediawiki.util',
                        'mediawiki.notify',
+                       'mediawiki.util',
+                       'jquery.accessKeyLabel',
                        'jquery.mwExtension',
                ),
                'messages' => array(
@@ -1421,6 +1433,10 @@ return array(
                        'ooui-outline-control-move-up',
                        'ooui-outline-control-remove',
                        'ooui-toolbar-more',
+                       'ooui-dialog-confirm-title',
+                       'ooui-dialog-confirm-default-prompt',
+                       'ooui-dialog-confirm-default-ok',
+                       'ooui-dialog-confirm-default-cancel'
                ),
                'dependencies' => array(
                        'oojs',
index a86bf79..d4b67f7 100644 (file)
@@ -1,71 +1,81 @@
 /*!
- * jQuery JavaScript Library v1.8.3
+ * jQuery JavaScript Library v1.11.1
  * http://jquery.com/
  *
  * Includes Sizzle.js
  * http://sizzlejs.com/
  *
- * Copyright 2012 jQuery Foundation and other contributors
+ * Copyright 2005, 2014 jQuery Foundation, Inc. and other contributors
  * Released under the MIT license
  * http://jquery.org/license
  *
- * Date: Tue Nov 13 2012 08:20:33 GMT-0500 (Eastern Standard Time)
+ * Date: 2014-05-01T17:42Z
  */
-(function( window, undefined ) {
-var
-       // A central reference to the root jQuery(document)
-       rootjQuery,
 
-       // The deferred used on DOM ready
-       readyList,
+(function( global, factory ) {
+
+       if ( typeof module === "object" && typeof module.exports === "object" ) {
+               // For CommonJS and CommonJS-like environments where a proper window is present,
+               // execute the factory and get jQuery
+               // For environments that do not inherently posses a window with a document
+               // (such as Node.js), expose a jQuery-making factory as module.exports
+               // This accentuates the need for the creation of a real window
+               // e.g. var jQuery = require("jquery")(window);
+               // See ticket #14549 for more info
+               module.exports = global.document ?
+                       factory( global, true ) :
+                       function( w ) {
+                               if ( !w.document ) {
+                                       throw new Error( "jQuery requires a window with a document" );
+                               }
+                               return factory( w );
+                       };
+       } else {
+               factory( global );
+       }
 
-       // Use the correct document accordingly with window argument (sandbox)
-       document = window.document,
-       location = window.location,
-       navigator = window.navigator,
+// Pass this if window is not defined yet
+}(typeof window !== "undefined" ? window : this, function( window, noGlobal ) {
 
-       // Map over jQuery in case of overwrite
-       _jQuery = window.jQuery,
+// Can't do this because several apps including ASP.NET trace
+// the stack via arguments.caller.callee and Firefox dies if
+// you try to trace through "use strict" call chains. (#13335)
+// Support: Firefox 18+
+//
 
-       // Map over the $ in case of overwrite
-       _$ = window.$,
+var deletedIds = [];
 
-       // 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,
+var slice = deletedIds.slice;
 
-       // 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 );
-       },
+var concat = deletedIds.concat;
 
-       // Used for matching numbers
-       core_pnum = /[\-+]?(?:\d*\.|)\d+(?:[eE][\-+]?\d+|)/.source,
+var push = deletedIds.push;
 
-       // Used for detecting and trimming whitespace
-       core_rnotwhite = /\S/,
-       core_rspace = /\s+/,
+var indexOf = deletedIds.indexOf;
 
-       // 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,
+var class2type = {};
+
+var toString = class2type.toString;
+
+var hasOwn = class2type.hasOwnProperty;
+
+var support = {};
 
-       // 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,
+var
+       version = "1.11.1",
+
+       // Define a local copy of jQuery
+       jQuery = function( selector, context ) {
+               // The jQuery object is actually just the init constructor 'enhanced'
+               // Need init if jQuery is called (just allow error to be thrown if not included)
+               return new jQuery.fn.init( selector, context );
+       },
+
+       // Support: Android<4.1, IE<9
+       // Make sure we trim BOM and NBSP
+       rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,
 
        // Matches dashed string for camelizing
        rmsPrefix = /^-ms-/,
@@ -73,163 +83,48 @@ var
 
        // 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 = {};
+               return letter.toUpperCase();
+       };
 
 jQuery.fn = jQuery.prototype = {
-       constructor: jQuery,
-       init: function( selector, context, rootjQuery ) {
-               var match, elem, ret, doc;
-
-               // Handle $(""), $(null), $(undefined), $(false)
-               if ( !selector ) {
-                       return this;
-               }
-
-               // Handle $(DOMElement)
-               if ( selector.nodeType ) {
-                       this.context = this[0] = selector;
-                       this.length = 1;
-                       return this;
-               }
-
-               // 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 ];
-
-                       } else {
-                               match = rquickExpr.exec( selector );
-                       }
-
-                       // Match html or make sure no context is specified for #id
-                       if ( match && (match[1] || !context) ) {
-
-                               // HANDLE: $(html) -> $(array)
-                               if ( match[1] ) {
-                                       context = context instanceof jQuery ? context[0] : context;
-                                       doc = ( context && context.nodeType ? context.ownerDocument || context : document );
-
-                                       // 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 );
-                                       }
-
-                                       return jQuery.merge( this, selector );
-
-                               // 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 );
-                                               }
-
-                                               // Otherwise, we inject the element directly into the jQuery object
-                                               this.length = 1;
-                                               this[0] = elem;
-                                       }
-
-                                       this.context = document;
-                                       this.selector = selector;
-                                       return this;
-                               }
-
-                       // HANDLE: $(expr, $(...))
-                       } else if ( !context || context.jquery ) {
-                               return ( context || rootjQuery ).find( selector );
-
-                       // HANDLE: $(expr, context)
-                       // (which is just equivalent to: $(context).find(expr)
-                       } else {
-                               return this.constructor( context ).find( selector );
-                       }
-
-               // HANDLE: $(function)
-               // Shortcut for document ready
-               } else if ( jQuery.isFunction( selector ) ) {
-                       return rootjQuery.ready( selector );
-               }
-
-               if ( selector.selector !== undefined ) {
-                       this.selector = selector.selector;
-                       this.context = selector.context;
-               }
+       // The current version of jQuery being used
+       jquery: version,
 
-               return jQuery.makeArray( selector, this );
-       },
+       constructor: jQuery,
 
        // Start with an empty selector
        selector: "",
 
-       // The current version of jQuery being used
-       jquery: "1.8.3",
-
        // The default length of a jQuery object is 0
        length: 0,
 
-       // The number of elements contained in the matched element set
-       size: function() {
-               return this.length;
-       },
-
        toArray: function() {
-               return core_slice.call( this );
+               return slice.call( this );
        },
 
        // 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 ?
+               return num != null ?
 
-                       // Return a 'clean' array
-                       this.toArray() :
+                       // Return just the one element from the set
+                       ( num < 0 ? this[ num + this.length ] : this[ num ] ) :
 
-                       // Return just the object
-                       ( num < 0 ? this[ this.length + num ] : this[ num ] );
+                       // Return all the elements in a clean array
+                       slice.call( this );
        },
 
        // Take an array of elements and push it onto the stack
        // (returning the new matched element set)
-       pushStack: function( elems, name, selector ) {
+       pushStack: function( elems ) {
 
                // Build a new jQuery matched element set
                var ret = jQuery.merge( this.constructor(), elems );
 
                // Add the old object onto the stack (as a reference)
                ret.prevObject = this;
-
                ret.context = this.context;
 
-               if ( name === "find" ) {
-                       ret.selector = this.selector + ( this.selector ? " " : "" ) + selector;
-               } else if ( name ) {
-                       ret.selector = this.selector + "." + name + "(" + selector + ")";
-               }
-
                // Return the newly-formed element set
                return ret;
        },
@@ -241,18 +136,14 @@ jQuery.fn = jQuery.prototype = {
                return jQuery.each( this, callback, args );
        },
 
-       ready: function( fn ) {
-               // Add the callback
-               jQuery.ready.promise().done( fn );
-
-               return this;
+       map: function( callback ) {
+               return this.pushStack( jQuery.map(this, function( elem, i ) {
+                       return callback.call( elem, i, elem );
+               }));
        },
 
-       eq: function( i ) {
-               i = +i;
-               return i === -1 ?
-                       this.slice( i ) :
-                       this.slice( i, i + 1 );
+       slice: function() {
+               return this.pushStack( slice.apply( this, arguments ) );
        },
 
        first: function() {
@@ -263,15 +154,10 @@ jQuery.fn = jQuery.prototype = {
                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 );
-               }));
+       eq: function( i ) {
+               var len = this.length,
+                       j = +i + ( i < 0 ? len : 0 );
+               return this.pushStack( j >= 0 && j < len ? [ this[j] ] : [] );
        },
 
        end: function() {
@@ -280,16 +166,13 @@ jQuery.fn = jQuery.prototype = {
 
        // For internal use only.
        // Behaves like an Array's method, not like a jQuery method.
-       push: core_push,
-       sort: [].sort,
-       splice: [].splice
+       push: push,
+       sort: deletedIds.sort,
+       splice: deletedIds.splice
 };
 
-// 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,
+       var src, copyIsArray, copy, name, options, clone,
                target = arguments[0] || {},
                i = 1,
                length = arguments.length,
@@ -298,9 +181,10 @@ jQuery.extend = jQuery.fn.extend = function() {
        // Handle a deep copy situation
        if ( typeof target === "boolean" ) {
                deep = target;
-               target = arguments[1] || {};
+
                // skip the boolean and the target
-               i = 2;
+               target = arguments[ i ] || {};
+               i++;
        }
 
        // Handle case when target is a string or something (possible in deep copy)
@@ -309,9 +193,9 @@ jQuery.extend = jQuery.fn.extend = function() {
        }
 
        // extend jQuery itself if only one argument is passed
-       if ( length === i ) {
+       if ( i === length ) {
                target = this;
-               --i;
+               i--;
        }
 
        for ( ; i < length; i++ ) {
@@ -353,63 +237,17 @@ jQuery.extend = jQuery.fn.extend = function() {
 };
 
 jQuery.extend({
-       noConflict: function( deep ) {
-               if ( window.$ === jQuery ) {
-                       window.$ = _$;
-               }
-
-               if ( deep && window.jQuery === jQuery ) {
-                       window.jQuery = _jQuery;
-               }
-
-               return jQuery;
-       },
-
-       // Is the DOM ready to be used? Set to true once it occurs.
-       isReady: false,
+       // Unique for each copy of jQuery on the page
+       expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ),
 
-       // A counter to track how many items to wait for before
-       // the ready event fires. See #6781
-       readyWait: 1,
+       // Assume jQuery is ready without the ready module
+       isReady: true,
 
-       // Hold (or release) the ready event
-       holdReady: function( hold ) {
-               if ( hold ) {
-                       jQuery.readyWait++;
-               } else {
-                       jQuery.ready( true );
-               }
+       error: function( msg ) {
+               throw new Error( msg );
        },
 
-       // Handle when the DOM is ready
-       ready: function( wait ) {
-
-               // Abort if there are pending holds or we're already ready
-               if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {
-                       return;
-               }
-
-               // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
-               if ( !document.body ) {
-                       return setTimeout( jQuery.ready, 1 );
-               }
-
-               // 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;
-               }
-
-               // If there are functions bound, to execute
-               readyList.resolveWith( document, [ jQuery ] );
-
-               // Trigger any bound ready events
-               if ( jQuery.fn.trigger ) {
-                       jQuery( document ).trigger("ready").off("ready");
-               }
-       },
+       noop: function() {},
 
        // See test/unit/core.js for details concerning isFunction.
        // Since version 1.3, DOM methods and functions like alert
@@ -423,20 +261,28 @@ jQuery.extend({
        },
 
        isWindow: function( obj ) {
+               /* jshint eqeqeq: false */
                return obj != null && obj == obj.window;
        },
 
        isNumeric: function( obj ) {
-               return !isNaN( parseFloat(obj) ) && isFinite( obj );
+               // parseFloat NaNs numeric-cast false positives (null|true|false|"")
+               // ...but misinterprets leading-number strings, particularly hex literals ("0x...")
+               // subtraction forces infinities to NaN
+               return !jQuery.isArray( obj ) && obj - parseFloat( obj ) >= 0;
        },
 
-       type: function( obj ) {
-               return obj == null ?
-                       String( obj ) :
-                       class2type[ core_toString.call(obj) ] || "object";
+       isEmptyObject: function( obj ) {
+               var name;
+               for ( name in obj ) {
+                       return false;
+               }
+               return true;
        },
 
        isPlainObject: function( obj ) {
+               var key;
+
                // 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
@@ -447,8 +293,8 @@ jQuery.extend({
                try {
                        // Not own constructor property must be Object
                        if ( obj.constructor &&
-                               !core_hasOwn.call(obj, "constructor") &&
-                               !core_hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) {
+                               !hasOwn.call(obj, "constructor") &&
+                               !hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) {
                                return false;
                        }
                } catch ( e ) {
@@ -456,107 +302,35 @@ jQuery.extend({
                        return false;
                }
 
+               // Support: IE<9
+               // Handle iteration over inherited properties before own properties.
+               if ( support.ownLast ) {
+                       for ( key in obj ) {
+                               return hasOwn.call( obj, key );
+                       }
+               }
+
                // Own properties are enumerated firstly, so to speed up,
                // if last one is own, then all properties are own.
-
-               var key;
                for ( key in obj ) {}
 
-               return key === undefined || core_hasOwn.call( obj, key );
-       },
-
-       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;
-
-               // Single tag
-               if ( (parsed = rsingleTag.exec( data )) ) {
-                       return [ context.createElement( parsed[1] ) ];
-               }
-
-               parsed = jQuery.buildFragment( [ data ], context, scripts ? null : [] );
-               return jQuery.merge( [],
-                       (parsed.cacheable ? jQuery.clone( parsed.fragment ) : parsed.fragment).childNodes );
-       },
-
-       parseJSON: function( data ) {
-               if ( !data || typeof data !== "string") {
-                       return null;
-               }
-
-               // Make sure leading/trailing whitespace is removed (IE can't handle it)
-               data = jQuery.trim( data );
-
-               // Attempt to parse using the native JSON parser first
-               if ( window.JSON && window.JSON.parse ) {
-                       return window.JSON.parse( data );
-               }
-
-               // 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, "")) ) {
-
-                       return ( new Function( "return " + data ) )();
-
-               }
-               jQuery.error( "Invalid JSON: " + data );
+               return key === undefined || hasOwn.call( obj, key );
        },
 
-       // 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 );
+       type: function( obj ) {
+               if ( obj == null ) {
+                       return obj + "";
                }
-               return xml;
+               return typeof obj === "object" || typeof obj === "function" ?
+                       class2type[ toString.call(obj) ] || "object" :
+                       typeof obj;
        },
 
-       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 ) ) {
+               if ( data && jQuery.trim( data ) ) {
                        // We use execScript on Internet Explorer
                        // We use an anonymous function so that context is window
                        // rather than jQuery in Firefox
@@ -578,21 +352,25 @@ jQuery.extend({
 
        // args is for internal usage only
        each: function( obj, callback, args ) {
-               var name,
+               var value,
                        i = 0,
                        length = obj.length,
-                       isObj = length === undefined || jQuery.isFunction( obj );
+                       isArray = isArraylike( obj );
 
                if ( args ) {
-                       if ( isObj ) {
-                               for ( name in obj ) {
-                                       if ( callback.apply( obj[ name ], args ) === false ) {
+                       if ( isArray ) {
+                               for ( ; i < length; i++ ) {
+                                       value = callback.apply( obj[ i ], args );
+
+                                       if ( value === false ) {
                                                break;
                                        }
                                }
                        } else {
-                               for ( ; i < length; ) {
-                                       if ( callback.apply( obj[ i++ ], args ) === false ) {
+                               for ( i in obj ) {
+                                       value = callback.apply( obj[ i ], args );
+
+                                       if ( value === false ) {
                                                break;
                                        }
                                }
@@ -600,15 +378,19 @@ jQuery.extend({
 
                // 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 ) {
+                       if ( isArray ) {
+                               for ( ; i < length; i++ ) {
+                                       value = callback.call( obj[ i ], i, obj[ i ] );
+
+                                       if ( value === false ) {
                                                break;
                                        }
                                }
                        } else {
-                               for ( ; i < length; ) {
-                                       if ( callback.call( obj[ i ], i, obj[ i++ ] ) === false ) {
+                               for ( i in obj ) {
+                                       value = callback.call( obj[ i ], i, obj[ i ] );
+
+                                       if ( value === false ) {
                                                break;
                                        }
                                }
@@ -618,35 +400,25 @@ jQuery.extend({
                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 );
-               } :
-
-               // Otherwise use our own trimming functionality
-               function( text ) {
-                       return text == null ?
-                               "" :
-                               ( text + "" ).replace( rtrim, "" );
-               },
+       // Support: Android<4.1, IE<9
+       trim: function( text ) {
+               return text == null ?
+                       "" :
+                       ( text + "" ).replace( rtrim, "" );
+       },
 
        // results is for internal usage only
        makeArray: function( arr, results ) {
-               var type,
-                       ret = results || [];
+               var ret = results || [];
 
                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 );
-
-                       if ( arr.length == null || type === "string" || type === "function" || type === "regexp" || jQuery.isWindow( arr ) ) {
-                               core_push.call( ret, arr );
+                       if ( isArraylike( Object(arr) ) ) {
+                               jQuery.merge( ret,
+                                       typeof arr === "string" ?
+                                       [ arr ] : arr
+                               );
                        } else {
-                               jQuery.merge( ret, arr );
+                               push.call( ret, arr );
                        }
                }
 
@@ -657,8 +429,8 @@ jQuery.extend({
                var len;
 
                if ( arr ) {
-                       if ( core_indexOf ) {
-                               return core_indexOf.call( arr, elem, i );
+                       if ( indexOf ) {
+                               return indexOf.call( arr, elem, i );
                        }
 
                        len = arr.length;
@@ -676,16 +448,17 @@ jQuery.extend({
        },
 
        merge: function( first, second ) {
-               var l = second.length,
-                       i = first.length,
-                       j = 0;
+               var len = +second.length,
+                       j = 0,
+                       i = first.length;
 
-               if ( typeof l === "number" ) {
-                       for ( ; j < l; j++ ) {
-                               first[ i++ ] = second[ j ];
-                       }
+               while ( j < len ) {
+                       first[ i++ ] = second[ j++ ];
+               }
 
-               } else {
+               // Support: IE<9
+               // Workaround casting of .length to NaN on otherwise arraylike objects (e.g., NodeLists)
+               if ( len !== len ) {
                        while ( second[j] !== undefined ) {
                                first[ i++ ] = second[ j++ ];
                        }
@@ -696,57 +469,56 @@ jQuery.extend({
                return first;
        },
 
-       grep: function( elems, callback, inv ) {
-               var retVal,
-                       ret = [],
+       grep: function( elems, callback, invert ) {
+               var callbackInverse,
+                       matches = [],
                        i = 0,
-                       length = elems.length;
-               inv = !!inv;
+                       length = elems.length,
+                       callbackExpect = !invert;
 
                // 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 ] );
+                       callbackInverse = !callback( elems[ i ], i );
+                       if ( callbackInverse !== callbackExpect ) {
+                               matches.push( elems[ i ] );
                        }
                }
 
-               return ret;
+               return matches;
        },
 
        // arg is for internal usage only
        map: function( elems, callback, arg ) {
-               var value, key,
-                       ret = [],
+               var value,
                        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 ) ) ;
+                       isArray = isArraylike( elems ),
+                       ret = [];
 
-               // Go through the array, translating each of the items to their
+               // Go through the array, translating each of the items to their new values
                if ( isArray ) {
                        for ( ; i < length; i++ ) {
                                value = callback( elems[ i ], i, arg );
 
                                if ( value != null ) {
-                                       ret[ ret.length ] = value;
+                                       ret.push( value );
                                }
                        }
 
                // Go through every key on the object,
                } else {
-                       for ( key in elems ) {
-                               value = callback( elems[ key ], key, arg );
+                       for ( i in elems ) {
+                               value = callback( elems[ i ], i, arg );
 
                                if ( value != null ) {
-                                       ret[ ret.length ] = value;
+                                       ret.push( value );
                                }
                        }
                }
 
                // Flatten any nested arrays
-               return ret.concat.apply( [], ret );
+               return concat.apply( [], ret );
        },
 
        // A global GUID counter for objects
@@ -755,7 +527,7 @@ jQuery.extend({
        // Bind a function to a context, optionally partially applying any
        // arguments.
        proxy: function( fn, context ) {
-               var tmp, args, proxy;
+               var args, proxy, tmp;
 
                if ( typeof context === "string" ) {
                        tmp = fn[ context ];
@@ -770,9 +542,9 @@ jQuery.extend({
                }
 
                // Simulated bind
-               args = core_slice.call( arguments, 2 );
+               args = slice.call( arguments, 2 );
                proxy = function() {
-                       return fn.apply( context, args.concat( core_slice.call( arguments ) ) );
+                       return fn.apply( context || this, args.concat( slice.call( arguments ) ) );
                };
 
                // Set the guid of unique handler to the same of original handler, so it can be removed
@@ -781,6519 +553,8008 @@ jQuery.extend({
                return proxy;
        },
 
-       // 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 );
-                                       };
+       now: function() {
+               return +( new Date() );
+       },
+
+       // jQuery.support is not used in Core but other projects attach their
+       // properties to it so it needs to exist.
+       support: support
+});
+
+// Populate the class2type map
+jQuery.each("Boolean Number String Function Array Date RegExp Object Error".split(" "), function(i, name) {
+       class2type[ "[object " + name + "]" ] = name.toLowerCase();
+});
+
+function isArraylike( obj ) {
+       var length = obj.length,
+               type = jQuery.type( obj );
+
+       if ( type === "function" || jQuery.isWindow( obj ) ) {
+               return false;
+       }
+
+       if ( obj.nodeType === 1 && length ) {
+               return true;
+       }
+
+       return type === "array" || length === 0 ||
+               typeof length === "number" && length > 0 && ( length - 1 ) in obj;
+}
+var Sizzle =
+/*!
+ * Sizzle CSS Selector Engine v1.10.19
+ * http://sizzlejs.com/
+ *
+ * Copyright 2013 jQuery Foundation, Inc. and other contributors
+ * Released under the MIT license
+ * http://jquery.org/license
+ *
+ * Date: 2014-04-18
+ */
+(function( window ) {
+
+var i,
+       support,
+       Expr,
+       getText,
+       isXML,
+       tokenize,
+       compile,
+       select,
+       outermostContext,
+       sortInput,
+       hasDuplicate,
+
+       // Local document vars
+       setDocument,
+       document,
+       docElem,
+       documentIsHTML,
+       rbuggyQSA,
+       rbuggyMatches,
+       matches,
+       contains,
+
+       // Instance-specific data
+       expando = "sizzle" + -(new Date()),
+       preferredDoc = window.document,
+       dirruns = 0,
+       done = 0,
+       classCache = createCache(),
+       tokenCache = createCache(),
+       compilerCache = createCache(),
+       sortOrder = function( a, b ) {
+               if ( a === b ) {
+                       hasDuplicate = true;
+               }
+               return 0;
+       },
+
+       // General-purpose constants
+       strundefined = typeof undefined,
+       MAX_NEGATIVE = 1 << 31,
+
+       // Instance methods
+       hasOwn = ({}).hasOwnProperty,
+       arr = [],
+       pop = arr.pop,
+       push_native = arr.push,
+       push = arr.push,
+       slice = arr.slice,
+       // Use a stripped-down indexOf if we can't use a native one
+       indexOf = arr.indexOf || function( elem ) {
+               var i = 0,
+                       len = this.length;
+               for ( ; i < len; i++ ) {
+                       if ( this[i] === elem ) {
+                               return i;
+                       }
+               }
+               return -1;
+       },
+
+       booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",
+
+       // Regular expressions
+
+       // Whitespace characters http://www.w3.org/TR/css3-selectors/#whitespace
+       whitespace = "[\\x20\\t\\r\\n\\f]",
+       // http://www.w3.org/TR/css3-syntax/#characters
+       characterEncoding = "(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",
+
+       // Loosely modeled on CSS identifier characters
+       // An unquoted value should be a CSS identifier http://www.w3.org/TR/css3-selectors/#attribute-selectors
+       // Proper syntax: http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier
+       identifier = characterEncoding.replace( "w", "w#" ),
+
+       // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors
+       attributes = "\\[" + whitespace + "*(" + characterEncoding + ")(?:" + whitespace +
+               // Operator (capture 2)
+               "*([*^$|!~]?=)" + whitespace +
+               // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]"
+               "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace +
+               "*\\]",
+
+       pseudos = ":(" + characterEncoding + ")(?:\\((" +
+               // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:
+               // 1. quoted (capture 3; capture 4 or capture 5)
+               "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" +
+               // 2. simple (capture 6)
+               "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" +
+               // 3. anything else (capture 2)
+               ".*" +
+               ")\\)|)",
+
+       // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter
+       rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ),
+
+       rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ),
+       rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ),
+
+       rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g" ),
+
+       rpseudo = new RegExp( pseudos ),
+       ridentifier = new RegExp( "^" + identifier + "$" ),
+
+       matchExpr = {
+               "ID": new RegExp( "^#(" + characterEncoding + ")" ),
+               "CLASS": new RegExp( "^\\.(" + characterEncoding + ")" ),
+               "TAG": new RegExp( "^(" + characterEncoding.replace( "w", "w*" ) + ")" ),
+               "ATTR": new RegExp( "^" + attributes ),
+               "PSEUDO": new RegExp( "^" + pseudos ),
+               "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace +
+                       "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace +
+                       "*(\\d+)|))" + whitespace + "*\\)|)", "i" ),
+               "bool": new RegExp( "^(?:" + booleans + ")$", "i" ),
+               // For use in libraries implementing .is()
+               // We use this for POS matching in `select`
+               "needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" +
+                       whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" )
+       },
+
+       rinputs = /^(?:input|select|textarea|button)$/i,
+       rheader = /^h\d$/i,
+
+       rnative = /^[^{]+\{\s*\[native \w/,
+
+       // Easily-parseable/retrievable ID or TAG or CLASS selectors
+       rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,
+
+       rsibling = /[+~]/,
+       rescape = /'|\\/g,
+
+       // CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters
+       runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ),
+       funescape = function( _, escaped, escapedWhitespace ) {
+               var high = "0x" + escaped - 0x10000;
+               // NaN means non-codepoint
+               // Support: Firefox<24
+               // Workaround erroneous numeric interpretation of +"0x"
+               return high !== high || escapedWhitespace ?
+                       escaped :
+                       high < 0 ?
+                               // BMP codepoint
+                               String.fromCharCode( high + 0x10000 ) :
+                               // Supplemental Plane codepoint (surrogate pair)
+                               String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );
+       };
+
+// Optimize for push.apply( _, NodeList )
+try {
+       push.apply(
+               (arr = slice.call( preferredDoc.childNodes )),
+               preferredDoc.childNodes
+       );
+       // Support: Android<4.0
+       // Detect silently failing push.apply
+       arr[ preferredDoc.childNodes.length ].nodeType;
+} catch ( e ) {
+       push = { apply: arr.length ?
+
+               // Leverage slice if possible
+               function( target, els ) {
+                       push_native.apply( target, slice.call(els) );
+               } :
+
+               // Support: IE<9
+               // Otherwise append directly
+               function( target, els ) {
+                       var j = target.length,
+                               i = 0;
+                       // Can't trust NodeList.length
+                       while ( (target[j++] = els[i++]) ) {}
+                       target.length = j - 1;
+               }
+       };
+}
 
-                               // Otherwise they run against the entire set
+function Sizzle( selector, context, results, seed ) {
+       var match, elem, m, nodeType,
+               // QSA vars
+               i, groups, old, nid, newContext, newSelector;
+
+       if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) {
+               setDocument( context );
+       }
+
+       context = context || document;
+       results = results || [];
+
+       if ( !selector || typeof selector !== "string" ) {
+               return results;
+       }
+
+       if ( (nodeType = context.nodeType) !== 1 && nodeType !== 9 ) {
+               return [];
+       }
+
+       if ( documentIsHTML && !seed ) {
+
+               // Shortcuts
+               if ( (match = rquickExpr.exec( selector )) ) {
+                       // Speed-up: Sizzle("#ID")
+                       if ( (m = match[1]) ) {
+                               if ( nodeType === 9 ) {
+                                       elem = context.getElementById( m );
+                                       // Check parentNode to catch when Blackberry 4.6 returns
+                                       // nodes that are no longer in the document (jQuery #6963)
+                                       if ( elem && elem.parentNode ) {
+                                               // Handle the case where IE, Opera, and Webkit return items
+                                               // by name instead of ID
+                                               if ( elem.id === m ) {
+                                                       results.push( elem );
+                                                       return results;
+                                               }
+                                       } else {
+                                               return results;
+                                       }
                                } else {
-                                       fn.call( elems, value );
-                                       fn = null;
+                                       // Context is not a document
+                                       if ( context.ownerDocument && (elem = context.ownerDocument.getElementById( m )) &&
+                                               contains( context, elem ) && elem.id === m ) {
+                                               results.push( elem );
+                                               return results;
+                                       }
                                }
+
+                       // Speed-up: Sizzle("TAG")
+                       } else if ( match[2] ) {
+                               push.apply( results, context.getElementsByTagName( selector ) );
+                               return results;
+
+                       // Speed-up: Sizzle(".CLASS")
+                       } else if ( (m = match[3]) && support.getElementsByClassName && context.getElementsByClassName ) {
+                               push.apply( results, context.getElementsByClassName( m ) );
+                               return results;
                        }
+               }
+
+               // QSA path
+               if ( support.qsa && (!rbuggyQSA || !rbuggyQSA.test( selector )) ) {
+                       nid = old = expando;
+                       newContext = context;
+                       newSelector = nodeType === 9 && selector;
+
+                       // 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
+                       if ( nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) {
+                               groups = tokenize( selector );
+
+                               if ( (old = context.getAttribute("id")) ) {
+                                       nid = old.replace( rescape, "\\$&" );
+                               } else {
+                                       context.setAttribute( "id", nid );
+                               }
+                               nid = "[id='" + nid + "'] ";
 
-                       if ( fn ) {
-                               for (; i < length; i++ ) {
-                                       fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass );
+                               i = groups.length;
+                               while ( i-- ) {
+                                       groups[i] = nid + toSelector( groups[i] );
                                }
+                               newContext = rsibling.test( selector ) && testContext( context.parentNode ) || context;
+                               newSelector = groups.join(",");
                        }
 
-                       chainable = 1;
+                       if ( newSelector ) {
+                               try {
+                                       push.apply( results,
+                                               newContext.querySelectorAll( newSelector )
+                                       );
+                                       return results;
+                               } catch(qsaError) {
+                               } finally {
+                                       if ( !old ) {
+                                               context.removeAttribute("id");
+                                       }
+                               }
+                       }
                }
+       }
 
-               return chainable ?
-                       elems :
+       // All others
+       return select( selector.replace( rtrim, "$1" ), context, results, seed );
+}
 
-                       // Gets
-                       bulk ?
-                               fn.call( elems ) :
-                               length ? fn( elems[0], key ) : emptyGet;
-       },
+/**
+ * Create key-value caches of limited size
+ * @returns {Function(string, Object)} Returns the Object data after storing it on itself with
+ *     property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)
+ *     deleting the oldest entry
+ */
+function createCache() {
+       var keys = [];
 
-       now: function() {
-               return ( new Date() ).getTime();
+       function cache( key, value ) {
+               // Use (key + " ") to avoid collision with native prototype properties (see Issue #157)
+               if ( keys.push( key + " " ) > Expr.cacheLength ) {
+                       // Only keep the most recent entries
+                       delete cache[ keys.shift() ];
+               }
+               return (cache[ key + " " ] = value);
        }
-});
-
-jQuery.ready.promise = function( obj ) {
-       if ( !readyList ) {
+       return cache;
+}
 
-               readyList = jQuery.Deferred();
+/**
+ * Mark a function for special use by Sizzle
+ * @param {Function} fn The function to mark
+ */
+function markFunction( fn ) {
+       fn[ expando ] = true;
+       return fn;
+}
 
-               // 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 );
+/**
+ * Support testing using an element
+ * @param {Function} fn Passed the created div and expects a boolean result
+ */
+function assert( fn ) {
+       var div = document.createElement("div");
 
-               // Standards-based browsers support DOMContentLoaded
-               } else if ( document.addEventListener ) {
-                       // Use the handy event callback
-                       document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false );
+       try {
+               return !!fn( div );
+       } catch (e) {
+               return false;
+       } finally {
+               // Remove from its parent by default
+               if ( div.parentNode ) {
+                       div.parentNode.removeChild( div );
+               }
+               // release memory in IE
+               div = null;
+       }
+}
 
-                       // A fallback to window.onload, that will always work
-                       window.addEventListener( "load", jQuery.ready, false );
+/**
+ * Adds the same handler for all of the specified attrs
+ * @param {String} attrs Pipe-separated list of attributes
+ * @param {Function} handler The method that will be applied
+ */
+function addHandle( attrs, handler ) {
+       var arr = attrs.split("|"),
+               i = attrs.length;
 
-               // If IE event model is used
-               } else {
-                       // Ensure firing before onload, maybe late but safe also for iframes
-                       document.attachEvent( "onreadystatechange", DOMContentLoaded );
+       while ( i-- ) {
+               Expr.attrHandle[ arr[i] ] = handler;
+       }
+}
 
-                       // A fallback to window.onload, that will always work
-                       window.attachEvent( "onload", jQuery.ready );
+/**
+ * Checks document order of two siblings
+ * @param {Element} a
+ * @param {Element} b
+ * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b
+ */
+function siblingCheck( a, b ) {
+       var cur = b && a,
+               diff = cur && a.nodeType === 1 && b.nodeType === 1 &&
+                       ( ~b.sourceIndex || MAX_NEGATIVE ) -
+                       ( ~a.sourceIndex || MAX_NEGATIVE );
+
+       // Use IE sourceIndex if available on both nodes
+       if ( diff ) {
+               return diff;
+       }
 
-                       // If IE and not a frame
-                       // continually check to see if the document is ready
-                       var top = false;
+       // Check if b follows a
+       if ( cur ) {
+               while ( (cur = cur.nextSibling) ) {
+                       if ( cur === b ) {
+                               return -1;
+                       }
+               }
+       }
 
-                       try {
-                               top = window.frameElement == null && document.documentElement;
-                       } catch(e) {}
+       return a ? 1 : -1;
+}
 
-                       if ( top && top.doScroll ) {
-                               (function doScrollCheck() {
-                                       if ( !jQuery.isReady ) {
+/**
+ * Returns a function to use in pseudos for input types
+ * @param {String} type
+ */
+function createInputPseudo( type ) {
+       return function( elem ) {
+               var name = elem.nodeName.toLowerCase();
+               return name === "input" && elem.type === type;
+       };
+}
 
-                                               try {
-                                                       // Use the trick by Diego Perini
-                                                       // http://javascript.nwbox.com/IEContentLoaded/
-                                                       top.doScroll("left");
-                                               } catch(e) {
-                                                       return setTimeout( doScrollCheck, 50 );
-                                               }
+/**
+ * Returns a function to use in pseudos for buttons
+ * @param {String} type
+ */
+function createButtonPseudo( type ) {
+       return function( elem ) {
+               var name = elem.nodeName.toLowerCase();
+               return (name === "input" || name === "button") && elem.type === type;
+       };
+}
 
-                                               // and execute any waiting functions
-                                               jQuery.ready();
-                                       }
-                               })();
+/**
+ * Returns a function to use in pseudos for positionals
+ * @param {Function} fn
+ */
+function createPositionalPseudo( fn ) {
+       return markFunction(function( argument ) {
+               argument = +argument;
+               return markFunction(function( seed, matches ) {
+                       var j,
+                               matchIndexes = fn( [], seed.length, argument ),
+                               i = matchIndexes.length;
+
+                       // Match elements found at the specified indexes
+                       while ( i-- ) {
+                               if ( seed[ (j = matchIndexes[i]) ] ) {
+                                       seed[j] = !(matches[j] = seed[j]);
+                               }
                        }
+               });
+       });
+}
+
+/**
+ * Checks a node for validity as a Sizzle context
+ * @param {Element|Object=} context
+ * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value
+ */
+function testContext( context ) {
+       return context && typeof context.getElementsByTagName !== strundefined && context;
+}
+
+// Expose support vars for convenience
+support = Sizzle.support = {};
+
+/**
+ * Detects XML nodes
+ * @param {Element|Object} elem An element or a document
+ * @returns {Boolean} True iff elem is a non-HTML XML node
+ */
+isXML = 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).documentElement;
+       return documentElement ? documentElement.nodeName !== "HTML" : false;
+};
+
+/**
+ * Sets document-related variables once based on the current document
+ * @param {Element|Object} [doc] An element or document object to use to set the document
+ * @returns {Object} Returns the current document
+ */
+setDocument = Sizzle.setDocument = function( node ) {
+       var hasCompare,
+               doc = node ? node.ownerDocument || node : preferredDoc,
+               parent = doc.defaultView;
+
+       // If no document and documentElement is available, return
+       if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) {
+               return document;
+       }
+
+       // Set our document
+       document = doc;
+       docElem = doc.documentElement;
+
+       // Support tests
+       documentIsHTML = !isXML( doc );
+
+       // Support: IE>8
+       // If iframe document is assigned to "document" variable and if iframe has been reloaded,
+       // IE will throw "permission denied" error when accessing "document" variable, see jQuery #13936
+       // IE6-8 do not support the defaultView property so parent will be undefined
+       if ( parent && parent !== parent.top ) {
+               // IE11 does not have attachEvent, so all must suffer
+               if ( parent.addEventListener ) {
+                       parent.addEventListener( "unload", function() {
+                               setDocument();
+                       }, false );
+               } else if ( parent.attachEvent ) {
+                       parent.attachEvent( "onunload", function() {
+                               setDocument();
+                       });
                }
        }
-       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();
-});
+       /* Attributes
+       ---------------------------------------------------------------------- */
 
-// All jQuery objects should point back to these
-rootjQuery = jQuery(document);
-// String to Object options format cache
-var optionsCache = {};
+       // Support: IE<8
+       // Verify that getAttribute really returns attributes and not properties (excepting IE8 booleans)
+       support.attributes = assert(function( div ) {
+               div.className = "i";
+               return !div.getAttribute("className");
+       });
 
-// 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;
+       /* getElement(s)By*
+       ---------------------------------------------------------------------- */
+
+       // Check if getElementsByTagName("*") returns only elements
+       support.getElementsByTagName = assert(function( div ) {
+               div.appendChild( doc.createComment("") );
+               return !div.getElementsByTagName("*").length;
        });
-       return object;
-}
 
-/*
- * 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 ) {
+       // Check if getElementsByClassName can be trusted
+       support.getElementsByClassName = rnative.test( doc.getElementsByClassName ) && assert(function( div ) {
+               div.innerHTML = "<div class='a'></div><div class='a i'></div>";
 
-       // 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 );
+               // Support: Safari<4
+               // Catch class over-caching
+               div.firstChild.className = "i";
+               // Support: Opera<10
+               // Catch gEBCN failure to find non-leading classes
+               return div.getElementsByClassName("i").length === 2;
+       });
 
-       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;
+       // Support: IE<10
+       // Check if getElementById returns elements by name
+       // The broken getElementById methods don't pick up programatically-set names,
+       // so use a roundabout getElementsByName test
+       support.getById = assert(function( div ) {
+               docElem.appendChild( div ).id = expando;
+               return !doc.getElementsByName || !doc.getElementsByName( expando ).length;
+       });
+
+       // ID find and filter
+       if ( support.getById ) {
+               Expr.find["ID"] = function( id, context ) {
+                       if ( typeof context.getElementById !== strundefined && documentIsHTML ) {
+                               var m = context.getElementById( id );
+                               // Check parentNode to catch when Blackberry 4.6 returns
+                               // nodes that are no longer in the document #6963
+                               return m && m.parentNode ? [ m ] : [];
+                       }
+               };
+               Expr.filter["ID"] = function( id ) {
+                       var attrId = id.replace( runescape, funescape );
+                       return function( elem ) {
+                               return elem.getAttribute("id") === attrId;
+                       };
+               };
+       } else {
+               // Support: IE6/7
+               // getElementById is not reliable as a find shortcut
+               delete Expr.find["ID"];
+
+               Expr.filter["ID"] =  function( id ) {
+                       var attrId = id.replace( runescape, funescape );
+                       return function( elem ) {
+                               var node = typeof elem.getAttributeNode !== strundefined && elem.getAttributeNode("id");
+                               return node && node.value === attrId;
+                       };
+               };
+       }
+
+       // Tag
+       Expr.find["TAG"] = support.getElementsByTagName ?
+               function( tag, context ) {
+                       if ( typeof context.getElementsByTagName !== strundefined ) {
+                               return context.getElementsByTagName( tag );
+                       }
+               } :
+               function( tag, context ) {
+                       var elem,
+                               tmp = [],
+                               i = 0,
+                               results = context.getElementsByTagName( tag );
+
+                       // Filter out possible comments
+                       if ( tag === "*" ) {
+                               while ( (elem = results[i++]) ) {
+                                       if ( elem.nodeType === 1 ) {
+                                               tmp.push( elem );
+                                       }
                                }
+
+                               return tmp;
                        }
-                       firing = false;
-                       if ( list ) {
-                               if ( stack ) {
-                                       if ( stack.length ) {
-                                               fire( stack.shift() );
+                       return results;
+               };
+
+       // Class
+       Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) {
+               if ( typeof context.getElementsByClassName !== strundefined && documentIsHTML ) {
+                       return context.getElementsByClassName( className );
+               }
+       };
+
+       /* QSA/matchesSelector
+       ---------------------------------------------------------------------- */
+
+       // QSA and matchesSelector support
+
+       // matchesSelector(:active) reports false when true (IE9/Opera 11.5)
+       rbuggyMatches = [];
+
+       // qSa(:focus) reports false when true (Chrome 21)
+       // We allow this because of a bug in IE8/9 that throws an error
+       // whenever `document.activeElement` is accessed on an iframe
+       // So, we allow :focus to pass through QSA all the time to avoid the IE error
+       // See http://bugs.jquery.com/ticket/13378
+       rbuggyQSA = [];
+
+       if ( (support.qsa = rnative.test( doc.querySelectorAll )) ) {
+               // Build QSA regex
+               // Regex strategy adopted from Diego Perini
+               assert(function( div ) {
+                       // Select is set to empty string on purpose
+                       // This is to test IE's treatment of not explicitly
+                       // setting a boolean content attribute,
+                       // since its presence should be enough
+                       // http://bugs.jquery.com/ticket/12359
+                       div.innerHTML = "<select msallowclip=''><option selected=''></option></select>";
+
+                       // Support: IE8, Opera 11-12.16
+                       // Nothing should be selected when empty strings follow ^= or $= or *=
+                       // The test attribute must be unknown in Opera but "safe" for WinRT
+                       // http://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section
+                       if ( div.querySelectorAll("[msallowclip^='']").length ) {
+                               rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" );
+                       }
+
+                       // Support: IE8
+                       // Boolean attributes and "value" are not treated correctly
+                       if ( !div.querySelectorAll("[selected]").length ) {
+                               rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" );
+                       }
+
+                       // Webkit/Opera - :checked should return selected option elements
+                       // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
+                       // IE8 throws error here and will not see later tests
+                       if ( !div.querySelectorAll(":checked").length ) {
+                               rbuggyQSA.push(":checked");
+                       }
+               });
+
+               assert(function( div ) {
+                       // Support: Windows 8 Native Apps
+                       // The type and name attributes are restricted during .innerHTML assignment
+                       var input = doc.createElement("input");
+                       input.setAttribute( "type", "hidden" );
+                       div.appendChild( input ).setAttribute( "name", "D" );
+
+                       // Support: IE8
+                       // Enforce case-sensitivity of name attribute
+                       if ( div.querySelectorAll("[name=d]").length ) {
+                               rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" );
+                       }
+
+                       // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)
+                       // IE8 throws error here and will not see later tests
+                       if ( !div.querySelectorAll(":enabled").length ) {
+                               rbuggyQSA.push( ":enabled", ":disabled" );
+                       }
+
+                       // Opera 10-11 does not throw on post-comma invalid pseudos
+                       div.querySelectorAll("*,:x");
+                       rbuggyQSA.push(",.*:");
+               });
+       }
+
+       if ( (support.matchesSelector = rnative.test( (matches = docElem.matches ||
+               docElem.webkitMatchesSelector ||
+               docElem.mozMatchesSelector ||
+               docElem.oMatchesSelector ||
+               docElem.msMatchesSelector) )) ) {
+
+               assert(function( div ) {
+                       // Check to see if it's possible to do matchesSelector
+                       // on a disconnected node (IE 9)
+                       support.disconnectedMatch = matches.call( div, "div" );
+
+                       // This should fail with an exception
+                       // Gecko does not error, returns false instead
+                       matches.call( div, "[s!='']:x" );
+                       rbuggyMatches.push( "!=", pseudos );
+               });
+       }
+
+       rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") );
+       rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") );
+
+       /* Contains
+       ---------------------------------------------------------------------- */
+       hasCompare = rnative.test( docElem.compareDocumentPosition );
+
+       // Element contains another
+       // Purposefully does not implement inclusive descendent
+       // As in, an element does not contain itself
+       contains = hasCompare || rnative.test( docElem.contains ) ?
+               function( a, b ) {
+                       var adown = a.nodeType === 9 ? a.documentElement : a,
+                               bup = b && b.parentNode;
+                       return a === bup || !!( bup && bup.nodeType === 1 && (
+                               adown.contains ?
+                                       adown.contains( bup ) :
+                                       a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16
+                       ));
+               } :
+               function( a, b ) {
+                       if ( b ) {
+                               while ( (b = b.parentNode) ) {
+                                       if ( b === a ) {
+                                               return true;
                                        }
-                               } else if ( memory ) {
-                                       list = [];
-                               } else {
-                                       self.disable();
                                }
                        }
+                       return false;
+               };
+
+       /* Sorting
+       ---------------------------------------------------------------------- */
+
+       // Document order sorting
+       sortOrder = hasCompare ?
+       function( a, b ) {
+
+               // Flag for duplicate removal
+               if ( a === b ) {
+                       hasDuplicate = true;
+                       return 0;
+               }
+
+               // Sort on method existence if only one input has compareDocumentPosition
+               var compare = !a.compareDocumentPosition - !b.compareDocumentPosition;
+               if ( compare ) {
+                       return compare;
+               }
+
+               // Calculate position if both inputs belong to the same document
+               compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ?
+                       a.compareDocumentPosition( b ) :
+
+                       // Otherwise we know they are disconnected
+                       1;
+
+               // Disconnected nodes
+               if ( compare & 1 ||
+                       (!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) {
+
+                       // Choose the first element that is related to our preferred document
+                       if ( a === doc || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) {
+                               return -1;
+                       }
+                       if ( b === doc || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) {
+                               return 1;
+                       }
+
+                       // Maintain original order
+                       return sortInput ?
+                               ( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) :
+                               0;
+               }
+
+               return compare & 4 ? -1 : 1;
+       } :
+       function( a, b ) {
+               // Exit early if the nodes are identical
+               if ( a === b ) {
+                       hasDuplicate = true;
+                       return 0;
+               }
+
+               var cur,
+                       i = 0,
+                       aup = a.parentNode,
+                       bup = b.parentNode,
+                       ap = [ a ],
+                       bp = [ b ];
+
+               // Parentless nodes are either documents or disconnected
+               if ( !aup || !bup ) {
+                       return a === doc ? -1 :
+                               b === doc ? 1 :
+                               aup ? -1 :
+                               bup ? 1 :
+                               sortInput ?
+                               ( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) :
+                               0;
+
+               // If the nodes are siblings, we can do a quick check
+               } else if ( aup === bup ) {
+                       return siblingCheck( a, b );
+               }
+
+               // Otherwise we need full lists of their ancestors for comparison
+               cur = a;
+               while ( (cur = cur.parentNode) ) {
+                       ap.unshift( cur );
+               }
+               cur = b;
+               while ( (cur = cur.parentNode) ) {
+                       bp.unshift( cur );
+               }
+
+               // Walk down the tree looking for a discrepancy
+               while ( ap[i] === bp[i] ) {
+                       i++;
+               }
+
+               return i ?
+                       // Do a sibling check if the nodes have a common ancestor
+                       siblingCheck( ap[i], bp[i] ) :
+
+                       // Otherwise nodes in our document sort first
+                       ap[i] === preferredDoc ? -1 :
+                       bp[i] === preferredDoc ? 1 :
+                       0;
+       };
+
+       return doc;
+};
+
+Sizzle.matches = function( expr, elements ) {
+       return Sizzle( expr, null, null, elements );
+};
+
+Sizzle.matchesSelector = function( elem, expr ) {
+       // Set document vars if needed
+       if ( ( elem.ownerDocument || elem ) !== document ) {
+               setDocument( elem );
+       }
+
+       // Make sure that attribute selectors are quoted
+       expr = expr.replace( rattributeQuotes, "='$1']" );
+
+       if ( support.matchesSelector && documentIsHTML &&
+               ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&
+               ( !rbuggyQSA     || !rbuggyQSA.test( expr ) ) ) {
+
+               try {
+                       var ret = matches.call( elem, expr );
+
+                       // IE 9's matchesSelector returns false on disconnected nodes
+                       if ( ret || support.disconnectedMatch ||
+                                       // As well, disconnected nodes are said to be in a document
+                                       // fragment in IE 9
+                                       elem.document && elem.document.nodeType !== 11 ) {
+                               return ret;
+                       }
+               } catch(e) {}
+       }
+
+       return Sizzle( expr, document, null, [ elem ] ).length > 0;
+};
+
+Sizzle.contains = function( context, elem ) {
+       // Set document vars if needed
+       if ( ( context.ownerDocument || context ) !== document ) {
+               setDocument( context );
+       }
+       return contains( context, elem );
+};
+
+Sizzle.attr = function( elem, name ) {
+       // Set document vars if needed
+       if ( ( elem.ownerDocument || elem ) !== document ) {
+               setDocument( elem );
+       }
+
+       var fn = Expr.attrHandle[ name.toLowerCase() ],
+               // Don't get fooled by Object.prototype properties (jQuery #13807)
+               val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?
+                       fn( elem, name, !documentIsHTML ) :
+                       undefined;
+
+       return val !== undefined ?
+               val :
+               support.attributes || !documentIsHTML ?
+                       elem.getAttribute( name ) :
+                       (val = elem.getAttributeNode(name)) && val.specified ?
+                               val.value :
+                               null;
+};
+
+Sizzle.error = function( msg ) {
+       throw new Error( "Syntax error, unrecognized expression: " + msg );
+};
+
+/**
+ * Document sorting and removing duplicates
+ * @param {ArrayLike} results
+ */
+Sizzle.uniqueSort = function( results ) {
+       var elem,
+               duplicates = [],
+               j = 0,
+               i = 0;
+
+       // Unless we *know* we can detect duplicates, assume their presence
+       hasDuplicate = !support.detectDuplicates;
+       sortInput = !support.sortStable && results.slice( 0 );
+       results.sort( sortOrder );
+
+       if ( hasDuplicate ) {
+               while ( (elem = results[i++]) ) {
+                       if ( elem === results[ i ] ) {
+                               j = duplicates.push( i );
+                       }
+               }
+               while ( j-- ) {
+                       results.splice( duplicates[ j ], 1 );
+               }
+       }
+
+       // Clear input after sorting to release objects
+       // See https://github.com/jquery/sizzle/pull/225
+       sortInput = null;
+
+       return results;
+};
+
+/**
+ * Utility function for retrieving the text value of an array of DOM nodes
+ * @param {Array|Element} elem
+ */
+getText = Sizzle.getText = function( elem ) {
+       var node,
+               ret = "",
+               i = 0,
+               nodeType = elem.nodeType;
+
+       if ( !nodeType ) {
+               // If no nodeType, this is expected to be an array
+               while ( (node = elem[i++]) ) {
+                       // Do not traverse comment nodes
+                       ret += getText( node );
+               }
+       } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {
+               // Use textContent for elements
+               // innerText usage removed for consistency of new lines (jQuery #11153)
+               if ( typeof elem.textContent === "string" ) {
+                       return elem.textContent;
+               } else {
+                       // Traverse its children
+                       for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
+                               ret += getText( elem );
+                       }
+               }
+       } else if ( nodeType === 3 || nodeType === 4 ) {
+               return elem.nodeValue;
+       }
+       // Do not include comment or processing instruction nodes
+
+       return ret;
+};
+
+Expr = Sizzle.selectors = {
+
+       // Can be adjusted by the user
+       cacheLength: 50,
+
+       createPseudo: markFunction,
+
+       match: matchExpr,
+
+       attrHandle: {},
+
+       find: {},
+
+       relative: {
+               ">": { dir: "parentNode", first: true },
+               " ": { dir: "parentNode" },
+               "+": { dir: "previousSibling", first: true },
+               "~": { dir: "previousSibling" }
+       },
+
+       preFilter: {
+               "ATTR": function( match ) {
+                       match[1] = match[1].replace( runescape, funescape );
+
+                       // Move the given value to match[3] whether quoted or unquoted
+                       match[3] = ( match[3] || match[4] || match[5] || "" ).replace( runescape, funescape );
+
+                       if ( match[2] === "~=" ) {
+                               match[3] = " " + match[3] + " ";
+                       }
+
+                       return match.slice( 0, 4 );
+               },
+
+               "CHILD": function( match ) {
+                       /* matches from matchExpr["CHILD"]
+                               1 type (only|nth|...)
+                               2 what (child|of-type)
+                               3 argument (even|odd|\d*|\d*n([+-]\d+)?|...)
+                               4 xn-component of xn+y argument ([+-]?\d*n|)
+                               5 sign of xn-component
+                               6 x of xn-component
+                               7 sign of y-component
+                               8 y of y-component
+                       */
+                       match[1] = match[1].toLowerCase();
+
+                       if ( match[1].slice( 0, 3 ) === "nth" ) {
+                               // nth-* requires argument
+                               if ( !match[3] ) {
+                                       Sizzle.error( match[0] );
+                               }
+
+                               // numeric x and y parameters for Expr.filter.CHILD
+                               // remember that false/true cast respectively to 0/1
+                               match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) );
+                               match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" );
+
+                       // other types prohibit arguments
+                       } else if ( match[3] ) {
+                               Sizzle.error( match[0] );
+                       }
+
+                       return match;
                },
-               // 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" ) {
-                                                               if ( !options.unique || !self.has( arg ) ) {
-                                                                       list.push( arg );
+
+               "PSEUDO": function( match ) {
+                       var excess,
+                               unquoted = !match[6] && match[2];
+
+                       if ( matchExpr["CHILD"].test( match[0] ) ) {
+                               return null;
+                       }
+
+                       // Accept quoted arguments as-is
+                       if ( match[3] ) {
+                               match[2] = match[4] || match[5] || "";
+
+                       // Strip excess characters from unquoted arguments
+                       } else if ( unquoted && rpseudo.test( unquoted ) &&
+                               // Get excess from tokenize (recursively)
+                               (excess = tokenize( unquoted, true )) &&
+                               // advance to the next closing parenthesis
+                               (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) {
+
+                               // excess is a negative index
+                               match[0] = match[0].slice( 0, excess );
+                               match[2] = unquoted.slice( 0, excess );
+                       }
+
+                       // Return only captures needed by the pseudo filter method (type and argument)
+                       return match.slice( 0, 3 );
+               }
+       },
+
+       filter: {
+
+               "TAG": function( nodeNameSelector ) {
+                       var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();
+                       return nodeNameSelector === "*" ?
+                               function() { return true; } :
+                               function( elem ) {
+                                       return elem.nodeName && elem.nodeName.toLowerCase() === nodeName;
+                               };
+               },
+
+               "CLASS": function( className ) {
+                       var pattern = classCache[ className + " " ];
+
+                       return pattern ||
+                               (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) &&
+                               classCache( className, function( elem ) {
+                                       return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== strundefined && elem.getAttribute("class") || "" );
+                               });
+               },
+
+               "ATTR": function( name, operator, check ) {
+                       return function( elem ) {
+                               var result = Sizzle.attr( elem, name );
+
+                               if ( result == null ) {
+                                       return operator === "!=";
+                               }
+                               if ( !operator ) {
+                                       return true;
+                               }
+
+                               result += "";
+
+                               return operator === "=" ? result === check :
+                                       operator === "!=" ? result !== check :
+                                       operator === "^=" ? check && result.indexOf( check ) === 0 :
+                                       operator === "*=" ? check && result.indexOf( check ) > -1 :
+                                       operator === "$=" ? check && result.slice( -check.length ) === check :
+                                       operator === "~=" ? ( " " + result + " " ).indexOf( check ) > -1 :
+                                       operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" :
+                                       false;
+                       };
+               },
+
+               "CHILD": function( type, what, argument, first, last ) {
+                       var simple = type.slice( 0, 3 ) !== "nth",
+                               forward = type.slice( -4 ) !== "last",
+                               ofType = what === "of-type";
+
+                       return first === 1 && last === 0 ?
+
+                               // Shortcut for :nth-*(n)
+                               function( elem ) {
+                                       return !!elem.parentNode;
+                               } :
+
+                               function( elem, context, xml ) {
+                                       var cache, outerCache, node, diff, nodeIndex, start,
+                                               dir = simple !== forward ? "nextSibling" : "previousSibling",
+                                               parent = elem.parentNode,
+                                               name = ofType && elem.nodeName.toLowerCase(),
+                                               useCache = !xml && !ofType;
+
+                                       if ( parent ) {
+
+                                               // :(first|last|only)-(child|of-type)
+                                               if ( simple ) {
+                                                       while ( dir ) {
+                                                               node = elem;
+                                                               while ( (node = node[ dir ]) ) {
+                                                                       if ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) {
+                                                                               return false;
+                                                                       }
                                                                }
-                                                       } else if ( arg && arg.length && type !== "string" ) {
-                                                               // Inspect recursively
-                                                               add( arg );
+                                                               // Reverse direction for :only-* (if we haven't yet done so)
+                                                               start = dir = type === "only" && !start && "nextSibling";
                                                        }
-                                               });
-                                       })( 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 );
-                                       }
-                               }
-                               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--;
+                                                       return true;
+                                               }
+
+                                               start = [ forward ? parent.firstChild : parent.lastChild ];
+
+                                               // non-xml :nth-child(...) stores cache data on `parent`
+                                               if ( forward && useCache ) {
+                                                       // Seek `elem` from a previously-cached index
+                                                       outerCache = parent[ expando ] || (parent[ expando ] = {});
+                                                       cache = outerCache[ type ] || [];
+                                                       nodeIndex = cache[0] === dirruns && cache[1];
+                                                       diff = cache[0] === dirruns && cache[2];
+                                                       node = nodeIndex && parent.childNodes[ nodeIndex ];
+
+                                                       while ( (node = ++nodeIndex && node && node[ dir ] ||
+
+                                                               // Fallback to seeking `elem` from the start
+                                                               (diff = nodeIndex = 0) || start.pop()) ) {
+
+                                                               // When found, cache indexes on `parent` and break
+                                                               if ( node.nodeType === 1 && ++diff && node === elem ) {
+                                                                       outerCache[ type ] = [ dirruns, nodeIndex, diff ];
+                                                                       break;
                                                                }
-                                                               if ( index <= firingIndex ) {
-                                                                       firingIndex--;
+                                                       }
+
+                                               // Use previously-cached element index if available
+                                               } else if ( useCache && (cache = (elem[ expando ] || (elem[ expando ] = {}))[ type ]) && cache[0] === dirruns ) {
+                                                       diff = cache[1];
+
+                                               // xml :nth-child(...) or :nth-last-child(...) or :nth(-last)?-of-type(...)
+                                               } else {
+                                                       // Use the same loop as above to seek `elem` from the start
+                                                       while ( (node = ++nodeIndex && node && node[ dir ] ||
+                                                               (diff = nodeIndex = 0) || start.pop()) ) {
+
+                                                               if ( ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) && ++diff ) {
+                                                                       // Cache the index of each encountered element
+                                                                       if ( useCache ) {
+                                                                               (node[ expando ] || (node[ expando ] = {}))[ type ] = [ dirruns, diff ];
+                                                                       }
+
+                                                                       if ( node === elem ) {
+                                                                               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;
-                       },
+
+                                               // Incorporate the offset, then check against cycle size
+                                               diff -= last;
+                                               return diff === first || ( diff % first === 0 && diff / first >= 0 );
+                                       }
+                               };
+               },
+
+               "PSEUDO": function( pseudo, argument ) {
+                       // pseudo-class names are case-insensitive
+                       // http://www.w3.org/TR/selectors/#pseudo-classes
+                       // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters
+                       // Remember that setFilters inherits from pseudos
+                       var args,
+                               fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||
+                                       Sizzle.error( "unsupported pseudo: " + pseudo );
+
+                       // The user may use createPseudo to indicate that
+                       // arguments are needed to create the filter function
+                       // just as Sizzle does
+                       if ( fn[ expando ] ) {
+                               return fn( argument );
+                       }
+
+                       // But maintain support for old signatures
+                       if ( fn.length > 1 ) {
+                               args = [ pseudo, pseudo, "", argument ];
+                               return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?
+                                       markFunction(function( seed, matches ) {
+                                               var idx,
+                                                       matched = fn( seed, argument ),
+                                                       i = matched.length;
+                                               while ( i-- ) {
+                                                       idx = indexOf.call( seed, matched[i] );
+                                                       seed[ idx ] = !( matches[ idx ] = matched[i] );
+                                               }
+                                       }) :
+                                       function( elem ) {
+                                               return fn( elem, 0, args );
+                                       };
+                       }
+
+                       return fn;
+               }
+       },
+
+       pseudos: {
+               // Potentially complex pseudos
+               "not": markFunction(function( selector ) {
+                       // Trim the selector passed to compile
+                       // to avoid treating leading and trailing
+                       // spaces as combinators
+                       var input = [],
+                               results = [],
+                               matcher = compile( selector.replace( rtrim, "$1" ) );
+
+                       return matcher[ expando ] ?
+                               markFunction(function( seed, matches, context, xml ) {
+                                       var elem,
+                                               unmatched = matcher( seed, null, xml, [] ),
+                                               i = seed.length;
+
+                                       // Match elements unmatched by `matcher`
+                                       while ( i-- ) {
+                                               if ( (elem = unmatched[i]) ) {
+                                                       seed[i] = !(matches[i] = elem);
+                                               }
+                                       }
+                               }) :
+                               function( elem, context, xml ) {
+                                       input[0] = elem;
+                                       matcher( input, null, xml, results );
+                                       return !results.pop();
+                               };
+               }),
+
+               "has": markFunction(function( selector ) {
+                       return function( elem ) {
+                               return Sizzle( selector, elem ).length > 0;
+                       };
+               }),
+
+               "contains": markFunction(function( text ) {
+                       return function( elem ) {
+                               return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1;
+                       };
+               }),
+
+               // "Whether an element is represented by a :lang() selector
+               // is based solely on the element's language value
+               // being equal to the identifier C,
+               // or beginning with the identifier C immediately followed by "-".
+               // The matching of C against the element's language value is performed case-insensitively.
+               // The identifier C does not have to be a valid language name."
+               // http://www.w3.org/TR/selectors/#lang-pseudo
+               "lang": markFunction( function( lang ) {
+                       // lang value must be a valid identifier
+                       if ( !ridentifier.test(lang || "") ) {
+                               Sizzle.error( "unsupported lang: " + lang );
+                       }
+                       lang = lang.replace( runescape, funescape ).toLowerCase();
+                       return function( elem ) {
+                               var elemLang;
+                               do {
+                                       if ( (elemLang = documentIsHTML ?
+                                               elem.lang :
+                                               elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) {
+
+                                               elemLang = elemLang.toLowerCase();
+                                               return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0;
+                                       }
+                               } while ( (elem = elem.parentNode) && elem.nodeType === 1 );
+                               return false;
+                       };
+               }),
+
+               // Miscellaneous
+               "target": function( elem ) {
+                       var hash = window.location && window.location.hash;
+                       return hash && hash.slice( 1 ) === elem.id;
+               },
+
+               "root": function( elem ) {
+                       return elem === docElem;
+               },
+
+               "focus": function( elem ) {
+                       return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);
+               },
+
+               // Boolean properties
+               "enabled": function( elem ) {
+                       return elem.disabled === false;
+               },
+
+               "disabled": function( elem ) {
+                       return elem.disabled === true;
+               },
+
+               "checked": function( elem ) {
+                       // In CSS3, :checked should return both checked and selected elements
+                       // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
+                       var nodeName = elem.nodeName.toLowerCase();
+                       return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected);
+               },
+
+               "selected": function( elem ) {
+                       // Accessing this property makes selected-by-default
+                       // options in Safari work properly
+                       if ( elem.parentNode ) {
+                               elem.parentNode.selectedIndex;
+                       }
+
+                       return elem.selected === true;
+               },
+
+               // Contents
+               "empty": function( elem ) {
+                       // http://www.w3.org/TR/selectors/#empty-pseudo
+                       // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),
+                       //   but not by others (comment: 8; processing instruction: 7; etc.)
+                       // nodeType < 6 works because attributes (2) do not appear as children
+                       for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
+                               if ( elem.nodeType < 6 ) {
+                                       return false;
+                               }
+                       }
+                       return true;
+               },
+
+               "parent": function( elem ) {
+                       return !Expr.pseudos["empty"]( elem );
+               },
+
+               // Element/input types
+               "header": function( elem ) {
+                       return rheader.test( elem.nodeName );
+               },
+
+               "input": function( elem ) {
+                       return rinputs.test( elem.nodeName );
+               },
+
+               "button": function( elem ) {
+                       var name = elem.nodeName.toLowerCase();
+                       return name === "input" && elem.type === "button" || name === "button";
+               },
+
+               "text": function( elem ) {
+                       var attr;
+                       return elem.nodeName.toLowerCase() === "input" &&
+                               elem.type === "text" &&
+
+                               // Support: IE<8
+                               // New HTML5 attribute values (e.g., "search") appear with elem.type === "text"
+                               ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text" );
+               },
+
+               // Position-in-collection
+               "first": createPositionalPseudo(function() {
+                       return [ 0 ];
+               }),
+
+               "last": createPositionalPseudo(function( matchIndexes, length ) {
+                       return [ length - 1 ];
+               }),
+
+               "eq": createPositionalPseudo(function( matchIndexes, length, argument ) {
+                       return [ argument < 0 ? argument + length : argument ];
+               }),
+
+               "even": createPositionalPseudo(function( matchIndexes, length ) {
+                       var i = 0;
+                       for ( ; i < length; i += 2 ) {
+                               matchIndexes.push( i );
+                       }
+                       return matchIndexes;
+               }),
+
+               "odd": createPositionalPseudo(function( matchIndexes, length ) {
+                       var i = 1;
+                       for ( ; i < length; i += 2 ) {
+                               matchIndexes.push( i );
+                       }
+                       return matchIndexes;
+               }),
+
+               "lt": createPositionalPseudo(function( matchIndexes, length, argument ) {
+                       var i = argument < 0 ? argument + length : argument;
+                       for ( ; --i >= 0; ) {
+                               matchIndexes.push( i );
+                       }
+                       return matchIndexes;
+               }),
+
+               "gt": createPositionalPseudo(function( matchIndexes, length, argument ) {
+                       var i = argument < 0 ? argument + length : argument;
+                       for ( ; ++i < length; ) {
+                               matchIndexes.push( i );
+                       }
+                       return matchIndexes;
+               })
+       }
+};
+
+Expr.pseudos["nth"] = Expr.pseudos["eq"];
+
+// Add button/input type pseudos
+for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {
+       Expr.pseudos[ i ] = createInputPseudo( i );
+}
+for ( i in { submit: true, reset: true } ) {
+       Expr.pseudos[ i ] = createButtonPseudo( i );
+}
+
+// Easy API for creating new setFilters
+function setFilters() {}
+setFilters.prototype = Expr.filters = Expr.pseudos;
+Expr.setFilters = new setFilters();
+
+tokenize = Sizzle.tokenize = function( selector, parseOnly ) {
+       var matched, match, tokens, type,
+               soFar, groups, preFilters,
+               cached = tokenCache[ selector + " " ];
+
+       if ( cached ) {
+               return parseOnly ? 0 : cached.slice( 0 );
+       }
+
+       soFar = selector;
+       groups = [];
+       preFilters = Expr.preFilter;
+
+       while ( soFar ) {
+
+               // Comma and first run
+               if ( !matched || (match = rcomma.exec( soFar )) ) {
+                       if ( match ) {
+                               // Don't consume trailing commas as valid
+                               soFar = soFar.slice( match[0].length ) || soFar;
+                       }
+                       groups.push( (tokens = []) );
+               }
+
+               matched = false;
+
+               // Combinators
+               if ( (match = rcombinators.exec( soFar )) ) {
+                       matched = match.shift();
+                       tokens.push({
+                               value: matched,
+                               // Cast descendant combinators to space
+                               type: match[0].replace( rtrim, " " )
+                       });
+                       soFar = soFar.slice( matched.length );
+               }
+
+               // Filters
+               for ( type in Expr.filter ) {
+                       if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||
+                               (match = preFilters[ type ]( match ))) ) {
+                               matched = match.shift();
+                               tokens.push({
+                                       value: matched,
+                                       type: type,
+                                       matches: match
+                               });
+                               soFar = soFar.slice( matched.length );
+                       }
+               }
+
+               if ( !matched ) {
+                       break;
+               }
+       }
+
+       // Return the length of the invalid excess
+       // if we're just parsing
+       // Otherwise, throw an error or return tokens
+       return parseOnly ?
+               soFar.length :
+               soFar ?
+                       Sizzle.error( selector ) :
+                       // Cache the tokens
+                       tokenCache( selector, groups ).slice( 0 );
+};
+
+function toSelector( tokens ) {
+       var i = 0,
+               len = tokens.length,
+               selector = "";
+       for ( ; i < len; i++ ) {
+               selector += tokens[i].value;
+       }
+       return selector;
+}
+
+function addCombinator( matcher, combinator, base ) {
+       var dir = combinator.dir,
+               checkNonElements = base && dir === "parentNode",
+               doneName = done++;
+
+       return combinator.first ?
+               // Check against closest ancestor/preceding element
+               function( elem, context, xml ) {
+                       while ( (elem = elem[ dir ]) ) {
+                               if ( elem.nodeType === 1 || checkNonElements ) {
+                                       return matcher( elem, context, xml );
+                               }
+                       }
+               } :
+
+               // Check against all ancestor/preceding elements
+               function( elem, context, xml ) {
+                       var oldCache, outerCache,
+                               newCache = [ dirruns, doneName ];
+
+                       // We can't set arbitrary data on XML nodes, so they don't benefit from dir caching
+                       if ( xml ) {
+                               while ( (elem = elem[ dir ]) ) {
+                                       if ( elem.nodeType === 1 || checkNonElements ) {
+                                               if ( matcher( elem, context, xml ) ) {
+                                                       return true;
+                                               }
+                                       }
+                               }
+                       } else {
+                               while ( (elem = elem[ dir ]) ) {
+                                       if ( elem.nodeType === 1 || checkNonElements ) {
+                                               outerCache = elem[ expando ] || (elem[ expando ] = {});
+                                               if ( (oldCache = outerCache[ dir ]) &&
+                                                       oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) {
+
+                                                       // Assign to newCache so results back-propagate to previous elements
+                                                       return (newCache[ 2 ] = oldCache[ 2 ]);
+                                               } else {
+                                                       // Reuse newcache so results back-propagate to previous elements
+                                                       outerCache[ dir ] = newCache;
+
+                                                       // A match means we're done; a fail means we have to keep checking
+                                                       if ( (newCache[ 2 ] = matcher( elem, context, xml )) ) {
+                                                               return true;
+                                                       }
+                                               }
+                                       }
+                               }
+                       }
+               };
+}
+
+function elementMatcher( matchers ) {
+       return matchers.length > 1 ?
+               function( elem, context, xml ) {
+                       var i = matchers.length;
+                       while ( i-- ) {
+                               if ( !matchers[i]( elem, context, xml ) ) {
+                                       return false;
+                               }
+                       }
+                       return true;
+               } :
+               matchers[0];
+}
+
+function multipleContexts( selector, contexts, results ) {
+       var i = 0,
+               len = contexts.length;
+       for ( ; i < len; i++ ) {
+               Sizzle( selector, contexts[i], results );
+       }
+       return results;
+}
+
+function condense( unmatched, map, filter, context, xml ) {
+       var elem,
+               newUnmatched = [],
+               i = 0,
+               len = unmatched.length,
+               mapped = map != null;
+
+       for ( ; i < len; i++ ) {
+               if ( (elem = unmatched[i]) ) {
+                       if ( !filter || filter( elem, context, xml ) ) {
+                               newUnmatched.push( elem );
+                               if ( mapped ) {
+                                       map.push( i );
+                               }
+                       }
+               }
+       }
+
+       return newUnmatched;
+}
+
+function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {
+       if ( postFilter && !postFilter[ expando ] ) {
+               postFilter = setMatcher( postFilter );
+       }
+       if ( postFinder && !postFinder[ expando ] ) {
+               postFinder = setMatcher( postFinder, postSelector );
+       }
+       return markFunction(function( seed, results, context, xml ) {
+               var temp, i, elem,
+                       preMap = [],
+                       postMap = [],
+                       preexisting = results.length,
+
+                       // Get initial elements from seed or context
+                       elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ),
+
+                       // Prefilter to get matcher input, preserving a map for seed-results synchronization
+                       matcherIn = preFilter && ( seed || !selector ) ?
+                               condense( elems, preMap, preFilter, context, xml ) :
+                               elems,
+
+                       matcherOut = matcher ?
+                               // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,
+                               postFinder || ( seed ? preFilter : preexisting || postFilter ) ?
+
+                                       // ...intermediate processing is necessary
+                                       [] :
+
+                                       // ...otherwise use results directly
+                                       results :
+                               matcherIn;
+
+               // Find primary matches
+               if ( matcher ) {
+                       matcher( matcherIn, matcherOut, context, xml );
+               }
+
+               // Apply postFilter
+               if ( postFilter ) {
+                       temp = condense( matcherOut, postMap );
+                       postFilter( temp, [], context, xml );
+
+                       // Un-match failing elements by moving them back to matcherIn
+                       i = temp.length;
+                       while ( i-- ) {
+                               if ( (elem = temp[i]) ) {
+                                       matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);
+                               }
+                       }
+               }
+
+               if ( seed ) {
+                       if ( postFinder || preFilter ) {
+                               if ( postFinder ) {
+                                       // Get the final matcherOut by condensing this intermediate into postFinder contexts
+                                       temp = [];
+                                       i = matcherOut.length;
+                                       while ( i-- ) {
+                                               if ( (elem = matcherOut[i]) ) {
+                                                       // Restore matcherIn since elem is not yet a final match
+                                                       temp.push( (matcherIn[i] = elem) );
+                                               }
+                                       }
+                                       postFinder( null, (matcherOut = []), temp, xml );
+                               }
+
+                               // Move matched elements from seed to results to keep them synchronized
+                               i = matcherOut.length;
+                               while ( i-- ) {
+                                       if ( (elem = matcherOut[i]) &&
+                                               (temp = postFinder ? indexOf.call( seed, elem ) : preMap[i]) > -1 ) {
+
+                                               seed[temp] = !(results[temp] = elem);
+                                       }
+                               }
+                       }
+
+               // Add elements to results, through postFinder if defined
+               } else {
+                       matcherOut = condense(
+                               matcherOut === results ?
+                                       matcherOut.splice( preexisting, matcherOut.length ) :
+                                       matcherOut
+                       );
+                       if ( postFinder ) {
+                               postFinder( null, results, matcherOut, xml );
+                       } else {
+                               push.apply( results, matcherOut );
+                       }
+               }
+       });
+}
+
+function matcherFromTokens( tokens ) {
+       var checkContext, matcher, j,
+               len = tokens.length,
+               leadingRelative = Expr.relative[ tokens[0].type ],
+               implicitRelative = leadingRelative || Expr.relative[" "],
+               i = leadingRelative ? 1 : 0,
+
+               // The foundational matcher ensures that elements are reachable from top-level context(s)
+               matchContext = addCombinator( function( elem ) {
+                       return elem === checkContext;
+               }, implicitRelative, true ),
+               matchAnyContext = addCombinator( function( elem ) {
+                       return indexOf.call( checkContext, elem ) > -1;
+               }, implicitRelative, true ),
+               matchers = [ function( elem, context, xml ) {
+                       return ( !leadingRelative && ( xml || context !== outermostContext ) ) || (
+                               (checkContext = context).nodeType ?
+                                       matchContext( elem, context, xml ) :
+                                       matchAnyContext( elem, context, xml ) );
+               } ];
+
+       for ( ; i < len; i++ ) {
+               if ( (matcher = Expr.relative[ tokens[i].type ]) ) {
+                       matchers = [ addCombinator(elementMatcher( matchers ), matcher) ];
+               } else {
+                       matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );
+
+                       // Return special upon seeing a positional matcher
+                       if ( matcher[ expando ] ) {
+                               // Find the next relative operator (if any) for proper handling
+                               j = ++i;
+                               for ( ; j < len; j++ ) {
+                                       if ( Expr.relative[ tokens[j].type ] ) {
+                                               break;
+                                       }
+                               }
+                               return setMatcher(
+                                       i > 1 && elementMatcher( matchers ),
+                                       i > 1 && toSelector(
+                                               // If the preceding token was a descendant combinator, insert an implicit any-element `*`
+                                               tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" })
+                                       ).replace( rtrim, "$1" ),
+                                       matcher,
+                                       i < j && matcherFromTokens( tokens.slice( i, j ) ),
+                                       j < len && matcherFromTokens( (tokens = tokens.slice( j )) ),
+                                       j < len && toSelector( tokens )
+                               );
+                       }
+                       matchers.push( matcher );
+               }
+       }
+
+       return elementMatcher( matchers );
+}
+
+function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
+       var bySet = setMatchers.length > 0,
+               byElement = elementMatchers.length > 0,
+               superMatcher = function( seed, context, xml, results, outermost ) {
+                       var elem, j, matcher,
+                               matchedCount = 0,
+                               i = "0",
+                               unmatched = seed && [],
+                               setMatched = [],
+                               contextBackup = outermostContext,
+                               // We must always have either seed elements or outermost context
+                               elems = seed || byElement && Expr.find["TAG"]( "*", outermost ),
+                               // Use integer dirruns iff this is the outermost matcher
+                               dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1),
+                               len = elems.length;
+
+                       if ( outermost ) {
+                               outermostContext = context !== document && context;
+                       }
+
+                       // Add elements passing elementMatchers directly to results
+                       // Keep `i` a string if there are no elements so `matchedCount` will be "00" below
+                       // Support: IE<9, Safari
+                       // Tolerate NodeList properties (IE: "length"; Safari: <number>) matching elements by id
+                       for ( ; i !== len && (elem = elems[i]) != null; i++ ) {
+                               if ( byElement && elem ) {
+                                       j = 0;
+                                       while ( (matcher = elementMatchers[j++]) ) {
+                                               if ( matcher( elem, context, xml ) ) {
+                                                       results.push( elem );
+                                                       break;
+                                               }
+                                       }
+                                       if ( outermost ) {
+                                               dirruns = dirrunsUnique;
+                                       }
+                               }
+
+                               // Track unmatched elements for set filters
+                               if ( bySet ) {
+                                       // They will have gone through all possible matchers
+                                       if ( (elem = !matcher && elem) ) {
+                                               matchedCount--;
+                                       }
+
+                                       // Lengthen the array for every element, matched or not
+                                       if ( seed ) {
+                                               unmatched.push( elem );
+                                       }
+                               }
+                       }
+
+                       // Apply set filters to unmatched elements
+                       matchedCount += i;
+                       if ( bySet && i !== matchedCount ) {
+                               j = 0;
+                               while ( (matcher = setMatchers[j++]) ) {
+                                       matcher( unmatched, setMatched, context, xml );
+                               }
+
+                               if ( seed ) {
+                                       // Reintegrate element matches to eliminate the need for sorting
+                                       if ( matchedCount > 0 ) {
+                                               while ( i-- ) {
+                                                       if ( !(unmatched[i] || setMatched[i]) ) {
+                                                               setMatched[i] = pop.call( results );
+                                                       }
+                                               }
+                                       }
+
+                                       // Discard index placeholder values to get only actual matches
+                                       setMatched = condense( setMatched );
+                               }
+
+                               // Add matches to results
+                               push.apply( results, setMatched );
+
+                               // Seedless set matches succeeding multiple successful matchers stipulate sorting
+                               if ( outermost && !seed && setMatched.length > 0 &&
+                                       ( matchedCount + setMatchers.length ) > 1 ) {
+
+                                       Sizzle.uniqueSort( results );
+                               }
+                       }
+
+                       // Override manipulation of globals by nested matchers
+                       if ( outermost ) {
+                               dirruns = dirrunsUnique;
+                               outermostContext = contextBackup;
+                       }
+
+                       return unmatched;
+               };
+
+       return bySet ?
+               markFunction( superMatcher ) :
+               superMatcher;
+}
+
+compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {
+       var i,
+               setMatchers = [],
+               elementMatchers = [],
+               cached = compilerCache[ selector + " " ];
+
+       if ( !cached ) {
+               // Generate a function of recursive functions that can be used to check each element
+               if ( !match ) {
+                       match = tokenize( selector );
+               }
+               i = match.length;
+               while ( i-- ) {
+                       cached = matcherFromTokens( match[i] );
+                       if ( cached[ expando ] ) {
+                               setMatchers.push( cached );
+                       } else {
+                               elementMatchers.push( cached );
+                       }
+               }
+
+               // Cache the compiled function
+               cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );
+
+               // Save selector and tokenization
+               cached.selector = selector;
+       }
+       return cached;
+};
+
+/**
+ * A low-level selection function that works with Sizzle's compiled
+ *  selector functions
+ * @param {String|Function} selector A selector or a pre-compiled
+ *  selector function built with Sizzle.compile
+ * @param {Element} context
+ * @param {Array} [results]
+ * @param {Array} [seed] A set of elements to match against
+ */
+select = Sizzle.select = function( selector, context, results, seed ) {
+       var i, tokens, token, type, find,
+               compiled = typeof selector === "function" && selector,
+               match = !seed && tokenize( (selector = compiled.selector || selector) );
+
+       results = results || [];
+
+       // Try to minimize operations if there is no seed and only one group
+       if ( match.length === 1 ) {
+
+               // Take a shortcut and set the context if the root selector is an ID
+               tokens = match[0] = match[0].slice( 0 );
+               if ( tokens.length > 2 && (token = tokens[0]).type === "ID" &&
+                               support.getById && context.nodeType === 9 && documentIsHTML &&
+                               Expr.relative[ tokens[1].type ] ) {
+
+                       context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0];
+                       if ( !context ) {
+                               return results;
+
+                       // Precompiled matchers will still verify ancestry, so step up a level
+                       } else if ( compiled ) {
+                               context = context.parentNode;
+                       }
+
+                       selector = selector.slice( tokens.shift().value.length );
+               }
+
+               // Fetch a seed set for right-to-left matching
+               i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length;
+               while ( i-- ) {
+                       token = tokens[i];
+
+                       // Abort if we hit a combinator
+                       if ( Expr.relative[ (type = token.type) ] ) {
+                               break;
+                       }
+                       if ( (find = Expr.find[ type ]) ) {
+                               // Search, expanding context for leading sibling combinators
+                               if ( (seed = find(
+                                       token.matches[0].replace( runescape, funescape ),
+                                       rsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context
+                               )) ) {
+
+                                       // If seed is empty or no tokens remain, we can return early
+                                       tokens.splice( i, 1 );
+                                       selector = seed.length && toSelector( tokens );
+                                       if ( !selector ) {
+                                               push.apply( results, seed );
+                                               return results;
+                                       }
+
+                                       break;
+                               }
+                       }
+               }
+       }
+
+       // Compile and execute a filtering function if one is not provided
+       // Provide `match` to avoid retokenization if we modified the selector above
+       ( compiled || compile( selector, match ) )(
+               seed,
+               context,
+               !documentIsHTML,
+               results,
+               rsibling.test( selector ) && testContext( context.parentNode ) || context
+       );
+       return results;
+};
+
+// One-time assignments
+
+// Sort stability
+support.sortStable = expando.split("").sort( sortOrder ).join("") === expando;
+
+// Support: Chrome<14
+// Always assume duplicates if they aren't passed to the comparison function
+support.detectDuplicates = !!hasDuplicate;
+
+// Initialize against the default document
+setDocument();
+
+// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)
+// Detached nodes confoundingly follow *each other*
+support.sortDetached = assert(function( div1 ) {
+       // Should return 1, but returns 4 (following)
+       return div1.compareDocumentPosition( document.createElement("div") ) & 1;
+});
+
+// Support: IE<8
+// Prevent attribute/property "interpolation"
+// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx
+if ( !assert(function( div ) {
+       div.innerHTML = "<a href='#'></a>";
+       return div.firstChild.getAttribute("href") === "#" ;
+}) ) {
+       addHandle( "type|href|height|width", function( elem, name, isXML ) {
+               if ( !isXML ) {
+                       return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 );
+               }
+       });
+}
+
+// Support: IE<9
+// Use defaultValue in place of getAttribute("value")
+if ( !support.attributes || !assert(function( div ) {
+       div.innerHTML = "<input/>";
+       div.firstChild.setAttribute( "value", "" );
+       return div.firstChild.getAttribute( "value" ) === "";
+}) ) {
+       addHandle( "value", function( elem, name, isXML ) {
+               if ( !isXML && elem.nodeName.toLowerCase() === "input" ) {
+                       return elem.defaultValue;
+               }
+       });
+}
+
+// Support: IE<9
+// Use getAttributeNode to fetch booleans when getAttribute lies
+if ( !assert(function( div ) {
+       return div.getAttribute("disabled") == null;
+}) ) {
+       addHandle( booleans, function( elem, name, isXML ) {
+               var val;
+               if ( !isXML ) {
+                       return elem[ name ] === true ? name.toLowerCase() :
+                                       (val = elem.getAttributeNode( name )) && val.specified ?
+                                       val.value :
+                               null;
+               }
+       });
+}
+
+return Sizzle;
+
+})( window );
+
+
+
+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;
+
+
+
+var rneedsContext = jQuery.expr.match.needsContext;
+
+var rsingleTag = (/^<(\w+)\s*\/?>(?:<\/\1>|)$/);
+
+
+
+var risSimple = /^.[^:#\[\.,]*$/;
+
+// Implement the identical functionality for filter and not
+function winnow( elements, qualifier, not ) {
+       if ( jQuery.isFunction( qualifier ) ) {
+               return jQuery.grep( elements, function( elem, i ) {
+                       /* jshint -W018 */
+                       return !!qualifier.call( elem, i, elem ) !== not;
+               });
+
+       }
+
+       if ( qualifier.nodeType ) {
+               return jQuery.grep( elements, function( elem ) {
+                       return ( elem === qualifier ) !== not;
+               });
+
+       }
+
+       if ( typeof qualifier === "string" ) {
+               if ( risSimple.test( qualifier ) ) {
+                       return jQuery.filter( qualifier, elements, not );
+               }
+
+               qualifier = jQuery.filter( qualifier, elements );
+       }
+
+       return jQuery.grep( elements, function( elem ) {
+               return ( jQuery.inArray( elem, qualifier ) >= 0 ) !== not;
+       });
+}
+
+jQuery.filter = function( expr, elems, not ) {
+       var elem = elems[ 0 ];
+
+       if ( not ) {
+               expr = ":not(" + expr + ")";
+       }
+
+       return elems.length === 1 && elem.nodeType === 1 ?
+               jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [] :
+               jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {
+                       return elem.nodeType === 1;
+               }));
+};
+
+jQuery.fn.extend({
+       find: function( selector ) {
+               var i,
+                       ret = [],
+                       self = this,
+                       len = self.length;
+
+               if ( typeof selector !== "string" ) {
+                       return this.pushStack( jQuery( selector ).filter(function() {
+                               for ( i = 0; i < len; i++ ) {
+                                       if ( jQuery.contains( self[ i ], this ) ) {
+                                               return true;
+                                       }
+                               }
+                       }) );
+               }
+
+               for ( i = 0; i < len; i++ ) {
+                       jQuery.find( selector, self[ i ], ret );
+               }
+
+               // Needed because $( selector, context ) becomes $( context ).find( selector )
+               ret = this.pushStack( len > 1 ? jQuery.unique( ret ) : ret );
+               ret.selector = this.selector ? this.selector + " " + selector : selector;
+               return ret;
+       },
+       filter: function( selector ) {
+               return this.pushStack( winnow(this, selector || [], false) );
+       },
+       not: function( selector ) {
+               return this.pushStack( winnow(this, selector || [], true) );
+       },
+       is: function( selector ) {
+               return !!winnow(
+                       this,
+
+                       // 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".
+                       typeof selector === "string" && rneedsContext.test( selector ) ?
+                               jQuery( selector ) :
+                               selector || [],
+                       false
+               ).length;
+       }
+});
+
+
+// Initialize a jQuery object
+
+
+// A central reference to the root jQuery(document)
+var rootjQuery,
+
+       // Use the correct document accordingly with window argument (sandbox)
+       document = window.document,
+
+       // A simple way to check for HTML strings
+       // Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
+       // Strict HTML recognition (#11290: must start with <)
+       rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,
+
+       init = jQuery.fn.init = function( selector, context ) {
+               var match, elem;
+
+               // HANDLE: $(""), $(null), $(undefined), $(false)
+               if ( !selector ) {
+                       return this;
+               }
+
+               // 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 ];
+
+                       } else {
+                               match = rquickExpr.exec( selector );
+                       }
+
+                       // Match html or make sure no context is specified for #id
+                       if ( match && (match[1] || !context) ) {
+
+                               // HANDLE: $(html) -> $(array)
+                               if ( match[1] ) {
+                                       context = context instanceof jQuery ? context[0] : context;
+
+                                       // scripts is true for back-compat
+                                       // Intentionally let the error be thrown if parseHTML is not present
+                                       jQuery.merge( this, jQuery.parseHTML(
+                                               match[1],
+                                               context && context.nodeType ? context.ownerDocument || context : document,
+                                               true
+                                       ) );
+
+                                       // HANDLE: $(html, props)
+                                       if ( rsingleTag.test( match[1] ) && jQuery.isPlainObject( context ) ) {
+                                               for ( match in context ) {
+                                                       // Properties of context are called as methods if possible
+                                                       if ( jQuery.isFunction( this[ match ] ) ) {
+                                                               this[ match ]( context[ match ] );
+
+                                                       // ...and otherwise set as attributes
+                                                       } else {
+                                                               this.attr( match, context[ match ] );
+                                                       }
+                                               }
+                                       }
+
+                                       return 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 );
+                                               }
+
+                                               // Otherwise, we inject the element directly into the jQuery object
+                                               this.length = 1;
+                                               this[0] = elem;
+                                       }
+
+                                       this.context = document;
+                                       this.selector = selector;
+                                       return this;
+                               }
+
+                       // HANDLE: $(expr, $(...))
+                       } else if ( !context || context.jquery ) {
+                               return ( context || rootjQuery ).find( selector );
+
+                       // HANDLE: $(expr, context)
+                       // (which is just equivalent to: $(context).find(expr)
+                       } else {
+                               return this.constructor( context ).find( selector );
+                       }
+
+               // HANDLE: $(DOMElement)
+               } else if ( selector.nodeType ) {
+                       this.context = this[0] = selector;
+                       this.length = 1;
+                       return this;
+
+               // HANDLE: $(function)
+               // Shortcut for document ready
+               } else if ( jQuery.isFunction( selector ) ) {
+                       return typeof rootjQuery.ready !== "undefined" ?
+                               rootjQuery.ready( selector ) :
+                               // Execute immediately if ready is not present
+                               selector( jQuery );
+               }
+
+               if ( selector.selector !== undefined ) {
+                       this.selector = selector.selector;
+                       this.context = selector.context;
+               }
+
+               return jQuery.makeArray( selector, this );
+       };
+
+// Give the init function the jQuery prototype for later instantiation
+init.prototype = jQuery.fn;
+
+// Initialize central reference
+rootjQuery = jQuery( document );
+
+
+var rparentsprev = /^(?:parents|prev(?:Until|All))/,
+       // methods guaranteed to produce a unique set when starting from a unique set
+       guaranteedUnique = {
+               children: true,
+               contents: true,
+               next: true,
+               prev: true
+       };
+
+jQuery.extend({
+       dir: function( elem, dir, until ) {
+               var matched = [],
+                       cur = elem[ dir ];
+
+               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;
+       },
+
+       sibling: function( n, elem ) {
+               var r = [];
+
+               for ( ; n; n = n.nextSibling ) {
+                       if ( n.nodeType === 1 && n !== elem ) {
+                               r.push( n );
+                       }
+               }
+
+               return r;
+       }
+});
+
+jQuery.fn.extend({
+       has: function( target ) {
+               var i,
+                       targets = jQuery( target, this ),
+                       len = targets.length;
+
+               return this.filter(function() {
+                       for ( i = 0; i < len; i++ ) {
+                               if ( jQuery.contains( this, targets[i] ) ) {
+                                       return true;
+                               }
+                       }
+               });
+       },
+
+       closest: function( selectors, context ) {
+               var cur,
+                       i = 0,
+                       l = this.length,
+                       matched = [],
+                       pos = rneedsContext.test( selectors ) || typeof selectors !== "string" ?
+                               jQuery( selectors, context || this.context ) :
+                               0;
+
+               for ( ; i < l; i++ ) {
+                       for ( cur = this[i]; cur && cur !== context; cur = cur.parentNode ) {
+                               // Always skip document fragments
+                               if ( cur.nodeType < 11 && (pos ?
+                                       pos.index(cur) > -1 :
+
+                                       // Don't pass non-elements to Sizzle
+                                       cur.nodeType === 1 &&
+                                               jQuery.find.matchesSelector(cur, selectors)) ) {
+
+                                       matched.push( cur );
+                                       break;
+                               }
+                       }
+               }
+
+               return this.pushStack( matched.length > 1 ? jQuery.unique( matched ) : matched );
+       },
+
+       // 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.first().prevAll().length : -1;
+               }
+
+               // index in selector
+               if ( typeof elem === "string" ) {
+                       return jQuery.inArray( this[0], jQuery( elem ) );
+               }
+
+               // 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 ) {
+               return this.pushStack(
+                       jQuery.unique(
+                               jQuery.merge( this.get(), jQuery( selector, context ) )
+                       )
+               );
+       },
+
+       addBack: function( selector ) {
+               return this.add( selector == null ?
+                       this.prevObject : this.prevObject.filter(selector)
+               );
+       }
+});
+
+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 );
+
+               if ( name.slice( -5 ) !== "Until" ) {
+                       selector = until;
+               }
+
+               if ( selector && typeof selector === "string" ) {
+                       ret = jQuery.filter( selector, ret );
+               }
+
+               if ( this.length > 1 ) {
+                       // Remove duplicates
+                       if ( !guaranteedUnique[ name ] ) {
+                               ret = jQuery.unique( ret );
+                       }
+
+                       // Reverse order for parents* and prev-derivatives
+                       if ( rparentsprev.test( name ) ) {
+                               ret = ret.reverse();
+                       }
+               }
+
+               return this.pushStack( ret );
+       };
+});
+var rnotwhite = (/\S+/g);
+
+
+
+// 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.match( rnotwhite ) || [], function( _, flag ) {
+               object[ flag ] = true;
+       });
+       return object;
+}
+
+/*
+ * 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 ) {
+
+       // 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 );
+
+       var // Flag to know if list is currently firing
+               firing,
+               // Last fire value (for non-forgettable lists)
+               memory,
+               // Flag to know if list was already fired
+               fired,
+               // End of the loop when firing
+               firingLength,
+               // Index of currently firing callback (modified by remove if needed)
+               firingIndex,
+               // First callback to fire (used internally by add and fireWith)
+               firingStart,
+               // 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;
+                               }
+                       }
+                       firing = false;
+                       if ( list ) {
+                               if ( stack ) {
+                                       if ( stack.length ) {
+                                               fire( stack.shift() );
+                                       }
+                               } else if ( memory ) {
+                                       list = [];
+                               } else {
+                                       self.disable();
+                               }
+                       }
+               },
+               // 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" ) {
+                                                               if ( !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 );
+                                       }
+                               }
+                               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 this;
+                       },
+                       // Check if a given callback is in the list.
+                       // If no argument is given, return whether or not list has callbacks attached.
+                       has: function( fn ) {
+                               return fn ? jQuery.inArray( fn, list ) > -1 : !!( list && list.length );
+                       },
+                       // Remove all callbacks from the list
+                       empty: function() {
+                               list = [];
+                               firingLength = 0;
+                               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 ) ) {
+                                       args = args || [];
+                                       args = [ context, args.slice ? args.slice() : args ];
                                        if ( firing ) {
                                                stack.push( args );
                                        } else {
-                                               fire( args );
+                                               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;
+                       }
+               };
+
+       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 fn = jQuery.isFunction( fns[ i ] ) && fns[ i ];
+                                                       // deferred[ done | fail | progress ] for forwarding actions to newDefer
+                                                       deferred[ tuple[1] ](function() {
+                                                               var returned = fn && fn.apply( this, arguments );
+                                                               if ( returned && jQuery.isFunction( returned.promise ) ) {
+                                                                       returned.promise()
+                                                                               .done( newDefer.resolve )
+                                                                               .fail( newDefer.reject )
+                                                                               .progress( newDefer.notify );
+                                                               } else {
+                                                                       newDefer[ tuple[ 0 ] + "With" ]( this === promise ? newDefer.promise() : this, fn ? [ returned ] : arguments );
+                                                               }
+                                                       });
+                                               });
+                                               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 obj != null ? jQuery.extend( obj, promise ) : promise;
+                               }
+                       },
+                       deferred = {};
+
+               // Keep pipe for back-compat
+               promise.pipe = promise.then;
+
+               // Add list-specific methods
+               jQuery.each( tuples, function( i, tuple ) {
+                       var list = tuple[ 2 ],
+                               stateString = tuple[ 3 ];
+
+                       // promise[ done | fail | progress ] = list.add
+                       promise[ tuple[1] ] = list.add;
+
+                       // Handle state
+                       if ( stateString ) {
+                               list.add(function() {
+                                       // state = [ resolved | rejected ]
+                                       state = stateString;
+
+                               // [ reject_list | resolve_list ].disable; progress_list.lock
+                               }, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock );
+                       }
+
+                       // deferred[ resolve | reject | notify ]
+                       deferred[ tuple[0] ] = function() {
+                               deferred[ tuple[0] + "With" ]( this === deferred ? promise : this, arguments );
+                               return this;
+                       };
+                       deferred[ tuple[0] + "With" ] = list.fireWith;
+               });
+
+               // Make the deferred a promise
+               promise.promise( deferred );
+
+               // Call given func if any
+               if ( func ) {
+                       func.call( deferred, deferred );
+               }
+
+               // All done!
+               return deferred;
+       },
+
+       // Deferred helper
+       when: function( subordinate /* , ..., subordinateN */ ) {
+               var i = 0,
+                       resolveValues = slice.call( arguments ),
+                       length = resolveValues.length,
+
+                       // the count of uncompleted subordinates
+                       remaining = length !== 1 || ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0,
+
+                       // the master Deferred. If resolveValues consist of only a single Deferred, just use that.
+                       deferred = remaining === 1 ? subordinate : jQuery.Deferred(),
+
+                       // Update function for both resolve and progress values
+                       updateFunc = function( i, contexts, values ) {
+                               return function( value ) {
+                                       contexts[ i ] = this;
+                                       values[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;
+                                       if ( values === progressValues ) {
+                                               deferred.notifyWith( contexts, values );
+
+                                       } else if ( !(--remaining) ) {
+                                               deferred.resolveWith( contexts, values );
+                                       }
+                               };
+                       },
+
+                       progressValues, progressContexts, resolveContexts;
+
+               // 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;
+                               }
+                       }
+               }
+
+               // if we're not waiting on anything, resolve the master
+               if ( !remaining ) {
+                       deferred.resolveWith( resolveContexts, resolveValues );
+               }
+
+               return deferred.promise();
+       }
+});
+
+
+// The deferred used on DOM ready
+var readyList;
+
+jQuery.fn.ready = function( fn ) {
+       // Add the callback
+       jQuery.ready.promise().done( fn );
+
+       return this;
+};
+
+jQuery.extend({
+       // Is the DOM ready to be used? Set to true once it occurs.
+       isReady: false,
+
+       // A counter to track how many items to wait for before
+       // the ready event fires. See #6781
+       readyWait: 1,
+
+       // Hold (or release) the ready event
+       holdReady: function( hold ) {
+               if ( hold ) {
+                       jQuery.readyWait++;
+               } else {
+                       jQuery.ready( true );
+               }
+       },
+
+       // Handle when the DOM is ready
+       ready: function( wait ) {
+
+               // Abort if there are pending holds or we're already ready
+               if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {
+                       return;
+               }
+
+               // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
+               if ( !document.body ) {
+                       return setTimeout( jQuery.ready );
+               }
+
+               // 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;
+               }
+
+               // If there are functions bound, to execute
+               readyList.resolveWith( document, [ jQuery ] );
+
+               // Trigger any bound ready events
+               if ( jQuery.fn.triggerHandler ) {
+                       jQuery( document ).triggerHandler( "ready" );
+                       jQuery( document ).off( "ready" );
+               }
+       }
+});
+
+/**
+ * Clean-up method for dom ready events
+ */
+function detach() {
+       if ( document.addEventListener ) {
+               document.removeEventListener( "DOMContentLoaded", completed, false );
+               window.removeEventListener( "load", completed, false );
+
+       } else {
+               document.detachEvent( "onreadystatechange", completed );
+               window.detachEvent( "onload", completed );
+       }
+}
+
+/**
+ * The ready event handler and self cleanup method
+ */
+function completed() {
+       // readyState === "complete" is good enough for us to call the dom ready in oldIE
+       if ( document.addEventListener || event.type === "load" || document.readyState === "complete" ) {
+               detach();
+               jQuery.ready();
+       }
+}
+
+jQuery.ready.promise = function( obj ) {
+       if ( !readyList ) {
+
+               readyList = jQuery.Deferred();
+
+               // 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 );
+
+               // Standards-based browsers support DOMContentLoaded
+               } else if ( document.addEventListener ) {
+                       // Use the handy event callback
+                       document.addEventListener( "DOMContentLoaded", completed, false );
+
+                       // A fallback to window.onload, that will always work
+                       window.addEventListener( "load", completed, false );
+
+               // If IE event model is used
+               } else {
+                       // Ensure firing before onload, maybe late but safe also for iframes
+                       document.attachEvent( "onreadystatechange", completed );
+
+                       // A fallback to window.onload, that will always work
+                       window.attachEvent( "onload", completed );
+
+                       // If IE and not a frame
+                       // continually check to see if the document is ready
+                       var top = false;
+
+                       try {
+                               top = window.frameElement == null && document.documentElement;
+                       } catch(e) {}
+
+                       if ( top && top.doScroll ) {
+                               (function doScrollCheck() {
+                                       if ( !jQuery.isReady ) {
+
+                                               try {
+                                                       // Use the trick by Diego Perini
+                                                       // http://javascript.nwbox.com/IEContentLoaded/
+                                                       top.doScroll("left");
+                                               } catch(e) {
+                                                       return setTimeout( doScrollCheck, 50 );
+                                               }
+
+                                               // detach all dom ready events
+                                               detach();
+
+                                               // and execute any waiting functions
+                                               jQuery.ready();
+                                       }
+                               })();
+                       }
+               }
+       }
+       return readyList.promise( obj );
+};
+
+
+var strundefined = typeof undefined;
+
+
+
+// Support: IE<9
+// Iteration over object's inherited properties before its own
+var i;
+for ( i in jQuery( support ) ) {
+       break;
+}
+support.ownLast = i !== "0";
+
+// Note: most support tests are defined in their respective modules.
+// false until the test is run
+support.inlineBlockNeedsLayout = false;
+
+// Execute ASAP in case we need to set body.style.zoom
+jQuery(function() {
+       // Minified: var a,b,c,d
+       var val, div, body, container;
+
+       body = document.getElementsByTagName( "body" )[ 0 ];
+       if ( !body || !body.style ) {
+               // Return for frameset docs that don't have a body
+               return;
+       }
+
+       // Setup
+       div = document.createElement( "div" );
+       container = document.createElement( "div" );
+       container.style.cssText = "position:absolute;border:0;width:0;height:0;top:0;left:-9999px";
+       body.appendChild( container ).appendChild( div );
+
+       if ( typeof div.style.zoom !== strundefined ) {
+               // Support: IE<8
+               // Check if natively block-level elements act like inline-block
+               // elements when setting their display to 'inline' and giving
+               // them layout
+               div.style.cssText = "display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1";
+
+               support.inlineBlockNeedsLayout = val = div.offsetWidth === 3;
+               if ( val ) {
+                       // Prevent IE 6 from affecting layout for positioned elements #11048
+                       // Prevent IE from shrinking the body in IE 7 mode #12869
+                       // Support: IE<8
+                       body.style.zoom = 1;
+               }
+       }
+
+       body.removeChild( container );
+});
+
+
+
+
+(function() {
+       var div = document.createElement( "div" );
+
+       // Execute the test only if not already executed in another module.
+       if (support.deleteExpando == null) {
+               // Support: IE<9
+               support.deleteExpando = true;
+               try {
+                       delete div.test;
+               } catch( e ) {
+                       support.deleteExpando = false;
+               }
+       }
+
+       // Null elements to avoid leaks in IE.
+       div = null;
+})();
+
+
+/**
+ * Determines whether an object can have data
+ */
+jQuery.acceptData = function( elem ) {
+       var noData = jQuery.noData[ (elem.nodeName + " ").toLowerCase() ],
+               nodeType = +elem.nodeType || 1;
+
+       // Do not set data on non-element DOM nodes because it will not be cleared (#8335).
+       return nodeType !== 1 && nodeType !== 9 ?
+               false :
+
+               // Nodes accept data unless otherwise specified; rejection can be conditional
+               !noData || noData !== true && elem.getAttribute("classid") === noData;
+};
+
+
+var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,
+       rmultiDash = /([A-Z])/g;
+
+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 :
+                                       // 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 {
+                       data = undefined;
+               }
+       }
+
+       return data;
+}
+
+// checks a cache object for emptiness
+function isEmptyDataObject( obj ) {
+       var name;
+       for ( 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 internalData( elem, name, data, pvt /* Internal Use Only */ ) {
+       if ( !jQuery.acceptData( elem ) ) {
+               return;
+       }
+
+       var ret, thisCache,
+               internalKey = jQuery.expando,
+
+               // 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;
+
+       // 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)) && data === undefined && typeof name === "string" ) {
+               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 ) {
+                       id = elem[ internalKey ] = deletedIds.pop() || jQuery.guid++;
+               } else {
+                       id = internalKey;
+               }
+       }
+
+       if ( !cache[ id ] ) {
+               // Avoid exposing jQuery metadata on plain JS objects when the object
+               // is serialized using JSON.stringify
+               cache[ id ] = isNode ? {} : { 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 );
+               }
+       }
+
+       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;
+       }
+
+       // Check for both converted-to-camel and non-converted data property names
+       // If a data property was specified
+       if ( typeof name === "string" ) {
+
+               // 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;
+}
+
+function internalRemoveData( elem, name, pvt ) {
+       if ( !jQuery.acceptData( elem ) ) {
+               return;
+       }
+
+       var thisCache, i,
+               isNode = elem.nodeType,
+
+               // See jQuery.data for more information
+               cache = isNode ? jQuery.cache : elem,
+               id = isNode ? elem[ jQuery.expando ] : jQuery.expando;
+
+       // 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(" ");
                                        }
                                }
-                               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;
+                       } else {
+                               // If "name" is an array of keys...
+                               // When data is initially created, via ("key", "val") signature,
+                               // keys will be converted to camelCase.
+                               // Since there is no way to tell _how_ a key was added, remove
+                               // both plain key and camelCase key. #12786
+                               // This will only penalize the array argument path.
+                               name = name.concat( jQuery.map( name, jQuery.camelCase ) );
                        }
-               };
 
-       return self;
-};
-jQuery.extend({
+                       i = name.length;
+                       while ( i-- ) {
+                               delete thisCache[ name[i] ];
+                       }
 
-       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 obj != null ? jQuery.extend( obj, promise ) : promise;
-                               }
-                       },
-                       deferred = {};
+                       // If there is no data left in the cache, we want to continue
+                       // and let the cache object itself get destroyed
+                       if ( pvt ? !isEmptyDataObject(thisCache) : !jQuery.isEmptyObject(thisCache) ) {
+                               return;
+                       }
+               }
+       }
 
-               // Keep pipe for back-compat
-               promise.pipe = promise.then;
+       // See jQuery.data for more information
+       if ( !pvt ) {
+               delete cache[ id ].data;
 
-               // Add list-specific methods
-               jQuery.each( tuples, function( i, tuple ) {
-                       var list = tuple[ 2 ],
-                               stateString = tuple[ 3 ];
+               // Don't destroy the parent cache unless the internal data object
+               // had been the only thing left in it
+               if ( !isEmptyDataObject( cache[ id ] ) ) {
+                       return;
+               }
+       }
 
-                       // promise[ done | fail | progress ] = list.add
-                       promise[ tuple[1] ] = list.add;
+       // Destroy the cache
+       if ( isNode ) {
+               jQuery.cleanData( [ elem ], true );
 
-                       // Handle state
-                       if ( stateString ) {
-                               list.add(function() {
-                                       // state = [ resolved | rejected ]
-                                       state = stateString;
+       // Use delete when supported for expandos or `cache` is not a window per isWindow (#10080)
+       /* jshint eqeqeq: false */
+       } else if ( support.deleteExpando || cache != cache.window ) {
+               /* jshint eqeqeq: true */
+               delete cache[ id ];
 
-                               // [ reject_list | resolve_list ].disable; progress_list.lock
-                               }, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock );
-                       }
+       // When all else fails, null
+       } else {
+               cache[ id ] = null;
+       }
+}
 
-                       // deferred[ resolve | reject | notify ] = list.fire
-                       deferred[ tuple[0] ] = list.fire;
-                       deferred[ tuple[0] + "With" ] = list.fireWith;
-               });
+jQuery.extend({
+       cache: {},
 
-               // Make the deferred a promise
-               promise.promise( deferred );
+       // The following elements (space-suffixed to avoid Object.prototype collisions)
+       // throw uncatchable exceptions if you attempt to set expando properties
+       noData: {
+               "applet ": true,
+               "embed ": true,
+               // ...but Flash objects (which have this classid) *can* handle expandos
+               "object ": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
+       },
 
-               // Call given func if any
-               if ( func ) {
-                       func.call( deferred, deferred );
-               }
+       hasData: function( elem ) {
+               elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ];
+               return !!elem && !isEmptyDataObject( elem );
+       },
 
-               // All done!
-               return deferred;
+       data: function( elem, name, data ) {
+               return internalData( elem, name, data );
        },
 
-       // Deferred helper
-       when: function( subordinate /* , ..., subordinateN */ ) {
-               var i = 0,
-                       resolveValues = core_slice.call( arguments ),
-                       length = resolveValues.length,
+       removeData: function( elem, name ) {
+               return internalRemoveData( elem, name );
+       },
 
-                       // the count of uncompleted subordinates
-                       remaining = length !== 1 || ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0,
+       // For internal use only.
+       _data: function( elem, name, data ) {
+               return internalData( elem, name, data, true );
+       },
 
-                       // the master Deferred. If resolveValues consist of only a single Deferred, just use that.
-                       deferred = remaining === 1 ? subordinate : jQuery.Deferred(),
+       _removeData: function( elem, name ) {
+               return internalRemoveData( elem, name, true );
+       }
+});
 
-                       // 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 );
-                                       }
-                               };
-                       },
+jQuery.fn.extend({
+       data: function( key, value ) {
+               var i, name, data,
+                       elem = this[0],
+                       attrs = elem && elem.attributes;
 
-                       progressValues, progressContexts, resolveContexts;
+               // Special expections of .data basically thwart jQuery.access,
+               // so implement the relevant behavior ourselves
 
-               // 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;
+               // Gets all values
+               if ( key === undefined ) {
+                       if ( this.length ) {
+                               data = jQuery.data( elem );
+
+                               if ( elem.nodeType === 1 && !jQuery._data( elem, "parsedAttrs" ) ) {
+                                       i = attrs.length;
+                                       while ( i-- ) {
+
+                                               // Support: IE11+
+                                               // The attrs elements can be null (#14894)
+                                               if ( attrs[ i ] ) {
+                                                       name = attrs[ i ].name;
+                                                       if ( name.indexOf( "data-" ) === 0 ) {
+                                                               name = jQuery.camelCase( name.slice(5) );
+                                                               dataAttr( elem, name, data[ name ] );
+                                                       }
+                                               }
+                                       }
+                                       jQuery._data( elem, "parsedAttrs", true );
                                }
                        }
+
+                       return data;
                }
 
-               // if we're not waiting on anything, resolve the master
-               if ( !remaining ) {
-                       deferred.resolveWith( resolveContexts, resolveValues );
+               // Sets multiple values
+               if ( typeof key === "object" ) {
+                       return this.each(function() {
+                               jQuery.data( this, key );
+                       });
                }
 
-               return deferred.promise();
+               return arguments.length > 1 ?
+
+                       // Sets one value
+                       this.each(function() {
+                               jQuery.data( this, key, value );
+                       }) :
+
+                       // Gets one value
+                       // Try to fetch any internally stored data first
+                       elem ? dataAttr( elem, key, jQuery.data( elem, key ) ) : undefined;
+       },
+
+       removeData: function( key ) {
+               return this.each(function() {
+                       jQuery.removeData( this, key );
+               });
        }
 });
-jQuery.support = (function() {
-
-       var support,
-               all,
-               a,
-               select,
-               opt,
-               input,
-               fragment,
-               eventName,
-               i,
-               isSupported,
-               clickFn,
-               div = document.createElement("div");
 
-       // Setup
-       div.setAttribute( "className", "t" );
-       div.innerHTML = "  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>";
 
-       // Support tests won't run in some limited or non-browser environments
-       all = div.getElementsByTagName("*");
-       a = div.getElementsByTagName("a")[ 0 ];
-       if ( !all || !a || !all.length ) {
-               return {};
-       }
+jQuery.extend({
+       queue: function( elem, type, data ) {
+               var queue;
 
-       // First batch of tests
-       select = document.createElement("select");
-       opt = select.appendChild( document.createElement("option") );
-       input = div.getElementsByTagName("input")[ 0 ];
+               if ( elem ) {
+                       type = ( type || "fx" ) + "queue";
+                       queue = jQuery._data( elem, type );
 
-       a.style.cssText = "top:1px;float:left;opacity:.5";
-       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
-       };
+                       // 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 || [];
+               }
+       },
 
-       // Make sure checked status is properly cloned
-       input.checked = true;
-       support.noCloneChecked = input.cloneNode( true ).checked;
+       dequeue: function( elem, type ) {
+               type = type || "fx";
 
-       // 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 queue = jQuery.queue( elem, type ),
+                       startLength = queue.length,
+                       fn = queue.shift(),
+                       hooks = jQuery._queueHooks( elem, type ),
+                       next = function() {
+                               jQuery.dequeue( elem, type );
+                       };
 
-       // 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 the fx queue is dequeued, always remove the progress sentinel
+               if ( fn === "inprogress" ) {
+                       fn = queue.shift();
+                       startLength--;
+               }
 
-       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;
+               if ( fn ) {
+
+                       // Add a progress sentinel to prevent the fx queue from being
+                       // automatically dequeued
+                       if ( type === "fx" ) {
+                               queue.unshift( "inprogress" );
+                       }
+
+                       // clear up the last queue stop function
+                       delete hooks.stop;
+                       fn.call( elem, next, hooks );
+               }
+
+               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" );
+                               jQuery._removeData( elem, key );
+                       })
                });
-               div.cloneNode( true ).fireEvent("onclick");
-               div.detachEvent( "onclick", clickFn );
        }
+});
 
-       // 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";
+jQuery.fn.extend({
+       queue: function( type, data ) {
+               var setter = 2;
 
-       input.setAttribute( "checked", "checked" );
+               if ( typeof type !== "string" ) {
+                       data = type;
+                       type = "fx";
+                       setter--;
+               }
 
-       // #11217 - WebKit loses check when the name is after the checked attribute
-       input.setAttribute( "name", "t" );
+               if ( arguments.length < setter ) {
+                       return jQuery.queue( this[0], type );
+               }
 
-       div.appendChild( input );
-       fragment = document.createDocumentFragment();
-       fragment.appendChild( div.lastChild );
+               return data === undefined ?
+                       this :
+                       this.each(function() {
+                               var queue = jQuery.queue( this, type, data );
 
-       // WebKit doesn't clone checked state correctly in fragments
-       support.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked;
+                               // ensure a hooks for this queue
+                               jQuery._queueHooks( this, type );
 
-       // Check if a disconnected checkbox will retain its checked
-       // value of true after appended to the DOM (IE6/7)
-       support.appendChecked = input.checked;
+                               if ( type === "fx" && queue[0] !== "inprogress" ) {
+                                       jQuery.dequeue( this, type );
+                               }
+                       });
+       },
+       dequeue: function( type ) {
+               return this.each(function() {
+                       jQuery.dequeue( this, type );
+               });
+       },
+       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 ] );
+                               }
+                       };
 
-       fragment.removeChild( input );
-       fragment.appendChild( div );
+               if ( typeof type !== "string" ) {
+                       obj = type;
+                       type = undefined;
+               }
+               type = type || "fx";
 
-       // 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" );
+               while ( i-- ) {
+                       tmp = jQuery._data( elements[ i ], type + "queueHooks" );
+                       if ( tmp && tmp.empty ) {
+                               count++;
+                               tmp.empty.add( resolve );
                        }
-                       support[ i + "Bubbles" ] = isSupported;
                }
+               resolve();
+               return defer.promise( obj );
        }
+});
+var pnum = (/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/).source;
 
-       // 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];
-
-               if ( !body ) {
-                       // Return for frameset docs that don't have a body
-                       return;
-               }
-
-               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 );
+var cssExpand = [ "Top", "Right", "Bottom", "Left" ];
 
-               // Construct the test element
-               div = document.createElement("div");
-               container.appendChild( div );
+var isHidden = function( elem, el ) {
+               // isHidden might be called from jQuery#filter function;
+               // in that case, element will be second argument
+               elem = el || elem;
+               return jQuery.css( elem, "display" ) === "none" || !jQuery.contains( elem.ownerDocument, elem );
+       };
 
-               // 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 );
+// Multifunctional method to get and set values of a collection
+// The value/s can optionally be executed if it's a function
+var access = jQuery.access = function( elems, fn, key, value, chainable, emptyGet, raw ) {
+       var i = 0,
+               length = elems.length,
+               bulk = key == null;
 
-               // 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 );
+       // Sets many values
+       if ( jQuery.type( key ) === "object" ) {
+               chainable = true;
+               for ( i in key ) {
+                       jQuery.access( elems, fn, i, key[i], true, emptyGet, raw );
+               }
 
-               // 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";
+       // Sets one value
+       } else if ( value !== undefined ) {
+               chainable = true;
 
-                       // 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 );
+               if ( !jQuery.isFunction( value ) ) {
+                       raw = true;
                }
 
-               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 );
+               if ( bulk ) {
+                       // Bulk operations run against the entire set
+                       if ( raw ) {
+                               fn.call( elems, value );
+                               fn = null;
 
-                       // 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;
+                       // ...except when executing function values
+                       } else {
+                               bulk = fn;
+                               fn = function( elem, key, value ) {
+                                       return bulk.call( jQuery( elem ), value );
+                               };
+                       }
                }
 
-               // Null elements to avoid leaks in IE
-               body.removeChild( container );
-               container = div = tds = marginDiv = null;
-       });
-
-       // Null elements to avoid leaks in IE
-       fragment.removeChild( div );
-       all = a = select = opt = input = fragment = div = null;
+               if ( fn ) {
+                       for ( ; i < length; i++ ) {
+                               fn( elems[i], key, raw ? value : value.call( elems[i], i, fn( elems[i], key ) ) );
+                       }
+               }
+       }
 
-       return support;
-})();
-var rbrace = /(?:\{[\s\S]*\}|\[[\s\S]*\])$/,
-       rmultiDash = /([A-Z])/g;
+       return chainable ?
+               elems :
 
-jQuery.extend({
-       cache: {},
+               // Gets
+               bulk ?
+                       fn.call( elems ) :
+                       length ? fn( elems[0], key ) : emptyGet;
+};
+var rcheckableType = (/^(?:checkbox|radio)$/i);
 
-       deletedIds: [],
 
-       // Remove at next major release (1.9/2.0)
-       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, "" ),
+(function() {
+       // Minified: var a,b,c
+       var input = document.createElement( "input" ),
+               div = document.createElement( "div" ),
+               fragment = document.createDocumentFragment();
 
-       // 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
-       },
+       // Setup
+       div.innerHTML = "  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>";
 
-       hasData: function( elem ) {
-               elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ];
-               return !!elem && !isEmptyDataObject( elem );
-       },
+       // IE strips leading whitespace when .innerHTML is used
+       support.leadingWhitespace = div.firstChild.nodeType === 3;
 
-       data: function( elem, name, data, pvt /* Internal Use Only */ ) {
-               if ( !jQuery.acceptData( elem ) ) {
-                       return;
-               }
+       // Make sure that tbody elements aren't automatically inserted
+       // IE will insert them into empty tables
+       support.tbody = !div.getElementsByTagName( "tbody" ).length;
 
-               var thisCache, ret,
-                       internalKey = jQuery.expando,
-                       getByName = typeof name === "string",
+       // Make sure that link elements get serialized correctly by innerHTML
+       // This requires a wrapper element in IE
+       support.htmlSerialize = !!div.getElementsByTagName( "link" ).length;
 
-                       // 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,
+       // Makes sure cloning an html5 element does not cause problems
+       // Where outerHTML is undefined, this still works
+       support.html5Clone =
+               document.createElement( "nav" ).cloneNode( true ).outerHTML !== "<:nav></:nav>";
 
-                       // 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,
+       // Check if a disconnected checkbox will retain its checked
+       // value of true after appended to the DOM (IE6/7)
+       input.type = "checkbox";
+       input.checked = true;
+       fragment.appendChild( input );
+       support.appendChecked = input.checked;
 
-                       // 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;
+       // Make sure textarea (and checkbox) defaultValue is properly cloned
+       // Support: IE6-IE11+
+       div.innerHTML = "<textarea>x</textarea>";
+       support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;
 
-               // 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;
-               }
+       // #11217 - WebKit loses check when the name is after the checked attribute
+       fragment.appendChild( div );
+       div.innerHTML = "<input type='radio' checked='checked' name='t'/>";
 
-               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.guid++;
-                       } else {
-                               id = internalKey;
-                       }
-               }
+       // Support: Safari 5.1, iOS 5.1, Android 4.x, Android 2.3
+       // old WebKit doesn't clone checked state correctly in fragments
+       support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;
 
-               if ( !cache[ id ] ) {
-                       cache[ id ] = {};
+       // Support: IE<9
+       // Opera does not clone events (and typeof div.attachEvent === undefined).
+       // IE9-10 clones events bound via attachEvent, but they don't trigger with .click()
+       support.noCloneEvent = true;
+       if ( div.attachEvent ) {
+               div.attachEvent( "onclick", function() {
+                       support.noCloneEvent = false;
+               });
 
-                       // Avoids exposing jQuery metadata on plain JS objects when the object
-                       // is serialized using JSON.stringify
-                       if ( !isNode ) {
-                               cache[ id ].toJSON = jQuery.noop;
-                       }
-               }
+               div.cloneNode( true ).click();
+       }
 
-               // 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 );
-                       }
+       // Execute the test only if not already executed in another module.
+       if (support.deleteExpando == null) {
+               // Support: IE<9
+               support.deleteExpando = true;
+               try {
+                       delete div.test;
+               } catch( e ) {
+                       support.deleteExpando = false;
                }
+       }
+})();
 
-               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 = {};
-                       }
+(function() {
+       var i, eventName,
+               div = document.createElement( "div" );
 
-                       thisCache = thisCache.data;
-               }
+       // Support: IE<9 (lack submit/change bubble), Firefox 23+ (lack focusin event)
+       for ( i in { submit: true, change: true, focusin: true }) {
+               eventName = "on" + i;
 
-               if ( data !== undefined ) {
-                       thisCache[ jQuery.camelCase( name ) ] = data;
+               if ( !(support[ i + "Bubbles" ] = eventName in window) ) {
+                       // Beware of CSP restrictions (https://developer.mozilla.org/en/Security/CSP)
+                       div.setAttribute( eventName, "t" );
+                       support[ i + "Bubbles" ] = div.attributes[ eventName ].expando === false;
                }
+       }
 
-               // Check for both converted-to-camel and non-converted data property names
-               // If a data property was specified
-               if ( getByName ) {
+       // Null elements to avoid leaks in IE.
+       div = null;
+})();
 
-                       // First Try to find as-is property data
-                       ret = thisCache[ name ];
 
-                       // Test for null|undefined property data
-                       if ( ret == null ) {
+var rformElems = /^(?:input|select|textarea)$/i,
+       rkeyEvent = /^key/,
+       rmouseEvent = /^(?:mouse|pointer|contextmenu)|click/,
+       rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,
+       rtypenamespace = /^([^.]*)(?:\.(.+)|)$/;
 
-                               // Try to find the camelCased property
-                               ret = thisCache[ jQuery.camelCase( name ) ];
-                       }
-               } else {
-                       ret = thisCache;
-               }
+function returnTrue() {
+       return true;
+}
 
-               return ret;
-       },
+function returnFalse() {
+       return false;
+}
 
-       removeData: function( elem, name, pvt /* Internal Use Only */ ) {
-               if ( !jQuery.acceptData( elem ) ) {
-                       return;
-               }
+function safeActiveElement() {
+       try {
+               return document.activeElement;
+       } catch ( err ) { }
+}
 
-               var thisCache, i, l,
+/*
+ * Helper functions for managing events -- not part of the public interface.
+ * Props to Dean Edwards' addEvent library for many of the ideas.
+ */
+jQuery.event = {
 
-                       isNode = elem.nodeType,
+       global: {},
 
-                       // See jQuery.data for more information
-                       cache = isNode ? jQuery.cache : elem,
-                       id = isNode ? elem[ jQuery.expando ] : jQuery.expando;
+       add: function( elem, types, handler, data, selector ) {
+               var tmp, events, t, handleObjIn,
+                       special, eventHandle, handleObj,
+                       handlers, type, namespaces, origType,
+                       elemData = jQuery._data( elem );
 
-               // If there is already no cache entry for this object, there is no
-               // purpose in continuing
-               if ( !cache[ id ] ) {
+               // Don't attach events to noData or text/comment nodes (but allow plain objects)
+               if ( !elemData ) {
                        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;
-                               }
-                       }
+               // 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;
                }
 
-               // 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;
-                       }
+               // Make sure that the handler has a unique ID, used to find/remove it later
+               if ( !handler.guid ) {
+                       handler.guid = jQuery.guid++;
                }
 
-               // Destroy the cache
-               if ( isNode ) {
-                       jQuery.cleanData( [ elem ], true );
+               // Init the element's event structure and main handler, if this is the first
+               if ( !(events = elemData.events) ) {
+                       events = elemData.events = {};
+               }
+               if ( !(eventHandle = elemData.handle) ) {
+                       eventHandle = elemData.handle = 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 !== strundefined && (!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;
+               }
 
-               // 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 ];
+               // Handle multiple events separated by a space
+               types = ( types || "" ).match( rnotwhite ) || [ "" ];
+               t = types.length;
+               while ( t-- ) {
+                       tmp = rtypenamespace.exec( types[t] ) || [];
+                       type = origType = tmp[1];
+                       namespaces = ( tmp[2] || "" ).split( "." ).sort();
+
+                       // There *must* be a type, no attaching namespace-only handlers
+                       if ( !type ) {
+                               continue;
+                       }
 
-               // When all else fails, null
-               } else {
-                       cache[ id ] = null;
-               }
-       },
+                       // If event changes its type, use the special event handlers for the changed type
+                       special = jQuery.event.special[ type ] || {};
 
-       // For internal use only.
-       _data: function( elem, name, data ) {
-               return jQuery.data( elem, name, data, true );
-       },
+                       // If selector defined, determine special event api type, otherwise given type
+                       type = ( selector ? special.delegateType : special.bindType ) || 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() ];
+                       // Update special based on newly reset type
+                       special = jQuery.event.special[ type ] || {};
 
-               // nodes accept data unless otherwise specified; rejection can be conditional
-               return !noData || noData !== true && elem.getAttribute("classid") === noData;
-       }
-});
+                       // handleObj is passed to all event handlers
+                       handleObj = jQuery.extend({
+                               type: type,
+                               origType: origType,
+                               data: data,
+                               handler: handler,
+                               guid: handler.guid,
+                               selector: selector,
+                               needsContext: selector && jQuery.expr.match.needsContext.test( selector ),
+                               namespace: namespaces.join(".")
+                       }, handleObjIn );
 
-jQuery.fn.extend({
-       data: function( key, value ) {
-               var parts, part, attr, name, l,
-                       elem = this[0],
-                       i = 0,
-                       data = null;
+                       // Init the event handler queue if we're the first
+                       if ( !(handlers = events[ type ]) ) {
+                               handlers = events[ type ] = [];
+                               handlers.delegateCount = 0;
 
-               // Gets all values
-               if ( key === undefined ) {
-                       if ( this.length ) {
-                               data = jQuery.data( elem );
+                               // 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 );
 
-                               if ( elem.nodeType === 1 && !jQuery._data( elem, "parsedAttrs" ) ) {
-                                       attr = elem.attributes;
-                                       for ( l = attr.length; i < l; i++ ) {
-                                               name = attr[i].name;
+                                       } else if ( elem.attachEvent ) {
+                                               elem.attachEvent( "on" + type, eventHandle );
+                                       }
+                               }
+                       }
 
-                                               if ( !name.indexOf( "data-" ) ) {
-                                                       name = jQuery.camelCase( name.substring(5) );
+                       if ( special.add ) {
+                               special.add.call( elem, handleObj );
 
-                                                       dataAttr( elem, name, data[ name ] );
-                                               }
-                                       }
-                                       jQuery._data( elem, "parsedAttrs", true );
+                               if ( !handleObj.handler.guid ) {
+                                       handleObj.handler.guid = handler.guid;
                                }
                        }
 
-                       return data;
-               }
+                       // Add to the element's handler list, delegates in front
+                       if ( selector ) {
+                               handlers.splice( handlers.delegateCount++, 0, handleObj );
+                       } else {
+                               handlers.push( handleObj );
+                       }
 
-               // Sets multiple values
-               if ( typeof key === "object" ) {
-                       return this.each(function() {
-                               jQuery.data( this, key );
-                       });
+                       // Keep track of which events have ever been used, for event optimization
+                       jQuery.event.global[ type ] = true;
                }
 
-               parts = key.split( ".", 2 );
-               parts[1] = parts[1] ? "." + parts[1] : "";
-               part = parts[1] + "!";
+               // Nullify elem to prevent memory leaks in IE
+               elem = null;
+       },
 
-               return jQuery.access( this, function( value ) {
+       // Detach an event or set of events from an element
+       remove: function( elem, types, handler, selector, mappedTypes ) {
+               var j, handleObj, tmp,
+                       origCount, t, events,
+                       special, handlers, type,
+                       namespaces, origType,
+                       elemData = jQuery.hasData( elem ) && jQuery._data( elem );
 
-                       if ( value === undefined ) {
-                               data = this.triggerHandler( "getData" + part, [ parts[0] ] );
+               if ( !elemData || !(events = elemData.events) ) {
+                       return;
+               }
 
-                               // Try to fetch any internally stored data first
-                               if ( data === undefined && elem ) {
-                                       data = jQuery.data( elem, key );
-                                       data = dataAttr( elem, key, data );
-                               }
+               // Once for each type.namespace in types; type may be omitted
+               types = ( types || "" ).match( rnotwhite ) || [ "" ];
+               t = types.length;
+               while ( t-- ) {
+                       tmp = rtypenamespace.exec( types[t] ) || [];
+                       type = origType = tmp[1];
+                       namespaces = ( tmp[2] || "" ).split( "." ).sort();
 
-                               return data === undefined && parts[1] ?
-                                       this.data( parts[0] ) :
-                                       data;
+                       // 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;
                        }
 
-                       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 );
-       },
+                       special = jQuery.event.special[ type ] || {};
+                       type = ( selector ? special.delegateType : special.bindType ) || type;
+                       handlers = events[ type ] || [];
+                       tmp = tmp[2] && new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" );
 
-       removeData: function( key ) {
-               return this.each(function() {
-                       jQuery.removeData( this, key );
-               });
-       }
-});
+                       // Remove matching events
+                       origCount = j = handlers.length;
+                       while ( j-- ) {
+                               handleObj = handlers[ j ];
 
-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 ) {
+                               if ( ( mappedTypes || origType === handleObj.origType ) &&
+                                       ( !handler || handler.guid === handleObj.guid ) &&
+                                       ( !tmp || tmp.test( handleObj.namespace ) ) &&
+                                       ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) {
+                                       handlers.splice( j, 1 );
 
-               var name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase();
+                                       if ( handleObj.selector ) {
+                                               handlers.delegateCount--;
+                                       }
+                                       if ( special.remove ) {
+                                               special.remove.call( elem, handleObj );
+                                       }
+                               }
+                       }
 
-               data = elem.getAttribute( name );
+                       // 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 ( origCount && !handlers.length ) {
+                               if ( !special.teardown || special.teardown.call( elem, namespaces, elemData.handle ) === false ) {
+                                       jQuery.removeEvent( elem, type, elemData.handle );
+                               }
 
-               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 ) {}
+                               delete events[ type ];
+                       }
+               }
 
-                       // Make sure we set the data so it isn't changed later
-                       jQuery.data( elem, key, data );
+               // Remove the expando if it's no longer used
+               if ( jQuery.isEmptyObject( events ) ) {
+                       delete elemData.handle;
 
-               } else {
-                       data = undefined;
+                       // removeData also checks for emptiness and clears the expando if empty
+                       // so use it instead of delete
+                       jQuery._removeData( elem, "events" );
                }
-       }
+       },
 
-       return data;
-}
+       trigger: function( event, data, elem, onlyHandlers ) {
+               var handle, ontype, cur,
+                       bubbleType, special, tmp, i,
+                       eventPath = [ elem || document ],
+                       type = hasOwn.call( event, "type" ) ? event.type : event,
+                       namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split(".") : [];
 
-// checks a cache object for emptiness
-function isEmptyDataObject( obj ) {
-       var name;
-       for ( name in obj ) {
+               cur = tmp = elem = elem || document;
 
-               // if the public data object is empty, the private is still empty
-               if ( name === "data" && jQuery.isEmptyObject( obj[name] ) ) {
-                       continue;
+               // Don't do events on text and comment nodes
+               if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
+                       return;
                }
-               if ( name !== "toJSON" ) {
-                       return false;
+
+               // focus/blur morphs to focusin/out; ensure we're not firing them right now
+               if ( rfocusMorph.test( type + jQuery.event.triggered ) ) {
+                       return;
                }
-       }
 
-       return true;
-}
-jQuery.extend({
-       queue: function( elem, type, data ) {
-               var queue;
+               if ( type.indexOf(".") >= 0 ) {
+                       // Namespaced trigger; create a regexp to match event type in handle()
+                       namespaces = type.split(".");
+                       type = namespaces.shift();
+                       namespaces.sort();
+               }
+               ontype = type.indexOf(":") < 0 && "on" + type;
 
-               if ( elem ) {
-                       type = ( type || "fx" ) + "queue";
-                       queue = jQuery._data( elem, type );
+               // Caller can pass in a jQuery.Event object, Object, or just an event type string
+               event = event[ jQuery.expando ] ?
+                       event :
+                       new jQuery.Event( type, typeof event === "object" && event );
 
-                       // 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 || [];
-               }
-       },
+               // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)
+               event.isTrigger = onlyHandlers ? 2 : 3;
+               event.namespace = namespaces.join(".");
+               event.namespace_re = event.namespace ?
+                       new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" ) :
+                       null;
 
-       dequeue: function( elem, type ) {
-               type = type || "fx";
+               // Clean up the event in case it is being reused
+               event.result = undefined;
+               if ( !event.target ) {
+                       event.target = elem;
+               }
 
-               var queue = jQuery.queue( elem, type ),
-                       startLength = queue.length,
-                       fn = queue.shift(),
-                       hooks = jQuery._queueHooks( elem, type ),
-                       next = function() {
-                               jQuery.dequeue( elem, type );
-                       };
+               // Clone any incoming data and prepend the event, creating the handler arg list
+               data = data == null ?
+                       [ event ] :
+                       jQuery.makeArray( data, [ event ] );
 
-               // If the fx queue is dequeued, always remove the progress sentinel
-               if ( fn === "inprogress" ) {
-                       fn = queue.shift();
-                       startLength--;
+               // Allow special events to draw outside the lines
+               special = jQuery.event.special[ type ] || {};
+               if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {
+                       return;
                }
 
-               if ( fn ) {
+               // 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)
+               if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {
 
-                       // Add a progress sentinel to prevent the fx queue from being
-                       // automatically dequeued
-                       if ( type === "fx" ) {
-                               queue.unshift( "inprogress" );
+                       bubbleType = special.delegateType || type;
+                       if ( !rfocusMorph.test( bubbleType + type ) ) {
+                               cur = cur.parentNode;
+                       }
+                       for ( ; cur; cur = cur.parentNode ) {
+                               eventPath.push( cur );
+                               tmp = cur;
                        }
 
-                       // clear up the last queue stop function
-                       delete hooks.stop;
-                       fn.call( elem, next, hooks );
+                       // Only add window if we got to document (e.g., not plain obj or detached DOM)
+                       if ( tmp === (elem.ownerDocument || document) ) {
+                               eventPath.push( tmp.defaultView || tmp.parentWindow || window );
+                       }
                }
 
-               if ( !startLength && hooks ) {
-                       hooks.empty.fire();
-               }
-       },
+               // Fire handlers on the event path
+               i = 0;
+               while ( (cur = eventPath[i++]) && !event.isPropagationStopped() ) {
 
-       // 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 );
-                       })
-               });
-       }
-});
+                       event.type = i > 1 ?
+                               bubbleType :
+                               special.bindType || type;
 
-jQuery.fn.extend({
-       queue: function( type, data ) {
-               var setter = 2;
+                       // jQuery handler
+                       handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] && jQuery._data( cur, "handle" );
+                       if ( handle ) {
+                               handle.apply( cur, data );
+                       }
 
-               if ( typeof type !== "string" ) {
-                       data = type;
-                       type = "fx";
-                       setter--;
+                       // Native handler
+                       handle = ontype && cur[ ontype ];
+                       if ( handle && handle.apply && jQuery.acceptData( cur ) ) {
+                               event.result = handle.apply( cur, data );
+                               if ( event.result === false ) {
+                                       event.preventDefault();
+                               }
+                       }
                }
+               event.type = type;
 
-               if ( arguments.length < setter ) {
-                       return jQuery.queue( this[0], type );
-               }
+               // If nobody prevented the default action, do it now
+               if ( !onlyHandlers && !event.isDefaultPrevented() ) {
 
-               return data === undefined ?
-                       this :
-                       this.each(function() {
-                               var queue = jQuery.queue( this, type, data );
+                       if ( (!special._default || special._default.apply( eventPath.pop(), data ) === false) &&
+                               jQuery.acceptData( elem ) ) {
 
-                               // ensure a hooks for this queue
-                               jQuery._queueHooks( this, type );
+                               // 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)
+                               if ( ontype && elem[ type ] && !jQuery.isWindow( elem ) ) {
 
-                               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";
+                                       // Don't re-trigger an onFOO event when we call its FOO() method
+                                       tmp = elem[ ontype ];
 
-               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 ( tmp ) {
+                                               elem[ ontype ] = null;
+                                       }
 
-               if ( typeof type !== "string" ) {
-                       obj = type;
-                       type = undefined;
-               }
-               type = type || "fx";
+                                       // Prevent re-triggering of the same event, since we already bubbled it above
+                                       jQuery.event.triggered = type;
+                                       try {
+                                               elem[ type ]();
+                                       } catch ( e ) {
+                                               // IE<9 dies on focus/blur to hidden element (#1486,#12518)
+                                               // only reproducible on winXP IE8 native, not IE9 in IE8 mode
+                                       }
+                                       jQuery.event.triggered = undefined;
 
-               while( i-- ) {
-                       tmp = jQuery._data( elements[ i ], type + "queueHooks" );
-                       if ( tmp && tmp.empty ) {
-                               count++;
-                               tmp.empty.add( resolve );
+                                       if ( tmp ) {
+                                               elem[ ontype ] = tmp;
+                                       }
+                               }
                        }
                }
-               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 );
+               return event.result;
        },
 
-       removeAttr: function( name ) {
-               return this.each(function() {
-                       jQuery.removeAttr( this, name );
-               });
-       },
+       dispatch: function( event ) {
 
-       prop: function( name, value ) {
-               return jQuery.access( this, jQuery.prop, name, value, arguments.length > 1 );
-       },
+               // Make a writable jQuery.Event from the native event object
+               event = jQuery.event.fix( event );
 
-       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 ) {}
-               });
-       },
+               var i, ret, handleObj, matched, j,
+                       handlerQueue = [],
+                       args = slice.call( arguments ),
+                       handlers = ( jQuery._data( this, "events" ) || {} )[ event.type ] || [],
+                       special = jQuery.event.special[ event.type ] || {};
 
-       addClass: function( value ) {
-               var classNames, i, l, elem,
-                       setClass, c, cl;
+               // Use the fix-ed jQuery.Event rather than the (read-only) native event
+               args[0] = event;
+               event.delegateTarget = this;
 
-               if ( jQuery.isFunction( value ) ) {
-                       return this.each(function( j ) {
-                               jQuery( this ).addClass( value.call(this, j, this.className) );
-                       });
+               // Call the preDispatch hook for the mapped type, and let it bail if desired
+               if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {
+                       return;
                }
 
-               if ( value && typeof value === "string" ) {
-                       classNames = value.split( core_rspace );
+               // Determine handlers
+               handlerQueue = jQuery.event.handlers.call( this, event, handlers );
 
-                       for ( i = 0, l = this.length; i < l; i++ ) {
-                               elem = this[ i ];
+               // Run delegates first; they may want to stop propagation beneath us
+               i = 0;
+               while ( (matched = handlerQueue[ i++ ]) && !event.isPropagationStopped() ) {
+                       event.currentTarget = matched.elem;
 
-                               if ( elem.nodeType === 1 ) {
-                                       if ( !elem.className && classNames.length === 1 ) {
-                                               elem.className = value;
+                       j = 0;
+                       while ( (handleObj = matched.handlers[ j++ ]) && !event.isImmediatePropagationStopped() ) {
 
-                                       } else {
-                                               setClass = " " + elem.className + " ";
+                               // Triggered event must either 1) have no namespace, or
+                               // 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace).
+                               if ( !event.namespace_re || event.namespace_re.test( handleObj.namespace ) ) {
 
-                                               for ( c = 0, cl = classNames.length; c < cl; c++ ) {
-                                                       if ( setClass.indexOf( " " + classNames[ c ] + " " ) < 0 ) {
-                                                               setClass += classNames[ c ] + " ";
-                                                       }
+                                       event.handleObj = handleObj;
+                                       event.data = handleObj.data;
+
+                                       ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler )
+                                                       .apply( matched.elem, args );
+
+                                       if ( ret !== undefined ) {
+                                               if ( (event.result = ret) === false ) {
+                                                       event.preventDefault();
+                                                       event.stopPropagation();
                                                }
-                                               elem.className = jQuery.trim( setClass );
                                        }
                                }
                        }
                }
 
-               return this;
+               // Call the postDispatch hook for the mapped type
+               if ( special.postDispatch ) {
+                       special.postDispatch.call( this, event );
+               }
+
+               return event.result;
        },
 
-       removeClass: function( value ) {
-               var removes, className, elem, c, cl, i, l;
+       handlers: function( event, handlers ) {
+               var sel, handleObj, matches, i,
+                       handlerQueue = [],
+                       delegateCount = handlers.delegateCount,
+                       cur = event.target;
 
-               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 ) {
-                       removes = ( value || "" ).split( core_rspace );
+               // Find delegate handlers
+               // Black-hole SVG <use> instance trees (#13180)
+               // Avoid non-left-click bubbling in Firefox (#3861)
+               if ( delegateCount && cur.nodeType && (!event.button || event.type !== "click") ) {
 
-                       for ( i = 0, l = this.length; i < l; i++ ) {
-                               elem = this[ i ];
-                               if ( elem.nodeType === 1 && elem.className ) {
+                       /* jshint eqeqeq: false */
+                       for ( ; cur != this; cur = cur.parentNode || this ) {
+                               /* jshint eqeqeq: true */
+
+                               // Don't check non-elements (#13208)
+                               // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)
+                               if ( cur.nodeType === 1 && (cur.disabled !== true || event.type !== "click") ) {
+                                       matches = [];
+                                       for ( i = 0; i < delegateCount; i++ ) {
+                                               handleObj = handlers[ i ];
 
-                                       className = (" " + elem.className + " ").replace( rclass, " " );
+                                               // Don't conflict with Object.prototype properties (#13203)
+                                               sel = handleObj.selector + " ";
 
-                                       // 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 ] + " ") >= 0 ) {
-                                                       className = className.replace( " " + removes[ c ] + " " , " " );
+                                               if ( matches[ sel ] === undefined ) {
+                                                       matches[ sel ] = handleObj.needsContext ?
+                                                               jQuery( sel, this ).index( cur ) >= 0 :
+                                                               jQuery.find( sel, this, null, [ cur ] ).length;
                                                }
+                                               if ( matches[ sel ] ) {
+                                                       matches.push( handleObj );
+                                               }
+                                       }
+                                       if ( matches.length ) {
+                                               handlerQueue.push({ elem: cur, handlers: matches });
                                        }
-                                       elem.className = value ? jQuery.trim( className ) : "";
                                }
                        }
                }
 
-               return this;
+               // Add the remaining (directly-bound) handlers
+               if ( delegateCount < handlers.length ) {
+                       handlerQueue.push({ elem: this, handlers: handlers.slice( delegateCount ) });
+               }
+
+               return handlerQueue;
        },
 
-       toggleClass: function( value, stateVal ) {
-               var type = typeof value,
-                       isBool = typeof stateVal === "boolean";
+       fix: function( event ) {
+               if ( event[ jQuery.expando ] ) {
+                       return event;
+               }
 
-               if ( jQuery.isFunction( value ) ) {
-                       return this.each(function( i ) {
-                               jQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal );
-                       });
+               // Create a writable copy of the event object and normalize some properties
+               var i, prop, copy,
+                       type = event.type,
+                       originalEvent = event,
+                       fixHook = this.fixHooks[ type ];
+
+               if ( !fixHook ) {
+                       this.fixHooks[ type ] = fixHook =
+                               rmouseEvent.test( type ) ? this.mouseHooks :
+                               rkeyEvent.test( type ) ? this.keyHooks :
+                               {};
                }
+               copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props;
 
-               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 );
+               event = new jQuery.Event( originalEvent );
 
-                               while ( (className = classNames[ i++ ]) ) {
-                                       // check each className given, space separated list
-                                       state = isBool ? state : !self.hasClass( className );
-                                       self[ state ? "addClass" : "removeClass" ]( className );
-                               }
+               i = copy.length;
+               while ( i-- ) {
+                       prop = copy[ i ];
+                       event[ prop ] = originalEvent[ prop ];
+               }
 
-                       } else if ( type === "undefined" || type === "boolean" ) {
-                               if ( this.className ) {
-                                       // store className if set
-                                       jQuery._data( this, "__className__", this.className );
+               // Support: IE<9
+               // Fix target property (#1925)
+               if ( !event.target ) {
+                       event.target = originalEvent.srcElement || document;
+               }
+
+               // Support: Chrome 23+, Safari?
+               // Target should not be a text node (#504, #13143)
+               if ( event.target.nodeType === 3 ) {
+                       event.target = event.target.parentNode;
+               }
+
+               // Support: IE<9
+               // For mouse/key events, metaKey==false if it's undefined (#3368, #11328)
+               event.metaKey = !!event.metaKey;
+
+               return fixHook.filter ? fixHook.filter( event, originalEvent ) : event;
+       },
+
+       // Includes some event props shared by KeyEvent and MouseEvent
+       props: "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 body, eventDoc, doc,
+                               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;
+               }
+       },
+
+       special: {
+               load: {
+                       // Prevent triggered image.load events from bubbling to window.load
+                       noBubble: true
+               },
+               focus: {
+                       // Fire native event if possible so blur/focus sequence is correct
+                       trigger: function() {
+                               if ( this !== safeActiveElement() && this.focus ) {
+                                       try {
+                                               this.focus();
+                                               return false;
+                                       } catch ( e ) {
+                                               // Support: IE<9
+                                               // If we error on focus to hidden element (#1486, #12518),
+                                               // let .trigger() run the handlers
+                                       }
+                               }
+                       },
+                       delegateType: "focusin"
+               },
+               blur: {
+                       trigger: function() {
+                               if ( this === safeActiveElement() && this.blur ) {
+                                       this.blur();
+                                       return false;
+                               }
+                       },
+                       delegateType: "focusout"
+               },
+               click: {
+                       // For checkbox, fire native event so checked state will be right
+                       trigger: function() {
+                               if ( jQuery.nodeName( this, "input" ) && this.type === "checkbox" && this.click ) {
+                                       this.click();
+                                       return false;
                                }
+                       },
 
-                               // toggle whole className
-                               this.className = this.className || value === false ? "" : jQuery._data( this, "__className__" ) || "";
+                       // For cross-browser consistency, don't fire native .click() on links
+                       _default: function( event ) {
+                               return jQuery.nodeName( event.target, "a" );
                        }
-               });
+               },
+
+               beforeunload: {
+                       postDispatch: function( event ) {
+
+                               // Support: Firefox 20+
+                               // Firefox doesn't alert if the returnValue field is not set.
+                               if ( event.result !== undefined && event.originalEvent ) {
+                                       event.originalEvent.returnValue = event.result;
+                               }
+                       }
+               }
        },
 
-       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 ) >= 0 ) {
-                               return true;
-                       }
-               }
+       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();
+               }
+       }
+};
+
+jQuery.removeEvent = document.removeEventListener ?
+       function( elem, type, handle ) {
+               if ( elem.removeEventListener ) {
+                       elem.removeEventListener( type, handle, false );
+               }
+       } :
+       function( elem, type, handle ) {
+               var name = "on" + type;
+
+               if ( elem.detachEvent ) {
+
+                       // #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 ] === strundefined ) {
+                               elem[ name ] = null;
+                       }
+
+                       elem.detachEvent( name, 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.defaultPrevented === undefined &&
+                               // Support: IE < 9, Android < 4.0
+                               src.returnValue === false ?
+                       returnTrue :
+                       returnFalse;
 
-               return false;
-       },
+       // Event type
+       } else {
+               this.type = src;
+       }
 
-       val: function( value ) {
-               var hooks, ret, isFunction,
-                       elem = this[0];
+       // Put explicitly provided properties onto the event object
+       if ( props ) {
+               jQuery.extend( this, props );
+       }
 
-               if ( !arguments.length ) {
-                       if ( elem ) {
-                               hooks = jQuery.valHooks[ elem.type ] || jQuery.valHooks[ elem.nodeName.toLowerCase() ];
+       // Create a timestamp if incoming event doesn't have one
+       this.timeStamp = src && src.timeStamp || jQuery.now();
 
-                               if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) {
-                                       return ret;
-                               }
+       // Mark it as fixed
+       this[ jQuery.expando ] = true;
+};
 
-                               ret = elem.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 = {
+       isDefaultPrevented: returnFalse,
+       isPropagationStopped: returnFalse,
+       isImmediatePropagationStopped: returnFalse,
 
-                               return typeof ret === "string" ?
-                                       // handle most common string cases
-                                       ret.replace(rreturn, "") :
-                                       // handle cases where value is null/undef or number
-                                       ret == null ? "" : ret;
-                       }
+       preventDefault: function() {
+               var e = this.originalEvent;
 
+               this.isDefaultPrevented = returnTrue;
+               if ( !e ) {
                        return;
                }
 
-               isFunction = jQuery.isFunction( value );
+               // If preventDefault exists, run it on the original event
+               if ( e.preventDefault ) {
+                       e.preventDefault();
 
-               return this.each(function( i ) {
-                       var val,
-                               self = jQuery(this);
+               // Support: IE
+               // Otherwise set the returnValue property of the original event to false
+               } else {
+                       e.returnValue = false;
+               }
+       },
+       stopPropagation: function() {
+               var e = this.originalEvent;
 
-                       if ( this.nodeType !== 1 ) {
-                               return;
-                       }
+               this.isPropagationStopped = returnTrue;
+               if ( !e ) {
+                       return;
+               }
+               // If stopPropagation exists, run it on the original event
+               if ( e.stopPropagation ) {
+                       e.stopPropagation();
+               }
 
-                       if ( isFunction ) {
-                               val = value.call( this, i, self.val() );
-                       } else {
-                               val = value;
-                       }
+               // Support: IE
+               // Set the cancelBubble property of the original event to true
+               e.cancelBubble = true;
+       },
+       stopImmediatePropagation: function() {
+               var e = this.originalEvent;
 
-                       // 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 + "";
-                               });
-                       }
+               this.isImmediatePropagationStopped = returnTrue;
 
-                       hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];
+               if ( e && e.stopImmediatePropagation ) {
+                       e.stopImmediatePropagation();
+               }
 
-                       // If set returns undefined, fall back to normal setting
-                       if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value" ) === undefined ) {
-                               this.value = val;
-                       }
-               });
+               this.stopPropagation();
        }
-});
+};
 
-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, option,
-                                       options = elem.options,
-                                       index = elem.selectedIndex,
-                                       one = elem.type === "select-one" || index < 0,
-                                       values = one ? null : [],
-                                       max = one ? index + 1 : options.length,
-                                       i = index < 0 ?
-                                               max :
-                                               one ? index : 0;
+// Create mouseenter/leave events using mouseover/out and event-time checks
+jQuery.each({
+       mouseenter: "mouseover",
+       mouseleave: "mouseout",
+       pointerenter: "pointerover",
+       pointerleave: "pointerout"
+}, function( orig, fix ) {
+       jQuery.event.special[ orig ] = {
+               delegateType: fix,
+               bindType: fix,
 
-                               // Loop through all the selected options
-                               for ( ; i < max; i++ ) {
-                                       option = options[ i ];
+               handle: function( event ) {
+                       var ret,
+                               target = this,
+                               related = event.relatedTarget,
+                               handleObj = event.handleObj;
 
-                                       // oldIE doesn't update selected after form reset (#2551)
-                                       if ( ( option.selected || i === index ) &&
-                                                       // Don't return options that are disabled or in a disabled optgroup
-                                                       ( jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null ) &&
-                                                       ( !option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" ) ) ) {
+                       // 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;
+               }
+       };
+});
 
-                                               // Get the specific value for the option
-                                               value = jQuery( option ).val();
+// IE submit delegation
+if ( !support.submitBubbles ) {
 
-                                               // We don't need an array for one selects
-                                               if ( one ) {
-                                                       return value;
-                                               }
+       jQuery.event.special.submit = {
+               setup: function() {
+                       // Only need this for delegated form submit events
+                       if ( jQuery.nodeName( this, "form" ) ) {
+                               return false;
+                       }
 
-                                               // Multi-Selects return an array
-                                               values.push( value );
-                                       }
+                       // 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, "submitBubbles" ) ) {
+                                       jQuery.event.add( form, "submit._submit", function( event ) {
+                                               event._submit_bubble = true;
+                                       });
+                                       jQuery._data( form, "submitBubbles", true );
                                }
+                       });
+                       // return undefined since we don't need an event listener
+               },
 
-                               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;
+               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 );
                                }
-                               return values;
                        }
-               }
-       },
-
-       // Unused in 1.8, left in so attrFn-stabbers won't die; remove in 1.9
-       attrFn: {},
-
-       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;
-               }
+               teardown: function() {
+                       // Only need this for delegated form submit events
+                       if ( jQuery.nodeName( this, "form" ) ) {
+                               return false;
+                       }
 
-               if ( pass && jQuery.isFunction( jQuery.fn[ name ] ) ) {
-                       return jQuery( elem )[ name ]( value );
+                       // Remove delegated handlers; cleanData eventually reaps submit handlers attached above
+                       jQuery.event.remove( this, "._submit" );
                }
+       };
+}
 
-               // Fallback to prop when attributes are not supported
-               if ( typeof elem.getAttribute === "undefined" ) {
-                       return jQuery.prop( elem, name, value );
-               }
+// IE change delegation and checkbox/radio fix
+if ( !support.changeBubbles ) {
 
-               notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
+       jQuery.event.special.change = {
 
-               // 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 );
-               }
+               setup: function() {
 
-               if ( value !== undefined ) {
+                       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 );
+                                       });
+                               }
+                               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 ( value === null ) {
-                               jQuery.removeAttr( elem, name );
-                               return;
+                               if ( rformElems.test( elem.nodeName ) && !jQuery._data( elem, "changeBubbles" ) ) {
+                                       jQuery.event.add( elem, "change._change", function( event ) {
+                                               if ( this.parentNode && !event.isSimulated && !event.isTrigger ) {
+                                                       jQuery.event.simulate( "change", this.parentNode, event, true );
+                                               }
+                                       });
+                                       jQuery._data( elem, "changeBubbles", true );
+                               }
+                       });
+               },
 
-                       } else if ( hooks && "set" in hooks && notxml && (ret = hooks.set( elem, value, name )) !== undefined ) {
-                               return ret;
+               handle: function( event ) {
+                       var elem = event.target;
 
-                       } else {
-                               elem.setAttribute( name, value + "" );
-                               return value;
+                       // 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 );
                        }
+               },
 
-               } else if ( hooks && "get" in hooks && notxml && (ret = hooks.get( elem, name )) !== null ) {
-                       return ret;
-
-               } else {
-
-                       ret = elem.getAttribute( name );
+               teardown: function() {
+                       jQuery.event.remove( this, "._change" );
 
-                       // Non-existent attributes return null, we normalize to undefined
-                       return ret === null ?
-                               undefined :
-                               ret;
+                       return !rformElems.test( this.nodeName );
                }
-       },
-
-       removeAttr: function( elem, value ) {
-               var propName, attrNames, name, isBool,
-                       i = 0;
-
-               if ( value && elem.nodeType === 1 ) {
-
-                       attrNames = value.split( core_rspace );
-
-                       for ( ; i < attrNames.length; i++ ) {
-                               name = attrNames[ i ];
+       };
+}
 
-                               if ( name ) {
-                                       propName = jQuery.propFix[ name ] || name;
-                                       isBool = rboolean.test( name );
+// Create "bubbling" focus and blur events
+if ( !support.focusinBubbles ) {
+       jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) {
 
-                                       // 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 );
+               // Attach a single capturing handler on the document while someone wants focusin/focusout
+               var handler = function( event ) {
+                               jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true );
+                       };
 
-                                       // Set corresponding property to false for boolean attributes
-                                       if ( isBool && propName in elem ) {
-                                               elem[ propName ] = false;
-                                       }
-                               }
-                       }
-               }
-       },
+               jQuery.event.special[ fix ] = {
+                       setup: function() {
+                               var doc = this.ownerDocument || this,
+                                       attaches = jQuery._data( doc, fix );
 
-       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 );
+                               if ( !attaches ) {
+                                       doc.addEventListener( orig, handler, true );
                                }
-                               return name in elem ?
-                                       elem.value :
-                                       null;
+                               jQuery._data( doc, fix, ( attaches || 0 ) + 1 );
                        },
-                       set: function( elem, value, name ) {
-                               if ( nodeHook && jQuery.nodeName( elem, "button" ) ) {
-                                       return nodeHook.set( elem, value, name );
+                       teardown: function() {
+                               var doc = this.ownerDocument || this,
+                                       attaches = jQuery._data( doc, fix ) - 1;
+
+                               if ( !attaches ) {
+                                       doc.removeEventListener( orig, handler, true );
+                                       jQuery._removeData( doc, fix );
+                               } else {
+                                       jQuery._data( doc, fix, attaches );
                                }
-                               // 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;
-               }
+jQuery.fn.extend({
 
-               notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
+       on: function( types, selector, data, fn, /*INTERNAL*/ one ) {
+               var type, origFn;
 
-               if ( notxml ) {
-                       // Fix name and attach hooks
-                       name = jQuery.propFix[ name ] || name;
-                       hooks = jQuery.propHooks[ name ];
+               // Types can be a map of types/handlers
+               if ( typeof types === "object" ) {
+                       // ( types-Object, selector, data )
+                       if ( typeof selector !== "string" ) {
+                               // ( types-Object, data )
+                               data = data || selector;
+                               selector = undefined;
+                       }
+                       for ( type in types ) {
+                               this.on( type, selector, data, types[ type ], one );
+                       }
+                       return this;
                }
 
-               if ( value !== undefined ) {
-                       if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) {
-                               return ret;
-
+               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 {
-                               return ( elem[ name ] = value );
+                               // ( types, data, fn )
+                               fn = data;
+                               data = selector;
+                               selector = undefined;
                        }
+               }
+               if ( fn === false ) {
+                       fn = returnFalse;
+               } else if ( !fn ) {
+                       return this;
+               }
 
-               } else {
-                       if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) {
-                               return ret;
-
-                       } else {
-                               return elem[ name ];
+               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;
+               }
+               if ( typeof types === "object" ) {
+                       // ( types-object [, selector] )
+                       for ( 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 );
+               });
        },
 
-       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;
-                       }
+       trigger: function( type, data ) {
+               return this.each(function() {
+                       jQuery.event.trigger( type, data, this );
+               });
+       },
+       triggerHandler: function( type, data ) {
+               var elem = this[0];
+               if ( elem ) {
+                       return jQuery.event.trigger( type, data, elem, true );
                }
        }
 });
 
-// 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() );
+function createSafeFragment( document ) {
+       var list = nodeNames.split( "|" ),
+               safeFrag = document.createDocumentFragment();
+
+       if ( safeFrag.createElement ) {
+               while ( list.length ) {
+                       safeFrag.createElement(
+                               list.pop()
+                       );
                }
-               return name;
        }
-};
+       return safeFrag;
+}
 
-// IE6/7 do not support getting/setting some attributes with get/setAttribute
-if ( !getSetAttribute ) {
+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,
+       rnoshimcache = new RegExp("<(?:" + nodeNames + ")[\\s/>]", "i"),
+       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,
+       // checked="checked" or checked
+       rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
+       rscriptType = /^$|\/(?:java|ecma)script/i,
+       rscriptTypeMasked = /^true\/(.*)/,
+       rcleanScript = /^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,
 
-       fixSpecified = {
-               name: true,
-               id: true,
-               coords: true
-       };
+       // We have to close these tags to support XHTML (#13200)
+       wrapMap = {
+               option: [ 1, "<select multiple='multiple'>", "</select>" ],
+               legend: [ 1, "<fieldset>", "</fieldset>" ],
+               area: [ 1, "<map>", "</map>" ],
+               param: [ 1, "<object>", "</object>" ],
+               thead: [ 1, "<table>", "</table>" ],
+               tr: [ 2, "<table><tbody>", "</tbody></table>" ],
+               col: [ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ],
+               td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
 
-       // 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 + "" );
-               }
-       };
+               // 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.
+               _default: support.htmlSerialize ? [ 0, "", "" ] : [ 1, "X<div>", "</div>"  ]
+       },
+       safeFragment = createSafeFragment( document ),
+       fragmentDiv = safeFragment.appendChild( document.createElement("div") );
 
-       // 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;
-                               }
-                       }
-               });
-       });
+wrapMap.optgroup = wrapMap.option;
+wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
+wrapMap.th = wrapMap.td;
 
-       // 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";
+function getAll( context, tag ) {
+       var elems, elem,
+               i = 0,
+               found = typeof context.getElementsByTagName !== strundefined ? context.getElementsByTagName( tag || "*" ) :
+                       typeof context.querySelectorAll !== strundefined ? context.querySelectorAll( tag || "*" ) :
+                       undefined;
+
+       if ( !found ) {
+               for ( found = [], elems = context.childNodes || context; (elem = elems[i]) != null; i++ ) {
+                       if ( !tag || jQuery.nodeName( elem, tag ) ) {
+                               found.push( elem );
+                       } else {
+                               jQuery.merge( found, getAll( elem, tag ) );
                        }
-                       nodeHook.set( elem, value, name );
                }
-       };
+       }
+
+       return tag === undefined || tag && jQuery.nodeName( context, tag ) ?
+               jQuery.merge( [ context ], found ) :
+               found;
+}
+
+// Used in buildFragment, fixes the defaultChecked property
+function fixDefaultChecked( elem ) {
+       if ( rcheckableType.test( elem.type ) ) {
+               elem.defaultChecked = elem.checked;
+       }
 }
 
+// Support: IE<8
+// Manipulating tables requires a tbody
+function manipulationTarget( elem, content ) {
+       return jQuery.nodeName( elem, "table" ) &&
+               jQuery.nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ?
 
-// 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;
-                       }
-               });
-       });
+               elem.getElementsByTagName("tbody")[0] ||
+                       elem.appendChild( elem.ownerDocument.createElement("tbody") ) :
+               elem;
 }
 
-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 + "" );
-               }
-       };
+// Replace/restore the type attribute of script elements for safe DOM manipulation
+function disableScript( elem ) {
+       elem.type = (jQuery.find.attr( elem, "type" ) !== null) + "/" + elem.type;
+       return elem;
+}
+function restoreScript( elem ) {
+       var match = rscriptTypeMasked.exec( elem.type );
+       if ( match ) {
+               elem.type = match[1];
+       } else {
+               elem.removeAttribute("type");
+       }
+       return elem;
 }
 
-// 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;
+// Mark scripts as having already been evaluated
+function setGlobalEval( elems, refElements ) {
+       var elem,
+               i = 0;
+       for ( ; (elem = elems[i]) != null; i++ ) {
+               jQuery._data( elem, "globalEval", !refElements || jQuery._data( refElements[i], "globalEval" ) );
+       }
+}
 
-                       if ( parent ) {
-                               parent.selectedIndex;
+function cloneCopyEvent( src, dest ) {
 
-                               // Make sure that it also works with optgroups, see #5701
-                               if ( parent.parentNode ) {
-                                       parent.parentNode.selectedIndex;
-                               }
+       if ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) {
+               return;
+       }
+
+       var type, i, l,
+               oldData = jQuery._data( src ),
+               curData = jQuery._data( dest, oldData ),
+               events = oldData.events;
+
+       if ( events ) {
+               delete curData.handle;
+               curData.events = {};
+
+               for ( type in events ) {
+                       for ( i = 0, l = events[ type ].length; i < l; i++ ) {
+                               jQuery.event.add( dest, type, events[ type ][ i ] );
                        }
-                       return null;
                }
-       });
-}
+       }
 
-// IE6/7 call enctype encoding
-if ( !jQuery.support.enctype ) {
-       jQuery.propFix.enctype = "encoding";
+       // make the cloned public data object a copy from the original
+       if ( curData.data ) {
+               curData.data = jQuery.extend( {}, curData.data );
+       }
 }
 
-// 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" );
-       };
+function fixCloneNodeIssues( src, dest ) {
+       var nodeName, e, data;
 
-/*
- * Helper functions for managing events -- not part of the public interface.
- * Props to Dean Edwards' addEvent library for many of the ideas.
- */
-jQuery.event = {
+       // We do not need to do anything for non-Elements
+       if ( dest.nodeType !== 1 ) {
+               return;
+       }
 
-       add: function( elem, types, handler, data, selector ) {
+       nodeName = dest.nodeName.toLowerCase();
 
-               var elemData, eventHandle, events,
-                       t, tns, type, namespaces, handleObj,
-                       handleObjIn, handlers, special;
+       // IE6-8 copies events bound via attachEvent when using cloneNode.
+       if ( !support.noCloneEvent && dest[ jQuery.expando ] ) {
+               data = jQuery._data( dest );
 
-               // 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;
+               for ( e in data.events ) {
+                       jQuery.removeEvent( dest, e, data.handle );
                }
 
-               // 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;
-               }
+               // Event data gets referenced instead of copied if the expando gets copied too
+               dest.removeAttribute( jQuery.expando );
+       }
 
-               // Make sure that the handler has a unique ID, used to find/remove it later
-               if ( !handler.guid ) {
-                       handler.guid = jQuery.guid++;
-               }
+       // IE blanks contents when cloning scripts, and tries to evaluate newly-set text
+       if ( nodeName === "script" && dest.text !== src.text ) {
+               disableScript( dest ).text = src.text;
+               restoreScript( dest );
 
-               // Init the element's event structure and main handler, if this is the first
-               events = elemData.events;
-               if ( !events ) {
-                       elemData.events = events = {};
+       // IE6-10 improperly clones children of object elements using classid.
+       // IE10 throws NoModificationAllowedError if parent is null, #12132.
+       } else if ( nodeName === "object" ) {
+               if ( dest.parentNode ) {
+                       dest.outerHTML = src.outerHTML;
                }
-               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;
+
+               // 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 ( support.html5Clone && ( src.innerHTML && !jQuery.trim(dest.innerHTML) ) ) {
+                       dest.innerHTML = src.innerHTML;
                }
 
-               // 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++ ) {
+       } 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
 
-                       tns = rtypenamespace.exec( types[t] ) || [];
-                       type = tns[1];
-                       namespaces = ( tns[2] || "" ).split( "." ).sort();
+               dest.defaultChecked = dest.checked = src.checked;
 
-                       // If event changes its type, use the special event handlers for the changed type
-                       special = jQuery.event.special[ type ] || {};
+               // 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;
+               }
 
-                       // If selector defined, determine special event api type, otherwise given type
-                       type = ( selector ? special.delegateType : special.bindType ) || type;
+       // IE6-8 fails to return the selected option to the default selected
+       // state when cloning options
+       } else if ( nodeName === "option" ) {
+               dest.defaultSelected = dest.selected = src.defaultSelected;
 
-                       // Update special based on newly reset type
-                       special = jQuery.event.special[ type ] || {};
+       // 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;
+       }
+}
 
-                       // handleObj is passed to all event handlers
-                       handleObj = jQuery.extend({
-                               type: type,
-                               origType: tns[1],
-                               data: data,
-                               handler: handler,
-                               guid: handler.guid,
-                               selector: selector,
-                               needsContext: selector && jQuery.expr.match.needsContext.test( selector ),
-                               namespace: namespaces.join(".")
-                       }, handleObjIn );
+jQuery.extend({
+       clone: function( elem, dataAndEvents, deepDataAndEvents ) {
+               var destElements, node, clone, i, srcElements,
+                       inPage = jQuery.contains( elem.ownerDocument, elem );
 
-                       // Init the event handler queue if we're the first
-                       handlers = events[ type ];
-                       if ( !handlers ) {
-                               handlers = events[ type ] = [];
-                               handlers.delegateCount = 0;
+               if ( support.html5Clone || jQuery.isXMLDoc(elem) || !rnoshimcache.test( "<" + elem.nodeName + ">" ) ) {
+                       clone = elem.cloneNode( 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 );
+               // IE<=8 does not properly clone detached, unknown element nodes
+               } else {
+                       fragmentDiv.innerHTML = elem.outerHTML;
+                       fragmentDiv.removeChild( clone = fragmentDiv.firstChild );
+               }
 
-                                       } else if ( elem.attachEvent ) {
-                                               elem.attachEvent( "on" + type, eventHandle );
-                                       }
-                               }
-                       }
+               if ( (!support.noCloneEvent || !support.noCloneChecked) &&
+                               (elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem) ) {
 
-                       if ( special.add ) {
-                               special.add.call( elem, handleObj );
+                       // We eschew Sizzle here for performance reasons: http://jsperf.com/getall-vs-sizzle/2
+                       destElements = getAll( clone );
+                       srcElements = getAll( elem );
 
-                               if ( !handleObj.handler.guid ) {
-                                       handleObj.handler.guid = handler.guid;
+                       // Fix all IE cloning issues
+                       for ( i = 0; (node = srcElements[i]) != null; ++i ) {
+                               // Ensure that the destination node is not null; Fixes #9587
+                               if ( destElements[i] ) {
+                                       fixCloneNodeIssues( node, destElements[i] );
                                }
                        }
+               }
 
-                       // Add to the element's handler list, delegates in front
-                       if ( selector ) {
-                               handlers.splice( handlers.delegateCount++, 0, handleObj );
+               // Copy the events from the original to the clone
+               if ( dataAndEvents ) {
+                       if ( deepDataAndEvents ) {
+                               srcElements = srcElements || getAll( elem );
+                               destElements = destElements || getAll( clone );
+
+                               for ( i = 0; (node = srcElements[i]) != null; i++ ) {
+                                       cloneCopyEvent( node, destElements[i] );
+                               }
                        } else {
-                               handlers.push( handleObj );
+                               cloneCopyEvent( elem, clone );
                        }
+               }
 
-                       // Keep track of which events have ever been used, for event optimization
-                       jQuery.event.global[ type ] = true;
+               // Preserve script evaluation history
+               destElements = getAll( clone, "script" );
+               if ( destElements.length > 0 ) {
+                       setGlobalEval( destElements, !inPage && getAll( elem, "script" ) );
                }
 
-               // Nullify elem to prevent memory leaks in IE
-               elem = null;
+               destElements = srcElements = node = null;
+
+               // Return the cloned set
+               return clone;
        },
 
-       global: {},
+       buildFragment: function( elems, context, scripts, selection ) {
+               var j, elem, contains,
+                       tmp, tag, tbody, wrap,
+                       l = elems.length,
 
-       // Detach an event or set of events from an element
-       remove: function( elem, types, handler, selector, mappedTypes ) {
+                       // Ensure a safe fragment
+                       safe = createSafeFragment( context ),
 
-               var t, tns, type, origType, namespaces, origCount,
-                       j, events, special, eventType, handleObj,
-                       elemData = jQuery.hasData( elem ) && jQuery._data( elem );
+                       nodes = [],
+                       i = 0;
 
-               if ( !elemData || !(events = elemData.events) ) {
-                       return;
-               }
+               for ( ; i < l; i++ ) {
+                       elem = elems[ 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 ( elem || elem === 0 ) {
 
-                       // 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 );
+                               // Add nodes directly
+                               if ( jQuery.type( elem ) === "object" ) {
+                                       jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );
+
+                               // Convert non-html into a text node
+                               } else if ( !rhtml.test( elem ) ) {
+                                       nodes.push( context.createTextNode( elem ) );
+
+                               // Convert html into DOM nodes
+                               } else {
+                                       tmp = tmp || safe.appendChild( context.createElement("div") );
+
+                                       // Deserialize a standard representation
+                                       tag = (rtagName.exec( elem ) || [ "", "" ])[ 1 ].toLowerCase();
+                                       wrap = wrapMap[ tag ] || wrapMap._default;
+
+                                       tmp.innerHTML = wrap[1] + elem.replace( rxhtmlTag, "<$1></$2>" ) + wrap[2];
+
+                                       // Descend through wrappers to the right content
+                                       j = wrap[0];
+                                       while ( j-- ) {
+                                               tmp = tmp.lastChild;
+                                       }
+
+                                       // Manually add leading whitespace removed by IE
+                                       if ( !support.leadingWhitespace && rleadingWhitespace.test( elem ) ) {
+                                               nodes.push( context.createTextNode( rleadingWhitespace.exec( elem )[0] ) );
+                                       }
+
+                                       // Remove IE's autoinserted <tbody> from table fragments
+                                       if ( !support.tbody ) {
+
+                                               // String was a <table>, *may* have spurious <tbody>
+                                               elem = tag === "table" && !rtbody.test( elem ) ?
+                                                       tmp.firstChild :
+
+                                                       // String was a bare <thead> or <tfoot>
+                                                       wrap[1] === "<table>" && !rtbody.test( elem ) ?
+                                                               tmp :
+                                                               0;
+
+                                               j = elem && elem.childNodes.length;
+                                               while ( j-- ) {
+                                                       if ( jQuery.nodeName( (tbody = elem.childNodes[j]), "tbody" ) && !tbody.childNodes.length ) {
+                                                               elem.removeChild( tbody );
+                                                       }
+                                               }
+                                       }
+
+                                       jQuery.merge( nodes, tmp.childNodes );
+
+                                       // Fix #12392 for WebKit and IE > 9
+                                       tmp.textContent = "";
+
+                                       // Fix #12392 for oldIE
+                                       while ( tmp.firstChild ) {
+                                               tmp.removeChild( tmp.firstChild );
+                                       }
+
+                                       // Remember the top-level container for proper cleanup
+                                       tmp = safe.lastChild;
                                }
+                       }
+               }
+
+               // Fix #11356: Clear elements from fragment
+               if ( tmp ) {
+                       safe.removeChild( tmp );
+               }
+
+               // Reset defaultChecked for any radios and checkboxes
+               // about to be appended to the DOM in IE 6/7 (#8060)
+               if ( !support.appendChecked ) {
+                       jQuery.grep( getAll( nodes, "input" ), fixDefaultChecked );
+               }
+
+               i = 0;
+               while ( (elem = nodes[ i++ ]) ) {
+
+                       // #4087 - If origin and destination elements are the same, and this is
+                       // that element, do not do anything
+                       if ( selection && jQuery.inArray( elem, selection ) !== -1 ) {
                                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 ];
+                       contains = jQuery.contains( elem.ownerDocument, elem );
 
-                               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 );
+                       // Append to fragment
+                       tmp = getAll( safe.appendChild( elem ), "script" );
 
-                                       if ( handleObj.selector ) {
-                                               eventType.delegateCount--;
-                                       }
-                                       if ( special.remove ) {
-                                               special.remove.call( elem, handleObj );
-                                       }
-                               }
+                       // Preserve script evaluation history
+                       if ( contains ) {
+                               setGlobalEval( tmp );
                        }
 
-                       // 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 );
+                       // Capture executables
+                       if ( scripts ) {
+                               j = 0;
+                               while ( (elem = tmp[ j++ ]) ) {
+                                       if ( rscriptType.test( elem.type || "" ) ) {
+                                               scripts.push( elem );
+                                       }
                                }
-
-                               delete events[ type ];
                        }
                }
 
-               // Remove the expando if it's no longer used
-               if ( jQuery.isEmptyObject( events ) ) {
-                       delete elemData.handle;
+               tmp = null;
 
-                       // removeData also checks for emptiness and clears the expando if empty
-                       // so use it instead of delete
-                       jQuery.removeData( elem, "events", true );
-               }
+               return safe;
        },
 
-       // 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
-       },
+       cleanData: function( elems, /* internal */ acceptData ) {
+               var elem, type, id, data,
+                       i = 0,
+                       internalKey = jQuery.expando,
+                       cache = jQuery.cache,
+                       deleteExpando = support.deleteExpando,
+                       special = jQuery.event.special;
 
-       trigger: function( event, data, elem, onlyHandlers ) {
-               // Don't do events on text and comment nodes
-               if ( elem && (elem.nodeType === 3 || elem.nodeType === 8) ) {
-                       return;
-               }
+               for ( ; (elem = elems[i]) != null; i++ ) {
+                       if ( acceptData || jQuery.acceptData( elem ) ) {
 
-               // Event object or event type
-               var cache, exclusive, i, cur, old, ontype, special, handle, eventPath, bubbleType,
-                       type = event.type || event,
-                       namespaces = [];
+                               id = elem[ internalKey ];
+                               data = id && cache[ id ];
 
-               // focus/blur morphs to focusin/out; ensure we're not firing them right now
-               if ( rfocusMorph.test( type + jQuery.event.triggered ) ) {
-                       return;
-               }
+                               if ( data ) {
+                                       if ( data.events ) {
+                                               for ( type in data.events ) {
+                                                       if ( special[ type ] ) {
+                                                               jQuery.event.remove( elem, type );
 
-               if ( type.indexOf( "!" ) >= 0 ) {
-                       // Exclusive events trigger only for the exact event (no namespaces)
-                       type = type.slice(0, -1);
-                       exclusive = true;
-               }
+                                                       // This is a shortcut to avoid jQuery.event.remove's overhead
+                                                       } else {
+                                                               jQuery.removeEvent( elem, type, data.handle );
+                                                       }
+                                               }
+                                       }
 
-               if ( type.indexOf( "." ) >= 0 ) {
-                       // Namespaced trigger; create a regexp to match event type in handle()
-                       namespaces = type.split(".");
-                       type = namespaces.shift();
-                       namespaces.sort();
-               }
+                                       // Remove cache only if it was not already removed by jQuery.event.remove
+                                       if ( cache[ id ] ) {
 
-               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;
-               }
+                                               delete cache[ id ];
 
-               // 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 );
+                                               // 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 ];
 
-               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 : "";
+                                               } else if ( typeof elem.removeAttribute !== strundefined ) {
+                                                       elem.removeAttribute( internalKey );
 
-               // Handle a global trigger
-               if ( !elem ) {
+                                               } else {
+                                                       elem[ internalKey ] = null;
+                                               }
 
-                       // 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 );
+                                               deletedIds.push( id );
+                                       }
                                }
                        }
-                       return;
                }
+       }
+});
 
-               // Clean up the event in case it is being reused
-               event.result = undefined;
-               if ( !event.target ) {
-                       event.target = elem;
-               }
+jQuery.fn.extend({
+       text: function( value ) {
+               return 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 );
+       },
 
-               // Clone any incoming data and prepend the event, creating the handler arg list
-               data = data != null ? jQuery.makeArray( data ) : [];
-               data.unshift( event );
+       append: function() {
+               return this.domManip( arguments, function( elem ) {
+                       if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
+                               var target = manipulationTarget( this, elem );
+                               target.appendChild( elem );
+                       }
+               });
+       },
 
-               // Allow special events to draw outside the lines
-               special = jQuery.event.special[ type ] || {};
-               if ( special.trigger && special.trigger.apply( elem, data ) === false ) {
-                       return;
-               }
+       prepend: function() {
+               return this.domManip( arguments, function( elem ) {
+                       if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
+                               var target = manipulationTarget( this, elem );
+                               target.insertBefore( elem, target.firstChild );
+                       }
+               });
+       },
 
-               // 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 ) ) {
+       before: function() {
+               return this.domManip( arguments, function( elem ) {
+                       if ( this.parentNode ) {
+                               this.parentNode.insertBefore( elem, this );
+                       }
+               });
+       },
 
-                       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;
+       after: function() {
+               return this.domManip( arguments, function( elem ) {
+                       if ( this.parentNode ) {
+                               this.parentNode.insertBefore( elem, this.nextSibling );
+                       }
+               });
+       },
+
+       remove: function( selector, keepData /* Internal Use Only */ ) {
+               var elem,
+                       elems = selector ? jQuery.filter( selector, this ) : this,
+                       i = 0;
+
+               for ( ; (elem = elems[i]) != null; i++ ) {
+
+                       if ( !keepData && elem.nodeType === 1 ) {
+                               jQuery.cleanData( getAll( elem ) );
                        }
 
-                       // 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 ( elem.parentNode ) {
+                               if ( keepData && jQuery.contains( elem.ownerDocument, elem ) ) {
+                                       setGlobalEval( getAll( elem, "script" ) );
+                               }
+                               elem.parentNode.removeChild( elem );
                        }
                }
 
-               // Fire handlers on the event path
-               for ( i = 0; i < eventPath.length && !event.isPropagationStopped(); i++ ) {
+               return this;
+       },
 
-                       cur = eventPath[i][0];
-                       event.type = eventPath[i][1];
+       empty: function() {
+               var elem,
+                       i = 0;
 
-                       handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] && jQuery._data( cur, "handle" );
-                       if ( handle ) {
-                               handle.apply( cur, data );
+               for ( ; (elem = this[i]) != null; i++ ) {
+                       // Remove element nodes and prevent memory leaks
+                       if ( elem.nodeType === 1 ) {
+                               jQuery.cleanData( getAll( elem, false ) );
                        }
-                       // Note that this is a bare JS function and not a jQuery handler
-                       handle = ontype && cur[ ontype ];
-                       if ( handle && jQuery.acceptData( cur ) && handle.apply && handle.apply( cur, data ) === false ) {
-                               event.preventDefault();
+
+                       // Remove any remaining nodes
+                       while ( elem.firstChild ) {
+                               elem.removeChild( elem.firstChild );
+                       }
+
+                       // If this is a select, ensure that it displays empty (#12336)
+                       // Support: IE<9
+                       if ( elem.options && jQuery.nodeName( elem, "select" ) ) {
+                               elem.options.length = 0;
                        }
                }
-               event.type = type;
 
-               // If nobody prevented the default action, do it now
-               if ( !onlyHandlers && !event.isDefaultPrevented() ) {
+               return this;
+       },
 
-                       if ( (!special._default || special._default.apply( elem.ownerDocument, data ) === false) &&
-                               !(type === "click" && jQuery.nodeName( elem, "a" )) && jQuery.acceptData( elem ) ) {
+       clone: function( dataAndEvents, deepDataAndEvents ) {
+               dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
+               deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
 
-                               // 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 this.map(function() {
+                       return jQuery.clone( this, dataAndEvents, deepDataAndEvents );
+               });
+       },
 
-                                       // Don't re-trigger an onFOO event when we call its FOO() method
-                                       old = elem[ ontype ];
+       html: function( value ) {
+               return access( this, function( value ) {
+                       var elem = this[ 0 ] || {},
+                               i = 0,
+                               l = this.length;
 
-                                       if ( old ) {
-                                               elem[ ontype ] = null;
-                                       }
+                       if ( value === undefined ) {
+                               return elem.nodeType === 1 ?
+                                       elem.innerHTML.replace( rinlinejQuery, "" ) :
+                                       undefined;
+                       }
 
-                                       // Prevent re-triggering of the same event, since we already bubbled it above
-                                       jQuery.event.triggered = type;
-                                       elem[ type ]();
-                                       jQuery.event.triggered = undefined;
+                       // See if we can take a shortcut and just use innerHTML
+                       if ( typeof value === "string" && !rnoInnerhtml.test( value ) &&
+                               ( support.htmlSerialize || !rnoshimcache.test( value )  ) &&
+                               ( support.leadingWhitespace || !rleadingWhitespace.test( value ) ) &&
+                               !wrapMap[ (rtagName.exec( value ) || [ "", "" ])[ 1 ].toLowerCase() ] ) {
+
+                               value = value.replace( rxhtmlTag, "<$1></$2>" );
 
-                                       if ( old ) {
-                                               elem[ ontype ] = old;
+                               try {
+                                       for (; i < l; i++ ) {
+                                               // Remove element nodes and prevent memory leaks
+                                               elem = this[i] || {};
+                                               if ( elem.nodeType === 1 ) {
+                                                       jQuery.cleanData( getAll( elem, false ) );
+                                                       elem.innerHTML = value;
+                                               }
                                        }
-                               }
+
+                                       elem = 0;
+
+                               // If using innerHTML throws an exception, use the fallback method
+                               } catch(e) {}
                        }
-               }
 
-               return event.result;
+                       if ( elem ) {
+                               this.empty().append( value );
+                       }
+               }, null, value, arguments.length );
        },
 
-       dispatch: function( event ) {
+       replaceWith: function() {
+               var arg = arguments[ 0 ];
 
-               // Make a writable jQuery.Event from the native event object
-               event = jQuery.event.fix( event || window.event );
+               // Make the changes, replacing each context element with the new content
+               this.domManip( arguments, function( elem ) {
+                       arg = this.parentNode;
 
-               var i, j, cur, ret, selMatch, matched, matches, handleObj, sel, related,
-                       handlers = ( (jQuery._data( this, "events" ) || {} )[ event.type ] || []),
-                       delegateCount = handlers.delegateCount,
-                       args = core_slice.call( arguments ),
-                       run_all = !event.exclusive && !event.namespace,
-                       special = jQuery.event.special[ event.type ] || {},
-                       handlerQueue = [];
+                       jQuery.cleanData( getAll( this ) );
 
-               // Use the fix-ed jQuery.Event rather than the (read-only) native event
-               args[0] = event;
-               event.delegateTarget = this;
+                       if ( arg ) {
+                               arg.replaceChild( elem, 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;
-               }
+               // Force removal if there was no new content (e.g., from empty arguments)
+               return arg && (arg.length || arg.nodeType) ? this : this.remove();
+       },
 
-               // 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") ) {
+       detach: function( selector ) {
+               return this.remove( selector, true );
+       },
 
-                       for ( cur = event.target; cur != this; cur = cur.parentNode || this ) {
+       domManip: function( args, callback ) {
 
-                               // 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;
+               // Flatten any nested arrays
+               args = concat.apply( [], args );
 
-                                               if ( selMatch[ sel ] === undefined ) {
-                                                       selMatch[ sel ] = handleObj.needsContext ?
-                                                               jQuery( sel, this ).index( cur ) >= 0 :
-                                                               jQuery.find( sel, this, null, [ cur ] ).length;
-                                               }
-                                               if ( selMatch[ sel ] ) {
-                                                       matches.push( handleObj );
-                                               }
-                                       }
-                                       if ( matches.length ) {
-                                               handlerQueue.push({ elem: cur, matches: matches });
-                                       }
+               var first, node, hasScripts,
+                       scripts, doc, fragment,
+                       i = 0,
+                       l = this.length,
+                       set = this,
+                       iNoClone = l - 1,
+                       value = args[0],
+                       isFunction = jQuery.isFunction( value );
+
+               // We can't cloneNode fragments that contain checked, in WebKit
+               if ( isFunction ||
+                               ( l > 1 && typeof value === "string" &&
+                                       !support.checkClone && rchecked.test( value ) ) ) {
+                       return this.each(function( index ) {
+                               var self = set.eq( index );
+                               if ( isFunction ) {
+                                       args[0] = value.call( this, index, self.html() );
                                }
-                       }
+                               self.domManip( args, callback );
+                       });
                }
 
-               // Add the remaining (directly-bound) handlers
-               if ( handlers.length > delegateCount ) {
-                       handlerQueue.push({ elem: this, matches: handlers.slice( delegateCount ) });
-               }
+               if ( l ) {
+                       fragment = jQuery.buildFragment( args, this[ 0 ].ownerDocument, false, this );
+                       first = fragment.firstChild;
 
-               // 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;
+                       if ( fragment.childNodes.length === 1 ) {
+                               fragment = first;
+                       }
 
-                       for ( j = 0; j < matched.matches.length && !event.isImmediatePropagationStopped(); j++ ) {
-                               handleObj = matched.matches[ j ];
+                       if ( first ) {
+                               scripts = jQuery.map( getAll( fragment, "script" ), disableScript );
+                               hasScripts = scripts.length;
 
-                               // 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 ) ) {
+                               // Use the original fragment for the last item instead of the first because it can end up
+                               // being emptied incorrectly in certain situations (#8070).
+                               for ( ; i < l; i++ ) {
+                                       node = fragment;
 
-                                       event.data = handleObj.data;
-                                       event.handleObj = handleObj;
+                                       if ( i !== iNoClone ) {
+                                               node = jQuery.clone( node, true, true );
+
+                                               // Keep references to cloned scripts for later restoration
+                                               if ( hasScripts ) {
+                                                       jQuery.merge( scripts, getAll( node, "script" ) );
+                                               }
+                                       }
+
+                                       callback.call( this[i], node, i );
+                               }
+
+                               if ( hasScripts ) {
+                                       doc = scripts[ scripts.length - 1 ].ownerDocument;
 
-                                       ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler )
-                                                       .apply( matched.elem, args );
+                                       // Reenable scripts
+                                       jQuery.map( scripts, restoreScript );
 
-                                       if ( ret !== undefined ) {
-                                               event.result = ret;
-                                               if ( ret === false ) {
-                                                       event.preventDefault();
-                                                       event.stopPropagation();
+                                       // Evaluate executable scripts on first document insertion
+                                       for ( i = 0; i < hasScripts; i++ ) {
+                                               node = scripts[ i ];
+                                               if ( rscriptType.test( node.type || "" ) &&
+                                                       !jQuery._data( node, "globalEval" ) && jQuery.contains( doc, node ) ) {
+
+                                                       if ( node.src ) {
+                                                               // Optional AJAX dependency, but won't run scripts if not present
+                                                               if ( jQuery._evalUrl ) {
+                                                                       jQuery._evalUrl( node.src );
+                                                               }
+                                                       } else {
+                                                               jQuery.globalEval( ( node.text || node.textContent || node.innerHTML || "" ).replace( rcleanScript, "" ) );
+                                                       }
                                                }
                                        }
                                }
+
+                               // Fix #11809: Avoid leaking memory
+                               fragment = first = null;
                        }
                }
 
-               // Call the postDispatch hook for the mapped type
-               if ( special.postDispatch ) {
-                       special.postDispatch.call( this, event );
-               }
+               return this;
+       }
+});
 
-               return event.result;
-       },
+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 ),
+                       last = insert.length - 1;
 
-       // 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(" "),
+               for ( ; i <= last; i++ ) {
+                       elems = i === last ? this : this.clone(true);
+                       jQuery( insert[i] )[ original ]( elems );
 
-       fixHooks: {},
+                       // Modern browsers can apply jQuery collections as arrays, but oldIE needs a .get()
+                       push.apply( ret, elems.get() );
+               }
 
-       keyHooks: {
-               props: "char charCode key keyCode".split(" "),
-               filter: function( event, original ) {
+               return this.pushStack( ret );
+       };
+});
 
-                       // Add which for key events
-                       if ( event.which == null ) {
-                               event.which = original.charCode != null ? original.charCode : original.keyCode;
-                       }
 
-                       return event;
-               }
-       },
+var iframe,
+       elemdisplay = {};
 
-       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;
+/**
+ * Retrieve the actual display of a element
+ * @param {String} name nodeName of the element
+ * @param {Object} doc Document object
+ */
+// Called only from within defaultDisplay
+function actualDisplay( name, doc ) {
+       var style,
+               elem = jQuery( doc.createElement( name ) ).appendTo( doc.body ),
 
-                       // 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;
+               // getDefaultComputedStyle might be reliably used only on attached element
+               display = window.getDefaultComputedStyle && ( style = window.getDefaultComputedStyle( elem[ 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 );
-                       }
+                       // Use of this method is a temporary fix (more like optmization) until something better comes along,
+                       // since it was removed from specification and supported only in FF
+                       style.display : jQuery.css( elem[ 0 ], "display" );
 
-                       // Add relatedTarget, if necessary
-                       if ( !event.relatedTarget && fromElement ) {
-                               event.relatedTarget = fromElement === event.target ? original.toElement : fromElement;
-                       }
+       // We don't have any data stored on the element,
+       // so use "detach" method as fast way to get rid of the element
+       elem.detach();
 
-                       // 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 display;
+}
 
-                       return event;
-               }
-       },
+/**
+ * Try to determine the default display value of an element
+ * @param {String} nodeName
+ */
+function defaultDisplay( nodeName ) {
+       var doc = document,
+               display = elemdisplay[ nodeName ];
 
-       fix: function( event ) {
-               if ( event[ jQuery.expando ] ) {
-                       return event;
-               }
+       if ( !display ) {
+               display = actualDisplay( nodeName, doc );
 
-               // 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;
+               // If the simple way fails, read from inside an iframe
+               if ( display === "none" || !display ) {
 
-               event = jQuery.Event( originalEvent );
+                       // Use the already-created iframe if possible
+                       iframe = (iframe || jQuery( "<iframe frameborder='0' width='0' height='0'/>" )).appendTo( doc.documentElement );
 
-               for ( i = copy.length; i; ) {
-                       prop = copy[ --i ];
-                       event[ prop ] = originalEvent[ prop ];
-               }
+                       // Always write a new HTML skeleton so Webkit and Firefox don't choke on reuse
+                       doc = ( iframe[ 0 ].contentWindow || iframe[ 0 ].contentDocument ).document;
 
-               // Fix target property, if necessary (#1925, IE 6/7/8 & Safari2)
-               if ( !event.target ) {
-                       event.target = originalEvent.srcElement || document;
-               }
+                       // Support: IE
+                       doc.write();
+                       doc.close();
 
-               // Target should not be a text node (#504, Safari)
-               if ( event.target.nodeType === 3 ) {
-                       event.target = event.target.parentNode;
+                       display = actualDisplay( nodeName, doc );
+                       iframe.detach();
                }
 
-               // For mouse/key events, metaKey==false if it's undefined (#3368, #11328; IE6/7/8)
-               event.metaKey = !!event.metaKey;
-
-               return fixHook.filter? fixHook.filter( event, originalEvent ) : event;
-       },
+               // Store the correct default display
+               elemdisplay[ nodeName ] = display;
+       }
 
-       special: {
-               load: {
-                       // Prevent triggered image.load events from bubbling to window.load
-                       noBubble: true
-               },
+       return display;
+}
 
-               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;
-                               }
-                       },
+(function() {
+       var shrinkWrapBlocksVal;
 
-                       teardown: function( namespaces, eventHandle ) {
-                               if ( this.onbeforeunload === eventHandle ) {
-                                       this.onbeforeunload = null;
-                               }
-                       }
+       support.shrinkWrapBlocks = function() {
+               if ( shrinkWrapBlocksVal != null ) {
+                       return shrinkWrapBlocksVal;
                }
-       },
 
-       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();
-               }
-       }
-};
+               // Will be changed later if needed.
+               shrinkWrapBlocksVal = false;
 
-// 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;
+               // Minified: var b,c,d
+               var div, body, container;
 
-jQuery.removeEvent = document.removeEventListener ?
-       function( elem, type, handle ) {
-               if ( elem.removeEventListener ) {
-                       elem.removeEventListener( type, handle, false );
+               body = document.getElementsByTagName( "body" )[ 0 ];
+               if ( !body || !body.style ) {
+                       // Test fired too early or in an unsupported environment, exit.
+                       return;
                }
-       } :
-       function( elem, type, handle ) {
-               var name = "on" + type;
-
-               if ( elem.detachEvent ) {
 
-                       // #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;
-                       }
+               // Setup
+               div = document.createElement( "div" );
+               container = document.createElement( "div" );
+               container.style.cssText = "position:absolute;border:0;width:0;height:0;top:0;left:-9999px";
+               body.appendChild( container ).appendChild( div );
 
-                       elem.detachEvent( name, handle );
+               // Support: IE6
+               // Check if elements with layout shrink-wrap their children
+               if ( typeof div.style.zoom !== strundefined ) {
+                       // Reset CSS: box-sizing; display; margin; border
+                       div.style.cssText =
+                               // Support: Firefox<29, Android 2.3
+                               // Vendor-prefix box-sizing
+                               "-webkit-box-sizing:content-box;-moz-box-sizing:content-box;" +
+                               "box-sizing:content-box;display:block;margin:0;border:0;" +
+                               "padding:1px;width:1px;zoom:1";
+                       div.appendChild( document.createElement( "div" ) ).style.width = "5px";
+                       shrinkWrapBlocksVal = div.offsetWidth !== 3;
                }
-       };
 
-jQuery.Event = function( src, props ) {
-       // Allow instantiation without the 'new' keyword
-       if ( !(this instanceof jQuery.Event) ) {
-               return new jQuery.Event( src, props );
-       }
+               body.removeChild( container );
 
-       // Event object
-       if ( src && src.type ) {
-               this.originalEvent = src;
-               this.type = src.type;
+               return shrinkWrapBlocksVal;
+       };
 
-               // 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;
+})();
+var rmargin = (/^margin/);
 
-       // Event type
-       } else {
-               this.type = src;
-       }
+var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" );
 
-       // 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;
-};
+var getStyles, curCSS,
+       rposition = /^(top|right|bottom|left)$/;
 
-function returnFalse() {
-       return false;
-}
-function returnTrue() {
-       return true;
-}
+if ( window.getComputedStyle ) {
+       getStyles = function( elem ) {
+               return elem.ownerDocument.defaultView.getComputedStyle( elem, null );
+       };
 
-// 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;
+       curCSS = function( elem, name, computed ) {
+               var width, minWidth, maxWidth, ret,
+                       style = elem.style;
 
-               var e = this.originalEvent;
-               if ( !e ) {
-                       return;
-               }
+               computed = computed || getStyles( elem );
 
-               // if preventDefault exists run it on the original event
-               if ( e.preventDefault ) {
-                       e.preventDefault();
+               // getPropertyValue is only needed for .css('filter') in IE9, see #12537
+               ret = computed ? computed.getPropertyValue( name ) || computed[ name ] : undefined;
 
-               // otherwise set the returnValue property of the original event to false (IE)
-               } else {
-                       e.returnValue = false;
-               }
-       },
-       stopPropagation: function() {
-               this.isPropagationStopped = returnTrue;
+               if ( computed ) {
 
-               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 ( ret === "" && !jQuery.contains( elem.ownerDocument, elem ) ) {
+                               ret = jQuery.style( elem, name );
+                       }
 
-// 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,
+                       // 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 ) ) {
 
-               handle: function( event ) {
-                       var ret,
-                               target = this,
-                               related = event.relatedTarget,
-                               handleObj = event.handleObj,
-                               selector = handleObj.selector;
+                               // Remember the original values
+                               width = style.width;
+                               minWidth = style.minWidth;
+                               maxWidth = style.maxWidth;
 
-                       // 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;
+                               // Put in the new values to get a computed value out
+                               style.minWidth = style.maxWidth = style.width = ret;
+                               ret = computed.width;
+
+                               // Revert the changed values
+                               style.width = width;
+                               style.minWidth = minWidth;
+                               style.maxWidth = maxWidth;
                        }
-                       return ret;
                }
+
+               // Support: IE
+               // IE returns zIndex value as an integer.
+               return ret === undefined ?
+                       ret :
+                       ret + "";
+       };
+} else if ( document.documentElement.currentStyle ) {
+       getStyles = function( elem ) {
+               return elem.currentStyle;
        };
-});
 
-// IE submit delegation
-if ( !jQuery.support.submitBubbles ) {
+       curCSS = function( elem, name, computed ) {
+               var left, rs, rsLeft, ret,
+                       style = elem.style;
 
-       jQuery.event.special.submit = {
-               setup: function() {
-                       // Only need this for delegated form submit events
-                       if ( jQuery.nodeName( this, "form" ) ) {
-                               return false;
-                       }
+               computed = computed || getStyles( elem );
+               ret = computed ? computed[ name ] : undefined;
 
-                       // 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
-               },
+               // Avoid setting ret to empty string here
+               // so we don't default to auto
+               if ( ret == null && style && style[ name ] ) {
+                       ret = style[ name ];
+               }
 
-               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 );
-                               }
-                       }
-               },
+               // From the awesome hack by Dean Edwards
+               // http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291
 
-               teardown: function() {
-                       // Only need this for delegated form submit events
-                       if ( jQuery.nodeName( this, "form" ) ) {
-                               return false;
+               // 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 ) ) {
+
+                       // Remember the original values
+                       left = style.left;
+                       rs = elem.runtimeStyle;
+                       rsLeft = rs && rs.left;
+
+                       // Put in the new values to get a computed value out
+                       if ( rsLeft ) {
+                               rs.left = elem.currentStyle.left;
                        }
+                       style.left = name === "fontSize" ? "1em" : ret;
+                       ret = style.pixelLeft + "px";
 
-                       // Remove delegated handlers; cleanData eventually reaps submit handlers attached above
-                       jQuery.event.remove( this, "._submit" );
+                       // Revert the changed values
+                       style.left = left;
+                       if ( rsLeft ) {
+                               rs.left = rsLeft;
+                       }
                }
+
+               // Support: IE
+               // IE returns zIndex value as an integer.
+               return ret === undefined ?
+                       ret :
+                       ret + "" || "auto";
        };
 }
 
-// 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;
-                                               }
-                                               // Allow triggered, simulated change events (#11500)
-                                               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 ) && !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 );
-                                               }
-                                       });
-                                       jQuery._data( elem, "_change_attached", true );
-                               }
-                       });
-               },
+function addGetHookIf( conditionFn, hookFn ) {
+       // Define the hook, we'll check on the first run if it's really needed.
+       return {
+               get: function() {
+                       var condition = conditionFn();
 
-               handle: function( event ) {
-                       var elem = event.target;
+                       if ( condition == null ) {
+                               // The test was not ready at this point; screw the hook this time
+                               // but check again when needed next time.
+                               return;
+                       }
 
-                       // 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 );
+                       if ( condition ) {
+                               // Hook not needed (or it's not possible to use it due to missing dependency),
+                               // remove it.
+                               // Since there are no other hooks for marginRight, remove the whole object.
+                               delete this.get;
+                               return;
                        }
-               },
 
-               teardown: function() {
-                       jQuery.event.remove( this, "._change" );
+                       // Hook needed; redefine it so that the support test is not executed again.
 
-                       return !rformElems.test( this.nodeName );
+                       return (this.get = hookFn).apply( this, arguments );
                }
        };
 }
 
-// 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 );
-                       };
+(function() {
+       // Minified: var b,c,d,e,f,g, h,i
+       var div, style, a, pixelPositionVal, boxSizingReliableVal,
+               reliableHiddenOffsetsVal, reliableMarginRightVal;
 
-               jQuery.event.special[ fix ] = {
-                       setup: function() {
-                               if ( attaches++ === 0 ) {
-                                       document.addEventListener( orig, handler, true );
-                               }
-                       },
-                       teardown: function() {
-                               if ( --attaches === 0 ) {
-                                       document.removeEventListener( orig, handler, true );
-                               }
-                       }
-               };
-       });
-}
+       // Setup
+       div = document.createElement( "div" );
+       div.innerHTML = "  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>";
+       a = div.getElementsByTagName( "a" )[ 0 ];
+       style = a && a.style;
 
-jQuery.fn.extend({
+       // Finish early in limited (non-browser) environments
+       if ( !style ) {
+               return;
+       }
 
-       on: function( types, selector, data, fn, /*INTERNAL*/ one ) {
-               var origFn, type;
+       style.cssText = "float:left;opacity:.5";
 
-               // 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;
+       // Support: IE<9
+       // Make sure that element opacity exists (as opposed to filter)
+       support.opacity = style.opacity === "0.5";
+
+       // Verify style float existence
+       // (IE uses styleFloat instead of cssFloat)
+       support.cssFloat = !!style.cssFloat;
+
+       div.style.backgroundClip = "content-box";
+       div.cloneNode( true ).style.backgroundClip = "";
+       support.clearCloneStyle = div.style.backgroundClip === "content-box";
+
+       // Support: Firefox<29, Android 2.3
+       // Vendor-prefix box-sizing
+       support.boxSizing = style.boxSizing === "" || style.MozBoxSizing === "" ||
+               style.WebkitBoxSizing === "";
+
+       jQuery.extend(support, {
+               reliableHiddenOffsets: function() {
+                       if ( reliableHiddenOffsetsVal == null ) {
+                               computeStyleTests();
                        }
-                       for ( type in types ) {
-                               this.on( type, selector, data, types[ type ], one );
+                       return reliableHiddenOffsetsVal;
+               },
+
+               boxSizingReliable: function() {
+                       if ( boxSizingReliableVal == null ) {
+                               computeStyleTests();
                        }
-                       return this;
-               }
+                       return boxSizingReliableVal;
+               },
 
-               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;
+               pixelPosition: function() {
+                       if ( pixelPositionVal == null ) {
+                               computeStyleTests();
                        }
-               }
-               if ( fn === false ) {
-                       fn = returnFalse;
-               } else if ( !fn ) {
-                       return this;
-               }
+                       return pixelPositionVal;
+               },
 
-               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;
-               }
-               if ( typeof types === "object" ) {
-                       // ( types-object [, selector] )
-                       for ( type in types ) {
-                               this.off( type, selector, types[ type ] );
+               // Support: Android 2.3
+               reliableMarginRight: function() {
+                       if ( reliableMarginRightVal == null ) {
+                               computeStyleTests();
                        }
-                       return this;
-               }
-               if ( selector === false || typeof selector === "function" ) {
-                       // ( types [, fn] )
-                       fn = selector;
-                       selector = undefined;
+                       return reliableMarginRightVal;
                }
-               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 );
-       },
+       function computeStyleTests() {
+               // Minified: var b,c,d,j
+               var div, body, container, contents;
 
-       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;
-       },
+               body = document.getElementsByTagName( "body" )[ 0 ];
+               if ( !body || !body.style ) {
+                       // Test fired too early or in an unsupported environment, exit.
+                       return;
+               }
 
-       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 );
-       },
+               // Setup
+               div = document.createElement( "div" );
+               container = document.createElement( "div" );
+               container.style.cssText = "position:absolute;border:0;width:0;height:0;top:0;left:-9999px";
+               body.appendChild( container ).appendChild( div );
 
-       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 );
-               }
-       },
+               div.style.cssText =
+                       // Support: Firefox<29, Android 2.3
+                       // Vendor-prefix box-sizing
+                       "-webkit-box-sizing:border-box;-moz-box-sizing:border-box;" +
+                       "box-sizing:border-box;display:block;margin-top:1%;top:1%;" +
+                       "border:1px;padding:1px;width:4px;position:absolute";
 
-       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 );
+               // Support: IE<9
+               // Assume reasonable values in the absence of getComputedStyle
+               pixelPositionVal = boxSizingReliableVal = false;
+               reliableMarginRightVal = true;
 
-                               // Make sure that clicks stop
-                               event.preventDefault();
+               // Check for getComputedStyle so that this code is not run in IE<9.
+               if ( window.getComputedStyle ) {
+                       pixelPositionVal = ( window.getComputedStyle( div, null ) || {} ).top !== "1%";
+                       boxSizingReliableVal =
+                               ( window.getComputedStyle( div, null ) || { width: "4px" } ).width === "4px";
 
-                               // and execute the function
-                               return args[ lastToggle ].apply( this, arguments ) || false;
-                       };
+                       // Support: Android 2.3
+                       // Div with explicit width and no margin-right incorrectly
+                       // gets computed margin-right based on width of container (#3333)
+                       // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
+                       contents = div.appendChild( document.createElement( "div" ) );
+
+                       // Reset CSS: box-sizing; display; margin; border; padding
+                       contents.style.cssText = div.style.cssText =
+                               // Support: Firefox<29, Android 2.3
+                               // Vendor-prefix box-sizing
+                               "-webkit-box-sizing:content-box;-moz-box-sizing:content-box;" +
+                               "box-sizing:content-box;display:block;margin:0;border:0;padding:0";
+                       contents.style.marginRight = contents.style.width = "0";
+                       div.style.width = "1px";
+
+                       reliableMarginRightVal =
+                               !parseFloat( ( window.getComputedStyle( contents, null ) || {} ).marginRight );
+               }
 
-               // link all the functions, so any of them can unbind this click handler
-               toggler.guid = guid;
-               while ( i < args.length ) {
-                       args[ i++ ].guid = guid;
+               // Support: IE8
+               // 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).
+               div.innerHTML = "<table><tr><td></td><td>t</td></tr></table>";
+               contents = div.getElementsByTagName( "td" );
+               contents[ 0 ].style.cssText = "margin:0;border:0;padding:0;display:none";
+               reliableHiddenOffsetsVal = contents[ 0 ].offsetHeight === 0;
+               if ( reliableHiddenOffsetsVal ) {
+                       contents[ 0 ].style.display = "";
+                       contents[ 1 ].style.display = "none";
+                       reliableHiddenOffsetsVal = contents[ 0 ].offsetHeight === 0;
                }
 
-               return this.click( toggler );
-       },
-
-       hover: function( fnOver, fnOut ) {
-               return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
+               body.removeChild( container );
        }
-});
 
-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 );
-       };
+// A method for quickly swapping in/out CSS properties to get correct calculations.
+jQuery.swap = function( elem, options, callback, args ) {
+       var ret, name,
+               old = {};
 
-       if ( rkeyEvent.test( name ) ) {
-               jQuery.event.fixHooks[ name ] = jQuery.event.keyHooks;
+       // Remember the old values, and insert the new ones
+       for ( name in options ) {
+               old[ name ] = elem.style[ name ];
+               elem.style[ name ] = options[ name ];
        }
 
-       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 cachedruns,\r
-       assertGetIdNotName,\r
-       Expr,\r
-       getText,\r
-       isXML,\r
-       contains,\r
-       compile,\r
-       sortOrder,\r
-       hasDuplicate,\r
-       outermostContext,\r
-\r
-       baseHasDuplicate = true,\r
-       strundefined = "undefined",\r
-\r
-       expando = ( "sizcache" + Math.random() ).replace( ".", "" ),\r
-\r
-       Token = String,\r
-       document = window.document,\r
-       docElem = document.documentElement,\r
-       dirruns = 0,\r
-       done = 0,\r
-       pop = [].pop,\r
-       push = [].push,\r
-       slice = [].slice,\r
-       // Use a stripped-down indexOf if a native one is unavailable\r
-       indexOf = [].indexOf || function( elem ) {\r
-               var i = 0,\r
-                       len = this.length;\r
-               for ( ; i < len; i++ ) {\r
-                       if ( this[i] === elem ) {\r
-                               return i;\r
-                       }\r
-               }\r
-               return -1;\r
-       },\r
-\r
-       // Augment a function for special use by Sizzle\r
-       markFunction = function( fn, value ) {\r
-               fn[ expando ] = value == null || value;\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
-                       // Retrieve with (key + " ") to avoid collision with native Object.prototype properties (see Issue #157)\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 = ":(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + whitespace +\r
-               "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)",\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
-               "POS": new RegExp( pos, "i" ),\r
-               "CHILD": new RegExp( "^:(only|nth|first|last)-child(?:\\(" + whitespace +\r
-                       "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace +\r
-                       "*(\\d+)|))" + whitespace + "*\\)|)", "i" ),\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,\r
-                       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 ( !selector || typeof selector !== "string" ) {\r
-               return results;\r
-       }\r
-\r
-       if ( nodeType !== 1 && nodeType !== 9 ) {\r
-               return [];\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.replace( rtrim, "$1" ), 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
-// Returns a function to use in pseudos for positionals\r
-function createPositionalPseudo( fn ) {\r
-       return markFunction(function( argument ) {\r
-               argument = +argument;\r
-               return markFunction(function( seed, matches ) {\r
-                       var j,\r
-                               matchIndexes = fn( [], seed.length, argument ),\r
-                               i = matchIndexes.length;\r
-\r
-                       // Match elements found at the specified indexes\r
-                       while ( i-- ) {\r
-                               if ( seed[ (j = matchIndexes[i]) ] ) {\r
-                                       seed[j] = !(matches[j] = seed[j]);\r
-                               }\r
-                       }\r
-               });\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( 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 val,\r
-               xml = isXML( elem );\r
-\r
-       if ( !xml ) {\r
-               name = name.toLowerCase();\r
-       }\r
-       if ( (val = Expr.attrHandle[ name ]) ) {\r
-               return val( elem );\r
-       }\r
-       if ( xml || assertAttributes ) {\r
-               return elem.getAttribute( name );\r
-       }\r
-       val = elem.getAttributeNode( name );\r
-       return val ?\r
-               typeof elem[ name ] === "boolean" ?\r
-                       elem[ name ] ? name : null :\r
-                       val.specified ? val.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
-       // 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": assertUsableName && function( tag, context ) {\r
-                       if ( typeof context.getElementsByName !== strundefined ) {\r
-                               return context.getElementsByName( name );\r
-                       }\r
-               },\r
-\r
-               "CLASS": assertUsableClassName && 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 ) {\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, 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
-\r
-                       return pattern ||\r
-                               (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) &&\r
-                               classCache( className, 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
-                       return function( elem, context ) {\r
-                               var result = Sizzle.attr( elem, name );\r
-\r
-                               if ( result == null ) {\r
-                                       return operator === "!=";\r
-                               }\r
-                               if ( !operator ) {\r
-                                       return true;\r
-                               }\r
-\r
-                               result += "";\r
-\r
-                               return operator === "=" ? result === check :\r
-                                       operator === "!=" ? result !== check :\r
-                                       operator === "^=" ? check && result.indexOf( check ) === 0 :\r
-                                       operator === "*=" ? check && result.indexOf( check ) > -1 :\r
-                                       operator === "$=" ? check && result.substr( result.length - check.length ) === check :\r
-                                       operator === "~=" ? ( " " + result + " " ).indexOf( check ) > -1 :\r
-                                       operator === "|=" ? result === check || result.substr( 0, check.length + 1 ) === check + "-" :\r
-                                       false;\r
-                       };\r
-               },\r
-\r
-               "CHILD": function( type, argument, first, last ) {\r
-\r
-                       if ( type === "nth" ) {\r
-                               return function( elem ) {\r
-                                       var node, diff,\r
-                                               parent = elem.parentNode;\r
-\r
-                                       if ( first === 1 && last === 0 ) {\r
-                                               return true;\r
-                                       }\r
-\r
-                                       if ( parent ) {\r
-                                               diff = 0;\r
-                                               for ( node = parent.firstChild; node; node = node.nextSibling ) {\r
-                                                       if ( node.nodeType === 1 ) {\r
-                                                               diff++;\r
-                                                               if ( elem === node ) {\r
-                                                                       break;\r
-                                                               }\r
-                                                       }\r
-                                               }\r
-                                       }\r
-\r
-                                       // Incorporate the offset (or cast to NaN), then check against cycle size\r
-                                       diff -= last;\r
-                                       return diff === first || ( diff % first === 0 && diff / first >= 0 );\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 ) {\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
-                       // Remember that setFilters inherits from pseudos\r
-                       var args,\r
-                               fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||\r
-                                       Sizzle.error( "unsupported pseudo: " + pseudo );\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
-                               return fn( argument );\r
-                       }\r
-\r
-                       // But maintain support for old signatures\r
-                       if ( fn.length > 1 ) {\r
-                               args = [ pseudo, pseudo, "", argument ];\r
-                               return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?\r
-                                       markFunction(function( seed, matches ) {\r
-                                               var idx,\r
-                                                       matched = fn( seed, argument ),\r
-                                                       i = matched.length;\r
-                                               while ( i-- ) {\r
-                                                       idx = indexOf.call( seed, matched[i] );\r
-                                                       seed[ idx ] = !( matches[ idx ] = matched[i] );\r
-                                               }\r
-                                       }) :\r
-                                       function( elem ) {\r
-                                               return fn( elem, 0, args );\r
-                                       };\r
-                       }\r
-\r
-                       return fn;\r
-               }\r
-       },\r
-\r
-       pseudos: {\r
-               "not": markFunction(function( selector ) {\r
-                       // Trim the selector passed to compile\r
-                       // to avoid treating leading and trailing\r
-                       // spaces as combinators\r
-                       var input = [],\r
-                               results = [],\r
-                               matcher = compile( selector.replace( rtrim, "$1" ) );\r
-\r
-                       return matcher[ expando ] ?\r
-                               markFunction(function( seed, matches, context, xml ) {\r
-                                       var elem,\r
-                                               unmatched = matcher( seed, null, xml, [] ),\r
-                                               i = seed.length;\r
-\r
-                                       // Match elements unmatched by `matcher`\r
-                                       while ( i-- ) {\r
-                                               if ( (elem = unmatched[i]) ) {\r
-                                                       seed[i] = !(matches[i] = elem);\r
-                                               }\r
-                                       }\r
-                               }) :\r
-                               function( elem, context, xml ) {\r
-                                       input[0] = elem;\r
-                                       matcher( input, null, xml, results );\r
-                                       return !results.pop();\r
-                               };\r
-               }),\r
-\r
-               "has": markFunction(function( selector ) {\r
-                       return function( elem ) {\r
-                               return Sizzle( selector, elem ).length > 0;\r
-                       };\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
-               "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
-               "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 || ~elem.tabIndex);\r
-               },\r
-\r
-               "active": function( elem ) {\r
-                       return elem === elem.ownerDocument.activeElement;\r
-               },\r
-\r
-               // Positional types\r
-               "first": createPositionalPseudo(function() {\r
-                       return [ 0 ];\r
-               }),\r
-\r
-               "last": createPositionalPseudo(function( matchIndexes, length ) {\r
-                       return [ length - 1 ];\r
-               }),\r
-\r
-               "eq": createPositionalPseudo(function( matchIndexes, length, argument ) {\r
-                       return [ argument < 0 ? argument + length : argument ];\r
-               }),\r
-\r
-               "even": createPositionalPseudo(function( matchIndexes, length ) {\r
-                       for ( var i = 0; i < length; i += 2 ) {\r
-                               matchIndexes.push( i );\r
-                       }\r
-                       return matchIndexes;\r
-               }),\r
-\r
-               "odd": createPositionalPseudo(function( matchIndexes, length ) {\r
-                       for ( var i = 1; i < length; i += 2 ) {\r
-                               matchIndexes.push( i );\r
-                       }\r
-                       return matchIndexes;\r
-               }),\r
-\r
-               "lt": createPositionalPseudo(function( matchIndexes, length, argument ) {\r
-                       for ( var i = argument < 0 ? argument + length : argument; --i >= 0; ) {\r
-                               matchIndexes.push( i );\r
-                       }\r
-                       return matchIndexes;\r
-               }),\r
-\r
-               "gt": createPositionalPseudo(function( matchIndexes, length, argument ) {\r
-                       for ( var i = argument < 0 ? argument + length : argument; ++i < length; ) {\r
-                               matchIndexes.push( i );\r
-                       }\r
-                       return matchIndexes;\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
-               duplicates = [],\r
-               i = 1,\r
-               j = 0;\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
-                               j = duplicates.push( i );\r
-                       }\r
-               }\r
-               while ( j-- ) {\r
-                       results.splice( duplicates[ j ], 1 );\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, parseOnly ) {\r
-       var matched, match, tokens, type,\r
-               soFar, groups, preFilters,\r
-               cached = tokenCache[ expando ][ selector + " " ];\r
-\r
-       if ( cached ) {\r
-               return parseOnly ? 0 : cached.slice( 0 );\r
-       }\r
-\r
-       soFar = selector;\r
-       groups = [];\r
-       preFilters = Expr.preFilter;\r
-\r
-       while ( soFar ) {\r
-\r
-               // Comma and first run\r
-               if ( !matched || (match = rcomma.exec( soFar )) ) {\r
-                       if ( match ) {\r
-                               // Don't consume trailing commas as valid\r
-                               soFar = soFar.slice( match[0].length ) || soFar;\r
-                       }\r
-                       groups.push( tokens = [] );\r
-               }\r
-\r
-               matched = false;\r
-\r
-               // Combinators\r
-               if ( (match = rcombinators.exec( soFar )) ) {\r
-                       tokens.push( matched = new Token( match.shift() ) );\r
-                       soFar = soFar.slice( matched.length );\r
-\r
-                       // Cast descendant combinators to space\r
-                       matched.type = match[0].replace( rtrim, " " );\r
-               }\r
-\r
-               // Filters\r
-               for ( type in Expr.filter ) {\r
-                       if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||\r
-                               (match = preFilters[ type ]( match ))) ) {\r
-\r
-                               tokens.push( matched = new Token( match.shift() ) );\r
-                               soFar = soFar.slice( matched.length );\r
-                               matched.type = type;\r
-                               matched.matches = match;\r
-                       }\r
-               }\r
-\r
-               if ( !matched ) {\r
-                       break;\r
-               }\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
-                       tokenCache( selector, groups ).slice( 0 );\r
-}\r
-\r
-function addCombinator( matcher, combinator, base ) {\r
-       var dir = combinator.dir,\r
-               checkNonElements = base && combinator.dir === "parentNode",\r
-               doneName = done++;\r
-\r
-       return combinator.first ?\r
-               // Check against closest ancestor/preceding element\r
-               function( elem, context, xml ) {\r
-                       while ( (elem = elem[ dir ]) ) {\r
-                               if ( checkNonElements || elem.nodeType === 1  ) {\r
-                                       return matcher( elem, context, xml );\r
-                               }\r
-                       }\r
-               } :\r
-\r
-               // Check against all ancestor/preceding elements\r
-               function( elem, context, xml ) {\r
-                       // We can't set arbitrary data on XML nodes, so they don't benefit from dir caching\r
-                       if ( !xml ) {\r
-                               var cache,\r
-                                       dirkey = dirruns + " " + doneName + " ",\r
-                                       cachedkey = dirkey + cachedruns;\r
-                               while ( (elem = elem[ dir ]) ) {\r
-                                       if ( checkNonElements || 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, context, xml ) ) {\r
-                                                               elem.sizset = true;\r
-                                                               return elem;\r
-                                                       }\r
-                                                       elem.sizset = false;\r
-                                               }\r
-                                       }\r
-                               }\r
-                       } else {\r
-                               while ( (elem = elem[ dir ]) ) {\r
-                                       if ( checkNonElements || elem.nodeType === 1 ) {\r
-                                               if ( matcher( elem, context, xml ) ) {\r
-                                                       return elem;\r
-                                               }\r
-                                       }\r
-                               }\r
-                       }\r
-               };\r
-}\r
-\r
-function elementMatcher( matchers ) {\r
-       return matchers.length > 1 ?\r
-               function( elem, context, xml ) {\r
-                       var i = matchers.length;\r
-                       while ( i-- ) {\r
-                               if ( !matchers[i]( elem, context, xml ) ) {\r
-                                       return false;\r
-                               }\r
-                       }\r
-                       return true;\r
-               } :\r
-               matchers[0];\r
-}\r
-\r
-function condense( unmatched, map, filter, context, xml ) {\r
-       var elem,\r
-               newUnmatched = [],\r
-               i = 0,\r
-               len = unmatched.length,\r
-               mapped = map != null;\r
-\r
-       for ( ; i < len; i++ ) {\r
-               if ( (elem = unmatched[i]) ) {\r
-                       if ( !filter || filter( elem, context, xml ) ) {\r
-                               newUnmatched.push( elem );\r
-                               if ( mapped ) {\r
-                                       map.push( i );\r
-                               }\r
-                       }\r
-               }\r
-       }\r
-\r
-       return newUnmatched;\r
-}\r
-\r
-function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {\r
-       if ( postFilter && !postFilter[ expando ] ) {\r
-               postFilter = setMatcher( postFilter );\r
-       }\r
-       if ( postFinder && !postFinder[ expando ] ) {\r
-               postFinder = setMatcher( postFinder, postSelector );\r
-       }\r
-       return markFunction(function( seed, results, context, xml ) {\r
-               var temp, i, elem,\r
-                       preMap = [],\r
-                       postMap = [],\r
-                       preexisting = results.length,\r
-\r
-                       // Get initial elements from seed or context\r
-                       elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ),\r
-\r
-                       // Prefilter to get matcher input, preserving a map for seed-results synchronization\r
-                       matcherIn = preFilter && ( seed || !selector ) ?\r
-                               condense( elems, preMap, preFilter, context, xml ) :\r
-                               elems,\r
-\r
-                       matcherOut = matcher ?\r
-                               // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,\r
-                               postFinder || ( seed ? preFilter : preexisting || postFilter ) ?\r
-\r
-                                       // ...intermediate processing is necessary\r
-                                       [] :\r
-\r
-                                       // ...otherwise use results directly\r
-                                       results :\r
-                               matcherIn;\r
-\r
-               // Find primary matches\r
-               if ( matcher ) {\r
-                       matcher( matcherIn, matcherOut, context, xml );\r
-               }\r
-\r
-               // Apply postFilter\r
-               if ( postFilter ) {\r
-                       temp = condense( matcherOut, postMap );\r
-                       postFilter( temp, [], context, xml );\r
-\r
-                       // Un-match failing elements by moving them back to matcherIn\r
-                       i = temp.length;\r
-                       while ( i-- ) {\r
-                               if ( (elem = temp[i]) ) {\r
-                                       matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);\r
-                               }\r
-                       }\r
-               }\r
-\r
-               if ( seed ) {\r
-                       if ( postFinder || preFilter ) {\r
-                               if ( postFinder ) {\r
-                                       // Get the final matcherOut by condensing this intermediate into postFinder contexts\r
-                                       temp = [];\r
-                                       i = matcherOut.length;\r
-                                       while ( i-- ) {\r
-                                               if ( (elem = matcherOut[i]) ) {\r
-                                                       // Restore matcherIn since elem is not yet a final match\r
-                                                       temp.push( (matcherIn[i] = elem) );\r
-                                               }\r
-                                       }\r
-                                       postFinder( null, (matcherOut = []), temp, xml );\r
-                               }\r
-\r
-                               // Move matched elements from seed to results to keep them synchronized\r
-                               i = matcherOut.length;\r
-                               while ( i-- ) {\r
-                                       if ( (elem = matcherOut[i]) &&\r
-                                               (temp = postFinder ? indexOf.call( seed, elem ) : preMap[i]) > -1 ) {\r
-\r
-                                               seed[temp] = !(results[temp] = elem);\r
-                                       }\r
-                               }\r
-                       }\r
-\r
-               // Add elements to results, through postFinder if defined\r
-               } else {\r
-                       matcherOut = condense(\r
-                               matcherOut === results ?\r
-                                       matcherOut.splice( preexisting, matcherOut.length ) :\r
-                                       matcherOut\r
-                       );\r
-                       if ( postFinder ) {\r
-                               postFinder( null, results, matcherOut, xml );\r
-                       } else {\r
-                               push.apply( results, matcherOut );\r
-                       }\r
-               }\r
-       });\r
-}\r
-\r
-function matcherFromTokens( tokens ) {\r
-       var checkContext, matcher, j,\r
-               len = tokens.length,\r
-               leadingRelative = Expr.relative[ tokens[0].type ],\r
-               implicitRelative = leadingRelative || Expr.relative[" "],\r
-               i = leadingRelative ? 1 : 0,\r
-\r
-               // The foundational matcher ensures that elements are reachable from top-level context(s)\r
-               matchContext = addCombinator( function( elem ) {\r
-                       return elem === checkContext;\r
-               }, implicitRelative, true ),\r
-               matchAnyContext = addCombinator( function( elem ) {\r
-                       return indexOf.call( checkContext, elem ) > -1;\r
-               }, implicitRelative, true ),\r
-               matchers = [ function( elem, context, xml ) {\r
-                       return ( !leadingRelative && ( xml || context !== outermostContext ) ) || (\r
-                               (checkContext = context).nodeType ?\r
-                                       matchContext( elem, context, xml ) :\r
-                                       matchAnyContext( elem, context, xml ) );\r
-               } ];\r
-\r
-       for ( ; i < len; i++ ) {\r
-               if ( (matcher = Expr.relative[ tokens[i].type ]) ) {\r
-                       matchers = [ addCombinator( elementMatcher( matchers ), matcher ) ];\r
-               } else {\r
-                       matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );\r
-\r
-                       // Return special upon seeing a positional matcher\r
-                       if ( matcher[ expando ] ) {\r
-                               // Find the next relative operator (if any) for proper handling\r
-                               j = ++i;\r
-                               for ( ; j < len; j++ ) {\r
-                                       if ( Expr.relative[ tokens[j].type ] ) {\r
-                                               break;\r
-                                       }\r
-                               }\r
-                               return setMatcher(\r
-                                       i > 1 && elementMatcher( matchers ),\r
-                                       i > 1 && tokens.slice( 0, i - 1 ).join("").replace( rtrim, "$1" ),\r
-                                       matcher,\r
-                                       i < j && matcherFromTokens( tokens.slice( i, j ) ),\r
-                                       j < len && matcherFromTokens( (tokens = tokens.slice( j )) ),\r
-                                       j < len && tokens.join("")\r
-                               );\r
-                       }\r
-                       matchers.push( matcher );\r
-               }\r
-       }\r
-\r
-       return elementMatcher( matchers );\r
-}\r
-\r
-function matcherFromGroupMatchers( elementMatchers, setMatchers ) {\r
-       var bySet = setMatchers.length > 0,\r
-               byElement = elementMatchers.length > 0,\r
-               superMatcher = function( seed, context, xml, results, expandContext ) {\r
-                       var elem, j, matcher,\r
-                               setMatched = [],\r
-                               matchedCount = 0,\r
-                               i = "0",\r
-                               unmatched = seed && [],\r
-                               outermost = expandContext != null,\r
-                               contextBackup = outermostContext,\r
-                               // We must always have either seed elements or context\r
-                               elems = seed || byElement && Expr.find["TAG"]( "*", expandContext && context.parentNode || context ),\r
-                               // Nested matchers should use non-integer dirruns\r
-                               dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.E);\r
-\r
-                       if ( outermost ) {\r
-                               outermostContext = context !== document && context;\r
-                               cachedruns = superMatcher.el;\r
-                       }\r
-\r
-                       // Add elements passing elementMatchers directly to results\r
-                       for ( ; (elem = elems[i]) != null; i++ ) {\r
-                               if ( byElement && elem ) {\r
-                                       for ( j = 0; (matcher = elementMatchers[j]); j++ ) {\r
-                                               if ( matcher( elem, context, xml ) ) {\r
-                                                       results.push( elem );\r
-                                                       break;\r
-                                               }\r
-                                       }\r
-                                       if ( outermost ) {\r
-                                               dirruns = dirrunsUnique;\r
-                                               cachedruns = ++superMatcher.el;\r
-                                       }\r
-                               }\r
-\r
-                               // Track unmatched elements for set filters\r
-                               if ( bySet ) {\r
-                                       // They will have gone through all possible matchers\r
-                                       if ( (elem = !matcher && elem) ) {\r
-                                               matchedCount--;\r
-                                       }\r
-\r
-                                       // Lengthen the array for every element, matched or not\r
-                                       if ( seed ) {\r
-                                               unmatched.push( elem );\r
-                                       }\r
-                               }\r
-                       }\r
-\r
-                       // Apply set filters to unmatched elements\r
-                       matchedCount += i;\r
-                       if ( bySet && i !== matchedCount ) {\r
-                               for ( j = 0; (matcher = setMatchers[j]); j++ ) {\r
-                                       matcher( unmatched, setMatched, context, xml );\r
-                               }\r
-\r
-                               if ( seed ) {\r
-                                       // Reintegrate element matches to eliminate the need for sorting\r
-                                       if ( matchedCount > 0 ) {\r
-                                               while ( i-- ) {\r
-                                                       if ( !(unmatched[i] || setMatched[i]) ) {\r
-                                                               setMatched[i] = pop.call( results );\r
-                                                       }\r
-                                               }\r
-                                       }\r
-\r
-                                       // Discard index placeholder values to get only actual matches\r
-                                       setMatched = condense( setMatched );\r
-                               }\r
-\r
-                               // Add matches to results\r
-                               push.apply( results, setMatched );\r
-\r
-                               // Seedless set matches succeeding multiple successful matchers stipulate sorting\r
-                               if ( outermost && !seed && setMatched.length > 0 &&\r
-                                       ( matchedCount + setMatchers.length ) > 1 ) {\r
-\r
-                                       Sizzle.uniqueSort( results );\r
-                               }\r
-                       }\r
-\r
-                       // Override manipulation of globals by nested matchers\r
-                       if ( outermost ) {\r
-                               dirruns = dirrunsUnique;\r
-                               outermostContext = contextBackup;\r
-                       }\r
-\r
-                       return unmatched;\r
-               };\r
-\r
-       superMatcher.el = 0;\r
-       return bySet ?\r
-               markFunction( superMatcher ) :\r
-               superMatcher;\r
-}\r
-\r
-compile = Sizzle.compile = function( selector, group /* Internal Use Only */ ) {\r
-       var i,\r
-               setMatchers = [],\r
-               elementMatchers = [],\r
-               cached = compilerCache[ expando ][ selector + " " ];\r
-\r
-       if ( !cached ) {\r
-               // Generate a function of recursive functions that can be used to check each element\r
-               if ( !group ) {\r
-                       group = tokenize( selector );\r
-               }\r
-               i = group.length;\r
-               while ( i-- ) {\r
-                       cached = matcherFromTokens( group[i] );\r
-                       if ( cached[ expando ] ) {\r
-                               setMatchers.push( cached );\r
-                       } else {\r
-                               elementMatchers.push( cached );\r
-                       }\r
-               }\r
-\r
-               // Cache the compiled function\r
-               cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );\r
-       }\r
-       return cached;\r
-};\r
-\r
-function multipleContexts( selector, contexts, results ) {\r
-       var i = 0,\r
-               len = contexts.length;\r
-       for ( ; i < len; i++ ) {\r
-               Sizzle( selector, contexts[i], results );\r
-       }\r
-       return results;\r
-}\r
-\r
-function select( selector, context, results, seed, xml ) {\r
-       var i, tokens, token, type, find,\r
-               match = tokenize( selector ),\r
-               j = match.length;\r
-\r
-       if ( !seed ) {\r
-               // Try to minimize operations if there is only one group\r
-               if ( match.length === 1 ) {\r
-\r
-                       // Take a shortcut and set the context if the root selector is an ID\r
-                       tokens = match[0] = match[0].slice( 0 );\r
-                       if ( tokens.length > 2 && (token = tokens[0]).type === "ID" &&\r
-                                       context.nodeType === 9 && !xml &&\r
-                                       Expr.relative[ tokens[1].type ] ) {\r
-\r
-                               context = Expr.find["ID"]( token.matches[0].replace( rbackslash, "" ), context, xml )[0];\r
-                               if ( !context ) {\r
-                                       return results;\r
-                               }\r
-\r
-                               selector = selector.slice( tokens.shift().length );\r
-                       }\r
-\r
-                       // Fetch a seed set for right-to-left matching\r
-                       for ( i = matchExpr["POS"].test( selector ) ? -1 : tokens.length - 1; i >= 0; i-- ) {\r
-                               token = tokens[i];\r
-\r
-                               // Abort if we hit a combinator\r
-                               if ( Expr.relative[ (type = token.type) ] ) {\r
-                                       break;\r
-                               }\r
-                               if ( (find = Expr.find[ type ]) ) {\r
-                                       // Search, expanding context for leading sibling combinators\r
-                                       if ( (seed = find(\r
-                                               token.matches[0].replace( rbackslash, "" ),\r
-                                               rsibling.test( tokens[0].type ) && context.parentNode || context,\r
-                                               xml\r
-                                       )) ) {\r
-\r
-                                               // If seed is empty or no tokens remain, we can return early\r
-                                               tokens.splice( i, 1 );\r
-                                               selector = seed.length && tokens.join("");\r
-                                               if ( !selector ) {\r
-                                                       push.apply( results, slice.call( seed, 0 ) );\r
-                                                       return results;\r
-                                               }\r
-\r
-                                               break;\r
-                                       }\r
-                               }\r
-                       }\r
-               }\r
-       }\r
-\r
-       // Compile and execute a filtering function\r
-       // Provide `match` to avoid retokenization if we modified the selector above\r
-       compile( selector, match )(\r
-               seed,\r
-               context,\r
-               xml,\r
-               results,\r
-               rsibling.test( selector )\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
-\r
-                       // qSa(:focus) reports false when true (Chrome 21), no need to also add to buggyMatches since matches checks buggyQSA\r
-                       // A support test would require too much code (would include document ready)\r
-                       rbuggyQSA = [ ":focus" ],\r
-\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 always contains :focus, so no need for a length check\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.test( selector ) ) {\r
-                               var groups, i,\r
-                                       old = true,\r
-                                       nid = expando,\r
-                                       newContext = context,\r
-                                       newSelector = context.nodeType === 9 && selector;\r
-\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
-                               if ( context.nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) {\r
-                                       groups = tokenize( selector );\r
-\r
-                                       if ( (old = context.getAttribute("id")) ) {\r
-                                               nid = old.replace( rescape, "\\$&" );\r
-                                       } else {\r
-                                               context.setAttribute( "id", nid );\r
-                                       }\r
-                                       nid = "[id='" + nid + "'] ";\r
-\r
-                                       i = groups.length;\r
-                                       while ( i-- ) {\r
-                                               groups[i] = nid + groups[i].join("");\r
-                                       }\r
-                                       newContext = rsibling.test( selector ) && context.parentNode || context;\r
-                                       newSelector = groups.join(",");\r
-                               }\r
-\r
-                               if ( newSelector ) {\r
-                                       try {\r
-                                               push.apply( results, slice.call( newContext.querySelectorAll(\r
-                                                       newSelector\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( "!=", pseudos );\r
-                               } catch ( e ) {}\r
-                       });\r
-\r
-                       // rbuggyMatches always contains :active and :focus, 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.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.pseudos["nth"] = Expr.pseudos["eq"];\r
-\r
-// Back-compat\r
-function setFilters() {}\r
-Expr.filters = setFilters.prototype = Expr.pseudos;\r
-Expr.setFilters = new setFilters();\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
-       };
+       ret = callback.apply( elem, args || [] );
 
-jQuery.fn.extend({
-       find: function( selector ) {
-               var i, l, length, n, r, ret,
-                       self = this;
+       // Revert the old values
+       for ( name in options ) {
+               elem.style[ name ] = old[ name ];
+       }
 
-               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;
-                                       }
-                               }
-                       });
-               }
+       return ret;
+};
 
-               ret = this.pushStack( "", "find", selector );
 
-               for ( i = 0, l = this.length; i < l; i++ ) {
-                       length = ret.length;
-                       jQuery.find( selector, this[i], ret );
+var
+               ralpha = /alpha\([^)]*\)/i,
+       ropacity = /opacity\s*=\s*([^)]*)/,
 
-                       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;
-                                               }
-                                       }
-                               }
-                       }
-               }
+       // 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]).+)/,
+       rnumsplit = new RegExp( "^(" + pnum + ")(.*)$", "i" ),
+       rrelNum = new RegExp( "^([+-])=(" + pnum + ")", "i" ),
 
-               return ret;
+       cssShow = { position: "absolute", visibility: "hidden", display: "block" },
+       cssNormalTransform = {
+               letterSpacing: "0",
+               fontWeight: "400"
        },
 
-       has: function( target ) {
-               var i,
-                       targets = jQuery( target, this ),
-                       len = targets.length;
+       cssPrefixes = [ "Webkit", "O", "Moz", "ms" ];
 
-               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);
-       },
+// return a css property mapped to a potentially vendor prefixed property
+function vendorPropName( style, name ) {
 
-       filter: function( selector ) {
-               return this.pushStack( winnow(this, selector, true), "filter", selector );
-       },
+       // shortcut for names that are not vendor prefixed
+       if ( name in style ) {
+               return name;
+       }
 
-       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 );
-       },
+       // check for vendor prefixed names
+       var capName = name.charAt(0).toUpperCase() + name.slice(1),
+               origName = name,
+               i = cssPrefixes.length;
 
-       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;
+       while ( i-- ) {
+               name = cssPrefixes[ i ] + capName;
+               if ( name in style ) {
+                       return name;
+               }
+       }
 
-               for ( ; i < l; i++ ) {
-                       cur = this[i];
+       return origName;
+}
 
-                       while ( cur && cur.ownerDocument && cur !== context && cur.nodeType !== 11 ) {
-                               if ( pos ? pos.index(cur) > -1 : jQuery.find.matchesSelector(cur, selectors) ) {
-                                       ret.push( cur );
-                                       break;
-                               }
-                               cur = cur.parentNode;
-                       }
-               }
+function showHide( elements, show ) {
+       var display, elem, hidden,
+               values = [],
+               index = 0,
+               length = elements.length;
 
-               ret = ret.length > 1 ? jQuery.unique( ret ) : ret;
+       for ( ; index < length; index++ ) {
+               elem = elements[ index ];
+               if ( !elem.style ) {
+                       continue;
+               }
 
-               return this.pushStack( ret, "closest", selectors );
-       },
+               values[ index ] = jQuery._data( elem, "olddisplay" );
+               display = elem.style.display;
+               if ( show ) {
+                       // Reset the inline display of this element to learn if it is
+                       // being hidden by cascaded rules or not
+                       if ( !values[ index ] && display === "none" ) {
+                               elem.style.display = "";
+                       }
 
-       // Determine the position of an element within
-       // the matched set of elements
-       index: function( elem ) {
+                       // 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", defaultDisplay(elem.nodeName) );
+                       }
+               } else {
+                       hidden = isHidden( elem );
 
-               // No argument, return index in parent
-               if ( !elem ) {
-                       return ( this[0] && this[0].parentNode ) ? this.prevAll().length : -1;
+                       if ( display && display !== "none" || !hidden ) {
+                               jQuery._data( elem, "olddisplay", hidden ? display : jQuery.css( elem, "display" ) );
+                       }
                }
+       }
 
-               // index in selector
-               if ( typeof elem === "string" ) {
-                       return jQuery.inArray( this[0], jQuery( elem ) );
+       // 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";
                }
+       }
 
-               // 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 );
-       },
+       return elements;
+}
 
-       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 );
+function setPositiveNumber( elem, value, subtract ) {
+       var matches = rnumsplit.exec( value );
+       return matches ?
+               // Guard against undefined "subtract", e.g., when used as in cssHooks
+               Math.max( 0, matches[ 1 ] - ( subtract || 0 ) ) + ( matches[ 2 ] || "px" ) :
+               value;
+}
 
-               return this.pushStack( isDisconnected( set[0] ) || isDisconnected( all[0] ) ?
-                       all :
-                       jQuery.unique( all ) );
-       },
+function augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) {
+       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,
 
-       addBack: function( selector ) {
-               return this.add( selector == null ?
-                       this.prevObject : this.prevObject.filter(selector)
-               );
-       }
-});
+               val = 0;
 
-jQuery.fn.andSelf = jQuery.fn.addBack;
+       for ( ; i < 4; i += 2 ) {
+               // both box models exclude margin, so add it if we want it
+               if ( extra === "margin" ) {
+                       val += jQuery.css( elem, extra + cssExpand[ i ], true, styles );
+               }
 
-// 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;
-}
+               if ( isBorderBox ) {
+                       // border-box includes padding, so remove it if we want content
+                       if ( extra === "content" ) {
+                               val -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
+                       }
 
-function sibling( cur, dir ) {
-       do {
-               cur = cur[ dir ];
-       } while ( cur && cur.nodeType !== 1 );
+                       // at this point, extra isn't border nor margin, so remove border
+                       if ( extra !== "margin" ) {
+                               val -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
+                       }
+               } else {
+                       // at this point, extra isn't content, so add padding
+                       val += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
 
-       return cur;
+                       // at this point, extra isn't content nor padding, so add border
+                       if ( extra !== "padding" ) {
+                               val += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
+                       }
+               }
+       }
+
+       return val;
 }
 
-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 );
+function getWidthOrHeight( elem, name, extra ) {
 
-               if ( !runtil.test( name ) ) {
-                       selector = until;
+       // Start with offset property, which is equivalent to the border-box value
+       var valueIsBorderBox = true,
+               val = name === "width" ? elem.offsetWidth : elem.offsetHeight,
+               styles = getStyles( elem ),
+               isBorderBox = support.boxSizing && jQuery.css( elem, "boxSizing", false, styles ) === "border-box";
+
+       // 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, styles );
+               if ( val < 0 || val == null ) {
+                       val = elem.style[ name ];
                }
 
-               if ( selector && typeof selector === "string" ) {
-                       ret = jQuery.filter( selector, ret );
+               // Computed unit is not pixels. Stop here and return.
+               if ( rnumnonpx.test(val) ) {
+                       return val;
                }
 
-               ret = this.length > 1 && !guaranteedUnique[ name ] ? jQuery.unique( ret ) : ret;
+               // 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 && ( support.boxSizingReliable() || val === elem.style[ name ] );
 
-               if ( this.length > 1 && rparentsprev.test( name ) ) {
-                       ret = ret.reverse();
-               }
+               // Normalize "", auto, and prepare for extra
+               val = parseFloat( val ) || 0;
+       }
 
-               return this.pushStack( ret, name, core_slice.call( arguments ).join(",") );
-       };
-});
+       // use the active box-sizing model to add/subtract irrelevant styles
+       return ( val +
+               augmentWidthOrHeight(
+                       elem,
+                       name,
+                       extra || ( isBorderBox ? "border" : "content" ),
+                       valueIsBorderBox,
+                       styles
+               )
+       ) + "px";
+}
 
 jQuery.extend({
-       filter: function( expr, elems, not ) {
-               if ( not ) {
-                       expr = ":not(" + expr + ")";
+       // 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;
+                               }
+                       }
                }
+       },
 
-               return elems.length === 1 ?
-                       jQuery.find.matchesSelector(elems[0], expr) ? [ elems[0] ] : [] :
-                       jQuery.find.matches(expr, elems);
+       // Don't automatically add "px" to these possibly-unitless properties
+       cssNumber: {
+               "columnCount": true,
+               "fillOpacity": true,
+               "flexGrow": true,
+               "flexShrink": true,
+               "fontWeight": true,
+               "lineHeight": true,
+               "opacity": true,
+               "order": true,
+               "orphans": true,
+               "widows": true,
+               "zIndex": true,
+               "zoom": true
        },
 
-       dir: function( elem, dir, until ) {
-               var matched = [],
-                       cur = elem[ dir ];
+       // Add in properties whose names you wish to fix before
+       // setting or getting the value
+       cssProps: {
+               // normalize float css property
+               "float": support.cssFloat ? "cssFloat" : "styleFloat"
+       },
 
-               while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) {
-                       if ( cur.nodeType === 1 ) {
-                               matched.push( cur );
-                       }
-                       cur = cur[dir];
+       // 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;
                }
-               return matched;
-       },
 
-       sibling: function( n, elem ) {
-               var r = [];
+               // Make sure that we're working with the right name
+               var ret, type, hooks,
+                       origName = jQuery.camelCase( name ),
+                       style = elem.style;
 
-               for ( ; n; n = n.nextSibling ) {
-                       if ( n.nodeType === 1 && n !== elem ) {
-                               r.push( n );
+               name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( style, origName ) );
+
+               // gets hook for the prefixed version
+               // followed by the unprefixed version
+               hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
+
+               // Check if we're setting a value
+               if ( value !== undefined ) {
+                       type = typeof value;
+
+                       // 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";
+                       }
+
+                       // Make sure that null and NaN values aren't set. See: #7116
+                       if ( value == null || value !== value ) {
+                               return;
+                       }
+
+                       // If a number was passed in, add 'px' to the (except for certain CSS properties)
+                       if ( type === "number" && !jQuery.cssNumber[ origName ] ) {
+                               value += "px";
                        }
+
+                       // Fixes #8908, it can be done more correctly by specifing setters in cssHooks,
+                       // but it would mean to define eight (for every problematic property) identical functions
+                       if ( !support.clearCloneStyle && value === "" && name.indexOf("background") === 0 ) {
+                               style[ name ] = "inherit";
+                       }
+
+                       // 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 ) {
+
+                               // Support: IE
+                               // Swallow errors from 'invalid' CSS values (#5509)
+                               try {
+                                       style[ name ] = value;
+                               } catch(e) {}
+                       }
+
+               } 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;
+                       }
+
+                       // Otherwise just get the value from the style object
+                       return style[ name ];
                }
+       },
 
-               return r;
-       }
-});
+       css: function( elem, name, extra, styles ) {
+               var num, val, hooks,
+                       origName = jQuery.camelCase( name );
 
-// Implement the identical functionality for filter and not
-function winnow( elements, qualifier, keep ) {
+               // Make sure that we're working with the right name
+               name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( elem.style, origName ) );
 
-       // Can't pass null or undefined to indexOf in Firefox 4
-       // Set to 0 to skip string check
-       qualifier = qualifier || 0;
+               // gets hook for the prefixed version
+               // followed by the unprefixed version
+               hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
 
-       if ( jQuery.isFunction( qualifier ) ) {
-               return jQuery.grep(elements, function( elem, i ) {
-                       var retVal = !!qualifier.call( elem, i, elem );
-                       return retVal === keep;
-               });
+               // If a hook was provided get the computed value from there
+               if ( hooks && "get" in hooks ) {
+                       val = hooks.get( elem, true, extra );
+               }
 
-       } else if ( qualifier.nodeType ) {
-               return jQuery.grep(elements, function( elem, i ) {
-                       return ( elem === qualifier ) === keep;
-               });
+               // Otherwise, if a way to get the computed value exists, use that
+               if ( val === undefined ) {
+                       val = curCSS( elem, name, styles );
+               }
 
-       } else if ( typeof qualifier === "string" ) {
-               var filtered = jQuery.grep(elements, function( elem ) {
-                       return elem.nodeType === 1;
-               });
+               //convert "normal" to computed value
+               if ( val === "normal" && name in cssNormalTransform ) {
+                       val = cssNormalTransform[ name ];
+               }
 
-               if ( isSimple.test( qualifier ) ) {
-                       return jQuery.filter(qualifier, filtered, !keep);
-               } else {
-                       qualifier = jQuery.filter( qualifier, filtered );
+               // Return, converting to number if forced or a qualifier was provided and val looks numeric
+               if ( extra === "" || extra ) {
+                       num = parseFloat( val );
+                       return extra === true || jQuery.isNumeric( num ) ? num || 0 : val;
                }
+               return val;
        }
+});
 
-       return jQuery.grep(elements, function( elem, i ) {
-               return ( jQuery.inArray( elem, qualifier ) >= 0 ) === keep;
-       });
-}
-function createSafeFragment( document ) {
-       var list = nodeNames.split( "|" ),
-       safeFrag = document.createDocumentFragment();
+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
+                               return rdisplayswap.test( jQuery.css( elem, "display" ) ) && elem.offsetWidth === 0 ?
+                                       jQuery.swap( elem, cssShow, function() {
+                                               return getWidthOrHeight( elem, name, extra );
+                                       }) :
+                                       getWidthOrHeight( elem, name, extra );
+                       }
+               },
 
-       if ( safeFrag.createElement ) {
-               while ( list.length ) {
-                       safeFrag.createElement(
-                               list.pop()
+               set: function( elem, value, extra ) {
+                       var styles = extra && getStyles( elem );
+                       return setPositiveNumber( elem, value, extra ?
+                               augmentWidthOrHeight(
+                                       elem,
+                                       name,
+                                       extra,
+                                       support.boxSizing && jQuery.css( elem, "boxSizing", false, styles ) === "border-box",
+                                       styles
+                               ) : 0
                        );
                }
-       }
-       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") );
+if ( !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" : "";
+               },
 
-wrapMap.optgroup = wrapMap.option;
-wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
-wrapMap.th = wrapMap.td;
+               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;
+
+                       // if setting opacity to 1, and no other filters exist - attempt to remove filter attribute #6652
+                       // if value === "", then remove inline opacity #12685
+                       if ( ( value >= 1 || value === "" ) &&
+                                       jQuery.trim( filter.replace( ralpha, "" ) ) === "" &&
+                                       style.removeAttribute ) {
+
+                               // 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 is no filter style applied in a css rule or unset inline opacity, we are done
+                               if ( value === "" || currentStyle && !currentStyle.filter ) {
+                                       return;
+                               }
+                       }
 
-// 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>" ];
+                       // otherwise, set new filter values
+                       style.filter = ralpha.test( filter ) ?
+                               filter.replace( ralpha, opacity ) :
+                               filter + " " + opacity;
+               }
+       };
 }
 
-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 );
-       },
+jQuery.cssHooks.marginRight = addGetHookIf( support.reliableMarginRight,
+       function( elem, computed ) {
+               if ( 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" },
+                               curCSS, [ elem, "marginRight" ] );
+               }
+       }
+);
+
+// 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 = 0,
+                               expanded = {},
 
-       wrapAll: function( html ) {
-               if ( jQuery.isFunction( html ) ) {
-                       return this.each(function(i) {
-                               jQuery(this).wrapAll( html.call(this, i) );
-                       });
+                               // assumes a single number if not a string
+                               parts = typeof value === "string" ? value.split(" ") : [ value ];
+
+                       for ( ; i < 4; i++ ) {
+                               expanded[ prefix + cssExpand[ i ] + suffix ] =
+                                       parts[ i ] || parts[ i - 2 ] || parts[ 0 ];
+                       }
+
+                       return expanded;
                }
+       };
 
-               if ( this[0] ) {
-                       // The elements to wrap the target around
-                       var wrap = jQuery( html, this[0].ownerDocument ).eq(0).clone(true);
+       if ( !rmargin.test( prefix ) ) {
+               jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;
+       }
+});
 
-                       if ( this[0].parentNode ) {
-                               wrap.insertBefore( this[0] );
-                       }
+jQuery.fn.extend({
+       css: function( name, value ) {
+               return access( this, function( elem, name, value ) {
+                       var styles, len,
+                               map = {},
+                               i = 0;
 
-                       wrap.map(function() {
-                               var elem = this;
+                       if ( jQuery.isArray( name ) ) {
+                               styles = getStyles( elem );
+                               len = name.length;
 
-                               while ( elem.firstChild && elem.firstChild.nodeType === 1 ) {
-                                       elem = elem.firstChild;
+                               for ( ; i < len; i++ ) {
+                                       map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );
                                }
 
-                               return elem;
-                       }).append( this );
-               }
+                               return map;
+                       }
 
-               return this;
+                       return value !== undefined ?
+                               jQuery.style( elem, name, value ) :
+                               jQuery.css( elem, name );
+               }, name, value, arguments.length > 1 );
        },
-
-       wrapInner: function( html ) {
-               if ( jQuery.isFunction( html ) ) {
-                       return this.each(function(i) {
-                               jQuery(this).wrapInner( html.call(this, i) );
-                       });
+       show: function() {
+               return showHide( this, true );
+       },
+       hide: function() {
+               return showHide( this );
+       },
+       toggle: function( state ) {
+               if ( typeof state === "boolean" ) {
+                       return state ? this.show() : this.hide();
                }
 
                return this.each(function() {
-                       var self = jQuery( this ),
-                               contents = self.contents();
-
-                       if ( contents.length ) {
-                               contents.wrapAll( html );
-
+                       if ( isHidden( this ) ) {
+                               jQuery( this ).show();
                        } else {
-                               self.append( html );
+                               jQuery( this ).hide();
                        }
                });
-       },
-
-       wrap: function( html ) {
-               var isFunction = jQuery.isFunction( html );
+       }
+});
 
-               return this.each(function(i) {
-                       jQuery( this ).wrapAll( isFunction ? html.call(this, i) : html );
-               });
-       },
 
-       unwrap: function() {
-               return this.parent().each(function() {
-                       if ( !jQuery.nodeName( this, "body" ) ) {
-                               jQuery( this ).replaceWith( this.childNodes );
-                       }
-               }).end();
-       },
+function Tween( elem, options, prop, end, easing ) {
+       return new Tween.prototype.init( elem, options, prop, end, easing );
+}
+jQuery.Tween = Tween;
 
-       append: function() {
-               return this.domManip(arguments, true, function( elem ) {
-                       if ( this.nodeType === 1 || this.nodeType === 11 ) {
-                               this.appendChild( elem );
-                       }
-               });
+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 ];
 
-       prepend: function() {
-               return this.domManip(arguments, true, function( elem ) {
-                       if ( this.nodeType === 1 || this.nodeType === 11 ) {
-                               this.insertBefore( elem, this.firstChild );
-                       }
-               });
+               return hooks && hooks.get ?
+                       hooks.get( this ) :
+                       Tween.propHooks._default.get( this );
        },
+       run: function( percent ) {
+               var eased,
+                       hooks = Tween.propHooks[ this.prop ];
 
-       before: function() {
-               if ( !isDisconnected( this[0] ) ) {
-                       return this.domManip(arguments, false, function( elem ) {
-                               this.parentNode.insertBefore( elem, this );
-                       });
+               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 ( arguments.length ) {
-                       var set = jQuery.clean( arguments );
-                       return this.pushStack( jQuery.merge( set, this ), "before", this.selector );
+               if ( this.options.step ) {
+                       this.options.step.call( this.elem, this.now, this );
                }
-       },
 
-       after: function() {
-               if ( !isDisconnected( this[0] ) ) {
-                       return this.domManip(arguments, false, function( elem ) {
-                               this.parentNode.insertBefore( elem, this.nextSibling );
-                       });
+               if ( hooks && hooks.set ) {
+                       hooks.set( this );
+               } else {
+                       Tween.propHooks._default.set( this );
                }
+               return this;
+       }
+};
 
-               if ( arguments.length ) {
-                       var set = jQuery.clean( arguments );
-                       return this.pushStack( jQuery.merge( this, set ), "after", this.selector );
-               }
-       },
+Tween.prototype.init.prototype = Tween.prototype;
 
-       // keepData is for internal use only--do not document
-       remove: function( selector, keepData ) {
-               var elem,
-                       i = 0;
+Tween.propHooks = {
+       _default: {
+               get: function( tween ) {
+                       var result;
 
-               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 ] );
-                               }
+                       if ( tween.elem[ tween.prop ] != null &&
+                               (!tween.elem.style || tween.elem.style[ tween.prop ] == null) ) {
+                               return tween.elem[ tween.prop ];
+                       }
 
-                               if ( elem.parentNode ) {
-                                       elem.parentNode.removeChild( elem );
-                               }
+                       // passing an empty string as a 3rd 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, "" );
+                       // 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;
                        }
                }
+       }
+};
 
-               return this;
+// Support: IE <=9
+// 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.easing = {
+       linear: function( p ) {
+               return p;
        },
+       swing: function( p ) {
+               return 0.5 - Math.cos( p * Math.PI ) / 2;
+       }
+};
 
-       empty: function() {
-               var elem,
-                       i = 0;
+jQuery.fx = Tween.prototype.init;
 
-               for ( ; (elem = this[i]) != null; i++ ) {
-                       // Remove element nodes and prevent memory leaks
-                       if ( elem.nodeType === 1 ) {
-                               jQuery.cleanData( elem.getElementsByTagName("*") );
-                       }
+// Back Compat <1.8 extension point
+jQuery.fx.step = {};
 
-                       // Remove any remaining nodes
-                       while ( elem.firstChild ) {
-                               elem.removeChild( elem.firstChild );
-                       }
-               }
 
-               return this;
-       },
 
-       clone: function( dataAndEvents, deepDataAndEvents ) {
-               dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
-               deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
 
-               return this.map( function () {
-                       return jQuery.clone( this, dataAndEvents, deepDataAndEvents );
-               });
-       },
+var
+       fxNow, timerId,
+       rfxtypes = /^(?:toggle|show|hide)$/,
+       rfxnum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" ),
+       rrun = /queueHooks$/,
+       animationPrefilters = [ defaultPrefilter ],
+       tweeners = {
+               "*": [ function( prop, value ) {
+                       var tween = this.createTween( prop, value ),
+                               target = tween.cur(),
+                               parts = rfxnum.exec( value ),
+                               unit = parts && parts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ),
 
-       html: function( value ) {
-               return jQuery.access( this, function( value ) {
-                       var elem = this[0] || {},
-                               i = 0,
-                               l = this.length;
+                               // Starting value computation is required for potential unit mismatches
+                               start = ( jQuery.cssNumber[ prop ] || unit !== "px" && +target ) &&
+                                       rfxnum.exec( jQuery.css( tween.elem, prop ) ),
+                               scale = 1,
+                               maxIterations = 20;
 
-                       if ( value === undefined ) {
-                               return elem.nodeType === 1 ?
-                                       elem.innerHTML.replace( rinlinejQuery, "" ) :
-                                       undefined;
-                       }
+                       if ( start && start[ 3 ] !== unit ) {
+                               // Trust units reported by jQuery.css
+                               unit = unit || start[ 3 ];
 
-                       // 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() ] ) {
+                               // Make sure we update the tween properties later on
+                               parts = parts || [];
 
-                               value = value.replace( rxhtmlTag, "<$1></$2>" );
+                               // Iteratively approximate from a nonzero starting point
+                               start = +target || 1;
 
-                               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;
-                                               }
-                                       }
+                               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
+                                       scale = scale || ".5";
 
-                                       elem = 0;
+                                       // Adjust and apply
+                                       start = start / scale;
+                                       jQuery.style( tween.elem, prop, start + unit );
 
-                               // If using innerHTML throws an exception, use the fallback method
-                               } catch(e) {}
+                               // Update scale, tolerating zero or NaN from tween.cur()
+                               // And breaking the loop if scale is unchanged or perfect, or if we've just had enough
+                               } while ( scale !== (scale = tween.cur() / target) && scale !== 1 && --maxIterations );
                        }
 
-                       if ( elem ) {
-                               this.empty().append( value );
-                       }
-               }, null, value, arguments.length );
-       },
+                       // Update tween properties
+                       if ( parts ) {
+                               start = tween.start = +start || +target || 0;
+                               tween.unit = unit;
+                               // If a +=/-= token was provided, we're doing a relative animation
+                               tween.end = parts[ 1 ] ?
+                                       start + ( parts[ 1 ] + 1 ) * parts[ 2 ] :
+                                       +parts[ 2 ];
+                       }
+
+                       return tween;
+               } ]
+       };
+
+// Animations created synchronously will run synchronously
+function createFxNow() {
+       setTimeout(function() {
+               fxNow = undefined;
+       });
+       return ( fxNow = jQuery.now() );
+}
+
+// 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;
+       }
 
-       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 ) );
-                               });
-                       }
+       return attrs;
+}
 
-                       if ( typeof value !== "string" ) {
-                               value = jQuery( value ).detach();
-                       }
+function createTween( value, prop, animation ) {
+       var tween,
+               collection = ( tweeners[ prop ] || [] ).concat( tweeners[ "*" ] ),
+               index = 0,
+               length = collection.length;
+       for ( ; index < length; index++ ) {
+               if ( (tween = collection[ index ].call( animation, prop, value )) ) {
 
-                       return this.each(function() {
-                               var next = this.nextSibling,
-                                       parent = this.parentNode;
+                       // we're done with this property
+                       return tween;
+               }
+       }
+}
 
-                               jQuery( this ).remove();
+function defaultPrefilter( elem, props, opts ) {
+       /* jshint validthis: true */
+       var prop, value, toggle, tween, hooks, oldfire, display, checkDisplay,
+               anim = this,
+               orig = {},
+               style = elem.style,
+               hidden = elem.nodeType && isHidden( elem ),
+               dataShow = jQuery._data( elem, "fxshow" );
 
-                               if ( next ) {
-                                       jQuery(next).before( value );
-                               } else {
-                                       jQuery(parent).append( value );
+       // 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++;
 
-               return this.length ?
-                       this.pushStack( jQuery(jQuery.isFunction(value) ? value() : value), "replaceWith", value ) :
-                       this;
-       },
+               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();
+                               }
+                       });
+               });
+       }
 
-       detach: function( selector ) {
-               return this.remove( selector, true );
-       },
+       // 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 ];
 
-       domManip: function( args, table, callback ) {
+               // Set display property to inline-block for height/width
+               // animations on inline elements that are having width/height animated
+               display = jQuery.css( elem, "display" );
 
-               // Flatten any nested arrays
-               args = [].concat.apply( [], args );
+               // Test default display if display is currently "none"
+               checkDisplay = display === "none" ?
+                       jQuery._data( elem, "olddisplay" ) || defaultDisplay( elem.nodeName ) : display;
 
-               var results, first, fragment, iNoClone,
-                       i = 0,
-                       value = args[0],
-                       scripts = [],
-                       l = this.length;
+               if ( checkDisplay === "inline" && jQuery.css( elem, "float" ) === "none" ) {
 
-               // 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 );
-                       });
+                       // inline-level elements accept inline-block;
+                       // block-level elements need to be inline with layout
+                       if ( !support.inlineBlockNeedsLayout || defaultDisplay( elem.nodeName ) === "inline" ) {
+                               style.display = "inline-block";
+                       } else {
+                               style.zoom = 1;
+                       }
                }
+       }
 
-               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 ( opts.overflow ) {
+               style.overflow = "hidden";
+               if ( !support.shrinkWrapBlocks() ) {
+                       anim.always(function() {
+                               style.overflow = opts.overflow[ 0 ];
+                               style.overflowX = opts.overflow[ 1 ];
+                               style.overflowY = opts.overflow[ 2 ];
                        });
                }
+       }
 
-               if ( this[0] ) {
-                       results = jQuery.buildFragment( args, this, scripts );
-                       fragment = results.fragment;
-                       first = fragment.firstChild;
+       // show/hide pass
+       for ( prop in props ) {
+               value = props[ prop ];
+               if ( rfxtypes.exec( value ) ) {
+                       delete props[ prop ];
+                       toggle = toggle || value === "toggle";
+                       if ( value === ( hidden ? "hide" : "show" ) ) {
 
-                       if ( fragment.childNodes.length === 1 ) {
-                               fragment = first;
+                               // If there is dataShow left over from a stopped hide or show and we are going to proceed with show, we should pretend to be hidden
+                               if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) {
+                                       hidden = true;
+                               } else {
+                                       continue;
+                               }
                        }
+                       orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop );
 
-                       if ( first ) {
-                               table = table && jQuery.nodeName( first, "tr" );
+               // Any non-fx value stops us from restoring the original display value
+               } else {
+                       display = undefined;
+               }
+       }
 
-                               // 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 )
-                                       );
-                               }
+       if ( !jQuery.isEmptyObject( orig ) ) {
+               if ( dataShow ) {
+                       if ( "hidden" in dataShow ) {
+                               hidden = dataShow.hidden;
                        }
+               } else {
+                       dataShow = jQuery._data( elem, "fxshow", {} );
+               }
 
-                       // 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, "" ) );
-                                       }
+               // store state if its toggle - enables .stop().toggle() to "reverse"
+               if ( toggle ) {
+                       dataShow.hidden = !hidden;
+               }
+               if ( hidden ) {
+                       jQuery( elem ).show();
+               } else {
+                       anim.done(function() {
+                               jQuery( elem ).hide();
+                       });
+               }
+               anim.done(function() {
+                       var prop;
+                       jQuery._removeData( elem, "fxshow" );
+                       for ( prop in orig ) {
+                               jQuery.style( elem, prop, orig[ prop ] );
+                       }
+               });
+               for ( prop in orig ) {
+                       tween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim );
 
-                                       if ( elem.parentNode ) {
-                                               elem.parentNode.removeChild( elem );
-                                       }
-                               });
+                       if ( !( prop in dataShow ) ) {
+                               dataShow[ prop ] = tween.start;
+                               if ( hidden ) {
+                                       tween.end = tween.start;
+                                       tween.start = prop === "width" || prop === "height" ? 1 : 0;
+                               }
                        }
                }
 
-               return this;
+       // If this is a noop like .hide().hide(), restore an overwritten display value
+       } else if ( (display === "none" ? defaultDisplay( elem.nodeName ) : display) === "inline" ) {
+               style.display = display;
        }
-});
-
-function findOrAppend( elem, tag ) {
-       return elem.getElementsByTagName( tag )[0] || elem.appendChild( elem.ownerDocument.createElement( tag ) );
 }
 
-function cloneCopyEvent( src, dest ) {
+function propFilter( props, specialEasing ) {
+       var index, name, easing, value, hooks;
 
-       if ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) {
-               return;
-       }
+       // 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 ];
+               }
 
-       var type, i, l,
-               oldData = jQuery._data( src ),
-               curData = jQuery._data( dest, oldData ),
-               events = oldData.events;
+               if ( index !== name ) {
+                       props[ name ] = value;
+                       delete props[ index ];
+               }
 
-       if ( events ) {
-               delete curData.handle;
-               curData.events = {};
+               hooks = jQuery.cssHooks[ name ];
+               if ( hooks && "expand" in hooks ) {
+                       value = hooks.expand( value );
+                       delete props[ name ];
 
-               for ( type in events ) {
-                       for ( i = 0, l = events[ type ].length; i < l; i++ ) {
-                               jQuery.event.add( dest, type, events[ type ][ i ] );
+                       // 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;
+                               }
                        }
+               } else {
+                       specialEasing[ name ] = easing;
                }
        }
-
-       // make the cloned public data object a copy from the original
-       if ( curData.data ) {
-               curData.data = jQuery.extend( {}, curData.data );
-       }
 }
 
-function cloneFixAttributes( src, dest ) {
-       var nodeName;
+function Animation( elem, properties, options ) {
+       var result,
+               stopped,
+               index = 0,
+               length = animationPrefilters.length,
+               deferred = jQuery.Deferred().always( function() {
+                       // don't match elem in the :animated selector
+                       delete tick.elem;
+               }),
+               tick = function() {
+                       if ( stopped ) {
+                               return false;
+                       }
+                       var currentTime = fxNow || createFxNow(),
+                               remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),
+                               // archaic crash bug won't allow us to use 1 - ( 0.5 || 0 ) (#12497)
+                               temp = remaining / animation.duration || 0,
+                               percent = 1 - temp,
+                               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 ) {
+                               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;
+                               if ( stopped ) {
+                                       return this;
+                               }
+                               stopped = true;
+                               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 {
+                                       deferred.rejectWith( elem, [ animation, gotoEnd ] );
+                               }
+                               return this;
+                       }
+               }),
+               props = animation.props;
+
+       propFilter( props, animation.opts.specialEasing );
 
-       // We do not need to do anything for non-Elements
-       if ( dest.nodeType !== 1 ) {
-               return;
+       for ( ; index < length ; index++ ) {
+               result = animationPrefilters[ index ].call( animation, elem, props, animation.opts );
+               if ( result ) {
+                       return result;
+               }
        }
 
-       // clearAttributes removes the attributes, which we don't want,
-       // but also removes the attachEvent events, which we *do* want
-       if ( dest.clearAttributes ) {
-               dest.clearAttributes();
-       }
+       jQuery.map( props, createTween, animation );
 
-       // mergeAttributes, in contrast, only merges back on the
-       // original attributes, not the events
-       if ( dest.mergeAttributes ) {
-               dest.mergeAttributes( src );
+       if ( jQuery.isFunction( animation.opts.start ) ) {
+               animation.opts.start.call( elem, animation );
        }
 
-       nodeName = dest.nodeName.toLowerCase();
+       jQuery.fx.timer(
+               jQuery.extend( tick, {
+                       elem: elem,
+                       anim: animation,
+                       queue: animation.opts.queue
+               })
+       );
 
-       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;
-               }
+       // 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 );
+}
 
-               // 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;
+jQuery.Animation = jQuery.extend( Animation, {
+       tweener: function( props, callback ) {
+               if ( jQuery.isFunction( props ) ) {
+                       callback = props;
+                       props = [ "*" ];
+               } else {
+                       props = props.split(" ");
                }
 
-       } 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;
+               var prop,
+                       index = 0,
+                       length = props.length;
 
-               // 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;
+               for ( ; index < length ; index++ ) {
+                       prop = props[ index ];
+                       tweeners[ prop ] = tweeners[ prop ] || [];
+                       tweeners[ prop ].unshift( callback );
                }
+       },
 
-       // 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;
+       prefilter: function( callback, prepend ) {
+               if ( prepend ) {
+                       animationPrefilters.unshift( callback );
+               } else {
+                       animationPrefilters.push( callback );
+               }
        }
+});
 
-       // 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;
+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
+       };
 
-       // 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 )) ) {
+       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;
 
-               // Mark cacheable and look for a hit
-               cacheable = true;
-               fragment = jQuery.fragments[ first ];
-               cachehit = fragment !== undefined;
+       // normalize opt.queue - true/undefined/null -> "fx"
+       if ( opt.queue == null || opt.queue === true ) {
+               opt.queue = "fx";
        }
 
-       if ( !fragment ) {
-               fragment = context.createDocumentFragment();
-               jQuery.clean( args, context, fragment, scripts );
+       // Queueing
+       opt.old = opt.complete;
 
-               // Update the cache, but only store false
-               // unless this is a second parsing of the same content
-               if ( cacheable ) {
-                       jQuery.fragments[ first ] = cachehit && fragment;
+       opt.complete = function() {
+               if ( jQuery.isFunction( opt.old ) ) {
+                       opt.old.call( this );
                }
-       }
-
-       return { fragment: fragment, cacheable: cacheable };
-};
-
-jQuery.fragments = {};
-
-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;
-
-               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 );
-                       }
 
-                       return this.pushStack( ret, name, insert.selector );
+               if ( opt.queue ) {
+                       jQuery.dequeue( this, opt.queue );
                }
        };
-});
 
-function getAll( elem ) {
-       if ( typeof elem.getElementsByTagName !== "undefined" ) {
-               return elem.getElementsByTagName( "*" );
+       return opt;
+};
 
-       } else if ( typeof elem.querySelectorAll !== "undefined" ) {
-               return elem.querySelectorAll( "*" );
+jQuery.fn.extend({
+       fadeTo: function( speed, to, easing, callback ) {
 
-       } else {
-               return [];
-       }
-}
+               // show any hidden elements after setting opacity to 0
+               return this.filter( isHidden ).css( "opacity", 0 ).show()
 
-// Used in clean, fixes the defaultChecked property
-function fixDefaultChecked( elem ) {
-       if ( rcheckableType.test( elem.type ) ) {
-               elem.defaultChecked = elem.checked;
-       }
-}
+                       // 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 );
 
-jQuery.extend({
-       clone: function( elem, dataAndEvents, deepDataAndEvents ) {
-               var srcElements,
-                       destElements,
-                       i,
-                       clone;
+                               // Empty animations, or finishing resolves immediately
+                               if ( empty || jQuery._data( this, "finish" ) ) {
+                                       anim.stop( true );
+                               }
+                       };
+                       doAnimation.finish = doAnimation;
 
-               if ( jQuery.support.html5Clone || jQuery.isXMLDoc(elem) || !rnoshimcache.test( "<" + elem.nodeName + ">" ) ) {
-                       clone = elem.cloneNode( true );
+               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 );
+               };
 
-               // IE<=8 does not properly clone detached, unknown element nodes
-               } else {
-                       fragmentDiv.innerHTML = elem.outerHTML;
-                       fragmentDiv.removeChild( clone = fragmentDiv.firstChild );
+               if ( typeof type !== "string" ) {
+                       gotoEnd = clearQueue;
+                       clearQueue = type;
+                       type = undefined;
+               }
+               if ( clearQueue && type !== false ) {
+                       this.queue( type || "fx", [] );
                }
 
-               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.
-
-                       cloneFixAttributes( elem, clone );
+               return this.each(function() {
+                       var dequeue = true,
+                               index = type != null && type + "queueHooks",
+                               timers = jQuery.timers,
+                               data = jQuery._data( this );
 
-                       // Using Sizzle here is crazy slow, so we use getElementsByTagName instead
-                       srcElements = getAll( elem );
-                       destElements = getAll( clone );
+                       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 ] );
+                                       }
+                               }
+                       }
 
-                       // 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] );
+                       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 );
                                }
                        }
+
+                       // 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 );
+                       }
+               });
+       },
+       finish: function( type ) {
+               if ( type !== false ) {
+                       type = type || "fx";
                }
+               return this.each(function() {
+                       var index,
+                               data = jQuery._data( this ),
+                               queue = data[ type + "queue" ],
+                               hooks = data[ type + "queueHooks" ],
+                               timers = jQuery.timers,
+                               length = queue ? queue.length : 0;
 
-               // Copy the events from the original to the clone
-               if ( dataAndEvents ) {
-                       cloneCopyEvent( elem, clone );
+                       // enable finishing flag on private data
+                       data.finish = true;
 
-                       if ( deepDataAndEvents ) {
-                               srcElements = getAll( elem );
-                               destElements = getAll( clone );
+                       // empty the queue first
+                       jQuery.queue( this, type, [] );
+
+                       if ( hooks && hooks.stop ) {
+                               hooks.stop.call( this, true );
+                       }
 
-                               for ( i = 0; srcElements[i]; ++i ) {
-                                       cloneCopyEvent( srcElements[i], destElements[i] );
+                       // look for any active animations, and finish them
+                       for ( index = timers.length; index--; ) {
+                               if ( timers[ index ].elem === this && timers[ index ].queue === type ) {
+                                       timers[ index ].anim.stop( true );
+                                       timers.splice( index, 1 );
                                }
                        }
-               }
 
-               srcElements = destElements = null;
+                       // look for any animations in the old queue and finish them
+                       for ( index = 0; index < length; index++ ) {
+                               if ( queue[ index ] && queue[ index ].finish ) {
+                                       queue[ index ].finish.call( this );
+                               }
+                       }
 
-               // Return the cloned set
-               return clone;
-       },
+                       // turn off finishing flag
+                       delete data.finish;
+               });
+       }
+});
 
-       clean: function( elems, context, fragment, scripts ) {
-               var i, j, elem, tag, wrap, depth, div, hasBody, tbody, len, handleScript, jsTags,
-                       safe = context === document && safeFragment,
-                       ret = [];
+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" ?
+                       cssFn.apply( this, arguments ) :
+                       this.animate( genFx( name, true ), speed, easing, callback );
+       };
+});
+
+// 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.timers = [];
+jQuery.fx.tick = function() {
+       var timer,
+               timers = jQuery.timers,
+               i = 0;
+
+       fxNow = jQuery.now();
 
-               // Ensure that context is a document
-               if ( !context || typeof context.createDocumentFragment === "undefined" ) {
-                       context = document;
+       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 );
                }
+       }
 
-               // Use the already-created safe fragment if context permits
-               for ( i = 0; (elem = elems[i]) != null; i++ ) {
-                       if ( typeof elem === "number" ) {
-                               elem += "";
-                       }
-
-                       if ( !elem ) {
-                               continue;
-                       }
+       if ( !timers.length ) {
+               jQuery.fx.stop();
+       }
+       fxNow = undefined;
+};
 
-                       // 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 );
+jQuery.fx.timer = function( timer ) {
+       jQuery.timers.push( timer );
+       if ( timer() ) {
+               jQuery.fx.start();
+       } else {
+               jQuery.timers.pop();
+       }
+};
 
-                                       // Fix "XHTML"-style tags in all browsers
-                                       elem = elem.replace(rxhtmlTag, "<$1></$2>");
+jQuery.fx.interval = 13;
 
-                                       // 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];
+jQuery.fx.start = function() {
+       if ( !timerId ) {
+               timerId = setInterval( jQuery.fx.tick, jQuery.fx.interval );
+       }
+};
 
-                                       // Move to the right depth
-                                       while ( depth-- ) {
-                                               div = div.lastChild;
-                                       }
+jQuery.fx.stop = function() {
+       clearInterval( timerId );
+       timerId = null;
+};
 
-                                       // Remove IE's autoinserted <tbody> from table fragments
-                                       if ( !jQuery.support.tbody ) {
+jQuery.fx.speeds = {
+       slow: 600,
+       fast: 200,
+       // Default speed
+       _default: 400
+};
 
-                                               // String was a <table>, *may* have spurious <tbody>
-                                               hasBody = rtbody.test(elem);
-                                                       tbody = tag === "table" && !hasBody ?
-                                                               div.firstChild && div.firstChild.childNodes :
-
-                                                               // String was a bare <thead> or <tfoot>
-                                                               wrap[1] === "<table>" && !hasBody ?
-                                                                       div.childNodes :
-                                                                       [];
-
-                                               for ( j = tbody.length - 1; j >= 0 ; --j ) {
-                                                       if ( jQuery.nodeName( tbody[ j ], "tbody" ) && !tbody[ j ].childNodes.length ) {
-                                                               tbody[ j ].parentNode.removeChild( tbody[ j ] );
-                                                       }
-                                               }
-                                       }
 
-                                       // 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 );
-                                       }
+// Based off of the plugin by Clint Helfers, with permission.
+// http://blindsignals.com/index.php/2009/07/jquery-delay/
+jQuery.fn.delay = function( time, type ) {
+       time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;
+       type = type || "fx";
 
-                                       elem = div.childNodes;
+       return this.queue( type, function( next, hooks ) {
+               var timeout = setTimeout( next, time );
+               hooks.stop = function() {
+                       clearTimeout( timeout );
+               };
+       });
+};
 
-                                       // Take out of fragment container (we need a fresh div each time)
-                                       div.parentNode.removeChild( div );
-                               }
-                       }
 
-                       if ( elem.nodeType ) {
-                               ret.push( elem );
-                       } else {
-                               jQuery.merge( ret, elem );
-                       }
-               }
+(function() {
+       // Minified: var a,b,c,d,e
+       var input, div, select, a, opt;
 
-               // Fix #11356: Clear elements from safeFragment
-               if ( div ) {
-                       elem = div = safe = null;
-               }
+       // Setup
+       div = document.createElement( "div" );
+       div.setAttribute( "className", "t" );
+       div.innerHTML = "  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>";
+       a = div.getElementsByTagName("a")[ 0 ];
 
-               // 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 );
-                               }
-                       }
-               }
+       // First batch of tests.
+       select = document.createElement("select");
+       opt = select.appendChild( document.createElement("option") );
+       input = div.getElementsByTagName("input")[ 0 ];
 
-               // 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 );
-                               }
-                       };
+       a.style.cssText = "top:1px";
 
-                       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;
-                                       }
-                               }
-                       }
-               }
+       // Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7)
+       support.getSetAttribute = div.className !== "t";
 
-               return ret;
-       },
+       // Get the style information from getAttribute
+       // (IE uses .cssText instead)
+       support.style = /top/.test( a.getAttribute("style") );
 
-       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;
+       // Make sure that URLs aren't manipulated
+       // (IE normalizes it by default)
+       support.hrefNormalized = a.getAttribute("href") === "/a";
 
-               for ( ; (elem = elems[i]) != null; i++ ) {
+       // Check the default checkbox/radio value ("" on WebKit; "on" elsewhere)
+       support.checkOn = !!input.value;
 
-                       if ( acceptData || jQuery.acceptData( elem ) ) {
+       // 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)
+       support.optSelected = opt.selected;
 
-                               id = elem[ internalKey ];
-                               data = id && cache[ id ];
+       // Tests for enctype support on a form (#6743)
+       support.enctype = !!document.createElement("form").enctype;
 
-                               if ( data ) {
-                                       if ( data.events ) {
-                                               for ( type in data.events ) {
-                                                       if ( special[ type ] ) {
-                                                               jQuery.event.remove( elem, type );
+       // 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;
 
-                                                       // This is a shortcut to avoid jQuery.event.remove's overhead
-                                                       } else {
-                                                               jQuery.removeEvent( elem, type, data.handle );
-                                                       }
-                                               }
-                                       }
+       // Support: IE8 only
+       // Check if we can trust getAttribute("value")
+       input = document.createElement( "input" );
+       input.setAttribute( "value", "" );
+       support.input = input.getAttribute( "value" ) === "";
 
-                                       // Remove cache only if it was not already removed by jQuery.event.remove
-                                       if ( cache[ id ] ) {
+       // Check if an input maintains its value after becoming a radio
+       input.value = "t";
+       input.setAttribute( "type", "radio" );
+       support.radioValue = input.value === "t";
+})();
 
-                                               delete cache[ id ];
 
-                                               // 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 ];
+var rreturn = /\r/g;
 
-                                               } else if ( elem.removeAttribute ) {
-                                                       elem.removeAttribute( internalKey );
+jQuery.fn.extend({
+       val: function( value ) {
+               var hooks, ret, isFunction,
+                       elem = this[0];
 
-                                               } else {
-                                                       elem[ internalKey ] = null;
-                                               }
+               if ( !arguments.length ) {
+                       if ( elem ) {
+                               hooks = jQuery.valHooks[ elem.type ] || jQuery.valHooks[ elem.nodeName.toLowerCase() ];
 
-                                               jQuery.deletedIds.push( id );
-                                       }
+                               if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) {
+                                       return ret;
                                }
-                       }
-               }
-       }
-});
-// Limit scope pollution from any deprecated API
-(function() {
 
-var matched, browser;
+                               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;
+                       }
 
-// 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();
+                       return;
+               }
 
-       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 ) ||
-               [];
+               isFunction = jQuery.isFunction( value );
 
-       return {
-               browser: match[ 1 ] || "",
-               version: match[ 2 ] || "0"
-       };
-};
+               return this.each(function( i ) {
+                       var val;
 
-matched = jQuery.uaMatch( navigator.userAgent );
-browser = {};
+                       if ( this.nodeType !== 1 ) {
+                               return;
+                       }
 
-if ( matched.browser ) {
-       browser[ matched.browser ] = true;
-       browser.version = matched.version;
-}
+                       if ( isFunction ) {
+                               val = value.call( this, i, jQuery( this ).val() );
+                       } else {
+                               val = value;
+                       }
 
-// Chrome is Webkit, but Webkit is also Safari.
-if ( browser.chrome ) {
-       browser.webkit = true;
-} else if ( browser.webkit ) {
-       browser.safari = true;
-}
+                       // 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 + "";
+                               });
+                       }
 
-jQuery.browser = browser;
+                       hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];
 
-jQuery.sub = function() {
-       function jQuerySub( selector, context ) {
-               return new jQuerySub.fn.init( selector, context );
+                       // 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( 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;
-};
+jQuery.extend({
+       valHooks: {
+               option: {
+                       get: function( elem ) {
+                               var val = jQuery.find.attr( elem, "value" );
+                               return val != null ?
+                                       val :
+                                       // Support: IE10-11+
+                                       // option.text throws exceptions (#14686, #14858)
+                                       jQuery.trim( jQuery.text( elem ) );
+                       }
+               },
+               select: {
+                       get: function( elem ) {
+                               var value, option,
+                                       options = elem.options,
+                                       index = elem.selectedIndex,
+                                       one = elem.type === "select-one" || index < 0,
+                                       values = one ? null : [],
+                                       max = one ? index + 1 : options.length,
+                                       i = index < 0 ?
+                                               max :
+                                               one ? index : 0;
 
-})();
-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 = { BODY: "block" },
+                               // Loop through all the selected options
+                               for ( ; i < max; i++ ) {
+                                       option = options[ i ];
 
-       cssShow = { position: "absolute", visibility: "hidden", display: "block" },
-       cssNormalTransform = {
-               letterSpacing: 0,
-               fontWeight: 400
-       },
+                                       // oldIE doesn't update selected after form reset (#2551)
+                                       if ( ( option.selected || i === index ) &&
+                                                       // Don't return options that are disabled or in a disabled optgroup
+                                                       ( support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null ) &&
+                                                       ( !option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" ) ) ) {
 
-       cssExpand = [ "Top", "Right", "Bottom", "Left" ],
-       cssPrefixes = [ "Webkit", "O", "Moz", "ms" ],
+                                               // Get the specific value for the option
+                                               value = jQuery( option ).val();
 
-       eventsToggle = jQuery.fn.toggle;
+                                               // We don't need an array for one selects
+                                               if ( one ) {
+                                                       return value;
+                                               }
 
-// return a css property mapped to a potentially vendor prefixed property
-function vendorPropName( style, name ) {
+                                               // Multi-Selects return an array
+                                               values.push( value );
+                                       }
+                               }
 
-       // shortcut for names that are not vendor prefixed
-       if ( name in style ) {
-               return name;
-       }
+                               return values;
+                       },
 
-       // check for vendor prefixed names
-       var capName = name.charAt(0).toUpperCase() + name.slice(1),
-               origName = name,
-               i = cssPrefixes.length;
+                       set: function( elem, value ) {
+                               var optionSet, option,
+                                       options = elem.options,
+                                       values = jQuery.makeArray( value ),
+                                       i = options.length;
 
-       while ( i-- ) {
-               name = cssPrefixes[ i ] + capName;
-               if ( name in style ) {
-                       return name;
-               }
-       }
+                               while ( i-- ) {
+                                       option = options[ i ];
 
-       return origName;
-}
+                                       if ( jQuery.inArray( jQuery.valHooks.option.get( option ), values ) >= 0 ) {
 
-function isHidden( elem, el ) {
-       elem = el || elem;
-       return jQuery.css( elem, "display" ) === "none" || !jQuery.contains( elem.ownerDocument, elem );
-}
+                                               // Support: IE6
+                                               // When new option element is added to select box we need to
+                                               // force reflow of newly added node in order to workaround delay
+                                               // of initialization properties
+                                               try {
+                                                       option.selected = optionSet = true;
 
-function showHide( elements, show ) {
-       var elem, display,
-               values = [],
-               index = 0,
-               length = elements.length;
+                                               } catch ( _ ) {
 
-       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 = "";
-                       }
+                                                       // Will be executed only in IE6
+                                                       option.scrollHeight;
+                                               }
+
+                                       } else {
+                                               option.selected = false;
+                                       }
+                               }
 
-                       // 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" );
+                               // Force browsers to behave consistently when non-matching value is set
+                               if ( !optionSet ) {
+                                       elem.selectedIndex = -1;
+                               }
 
-                       if ( !values[ index ] && display !== "none" ) {
-                               jQuery._data( elem, "olddisplay", display );
+                               return options;
                        }
                }
        }
+});
 
-       // 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";
+// Radios and checkboxes getter/setter
+jQuery.each([ "radio", "checkbox" ], function() {
+       jQuery.valHooks[ this ] = {
+               set: function( elem, value ) {
+                       if ( jQuery.isArray( value ) ) {
+                               return ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 );
+                       }
                }
+       };
+       if ( !support.checkOn ) {
+               jQuery.valHooks[ this ].get = function( elem ) {
+                       // Support: Webkit
+                       // "" is returned instead of "on" if a value isn't specified
+                       return elem.getAttribute("value") === null ? "on" : elem.value;
+               };
        }
+});
 
-       return elements;
-}
+
+
+
+var nodeHook, boolHook,
+       attrHandle = jQuery.expr.attrHandle,
+       ruseDefault = /^(?:checked|selected)$/i,
+       getSetAttribute = support.getSetAttribute,
+       getSetInput = support.input;
 
 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 );
+       attr: function( name, value ) {
+               return access( this, jQuery.attr, name, value, arguments.length > 1 );
        },
-       toggle: function( state, fn2 ) {
-               var bool = typeof state === "boolean";
-
-               if ( jQuery.isFunction( state ) && jQuery.isFunction( fn2 ) ) {
-                       return eventsToggle.apply( this, arguments );
-               }
 
+       removeAttr: function( name ) {
                return this.each(function() {
-                       if ( bool ? state : isHidden( this ) ) {
-                               jQuery( this ).show();
-                       } else {
-                               jQuery( this ).hide();
-                       }
+                       jQuery.removeAttr( this, name );
                });
        }
 });
 
 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;
-
-                               }
-                       }
-               }
-       },
-
-       // 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"
-       },
+       attr: function( elem, name, value ) {
+               var hooks, ret,
+                       nType = elem.nodeType;
 
-       // 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 ) {
+               // don't get/set attributes on text, comment and attribute nodes
+               if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
                        return;
                }
 
-               // Make sure that we're working with the right name
-               var ret, type, hooks,
-                       origName = jQuery.camelCase( name ),
-                       style = elem.style;
-
-               name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( style, origName ) );
+               // Fallback to prop when attributes are not supported
+               if ( typeof elem.getAttribute === strundefined ) {
+                       return jQuery.prop( elem, name, value );
+               }
 
-               // gets hook for the prefixed version
-               // followed by the unprefixed version
-               hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
+               // All attributes are lowercase
+               // Grab necessary hook if one is defined
+               if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {
+                       name = name.toLowerCase();
+                       hooks = jQuery.attrHooks[ name ] ||
+                               ( jQuery.expr.match.bool.test( name ) ? boolHook : nodeHook );
+               }
 
-               // Check if we're setting a value
                if ( value !== undefined ) {
-                       type = typeof value;
 
-                       // 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";
-                       }
+                       if ( value === null ) {
+                               jQuery.removeAttr( elem, name );
 
-                       // Make sure that NaN and null values aren't set. See: #7116
-                       if ( value == null || type === "number" && isNaN( value ) ) {
-                               return;
-                       }
+                       } else if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) {
+                               return ret;
 
-                       // If a number was passed in, add 'px' to the (except for certain CSS properties)
-                       if ( type === "number" && !jQuery.cssNumber[ origName ] ) {
-                               value += "px";
+                       } else {
+                               elem.setAttribute( name, value + "" );
+                               return value;
                        }
 
-                       // 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) {}
-                       }
+               } else if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) {
+                       return ret;
 
                } 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;
-                       }
+                       ret = jQuery.find.attr( elem, name );
 
-                       // Otherwise just get the value from the style object
-                       return style[ name ];
+                       // Non-existent attributes return null, we normalize to undefined
+                       return ret == null ?
+                               undefined :
+                               ret;
                }
        },
 
-       css: function( elem, name, numeric, extra ) {
-               var val, num, hooks,
-                       origName = jQuery.camelCase( name );
+       removeAttr: function( elem, value ) {
+               var name, propName,
+                       i = 0,
+                       attrNames = value && value.match( rnotwhite );
 
-               // Make sure that we're working with the right name
-               name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( elem.style, origName ) );
+               if ( attrNames && elem.nodeType === 1 ) {
+                       while ( (name = attrNames[i++]) ) {
+                               propName = jQuery.propFix[ name ] || name;
 
-               // gets hook for the prefixed version
-               // followed by the unprefixed version
-               hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
+                               // Boolean attributes get special treatment (#10870)
+                               if ( jQuery.expr.match.bool.test( name ) ) {
+                                       // Set corresponding property to false
+                                       if ( getSetInput && getSetAttribute || !ruseDefault.test( name ) ) {
+                                               elem[ propName ] = false;
+                                       // Support: IE<9
+                                       // Also clear defaultChecked/defaultSelected (if appropriate)
+                                       } else {
+                                               elem[ jQuery.camelCase( "default-" + name ) ] =
+                                                       elem[ propName ] = false;
+                                       }
 
-               // If a hook was provided get the computed value from there
-               if ( hooks && "get" in hooks ) {
-                       val = hooks.get( elem, true, extra );
-               }
+                               // See #9699 for explanation of this approach (setting first, then removal)
+                               } else {
+                                       jQuery.attr( elem, name, "" );
+                               }
 
-               // Otherwise, if a way to get the computed value exists, use that
-               if ( val === undefined ) {
-                       val = curCSS( elem, name );
+                               elem.removeAttribute( getSetAttribute ? name : propName );
+                       }
                }
+       },
 
-               //convert "normal" to computed value
-               if ( val === "normal" && name in cssNormalTransform ) {
-                       val = cssNormalTransform[ name ];
+       attrHooks: {
+               type: {
+                       set: function( elem, value ) {
+                               if ( !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 default in case type is set after value during creation
+                                       var val = elem.value;
+                                       elem.setAttribute( "type", value );
+                                       if ( val ) {
+                                               elem.value = val;
+                                       }
+                                       return value;
+                               }
+                       }
                }
+       }
+});
 
-               // 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;
+// Hook for boolean attributes
+boolHook = {
+       set: function( elem, value, name ) {
+               if ( value === false ) {
+                       // Remove boolean attributes when set to false
+                       jQuery.removeAttr( elem, name );
+               } else if ( getSetInput && getSetAttribute || !ruseDefault.test( name ) ) {
+                       // IE<8 needs the *property* name
+                       elem.setAttribute( !getSetAttribute && jQuery.propFix[ name ] || name, name );
+
+               // Use defaultChecked and defaultSelected for oldIE
+               } else {
+                       elem[ jQuery.camelCase( "default-" + name ) ] = elem[ name ] = true;
                }
-               return val;
-       },
 
-       // A method for quickly swapping in/out CSS properties to get correct calculations
-       swap: function( elem, options, callback ) {
-               var ret, name,
-                       old = {};
+               return name;
+       }
+};
+
+// Retrieve booleans specially
+jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( i, name ) {
 
-               // Remember the old values, and insert the new ones
-               for ( name in options ) {
-                       old[ name ] = elem.style[ name ];
-                       elem.style[ name ] = options[ name ];
-               }
+       var getter = attrHandle[ name ] || jQuery.find.attr;
 
-               ret = callback.call( elem );
+       attrHandle[ name ] = getSetInput && getSetAttribute || !ruseDefault.test( name ) ?
+               function( elem, name, isXML ) {
+                       var ret, handle;
+                       if ( !isXML ) {
+                               // Avoid an infinite loop by temporarily removing this function from the getter
+                               handle = attrHandle[ name ];
+                               attrHandle[ name ] = ret;
+                               ret = getter( elem, name, isXML ) != null ?
+                                       name.toLowerCase() :
+                                       null;
+                               attrHandle[ name ] = handle;
+                       }
+                       return ret;
+               } :
+               function( elem, name, isXML ) {
+                       if ( !isXML ) {
+                               return elem[ jQuery.camelCase( "default-" + name ) ] ?
+                                       name.toLowerCase() :
+                                       null;
+                       }
+               };
+});
 
-               // Revert the old values
-               for ( name in options ) {
-                       elem.style[ name ] = old[ name ];
+// fix oldIE attroperties
+if ( !getSetInput || !getSetAttribute ) {
+       jQuery.attrHooks.value = {
+               set: function( elem, value, name ) {
+                       if ( jQuery.nodeName( elem, "input" ) ) {
+                               // Does not return so that setAttribute is also used
+                               elem.defaultValue = value;
+                       } else {
+                               // Use nodeHook if defined (#1954); otherwise setAttribute is fine
+                               return nodeHook && nodeHook.set( elem, value, name );
+                       }
                }
+       };
+}
 
-               return ret;
-       }
-});
+// IE6/7 do not support getting/setting some attributes with get/setAttribute
+if ( !getSetAttribute ) {
 
-// 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;
+       // Use this for any attribute in IE6/7
+       // This fixes almost every IE6/7 issue
+       nodeHook = {
+               set: function( elem, value, name ) {
+                       // Set the existing or create a new attribute node
+                       var ret = elem.getAttributeNode( name );
+                       if ( !ret ) {
+                               elem.setAttributeNode(
+                                       (ret = elem.ownerDocument.createAttribute( name ))
+                               );
+                       }
 
-               if ( computed ) {
+                       ret.value = value += "";
 
-                       // getPropertyValue is only needed for .css('filter') in IE9, see #12537
-                       ret = computed.getPropertyValue( name ) || computed[ name ];
+                       // Break association with cloned elements by also using setAttribute (#9646)
+                       if ( name === "value" || value === elem.getAttribute( name ) ) {
+                               return value;
+                       }
+               }
+       };
 
-                       if ( ret === "" && !jQuery.contains( elem.ownerDocument, elem ) ) {
-                               ret = jQuery.style( elem, name );
+       // Some attributes are constructed with empty-string values when not defined
+       attrHandle.id = attrHandle.name = attrHandle.coords =
+               function( elem, name, isXML ) {
+                       var ret;
+                       if ( !isXML ) {
+                               return (ret = elem.getAttributeNode( name )) && ret.value !== "" ?
+                                       ret.value :
+                                       null;
                        }
+               };
 
-                       // 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;
+       // Fixing value retrieval on a button requires this module
+       jQuery.valHooks.button = {
+               get: function( elem, name ) {
+                       var ret = elem.getAttributeNode( name );
+                       if ( ret && ret.specified ) {
+                               return ret.value;
+                       }
+               },
+               set: nodeHook.set
+       };
 
-                               style.minWidth = style.maxWidth = style.width = ret;
-                               ret = computed.width;
+       // Set contenteditable to false on removals(#10429)
+       // Setting to empty string throws an error as an invalid value
+       jQuery.attrHooks.contenteditable = {
+               set: function( elem, value, name ) {
+                       nodeHook.set( elem, value === "" ? false : value, name );
+               }
+       };
 
-                               style.width = width;
-                               style.minWidth = minWidth;
-                               style.maxWidth = maxWidth;
+       // 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 ] = {
+                       set: function( elem, value ) {
+                               if ( value === "" ) {
+                                       elem.setAttribute( name, "auto" );
+                                       return value;
+                               }
                        }
-               }
+               };
+       });
+}
 
-               return ret;
+if ( !support.style ) {
+       jQuery.attrHooks.style = {
+               get: function( elem ) {
+                       // Return undefined in the case of empty string
+                       // Note: IE uppercases css property names, but if we were to .toLowerCase()
+                       // .cssText, that would destroy case senstitivity in URL's, like in "background"
+                       return elem.style.cssText || undefined;
+               },
+               set: function( elem, value ) {
+                       return ( elem.style.cssText = value + "" );
+               }
        };
-} 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 ];
-               }
 
-               // From the awesome hack by Dean Edwards
-               // http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291
 
-               // 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 ) ) {
 
-                       // Remember the original values
-                       left = style.left;
-                       rsLeft = elem.runtimeStyle && elem.runtimeStyle.left;
+var rfocusable = /^(?:input|select|textarea|button|object)$/i,
+       rclickable = /^(?:a|area)$/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";
+jQuery.fn.extend({
+       prop: function( name, value ) {
+               return access( this, jQuery.prop, name, value, arguments.length > 1 );
+       },
 
-                       // Revert the changed values
-                       style.left = left;
-                       if ( rsLeft ) {
-                               elem.runtimeStyle.left = rsLeft;
-                       }
-               }
+       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 ) {}
+               });
+       }
+});
 
-               return ret === "" ? "auto" : ret;
-       };
-}
+jQuery.extend({
+       propFix: {
+               "for": "htmlFor",
+               "class": "className"
+       },
 
-function setPositiveNumber( elem, value, subtract ) {
-       var matches = rnumsplit.exec( value );
-       return matches ?
-                       Math.max( 0, matches[ 1 ] - ( subtract || 0 ) ) + ( matches[ 2 ] || "px" ) :
-                       value;
-}
+       prop: function( elem, name, value ) {
+               var ret, hooks, notxml,
+                       nType = elem.nodeType;
 
-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,
+               // don't get/set properties on text, comment and attribute nodes
+               if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
+                       return;
+               }
 
-               val = 0;
+               notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
 
-       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 );
+               if ( notxml ) {
+                       // Fix name and attach hooks
+                       name = jQuery.propFix[ name ] || name;
+                       hooks = jQuery.propHooks[ name ];
                }
 
-               // 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;
-                       }
+               if ( value !== undefined ) {
+                       return hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ?
+                               ret :
+                               ( elem[ name ] = value );
 
-                       // at this point, extra isn't border nor margin, so remove border
-                       if ( extra !== "margin" ) {
-                               val -= parseFloat( curCSS( elem, "border" + cssExpand[ i ] + "Width" ) ) || 0;
-                       }
                } else {
-                       // at this point, extra isn't content, so add padding
-                       val += parseFloat( curCSS( elem, "padding" + cssExpand[ i ] ) ) || 0;
+                       return hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ?
+                               ret :
+                               elem[ name ];
+               }
+       },
 
-                       // at this point, extra isn't content nor padding, so add border
-                       if ( extra !== "padding" ) {
-                               val += parseFloat( curCSS( elem, "border" + cssExpand[ i ] + "Width" ) ) || 0;
+       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/
+                               // Use proper attribute retrieval(#12072)
+                               var tabindex = jQuery.find.attr( elem, "tabindex" );
+
+                               return tabindex ?
+                                       parseInt( tabindex, 10 ) :
+                                       rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ?
+                                               0 :
+                                               -1;
                        }
                }
        }
+});
 
-       return val;
+// Some attributes require a special call on IE
+// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx
+if ( !support.hrefNormalized ) {
+       // href/src property should get the full normalized URL (#10299/#12915)
+       jQuery.each([ "href", "src" ], function( i, name ) {
+               jQuery.propHooks[ name ] = {
+                       get: function( elem ) {
+                               return elem.getAttribute( name, 4 );
+                       }
+               };
+       });
 }
 
-function getWidthOrHeight( elem, name, extra ) {
+// Support: Safari, IE9+
+// mis-reports the default selected property of an option
+// Accessing the parent's selectedIndex property fixes it
+if ( !support.optSelected ) {
+       jQuery.propHooks.selected = {
+               get: function( elem ) {
+                       var parent = elem.parentNode;
 
-       // 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";
+                       if ( parent ) {
+                               parent.selectedIndex;
 
-       // 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 ];
+                               // Make sure that it also works with optgroups, see #5701
+                               if ( parent.parentNode ) {
+                                       parent.parentNode.selectedIndex;
+                               }
+                       }
+                       return null;
                }
+       };
+}
 
-               // Computed unit is not pixels. Stop here and return.
-               if ( rnumnonpx.test(val) ) {
-                       return val;
-               }
+jQuery.each([
+       "tabIndex",
+       "readOnly",
+       "maxLength",
+       "cellSpacing",
+       "cellPadding",
+       "rowSpan",
+       "colSpan",
+       "useMap",
+       "frameBorder",
+       "contentEditable"
+], function() {
+       jQuery.propFix[ this.toLowerCase() ] = this;
+});
 
-               // 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 ] );
+// IE6/7 call enctype encoding
+if ( !support.enctype ) {
+       jQuery.propFix.enctype = "encoding";
+}
 
-               // Normalize "", auto, and prepare for extra
-               val = parseFloat( val ) || 0;
-       }
 
-       // 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 ];
-       }
+var rclass = /[\t\r\n\f]/g;
 
-       var elem = jQuery( "<" + nodeName + ">" ).appendTo( document.body ),
-               display = elem.css("display");
-       elem.remove();
+jQuery.fn.extend({
+       addClass: function( value ) {
+               var classes, elem, cur, clazz, j, finalValue,
+                       i = 0,
+                       len = this.length,
+                       proceed = typeof value === "string" && value;
 
-       // 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
-                       })
-               );
+               if ( jQuery.isFunction( value ) ) {
+                       return this.each(function( j ) {
+                               jQuery( this ).addClass( value.call( this, j, this.className ) );
+                       });
+               }
+
+               if ( proceed ) {
+                       // The disjunction here is for better compressibility (see removeClass)
+                       classes = ( value || "" ).match( rnotwhite ) || [];
+
+                       for ( ; i < len; i++ ) {
+                               elem = this[ i ];
+                               cur = elem.nodeType === 1 && ( elem.className ?
+                                       ( " " + elem.className + " " ).replace( rclass, " " ) :
+                                       " "
+                               );
+
+                               if ( cur ) {
+                                       j = 0;
+                                       while ( (clazz = classes[j++]) ) {
+                                               if ( cur.indexOf( " " + clazz + " " ) < 0 ) {
+                                                       cur += clazz + " ";
+                                               }
+                                       }
 
-               // 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();
+                                       // only assign if different to avoid unneeded rendering.
+                                       finalValue = jQuery.trim( cur );
+                                       if ( elem.className !== finalValue ) {
+                                               elem.className = finalValue;
+                                       }
+                               }
+                       }
                }
 
-               elem = iframeDoc.body.appendChild( iframeDoc.createElement(nodeName) );
+               return this;
+       },
 
-               display = curCSS( elem, "display" );
-               document.body.removeChild( iframe );
-       }
+       removeClass: function( value ) {
+               var classes, elem, cur, clazz, j, finalValue,
+                       i = 0,
+                       len = this.length,
+                       proceed = arguments.length === 0 || typeof value === "string" && value;
 
-       // Store the correct default display
-       elemdisplay[ nodeName ] = display;
+               if ( jQuery.isFunction( value ) ) {
+                       return this.each(function( j ) {
+                               jQuery( this ).removeClass( value.call( this, j, this.className ) );
+                       });
+               }
+               if ( proceed ) {
+                       classes = ( value || "" ).match( rnotwhite ) || [];
 
-       return display;
-}
+                       for ( ; i < len; i++ ) {
+                               elem = this[ i ];
+                               // This expression is here for better compressibility (see addClass)
+                               cur = elem.nodeType === 1 && ( elem.className ?
+                                       ( " " + elem.className + " " ).replace( rclass, " " ) :
+                                       ""
+                               );
 
-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 );
+                               if ( cur ) {
+                                       j = 0;
+                                       while ( (clazz = classes[j++]) ) {
+                                               // Remove *all* instances
+                                               while ( cur.indexOf( " " + clazz + " " ) >= 0 ) {
+                                                       cur = cur.replace( " " + clazz + " ", " " );
+                                               }
+                                       }
+
+                                       // only assign if different to avoid unneeded rendering.
+                                       finalValue = value ? jQuery.trim( cur ) : "";
+                                       if ( elem.className !== finalValue ) {
+                                               elem.className = finalValue;
+                                       }
                                }
                        }
-               },
-
-               set: function( elem, value, extra ) {
-                       return setPositiveNumber( elem, value, extra ?
-                               augmentWidthOrHeight(
-                                       elem,
-                                       name,
-                                       extra,
-                                       jQuery.support.boxSizing && jQuery.css( elem, "boxSizing" ) === "border-box"
-                               ) : 0
-                       );
                }
-       };
-});
 
-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" : "";
-               },
+               return this;
+       },
 
-               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 || "";
+       toggleClass: function( value, stateVal ) {
+               var type = typeof value;
 
-                       // IE has trouble with opacity if it does not have layout
-                       // Force it by setting the zoom level
-                       style.zoom = 1;
+               if ( typeof stateVal === "boolean" && type === "string" ) {
+                       return stateVal ? this.addClass( value ) : this.removeClass( value );
+               }
 
-                       // 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 ) {
+               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 ),
+                                       classNames = value.match( rnotwhite ) || [];
 
-                               // 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" );
+                               while ( (className = classNames[ i++ ]) ) {
+                                       // check each className given, space separated list
+                                       if ( self.hasClass( className ) ) {
+                                               self.removeClass( className );
+                                       } else {
+                                               self.addClass( className );
+                                       }
+                               }
 
-                               // if there there is no filter style applied in a css rule, we are done
-                               if ( currentStyle && !currentStyle.filter ) {
-                                       return;
+                       // Toggle whole class name
+                       } else if ( type === strundefined || type === "boolean" ) {
+                               if ( this.className ) {
+                                       // store className if set
+                                       jQuery._data( this, "__className__", this.className );
                                }
-                       }
 
-                       // otherwise, set new filter values
-                       style.filter = ralpha.test( filter ) ?
-                               filter.replace( ralpha, opacity ) :
-                               filter + " " + opacity;
-               }
-       };
-}
+                               // If the element has a class name or if we're passed "false",
+                               // then remove the whole classname (if there was one, the above saved it).
+                               // Otherwise bring back whatever was previously saved (if anything),
+                               // falling back to the empty string if nothing was stored.
+                               this.className = this.className || value === false ? "" : jQuery._data( this, "__className__" ) || "";
+                       }
+               });
+       },
 
-// 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" );
-                                       }
-                               });
+       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 ) >= 0 ) {
+                               return true;
                        }
-               };
-       }
+               }
 
-       // 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;
-                                       }
-                               }
-                       };
-               });
+               return false;
        }
-
 });
 
-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,
 
-                               // assumes a single number if not a string
-                               parts = typeof value === "string" ? value.split(" ") : [ value ],
-                               expanded = {};
+// Return jQuery for attributes-only inclusion
 
-                       for ( i = 0; i < 4; i++ ) {
-                               expanded[ prefix + cssExpand[ i ] + suffix ] =
-                                       parts[ i ] || parts[ i - 2 ] || parts[ 0 ];
-                       }
 
-                       return expanded;
-               }
-       };
+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 ) {
 
-       if ( !rmargin.test( prefix ) ) {
-               jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;
-       }
+       // Handle event binding
+       jQuery.fn[ name ] = function( data, fn ) {
+               return arguments.length > 0 ?
+                       this.on( name, null, data, fn ) :
+                       this.trigger( name );
+       };
 });
-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() );
+       hover: function( fnOver, fnOut ) {
+               return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
        },
-       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();
+       bind: function( types, data, fn ) {
+               return this.on( types, null, data, fn );
+       },
+       unbind: function( types, fn ) {
+               return this.off( types, null, fn );
+       },
+
+       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 );
        }
 });
 
-//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;
+var nonce = jQuery.now();
+
+var rquery = (/\?/);
+
+
+
+var rvalidtokens = /(,)|(\[|{)|(}|])|"(?:[^"\\\r\n]|\\["\\\/bfnrt]|\\u[\da-fA-F]{4})*"\s*:?|true|false|null|-?(?!0\d)\d+(?:\.\d+|)(?:[eE][+-]?\d+|)/g;
+
+jQuery.parseJSON = function( data ) {
+       // Attempt to parse using the native JSON parser first
+       if ( window.JSON && window.JSON.parse ) {
+               // Support: Android 2.3
+               // Workaround failure to string-cast null input
+               return window.JSON.parse( data + "" );
        }
 
-       // 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 );
-               });
+       var requireNonComma,
+               depth = null,
+               str = jQuery.trim( data + "" );
 
-       } 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 );
+       // Guard against invalid (and possibly dangerous) input by ensuring that nothing remains
+       // after removing valid tokens
+       return str && !jQuery.trim( str.replace( rvalidtokens, function( token, comma, open, close ) {
+
+               // Force termination if we see a misplaced comma
+               if ( requireNonComma && comma ) {
+                       depth = 0;
                }
-       }
 
-       // Return the resulting serialization
-       return s.join( "&" ).replace( r20, "+" );
-};
+               // Perform no more replacements after returning to outermost depth
+               if ( depth === 0 ) {
+                       return token;
+               }
 
-function buildParams( prefix, obj, traditional, add ) {
-       var name;
+               // Commas must not follow "[", "{", or ","
+               requireNonComma = open || comma;
 
-       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 );
+               // Determine new depth
+               // array/object open ("[" or "{"): depth += true - false (increment)
+               // array/object close ("]" or "}"): depth += false - true (decrement)
+               // other cases ("," or primitive): depth += true - true (numeric cast)
+               depth += !close - !open;
 
-                       } 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 );
-                       }
-               });
+               // Remove this token
+               return "";
+       }) ) ?
+               ( Function( "return " + str ) )() :
+               jQuery.error( "Invalid JSON: " + data );
+};
 
-       } 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 );
+// Cross-browser xml parsing
+jQuery.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;
+};
+
+
 var
        // Document location
        ajaxLocParts,
        ajaxLocation,
 
        rhash = /#.*$/,
+       rts = /([?&])_=[^&]*/,
        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):$/,
+       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,
+       rurl = /^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,
 
        /* Prefilters
         * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)
@@ -7314,7 +8575,7 @@ var
        transports = {},
 
        // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression
-       allTypes = ["*/"] + ["*"];
+       allTypes = "*/".concat("*");
 
 // #8138, IE may throw an exception when accessing
 // a field from window.location if document.domain has been set
@@ -7342,215 +8603,238 @@ function addToPrefiltersOrTransports( structure ) {
                        dataTypeExpression = "*";
                }
 
-               var dataType, list, placeBefore,
-                       dataTypes = dataTypeExpression.toLowerCase().split( core_rspace ),
+               var dataType,
                        i = 0,
-                       length = dataTypes.length;
+                       dataTypes = dataTypeExpression.toLowerCase().match( rnotwhite ) || [];
 
                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 ) || "*";
+                       while ( (dataType = dataTypes[i++]) ) {
+                               // Prepend if requested
+                               if ( dataType.charAt( 0 ) === "+" ) {
+                                       dataType = dataType.slice( 1 ) || "*";
+                                       (structure[ dataType ] = structure[ dataType ] || []).unshift( func );
+
+                               // Otherwise append
+                               } else {
+                                       (structure[ dataType ] = structure[ dataType ] || []).push( func );
                                }
-                               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 );
+function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {
+
+       var inspected = {},
+               seekingTransport = ( structure === transports );
+
+       function inspect( dataType ) {
+               var selected;
+               inspected[ dataType ] = true;
+               jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {
+                       var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );
+                       if ( typeof dataTypeOrTransport === "string" && !seekingTransport && !inspected[ dataTypeOrTransport ] ) {
+                               options.dataTypes.unshift( dataTypeOrTransport );
+                               inspect( dataTypeOrTransport );
+                               return false;
+                       } else if ( seekingTransport ) {
+                               return !( selected = dataTypeOrTransport );
                        }
-               }
-       }
-       // 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 );
+               });
+               return selected;
        }
-       // unnecessary when only executing (prefilters)
-       // but it'll be ignored by the caller in that case
-       return selection;
+
+       return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" );
 }
 
 // A special extend for ajax options
 // that takes "flat" options (not to be deep extended)
 // Fixes #9887
 function ajaxExtend( target, src ) {
-       var key, deep,
+       var deep, key,
                flatOptions = jQuery.ajaxSettings.flatOptions || {};
+
        for ( key in src ) {
                if ( src[ key ] !== undefined ) {
-                       ( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ];
+                       ( flatOptions[ key ] ? target : ( deep || (deep = {}) ) )[ key ] = src[ key ];
                }
        }
        if ( deep ) {
                jQuery.extend( true, target, deep );
        }
+
+       return target;
 }
 
-jQuery.fn.load = function( url, params, callback ) {
-       if ( typeof url !== "string" && _load ) {
-               return _load.apply( this, arguments );
+/* Handles responses to an ajax request:
+ * - finds the right dataType (mediates between content-type and expected dataType)
+ * - returns the corresponding response
+ */
+function ajaxHandleResponses( s, jqXHR, responses ) {
+       var firstDataType, ct, finalDataType, type,
+               contents = s.contents,
+               dataTypes = s.dataTypes;
+
+       // 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");
+               }
        }
 
-       // Don't do a request if no elements are being requested
-       if ( !this.length ) {
-               return this;
+       // 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;
+                       }
+               }
        }
 
-       var selector, type, response,
-               self = this,
-               off = url.indexOf(" ");
+       // 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 ( off >= 0 ) {
-               selector = url.slice( off, url.length );
-               url = url.slice( 0, off );
+       // 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 ];
+       }
+}
+
+/* Chain conversions given the request and the original response
+ * Also sets the responseXXX fields on the jqXHR instance
+ */
+function ajaxConvert( s, response, jqXHR, isSuccess ) {
+       var conv2, current, conv, tmp, prev,
+               converters = {},
+               // Work with a copy of dataTypes in case we need to modify it for conversion
+               dataTypes = s.dataTypes.slice();
+
+       // Create converters map with lowercased keys
+       if ( dataTypes[ 1 ] ) {
+               for ( conv in s.converters ) {
+                       converters[ conv.toLowerCase() ] = s.converters[ conv ];
+               }
        }
 
-       // If it's a function
-       if ( jQuery.isFunction( params ) ) {
-
-               // We assume that it's the callback
-               callback = params;
-               params = undefined;
+       current = dataTypes.shift();
 
-       // Otherwise, build a param string
-       } else if ( params && typeof params === "object" ) {
-               type = "POST";
-       }
+       // Convert to each sequential dataType
+       while ( current ) {
 
-       // Request the remote document
-       jQuery.ajax({
-               url: url,
+               if ( s.responseFields[ current ] ) {
+                       jqXHR[ s.responseFields[ current ] ] = response;
+               }
 
-               // 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 ] );
-                       }
+               // Apply the dataFilter if provided
+               if ( !prev && isSuccess && s.dataFilter ) {
+                       response = s.dataFilter( response, s.dataType );
                }
-       }).done(function( responseText ) {
 
-               // Save response for use in complete callback
-               response = arguments;
+               prev = current;
+               current = dataTypes.shift();
 
-               // See if a selector was specified
-               self.html( selector ?
+               if ( current ) {
 
-                       // Create a dummy div to hold the results
-                       jQuery("<div>")
+                       // There's only work to do if current dataType is non-auto
+                       if ( current === "*" ) {
 
-                               // inject the contents of the document in, removing the scripts
-                               // to avoid any 'Permission Denied' errors in IE
-                               .append( responseText.replace( rscript, "" ) )
+                               current = prev;
 
-                               // Locate the specified elements
-                               .find( selector ) :
+                       // Convert response if prev dataType is non-auto and differs from current
+                       } else if ( prev !== "*" && prev !== current ) {
 
-                       // If not, just inject the full result
-                       responseText );
+                               // Seek a direct converter
+                               conv = converters[ prev + " " + current ] || converters[ "* " + current ];
 
-       });
+                               // If none found, seek a pair
+                               if ( !conv ) {
+                                       for ( conv2 in converters ) {
 
-       return this;
-};
+                                               // If conv2 outputs current
+                                               tmp = conv2.split( " " );
+                                               if ( tmp[ 1 ] === current ) {
 
-// 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 );
-       };
-});
+                                                       // 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 ];
 
-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;
+                                                               // Otherwise, insert the intermediate dataType
+                                                               } else if ( converters[ conv2 ] !== true ) {
+                                                                       current = tmp[ 0 ];
+                                                                       dataTypes.unshift( tmp[ 1 ] );
+                                                               }
+                                                               break;
+                                                       }
+                                               }
+                                       }
+                               }
+
+                               // 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 );
+                                       } else {
+                                               try {
+                                                       response = conv( response );
+                                               } catch ( e ) {
+                                                       return { state: "parsererror", error: conv ? e : "No conversion from " + prev + " to " + current };
+                                               }
+                                       }
+                               }
+                       }
                }
+       }
 
-               return jQuery.ajax({
-                       type: method,
-                       url: url,
-                       data: data,
-                       success: callback,
-                       dataType: type
-               });
-       };
-});
+       return { state: "success", data: response };
+}
 
 jQuery.extend({
 
-       getScript: function( url, callback ) {
-               return jQuery.get( url, undefined, callback, "script" );
-       },
-
-       getJSON: function( url, data, callback ) {
-               return jQuery.get( url, data, callback, "json" );
-       },
+       // Counter for holding the number of active queries
+       active: 0,
 
-       // 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;
-       },
+       // Last-Modified header cache for next request
+       lastModified: {},
+       etag: {},
 
        ajaxSettings: {
                url: ajaxLocation,
+               type: "GET",
                isLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ),
                global: true,
-               type: "GET",
-               contentType: "application/x-www-form-urlencoded; charset=UTF-8",
                processData: true,
                async: true,
+               contentType: "application/x-www-form-urlencoded; charset=UTF-8",
                /*
                timeout: 0,
                data: null,
@@ -7564,11 +8848,11 @@ jQuery.extend({
                */
 
                accepts: {
-                       xml: "application/xml, text/xml",
-                       html: "text/html",
+                       "*": allTypes,
                        text: "text/plain",
-                       json: "application/json, text/javascript",
-                       "*": allTypes
+                       html: "text/html",
+                       xml: "application/xml, text/xml",
+                       json: "application/json, text/javascript"
                },
 
                contents: {
@@ -7579,16 +8863,16 @@ jQuery.extend({
 
                responseFields: {
                        xml: "responseXML",
-                       text: "responseText"
+                       text: "responseText",
+                       json: "responseJSON"
                },
 
-               // 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
+               // Data converters
+               // Keys separate source (or catchall "*") and destination types with a single space
                converters: {
 
                        // Convert anything to text
-                       "* text": window.String,
+                       "* text": String,
 
                        // Text to html (true = no transformation)
                        "text html": true,
@@ -7605,11 +8889,24 @@ jQuery.extend({
                // and when you create one that shouldn't be
                // deep extended (see ajaxExtend)
                flatOptions: {
-                       context: true,
-                       url: true
+                       url: true,
+                       context: true
                }
        },
 
+       // 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 ) {
+               return settings ?
+
+                       // Building a settings object
+                       ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :
+
+                       // Extending ajaxSettings
+                       ajaxExtend( jQuery.ajaxSettings, target );
+       },
+
        ajaxPrefilter: addToPrefiltersOrTransports( prefilters ),
        ajaxTransport: addToPrefiltersOrTransports( transports ),
 
@@ -7625,34 +8922,34 @@ jQuery.extend({
                // Force options to be an object
                options = options || {};
 
-               var // ifModified key
-                       ifModifiedKey,
-                       // Response headers
+               var // Cross-domain detection vars
+                       parts,
+                       // Loop variable
+                       i,
+                       // URL without anti-cache param
+                       cacheURL,
+                       // Response headers as string
                        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,
+
+                       transport,
+                       // Response headers
+                       responseHeaders,
                        // 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,
+                       // Context for global events is callbackContext if it is a DOM node or jQuery collection
+                       globalEventContext = s.context && ( callbackContext.nodeType || callbackContext.jquery ) ?
+                               jQuery( callbackContext ) :
+                               jQuery.event,
                        // Deferreds
                        deferred = jQuery.Deferred(),
-                       completeDeferred = jQuery.Callbacks( "once memory" ),
+                       completeDeferred = jQuery.Callbacks("once memory"),
                        // Status-dependent callbacks
                        statusCode = s.statusCode || {},
                        // Headers (they are sent all at once)
@@ -7664,37 +8961,36 @@ jQuery.extend({
                        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;
-                               },
-
-                               // 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 ) ) ) {
+                                                       while ( (match = rheaders.exec( responseHeadersString )) ) {
                                                                responseHeaders[ match[1].toLowerCase() ] = match[ 2 ];
                                                        }
                                                }
                                                match = responseHeaders[ key.toLowerCase() ];
                                        }
-                                       return match === undefined ? null : match;
+                                       return match == null ? null : match;
+                               },
+
+                               // Raw string
+                               getAllResponseHeaders: function() {
+                                       return state === 2 ? responseHeadersString : null;
+                               },
+
+                               // Caches the header
+                               setRequestHeader: function( name, value ) {
+                                       var lname = name.toLowerCase();
+                                       if ( !state ) {
+                                               name = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name;
+                                               requestHeaders[ name ] = value;
+                                       }
+                                       return this;
                                },
 
                                // Overrides response content-type header
@@ -7705,164 +9001,58 @@ jQuery.extend({
                                        return this;
                                },
 
+                               // Status-dependent callbacks
+                               statusCode: function( map ) {
+                                       var code;
+                                       if ( map ) {
+                                               if ( state < 2 ) {
+                                                       for ( code in map ) {
+                                                               // Lazy-add the new callback in a way that preserves old ones
+                                                               statusCode[ code ] = [ statusCode[ code ], map[ code ] ];
+                                                       }
+                                               } else {
+                                                       // Execute the appropriate callbacks
+                                                       jqXHR.always( map[ jqXHR.status ] );
+                                               }
+                                       }
+                                       return this;
+                               },
+
                                // Cancel the request
                                abort: function( statusText ) {
-                                       statusText = statusText || strAbort;
+                                       var finalText = statusText || strAbort;
                                        if ( transport ) {
-                                               transport.abort( statusText );
+                                               transport.abort( finalText );
                                        }
-                                       done( 0, statusText );
+                                       done( 0, finalText );
                                        return this;
                                }
-                       };
-
-               // 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;
-
-                       // Called once
-                       if ( state === 2 ) {
-                               return;
-                       }
-
-                       // State is "done" now
-                       state = 2;
-
-                       // Clear timeout if it exists
-                       if ( timeoutTimer ) {
-                               clearTimeout( timeoutTimer );
-                       }
-
-                       // Dereference transport for early garbage collection
-                       // (no matter how long the jqXHR object will be used)
-                       transport = undefined;
-
-                       // Cache response headers
-                       responseHeadersString = headers || "";
-
-                       // Set readyState
-                       jqXHR.readyState = status > 0 ? 4 : 0;
-
-                       // Get response data
-                       if ( responses ) {
-                               response = ajaxHandleResponses( s, jqXHR, responses );
-                       }
-
-                       // If successful, handle type chaining
-                       if ( status >= 200 && status < 300 || status === 304 ) {
-
-                               // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
-                               if ( s.ifModified ) {
-
-                                       modified = jqXHR.getResponseHeader("Last-Modified");
-                                       if ( modified ) {
-                                               jQuery.lastModified[ ifModifiedKey ] = modified;
-                                       }
-                                       modified = jqXHR.getResponseHeader("Etag");
-                                       if ( modified ) {
-                                               jQuery.etag[ ifModifiedKey ] = modified;
-                                       }
-                               }
-
-                               // 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;
-                                       }
-                               }
-                       }
-
-                       // Set data for the fake xhr object
-                       jqXHR.status = status;
-                       jqXHR.statusText = ( nativeStatusText || statusText ) + "";
-
-                       // Success/Error
-                       if ( isSuccess ) {
-                               deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );
-                       } else {
-                               deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );
-                       }
-
-                       // Status-dependent callbacks
-                       jqXHR.statusCode( statusCode );
-                       statusCode = undefined;
-
-                       if ( fireGlobals ) {
-                               globalEventContext.trigger( "ajax" + ( isSuccess ? "Success" : "Error" ),
-                                               [ jqXHR, s, isSuccess ? success : error ] );
-                       }
-
-                       // Complete
-                       completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );
-
-                       if ( fireGlobals ) {
-                               globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] );
-                               // Handle the global AJAX counter
-                               if ( !( --jQuery.active ) ) {
-                                       jQuery.event.trigger( "ajaxStop" );
-                               }
-                       }
-               }
+                       };
 
                // Attach deferreds
-               deferred.promise( jqXHR );
+               deferred.promise( jqXHR ).complete = completeDeferred.add;
                jqXHR.success = jqXHR.done;
                jqXHR.error = jqXHR.fail;
-               jqXHR.complete = completeDeferred.add;
-
-               // 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;
-               };
 
                // Remove hash character (#7531: and string promotion)
                // Add protocol if not provided (#5866: IE7 issue with protocol-less urls)
+               // Handle falsy url in the settings object (#10093: consistency with old signature)
                // We also use the url parameter if available
-               s.url = ( ( url || s.url ) + "" ).replace( rhash, "" ).replace( rprotocol, ajaxLocParts[ 1 ] + "//" );
+               s.url = ( ( url || s.url || ajaxLocation ) + "" ).replace( rhash, "" ).replace( rprotocol, ajaxLocParts[ 1 ] + "//" );
+
+               // Alias method option to type as per ticket #12004
+               s.type = options.method || options.type || s.method || s.type;
 
                // Extract dataTypes list
-               s.dataTypes = jQuery.trim( s.dataType || "*" ).toLowerCase().split( core_rspace );
+               s.dataTypes = jQuery.trim( s.dataType || "*" ).toLowerCase().match( rnotwhite ) || [ "" ];
 
                // A cross-domain request is in order when we have a protocol:host:port mismatch
                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 ) ) )
+                                       ( parts[ 3 ] || ( parts[ 1 ] === "http:" ? "80" : "443" ) ) !==
+                                               ( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === "http:" ? "80" : "443" ) ) )
                        );
                }
 
@@ -7882,58 +9072,58 @@ jQuery.extend({
                // We can fire global events as of now if asked to
                fireGlobals = s.global;
 
+               // Watch for a new set of requests
+               if ( fireGlobals && jQuery.active++ === 0 ) {
+                       jQuery.event.trigger("ajaxStart");
+               }
+
                // Uppercase the type
                s.type = s.type.toUpperCase();
 
                // Determine if request has content
                s.hasContent = !rnoContent.test( s.type );
 
-               // Watch for a new set of requests
-               if ( fireGlobals && jQuery.active++ === 0 ) {
-                       jQuery.event.trigger( "ajaxStart" );
-               }
+               // Save the URL in case we're toying with the If-Modified-Since
+               // and/or If-None-Match header later on
+               cacheURL = s.url;
 
                // More options handling for requests with no content
                if ( !s.hasContent ) {
 
                        // If data is available, append data to url
                        if ( s.data ) {
-                               s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.data;
+                               cacheURL = ( s.url += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data );
                                // #9682: remove data so that it's not used in an eventual retry
                                delete s.data;
                        }
 
-                       // Get ifModifiedKey before adding the anti-cache parameter
-                       ifModifiedKey = s.url;
-
                        // Add anti-cache in url if needed
                        if ( s.cache === false ) {
+                               s.url = rts.test( cacheURL ) ?
 
-                               var ts = jQuery.now(),
-                                       // try replacing _= if it is there
-                                       ret = s.url.replace( rts, "$1_=" + ts );
+                                       // If there is already a '_' parameter, set its value
+                                       cacheURL.replace( rts, "$1_=" + nonce++ ) :
 
-                               // if nothing was replaced, add timestamp to the end
-                               s.url = ret + ( ( ret === s.url ) ? ( rquery.test( s.url ) ? "&" : "?" ) + "_=" + ts : "" );
+                                       // Otherwise add one to the end
+                                       cacheURL + ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + nonce++;
                        }
                }
 
-               // 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 );
-               }
-
                // 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.lastModified[ cacheURL ] ) {
+                               jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] );
                        }
-                       if ( jQuery.etag[ ifModifiedKey ] ) {
-                               jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ ifModifiedKey ] );
+                       if ( jQuery.etag[ cacheURL ] ) {
+                               jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] );
                        }
                }
 
+               // 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 );
+               }
+
                // Set the Accepts header for the server, depending on the dataType
                jqXHR.setRequestHeader(
                        "Accept",
@@ -7949,9 +9139,8 @@ jQuery.extend({
 
                // 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();
-
+                       // Abort if not done already and return
+                       return jqXHR.abort();
                }
 
                // aborting is no longer a cancellation
@@ -7970,21 +9159,22 @@ jQuery.extend({
                        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" );
+                               timeoutTimer = setTimeout(function() {
+                                       jqXHR.abort("timeout");
                                }, s.timeout );
                        }
 
                        try {
                                state = 1;
                                transport.send( requestHeaders, done );
-                       } catch (e) {
+                       } catch ( e ) {
                                // Propagate exception as error if not done
                                if ( state < 2 ) {
                                        done( -1, e );
@@ -7995,421 +9185,422 @@ jQuery.extend({
                        }
                }
 
-               return jqXHR;
-       },
-
-       // Counter for holding the number of active queries
-       active: 0,
+               // Callback for when everything is done
+               function done( status, nativeStatusText, responses, headers ) {
+                       var isSuccess, success, error, response, modified,
+                               statusText = nativeStatusText;
 
-       // Last-Modified header cache for next request
-       lastModified: {},
-       etag: {}
+                       // Called once
+                       if ( state === 2 ) {
+                               return;
+                       }
 
-});
+                       // State is "done" now
+                       state = 2;
 
-/* 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 ) {
+                       // Clear timeout if it exists
+                       if ( timeoutTimer ) {
+                               clearTimeout( timeoutTimer );
+                       }
 
-       var ct, type, finalDataType, firstDataType,
-               contents = s.contents,
-               dataTypes = s.dataTypes,
-               responseFields = s.responseFields;
+                       // Dereference transport for early garbage collection
+                       // (no matter how long the jqXHR object will be used)
+                       transport = undefined;
 
-       // Fill responseXXX fields
-       for ( type in responseFields ) {
-               if ( type in responses ) {
-                       jqXHR[ responseFields[type] ] = responses[ type ];
-               }
-       }
+                       // Cache response headers
+                       responseHeadersString = headers || "";
 
-       // 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" );
-               }
-       }
+                       // Set readyState
+                       jqXHR.readyState = status > 0 ? 4 : 0;
 
-       // 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;
-                       }
-               }
-       }
+                       // Determine if successful
+                       isSuccess = status >= 200 && status < 300 || status === 304;
 
-       // 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;
+                       // Get response data
+                       if ( responses ) {
+                               response = ajaxHandleResponses( s, jqXHR, responses );
                        }
-               }
-               // 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 ];
-       }
-}
-
-// 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;
+                       // Convert no matter what (that way responseXXX fields are always set)
+                       response = ajaxConvert( s, response, jqXHR, isSuccess );
 
-       // Apply the dataFilter if provided
-       if ( s.dataFilter ) {
-               response = s.dataFilter( response, s.dataType );
-       }
+                       // If successful, handle type chaining
+                       if ( isSuccess ) {
 
-       // Create converters map with lowercased keys
-       if ( dataTypes[ 1 ] ) {
-               for ( conv in s.converters ) {
-                       converters[ conv.toLowerCase() ] = s.converters[ conv ];
-               }
-       }
+                               // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
+                               if ( s.ifModified ) {
+                                       modified = jqXHR.getResponseHeader("Last-Modified");
+                                       if ( modified ) {
+                                               jQuery.lastModified[ cacheURL ] = modified;
+                                       }
+                                       modified = jqXHR.getResponseHeader("etag");
+                                       if ( modified ) {
+                                               jQuery.etag[ cacheURL ] = modified;
+                                       }
+                               }
 
-       // Convert to each sequential dataType, tolerating list modification
-       for ( ; (current = dataTypes[++i]); ) {
+                               // if no content
+                               if ( status === 204 || s.type === "HEAD" ) {
+                                       statusText = "nocontent";
 
-               // There's only work to do if current dataType is non-auto
-               if ( current !== "*" ) {
+                               // if not modified
+                               } else if ( status === 304 ) {
+                                       statusText = "notmodified";
 
-                       // Convert response if prev dataType is non-auto and differs from current
-                       if ( prev !== "*" && prev !== current ) {
+                               // If we have data, let's convert it
+                               } else {
+                                       statusText = response.state;
+                                       success = response.data;
+                                       error = response.error;
+                                       isSuccess = !error;
+                               }
+                       } else {
+                               // We extract error from statusText
+                               // then normalize statusText and status for non-aborts
+                               error = statusText;
+                               if ( status || !statusText ) {
+                                       statusText = "error";
+                                       if ( status < 0 ) {
+                                               status = 0;
+                                       }
+                               }
+                       }
 
-                               // Seek a direct converter
-                               conv = converters[ prev + " " + current ] || converters[ "* " + current ];
+                       // Set data for the fake xhr object
+                       jqXHR.status = status;
+                       jqXHR.statusText = ( nativeStatusText || statusText ) + "";
 
-                               // If none found, seek a pair
-                               if ( !conv ) {
-                                       for ( conv2 in converters ) {
+                       // Success/Error
+                       if ( isSuccess ) {
+                               deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );
+                       } else {
+                               deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );
+                       }
 
-                                               // If conv2 outputs current
-                                               tmp = conv2.split(" ");
-                                               if ( tmp[ 1 ] === current ) {
+                       // Status-dependent callbacks
+                       jqXHR.statusCode( statusCode );
+                       statusCode = undefined;
 
-                                                       // 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 ];
+                       if ( fireGlobals ) {
+                               globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError",
+                                       [ jqXHR, s, isSuccess ? success : error ] );
+                       }
 
-                                                               // Otherwise, insert the intermediate dataType
-                                                               } else if ( converters[ conv2 ] !== true ) {
-                                                                       current = tmp[ 0 ];
-                                                                       dataTypes.splice( i--, 0, current );
-                                                               }
+                       // Complete
+                       completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );
 
-                                                               break;
-                                                       }
-                                               }
-                                       }
+                       if ( fireGlobals ) {
+                               globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] );
+                               // Handle the global AJAX counter
+                               if ( !( --jQuery.active ) ) {
+                                       jQuery.event.trigger("ajaxStop");
                                }
+                       }
+               }
 
-                               // Apply converter (if not an equivalence)
-                               if ( conv !== true ) {
+               return jqXHR;
+       },
 
-                                       // Unless errors are allowed to bubble, catch and return them
-                                       if ( conv && s["throws"] ) {
-                                               response = conv( response );
-                                       } else {
-                                               try {
-                                                       response = conv( response );
-                                               } catch ( e ) {
-                                                       return { state: "parsererror", error: conv ? e : "No conversion from " + prev + " to " + current };
-                                               }
-                                       }
-                               }
-                       }
+       getJSON: function( url, data, callback ) {
+               return jQuery.get( url, data, callback, "json" );
+       },
 
-                       // Update prev for next iteration
-                       prev = current;
-               }
+       getScript: function( url, callback ) {
+               return jQuery.get( url, undefined, callback, "script" );
        }
+});
 
-       return { state: "success", data: response };
-}
-var oldCallbacks = [],
-       rquestion = /\?/,
-       rjsonp = /(=)\?(?=&|$)|\?\?/,
-       nonce = jQuery.now();
+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;
+               }
 
-// Default jsonp settings
-jQuery.ajaxSetup({
-       jsonp: "callback",
-       jsonpCallback: function() {
-               var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( nonce++ ) );
-               this[ callback ] = true;
-               return callback;
-       }
+               return jQuery.ajax({
+                       url: url,
+                       type: method,
+                       dataType: type,
+                       data: data,
+                       success: callback
+               });
+       };
+});
+
+// Attach a bunch of functions for handling common AJAX events
+jQuery.each( [ "ajaxStart", "ajaxStop", "ajaxComplete", "ajaxError", "ajaxSuccess", "ajaxSend" ], function( i, type ) {
+       jQuery.fn[ type ] = function( fn ) {
+               return this.on( type, fn );
+       };
 });
 
-// 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 );
+jQuery._evalUrl = function( url ) {
+       return jQuery.ajax({
+               url: url,
+               type: "GET",
+               dataType: "script",
+               async: false,
+               global: false,
+               "throws": true
+       });
+};
+
+
+jQuery.fn.extend({
+       wrapAll: function( html ) {
+               if ( jQuery.isFunction( html ) ) {
+                       return this.each(function(i) {
+                               jQuery(this).wrapAll( html.call(this, i) );
+                       });
+               }
+
+               if ( this[0] ) {
+                       // The elements to wrap the target around
+                       var wrap = jQuery( html, this[0].ownerDocument ).eq(0).clone(true);
+
+                       if ( this[0].parentNode ) {
+                               wrap.insertBefore( this[0] );
+                       }
 
-       // Handle iff the expected data type is "jsonp" or we have a parameter to set
-       if ( s.dataTypes[ 0 ] === "jsonp" || replaceInUrl || replaceInData ) {
+                       wrap.map(function() {
+                               var elem = this;
 
-               // Get callback name, remembering preexisting value associated with it
-               callbackName = s.jsonpCallback = jQuery.isFunction( s.jsonpCallback ) ?
-                       s.jsonpCallback() :
-                       s.jsonpCallback;
-               overwritten = window[ callbackName ];
+                               while ( elem.firstChild && elem.firstChild.nodeType === 1 ) {
+                                       elem = elem.firstChild;
+                               }
 
-               // 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;
+                               return elem;
+                       }).append( this );
                }
 
-               // 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 ];
-               };
-
-               // force json dataType
-               s.dataTypes[ 0 ] = "json";
+               return this;
+       },
 
-               // Install callback
-               window[ callbackName ] = function() {
-                       responseContainer = arguments;
-               };
+       wrapInner: function( html ) {
+               if ( jQuery.isFunction( html ) ) {
+                       return this.each(function(i) {
+                               jQuery(this).wrapInner( html.call(this, i) );
+                       });
+               }
 
-               // Clean-up function (fires after converters)
-               jqXHR.always(function() {
-                       // Restore preexisting value
-                       window[ callbackName ] = overwritten;
+               return this.each(function() {
+                       var self = jQuery( this ),
+                               contents = self.contents();
 
-                       // Save back as free
-                       if ( s[ callbackName ] ) {
-                               // make sure that re-using the options doesn't screw things around
-                               s.jsonpCallback = originalSettings.jsonpCallback;
+                       if ( contents.length ) {
+                               contents.wrapAll( html );
 
-                               // save the callback name for future use
-                               oldCallbacks.push( callbackName );
+                       } else {
+                               self.append( html );
                        }
+               });
+       },
 
-                       // Call if it was a function and we have a response
-                       if ( responseContainer && jQuery.isFunction( overwritten ) ) {
-                               overwritten( responseContainer[ 0 ] );
-                       }
+       wrap: function( html ) {
+               var isFunction = jQuery.isFunction( html );
 
-                       responseContainer = overwritten = undefined;
+               return this.each(function(i) {
+                       jQuery( this ).wrapAll( isFunction ? html.call(this, i) : html );
                });
-
-               // 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;
-               }
-       }
-});
 
-// 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;
+       unwrap: function() {
+               return this.parent().each(function() {
+                       if ( !jQuery.nodeName( this, "body" ) ) {
+                               jQuery( this ).replaceWith( this.childNodes );
+                       }
+               }).end();
        }
 });
 
-// Bind script tag hack transport
-jQuery.ajaxTransport( "script", function(s) {
 
-       // This transport only deals with cross domain requests
-       if ( s.crossDomain ) {
+jQuery.expr.filters.hidden = function( elem ) {
+       // Support: Opera <= 12.12
+       // Opera reports offsetWidths and offsetHeights less than zero on some elements
+       return elem.offsetWidth <= 0 && elem.offsetHeight <= 0 ||
+               (!support.reliableHiddenOffsets() &&
+                       ((elem.style && elem.style.display) || jQuery.css( elem, "display" )) === "none");
+};
 
-               var script,
-                       head = document.head || document.getElementsByTagName( "head" )[0] || document.documentElement;
+jQuery.expr.filters.visible = function( elem ) {
+       return !jQuery.expr.filters.hidden( elem );
+};
 
-               return {
 
-                       send: function( _, callback ) {
 
-                               script = document.createElement( "script" );
 
-                               script.async = "async";
+var r20 = /%20/g,
+       rbracket = /\[\]$/,
+       rCRLF = /\r?\n/g,
+       rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,
+       rsubmittable = /^(?:input|select|textarea|keygen)/i;
 
-                               if ( s.scriptCharset ) {
-                                       script.charset = s.scriptCharset;
-                               }
+function buildParams( prefix, obj, traditional, add ) {
+       var name;
 
-                               script.src = s.url;
+       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 );
 
-                               // Attach handlers for all browsers
-                               script.onload = script.onreadystatechange = function( _, isAbort ) {
+                       } else {
+                               // Item is non-scalar (array or object), encode its numeric index.
+                               buildParams( prefix + "[" + ( typeof v === "object" ? i : "" ) + "]", v, traditional, add );
+                       }
+               });
 
-                                       if ( isAbort || !script.readyState || /loaded|complete/.test( script.readyState ) ) {
+       } else if ( !traditional && jQuery.type( obj ) === "object" ) {
+               // Serialize object item.
+               for ( name in obj ) {
+                       buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
+               }
 
-                                               // Handle memory leak in IE
-                                               script.onload = script.onreadystatechange = null;
+       } else {
+               // Serialize scalar item.
+               add( prefix, obj );
+       }
+}
 
-                                               // Remove the script
-                                               if ( head && script.parentNode ) {
-                                                       head.removeChild( script );
-                                               }
+// 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 );
+               };
 
-                                               // Dereference the script
-                                               script = undefined;
+       // Set traditional to true for jQuery <= 1.3.2 behavior.
+       if ( traditional === undefined ) {
+               traditional = jQuery.ajaxSettings && jQuery.ajaxSettings.traditional;
+       }
 
-                                               // 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 );
-                       },
+       // 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 );
+               });
 
-                       abort: function() {
-                               if ( script ) {
-                                       script.onload( 0, 1 );
-                               }
-                       }
-               };
-       }
-});
-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 );
+       } 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 );
                }
-       } : false,
-       xhrId = 0;
+       }
 
-// Functions to create xhrs
-function createStandardXHR() {
-       try {
-               return new window.XMLHttpRequest();
-       } catch( e ) {}
-}
+       // Return the resulting serialization
+       return s.join( "&" ).replace( r20, "+" );
+};
+
+jQuery.fn.extend({
+       serialize: function() {
+               return jQuery.param( this.serializeArray() );
+       },
+       serializeArray: function() {
+               return this.map(function() {
+                       // Can add propHook for "elements" to filter or add form elements
+                       var elements = jQuery.prop( this, "elements" );
+                       return elements ? jQuery.makeArray( elements ) : this;
+               })
+               .filter(function() {
+                       var type = this.type;
+                       // Use .is(":disabled") so that fieldset[disabled] works
+                       return this.name && !jQuery( this ).is( ":disabled" ) &&
+                               rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&
+                               ( this.checked || !rcheckableType.test( type ) );
+               })
+               .map(function( i, elem ) {
+                       var val = jQuery( this ).val();
+
+                       return val == null ?
+                               null :
+                               jQuery.isArray( val ) ?
+                                       jQuery.map( val, function( val ) {
+                                               return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
+                                       }) :
+                                       { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
+               }).get();
+       }
+});
 
-function createActiveXHR() {
-       try {
-               return new window.ActiveXObject( "Microsoft.XMLHTTP" );
-       } catch( e ) {}
-}
 
 // 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.
-        */
+jQuery.ajaxSettings.xhr = window.ActiveXObject !== undefined ?
+       // Support: IE6+
        function() {
-               return !this.isLocal && createStandardXHR() || createActiveXHR();
+
+               // XHR cannot access local files, always use ActiveX for that case
+               return !this.isLocal &&
+
+                       // Support: IE7-8
+                       // oldIE XHR does not support non-RFC2616 methods (#13240)
+                       // See http://msdn.microsoft.com/en-us/library/ie/ms536648(v=vs.85).aspx
+                       // and http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9
+                       // Although this check for six methods instead of eight
+                       // since IE also does not support "trace" and "connect"
+                       /^(get|post|head|put|delete|options)$/i.test( this.type ) &&
+
+                       createStandardXHR() || createActiveXHR();
        } :
        // For all other browsers, use the standard XMLHttpRequest object
        createStandardXHR;
 
-// Determine support properties
-(function( xhr ) {
-       jQuery.extend( jQuery.support, {
-               ajax: !!xhr,
-               cors: !!xhr && ( "withCredentials" in xhr )
+var xhrId = 0,
+       xhrCallbacks = {},
+       xhrSupported = jQuery.ajaxSettings.xhr();
+
+// Support: IE<10
+// Open requests must be manually aborted on unload (#5280)
+if ( window.ActiveXObject ) {
+       jQuery( window ).on( "unload", function() {
+               for ( var key in xhrCallbacks ) {
+                       xhrCallbacks[ key ]( undefined, true );
+               }
        });
-})( jQuery.ajaxSettings.xhr() );
+}
+
+// Determine support properties
+support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported );
+xhrSupported = support.ajax = !!xhrSupported;
 
 // Create transport if the browser can provide an xhr
-if ( jQuery.support.ajax ) {
+if ( xhrSupported ) {
 
-       jQuery.ajaxTransport(function( s ) {
+       jQuery.ajaxTransport(function( options ) {
                // Cross domain only allowed if supported through XMLHttpRequest
-               if ( !s.crossDomain || jQuery.support.cors ) {
+               if ( !options.crossDomain || support.cors ) {
 
                        var callback;
 
                        return {
                                send: function( headers, complete ) {
-
-                                       // Get a new xhr
-                                       var handle, i,
-                                               xhr = s.xhr();
+                                       var i,
+                                               xhr = options.xhr(),
+                                               id = ++xhrId;
 
                                        // 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 );
-                                       }
+                                       xhr.open( options.type, options.url, options.async, options.username, options.password );
 
                                        // Apply custom fields if provided
-                                       if ( s.xhrFields ) {
-                                               for ( i in s.xhrFields ) {
-                                                       xhr[ i ] = s.xhrFields[ i ];
+                                       if ( options.xhrFields ) {
+                                               for ( i in options.xhrFields ) {
+                                                       xhr[ i ] = options.xhrFields[ i ];
                                                }
                                        }
 
                                        // Override mime type if needed
-                                       if ( s.mimeType && xhr.overrideMimeType ) {
-                                               xhr.overrideMimeType( s.mimeType );
+                                       if ( options.mimeType && xhr.overrideMimeType ) {
+                                               xhr.overrideMimeType( options.mimeType );
                                        }
 
                                        // X-Requested-With header
@@ -8417,888 +9608,434 @@ if ( jQuery.support.ajax ) {
                                        // 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";
+                                       if ( !options.crossDomain && !headers["X-Requested-With"] ) {
+                                               headers["X-Requested-With"] = "XMLHttpRequest";
                                        }
 
-                                       // Need an extra try/catch for cross domain requests in Firefox 3
-                                       try {
-                                               for ( i in headers ) {
-                                                       xhr.setRequestHeader( i, headers[ i ] );
+                                       // Set headers
+                                       for ( i in headers ) {
+                                               // Support: IE<9
+                                               // IE's ActiveXObject throws a 'Type Mismatch' exception when setting
+                                               // request header to a null-value.
+                                               //
+                                               // To keep consistent with other XHR implementations, cast the value
+                                               // to string and ignore `undefined`.
+                                               if ( headers[ i ] !== undefined ) {
+                                                       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 );
+                                       xhr.send( ( options.hasContent && options.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 occurred
-                                               // 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 ];
-                                                                       }
+                                               var status, statusText, responses;
+
+                                               // Was never called and is aborted or complete
+                                               if ( callback && ( isAbort || xhr.readyState === 4 ) ) {
+                                                       // Clean up
+                                                       delete xhrCallbacks[ id ];
+                                                       callback = undefined;
+                                                       xhr.onreadystatechange = jQuery.noop;
+
+                                                       // Abort manually if needed
+                                                       if ( isAbort ) {
+                                                               if ( xhr.readyState !== 4 ) {
+                                                                       xhr.abort();
+                                                               }
+                                                       } else {
+                                                               responses = {};
+                                                               status = xhr.status;
+
+                                                               // Support: IE<10
+                                                               // Accessing binary-data responseText throws an exception
+                                                               // (#11426)
+                                                               if ( typeof xhr.responseText === "string" ) {
+                                                                       responses.text = xhr.responseText;
                                                                }
 
-                                                               // 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( e ) {
-                                                                       }
-
-                                                                       // 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 = "";
-                                                                       }
+                                                               // 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
+                                                               // 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;
-                                                                       }
+                                                               // 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 && options.isLocal && !options.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 );
-                                                       }
                                                }
 
                                                // Call complete if needed
                                                if ( responses ) {
-                                                       complete( status, statusText, responses, responseHeaders );
+                                                       complete( status, statusText, responses, xhr.getAllResponseHeaders() );
                                                }
                                        };
 
-                                       if ( !s.async ) {
+                                       if ( !options.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 );
+                                               setTimeout( 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;
+                                               // Add to the list of active xhr callbacks
+                                               xhr.onreadystatechange = xhrCallbacks[ id ] = callback;
                                        }
                                },
 
                                abort: function() {
                                        if ( callback ) {
-                                               callback(0,1);
+                                               callback( undefined, true );
                                        }
                                }
                        };
                }
        });
 }
-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,
-                               tween = this.createTween( prop, value ),
-                               parts = rfxnum.exec( value ),
-                               target = tween.cur(),
-                               start = +target || 0,
-                               scale = 1,
-                               maxIterations = 20;
-
-                       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
-                                               scale = scale || ".5";
-
-                                               // Adjust and apply
-                                               start = start / scale;
-                                               jQuery.style( tween.elem, prop, start + unit );
-
-                                       // Update scale, tolerating zero or NaN from tween.cur()
-                                       // And breaking the loop if scale is unchanged or perfect, or if we've just had enough
-                                       } while ( scale !== (scale = tween.cur() / target) && scale !== 1 && --maxIterations );
-                               }
-
-                               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 ),
-                               // archaic crash bug won't allow us to use 1 - ( 0.5 || 0 ) (#12497)
-                               temp = remaining / animation.duration || 0,
-                               percent = 1 - temp,
-                               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 {
-                                       deferred.rejectWith( elem, [ animation, gotoEnd ] );
-                               }
-                               return this;
-                       }
-               }),
-               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 );
+// Functions to create xhrs
+function createStandardXHR() {
+       try {
+               return new window.XMLHttpRequest();
+       } catch( e ) {}
 }
 
-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 ];
-               }
-
-               hooks = jQuery.cssHooks[ name ];
-               if ( hooks && "expand" in hooks ) {
-                       value = hooks.expand( value );
-                       delete props[ name ];
-
-                       // 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;
-                               }
-                       }
-               } else {
-                       specialEasing[ name ] = easing;
-               }
-       }
+function createActiveXHR() {
+       try {
+               return new window.ActiveXObject( "Microsoft.XMLHTTP" );
+       } catch( e ) {}
 }
 
-jQuery.Animation = jQuery.extend( Animation, {
 
-       tweener: function( props, callback ) {
-               if ( jQuery.isFunction( props ) ) {
-                       callback = props;
-                       props = [ "*" ];
-               } else {
-                       props = props.split(" ");
-               }
 
-               var prop,
-                       index = 0,
-                       length = props.length;
 
-               for ( ; index < length ; index++ ) {
-                       prop = props[ index ];
-                       tweeners[ prop ] = tweeners[ prop ] || [];
-                       tweeners[ prop ].unshift( callback );
-               }
+// Install script dataType
+jQuery.ajaxSetup({
+       accepts: {
+               script: "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"
        },
-
-       prefilter: function( callback, prepend ) {
-               if ( prepend ) {
-                       animationPrefilters.unshift( callback );
-               } else {
-                       animationPrefilters.push( callback );
-               }
-       }
-});
-
-function defaultPrefilter( elem, props, opts ) {
-       var index, prop, value, length, dataShow, toggle, 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++;
-
-               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();
-                               }
-                       });
-               });
-       }
-
-       // 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;
-                       }
+       contents: {
+               script: /(?:java|ecma)script/
+       },
+       converters: {
+               "text script": function( text ) {
+                       jQuery.globalEval( text );
+                       return text;
                }
        }
+});
 
-       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 ];
-                       });
-               }
+// 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;
+       }
+});
 
+// Bind script tag hack transport
+jQuery.ajaxTransport( "script", function(s) {
 
-       // show/hide pass
-       for ( index in props ) {
-               value = props[ index ];
-               if ( rfxtypes.exec( value ) ) {
-                       delete props[ index ];
-                       toggle = toggle || value === "toggle";
-                       if ( value === ( hidden ? "hide" : "show" ) ) {
-                               continue;
-                       }
-                       handled.push( index );
-               }
-       }
+       // This transport only deals with cross domain requests
+       if ( s.crossDomain ) {
 
-       length = handled.length;
-       if ( length ) {
-               dataShow = jQuery._data( elem, "fxshow" ) || jQuery._data( elem, "fxshow", {} );
-               if ( "hidden" in dataShow ) {
-                       hidden = dataShow.hidden;
-               }
+               var script,
+                       head = document.head || jQuery("head")[0] || document.documentElement;
 
-               // store state if its toggle - enables .stop().toggle() to "reverse"
-               if ( toggle ) {
-                       dataShow.hidden = !hidden;
-               }
-               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 );
+               return {
 
-                       if ( !( prop in dataShow ) ) {
-                               dataShow[ prop ] = tween.start;
-                               if ( hidden ) {
-                                       tween.end = tween.start;
-                                       tween.start = prop === "width" || prop === "height" ? 1 : 0;
-                               }
-                       }
-               }
-       }
-}
+                       send: function( _, callback ) {
 
-function Tween( elem, options, prop, end, easing ) {
-       return new Tween.prototype.init( elem, options, prop, end, easing );
-}
-jQuery.Tween = Tween;
+                               script = document.createElement("script");
 
-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 ];
+                               script.async = true;
 
-               return hooks && hooks.get ?
-                       hooks.get( this ) :
-                       Tween.propHooks._default.get( this );
-       },
-       run: function( percent ) {
-               var eased,
-                       hooks = Tween.propHooks[ this.prop ];
+                               if ( s.scriptCharset ) {
+                                       script.charset = s.scriptCharset;
+                               }
 
-               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;
+                               script.src = s.url;
 
-               if ( this.options.step ) {
-                       this.options.step.call( this.elem, this.now, this );
-               }
+                               // Attach handlers for all browsers
+                               script.onload = script.onreadystatechange = function( _, isAbort ) {
 
-               if ( hooks && hooks.set ) {
-                       hooks.set( this );
-               } else {
-                       Tween.propHooks._default.set( this );
-               }
-               return this;
-       }
-};
+                                       if ( isAbort || !script.readyState || /loaded|complete/.test( script.readyState ) ) {
 
-Tween.prototype.init.prototype = Tween.prototype;
+                                               // Handle memory leak in IE
+                                               script.onload = script.onreadystatechange = null;
 
-Tween.propHooks = {
-       _default: {
-               get: function( tween ) {
-                       var result;
+                                               // Remove the script
+                                               if ( script.parentNode ) {
+                                                       script.parentNode.removeChild( script );
+                                               }
 
-                       if ( tween.elem[ tween.prop ] != null &&
-                               (!tween.elem.style || tween.elem.style[ tween.prop ] == null) ) {
-                               return tween.elem[ tween.prop ];
-                       }
+                                               // Dereference the script
+                                               script = null;
 
-                       // 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;
+                                               // Callback if not abort
+                                               if ( !isAbort ) {
+                                                       callback( 200, "success" );
+                                               }
+                                       }
+                               };
+
+                               // Circumvent IE6 bugs with base elements (#2709 and #4378) by prepending
+                               // Use native DOM manipulation to avoid our domManip AJAX trickery
+                               head.insertBefore( script, head.firstChild );
+                       },
+
+                       abort: function() {
+                               if ( script ) {
+                                       script.onload( undefined, true );
+                               }
                        }
-               }
+               };
        }
-};
+});
 
-// 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 );
-       };
+
+var oldCallbacks = [],
+       rjsonp = /(=)\?(?=&|$)|\?\?/;
+
+// Default jsonp settings
+jQuery.ajaxSetup({
+       jsonp: "callback",
+       jsonpCallback: function() {
+               var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( nonce++ ) );
+               this[ callback ] = true;
+               return callback;
+       }
 });
 
-jQuery.fn.extend({
-       fadeTo: function( speed, to, easing, callback ) {
+// Detect, normalize options and install callbacks for jsonp requests
+jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
 
-               // show any hidden elements after setting opacity to 0
-               return this.filter( isHidden ).css( "opacity", 0 ).show()
+       var callbackName, overwritten, responseContainer,
+               jsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ?
+                       "url" :
+                       typeof s.data === "string" && !( s.contentType || "" ).indexOf("application/x-www-form-urlencoded") && rjsonp.test( s.data ) && "data"
+               );
 
-                       // 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 );
+       // Handle iff the expected data type is "jsonp" or we have a parameter to set
+       if ( jsonProp || s.dataTypes[ 0 ] === "jsonp" ) {
 
-                               // Empty animations resolve immediately
-                               if ( empty ) {
-                                       anim.stop( true );
-                               }
-                       };
+               // Get callback name, remembering preexisting value associated with it
+               callbackName = s.jsonpCallback = jQuery.isFunction( s.jsonpCallback ) ?
+                       s.jsonpCallback() :
+                       s.jsonpCallback;
 
-               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 );
+               // Insert callback into url or form data
+               if ( jsonProp ) {
+                       s[ jsonProp ] = s[ jsonProp ].replace( rjsonp, "$1" + callbackName );
+               } else if ( s.jsonp !== false ) {
+                       s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.jsonp + "=" + callbackName;
+               }
+
+               // 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 ];
                };
 
-               if ( typeof type !== "string" ) {
-                       gotoEnd = clearQueue;
-                       clearQueue = type;
-                       type = undefined;
-               }
-               if ( clearQueue && type !== false ) {
-                       this.queue( type || "fx", [] );
-               }
+               // force json dataType
+               s.dataTypes[ 0 ] = "json";
 
-               return this.each(function() {
-                       var dequeue = true,
-                               index = type != null && type + "queueHooks",
-                               timers = jQuery.timers,
-                               data = jQuery._data( this );
+               // Install callback
+               overwritten = window[ callbackName ];
+               window[ callbackName ] = function() {
+                       responseContainer = arguments;
+               };
+
+               // Clean-up function (fires after converters)
+               jqXHR.always(function() {
+                       // Restore preexisting value
+                       window[ callbackName ] = overwritten;
+
+                       // Save back as free
+                       if ( s[ callbackName ] ) {
+                               // make sure that re-using the options doesn't screw things around
+                               s.jsonpCallback = originalSettings.jsonpCallback;
 
-                       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 ] );
-                                       }
-                               }
+                               // save the callback name for future use
+                               oldCallbacks.push( callbackName );
                        }
 
-                       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 );
-                               }
+                       // Call if it was a function and we have a response
+                       if ( responseContainer && jQuery.isFunction( overwritten ) ) {
+                               overwritten( responseContainer[ 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 );
-                       }
+                       responseContainer = overwritten = undefined;
                });
+
+               // Delegate to script
+               return "script";
        }
 });
 
-// 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;
-}
+// data: string of html
+// context (optional): If specified, the fragment will be created in this context, defaults to document
+// keepScripts (optional): If true, will include scripts passed in the html string
+jQuery.parseHTML = function( data, context, keepScripts ) {
+       if ( !data || typeof data !== "string" ) {
+               return null;
+       }
+       if ( typeof context === "boolean" ) {
+               keepScripts = context;
+               context = false;
+       }
+       context = context || document;
 
-// 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 );
-       };
-});
+       var parsed = rsingleTag.exec( data ),
+               scripts = !keepScripts && [];
 
-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
-       };
+       // Single tag
+       if ( parsed ) {
+               return [ context.createElement( parsed[1] ) ];
+       }
 
-       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;
+       parsed = jQuery.buildFragment( [ data ], context, scripts );
 
-       // normalize opt.queue - true/undefined/null -> "fx"
-       if ( opt.queue == null || opt.queue === true ) {
-               opt.queue = "fx";
+       if ( scripts && scripts.length ) {
+               jQuery( scripts ).remove();
        }
 
-       // Queueing
-       opt.old = opt.complete;
-
-       opt.complete = function() {
-               if ( jQuery.isFunction( opt.old ) ) {
-                       opt.old.call( this );
-               }
+       return jQuery.merge( [], parsed.childNodes );
+};
 
-               if ( opt.queue ) {
-                       jQuery.dequeue( this, opt.queue );
-               }
-       };
 
-       return opt;
-};
+// Keep a copy of the old load method
+var _load = jQuery.fn.load;
 
-jQuery.easing = {
-       linear: function( p ) {
-               return p;
-       },
-       swing: function( p ) {
-               return 0.5 - Math.cos( p*Math.PI ) / 2;
+/**
+ * Load a url into a page
+ */
+jQuery.fn.load = function( url, params, callback ) {
+       if ( typeof url !== "string" && _load ) {
+               return _load.apply( this, arguments );
        }
-};
-
-jQuery.timers = [];
-jQuery.fx = Tween.prototype.init;
-jQuery.fx.tick = function() {
-       var timer,
-               timers = jQuery.timers,
-               i = 0;
 
-       fxNow = jQuery.now();
+       var selector, response, type,
+               self = this,
+               off = url.indexOf(" ");
 
-       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 ( off >= 0 ) {
+               selector = jQuery.trim( url.slice( off, url.length ) );
+               url = url.slice( 0, off );
        }
 
-       if ( !timers.length ) {
-               jQuery.fx.stop();
-       }
-       fxNow = undefined;
-};
+       // If it's a function
+       if ( jQuery.isFunction( params ) ) {
 
-jQuery.fx.timer = function( timer ) {
-       if ( timer() && jQuery.timers.push( timer ) && !timerId ) {
-               timerId = setInterval( jQuery.fx.tick, jQuery.fx.interval );
-       }
-};
+               // We assume that it's the callback
+               callback = params;
+               params = undefined;
 
-jQuery.fx.interval = 13;
+       // Otherwise, build a param string
+       } else if ( params && typeof params === "object" ) {
+               type = "POST";
+       }
 
-jQuery.fx.stop = function() {
-       clearInterval( timerId );
-       timerId = null;
-};
+       // If we have elements to modify, make the request
+       if ( self.length > 0 ) {
+               jQuery.ajax({
+                       url: url,
 
-jQuery.fx.speeds = {
-       slow: 600,
-       fast: 200,
-       // Default speed
-       _default: 400
-};
+                       // if "type" variable is undefined, then "GET" method will be used
+                       type: type,
+                       dataType: "html",
+                       data: params
+               }).done(function( responseText ) {
 
-// Back Compat <1.8 extension point
-jQuery.fx.step = {};
+                       // Save response for use in complete callback
+                       response = arguments;
 
-if ( jQuery.expr && jQuery.expr.filters ) {
-       jQuery.expr.filters.animated = function( elem ) {
-               return jQuery.grep(jQuery.timers, function( fn ) {
-                       return elem === fn.elem;
-               }).length;
-       };
-}
-var rroot = /^(?:body|html)$/i;
+                       self.html( selector ?
 
-jQuery.fn.offset = function( options ) {
-       if ( arguments.length ) {
-               return options === undefined ?
-                       this :
-                       this.each(function( i ) {
-                               jQuery.offset.setOffset( this, options, i );
-                       });
-       }
+                               // If a selector was specified, locate the right elements in a dummy div
+                               // Exclude scripts to avoid IE 'Permission Denied' errors
+                               jQuery("<div>").append( jQuery.parseHTML( responseText ) ).find( selector ) :
 
-       var docElem, body, win, clientTop, clientLeft, scrollTop, scrollLeft,
-               box = { top: 0, left: 0 },
-               elem = this[ 0 ],
-               doc = elem && elem.ownerDocument;
+                               // Otherwise use the full result
+                               responseText );
 
-       if ( !doc ) {
-               return;
+               }).complete( callback && function( jqXHR, status ) {
+                       self.each( callback, response || [ jqXHR.responseText, status, jqXHR ] );
+               });
        }
 
-       if ( (body = doc.body) === elem ) {
-               return jQuery.offset.bodyOffset( elem );
-       }
+       return this;
+};
 
-       docElem = doc.documentElement;
 
-       // Make sure it's not a disconnected DOM node
-       if ( !jQuery.contains( docElem, elem ) ) {
-               return box;
-       }
 
-       // If we don't have gBCR, just use 0,0 rather than error
-       // BlackBerry 5, iOS 3 (original iPhone)
-       if ( typeof elem.getBoundingClientRect !== "undefined" ) {
-               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;
-       return {
-               top: box.top  + scrollTop  - clientTop,
-               left: box.left + scrollLeft - clientLeft
-       };
+
+jQuery.expr.filters.animated = function( elem ) {
+       return jQuery.grep(jQuery.timers, function( fn ) {
+               return elem === fn.elem;
+       }).length;
 };
 
-jQuery.offset = {
 
-       bodyOffset: function( body ) {
-               var top = body.offsetTop,
-                       left = body.offsetLeft;
 
-               if ( jQuery.support.doesNotIncludeMarginInBodyOffset ) {
-                       top  += parseFloat( jQuery.css(body, "marginTop") ) || 0;
-                       left += parseFloat( jQuery.css(body, "marginLeft") ) || 0;
-               }
 
-               return { top: top, left: left };
-       },
 
+var docElem = window.document.documentElement;
+
+/**
+ * Gets a window from an element
+ */
+function getWindow( elem ) {
+       return jQuery.isWindow( elem ) ?
+               elem :
+               elem.nodeType === 9 ?
+                       elem.defaultView || elem.parentWindow :
+                       false;
+}
+
+jQuery.offset = {
        setOffset: function( elem, options, i ) {
-               var position = jQuery.css( elem, "position" );
+               var curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition,
+                       position = jQuery.css( elem, "position" ),
+                       curElem = jQuery( elem ),
+                       props = {};
 
                // set position first, in-case top/left are set even on static elem
                if ( position === "static" ) {
                        elem.style.position = "relative";
                }
 
-               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;
+               curOffset = curElem.offset();
+               curCSSTop = jQuery.css( elem, "top" );
+               curCSSLeft = jQuery.css( elem, "left" );
+               calculatePosition = ( position === "absolute" || position === "fixed" ) &&
+                       jQuery.inArray("auto", [ curCSSTop, curCSSLeft ] ) > -1;
 
                // need to be able to calculate position if either top or left is auto and position is either absolute or fixed
                if ( calculatePosition ) {
@@ -9329,58 +10066,99 @@ jQuery.offset = {
        }
 };
 
-
 jQuery.fn.extend({
+       offset: function( options ) {
+               if ( arguments.length ) {
+                       return options === undefined ?
+                               this :
+                               this.each(function( i ) {
+                                       jQuery.offset.setOffset( this, options, i );
+                               });
+               }
+
+               var docElem, win,
+                       box = { top: 0, left: 0 },
+                       elem = this[ 0 ],
+                       doc = elem && elem.ownerDocument;
+
+               if ( !doc ) {
+                       return;
+               }
+
+               docElem = doc.documentElement;
+
+               // Make sure it's not a disconnected DOM node
+               if ( !jQuery.contains( docElem, elem ) ) {
+                       return box;
+               }
+
+               // If we don't have gBCR, just use 0,0 rather than error
+               // BlackBerry 5, iOS 3 (original iPhone)
+               if ( typeof elem.getBoundingClientRect !== strundefined ) {
+                       box = elem.getBoundingClientRect();
+               }
+               win = getWindow( doc );
+               return {
+                       top: box.top  + ( win.pageYOffset || docElem.scrollTop )  - ( docElem.clientTop  || 0 ),
+                       left: box.left + ( win.pageXOffset || docElem.scrollLeft ) - ( docElem.clientLeft || 0 )
+               };
+       },
 
        position: function() {
-               if ( !this[0] ) {
+               if ( !this[ 0 ] ) {
                        return;
                }
 
-               var elem = this[0],
+               var offsetParent, offset,
+                       parentOffset = { top: 0, left: 0 },
+                       elem = this[ 0 ];
+
+               // fixed elements are offset from window (parentOffset = {top:0, left: 0}, because it is its only offset parent
+               if ( jQuery.css( elem, "position" ) === "fixed" ) {
+                       // we assume that getBoundingClientRect is available when computed position is fixed
+                       offset = elem.getBoundingClientRect();
+               } else {
+                       // Get *real* offsetParent
+                       offsetParent = this.offsetParent();
 
-               // Get *real* offsetParent
-               offsetParent = this.offsetParent(),
+                       // Get correct offsets
+                       offset = this.offset();
+                       if ( !jQuery.nodeName( offsetParent[ 0 ], "html" ) ) {
+                               parentOffset = offsetParent.offset();
+                       }
 
-               // Get correct offsets
-               offset       = this.offset(),
-               parentOffset = rroot.test(offsetParent[0].nodeName) ? { top: 0, left: 0 } : offsetParent.offset();
+                       // Add offsetParent borders
+                       parentOffset.top  += jQuery.css( offsetParent[ 0 ], "borderTopWidth", true );
+                       parentOffset.left += jQuery.css( offsetParent[ 0 ], "borderLeftWidth", true );
+               }
 
-               // Subtract element margins
+               // Subtract parent offsets and 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;
-
-               // Subtract the two offsets
                return {
-                       top:  offset.top  - parentOffset.top,
-                       left: offset.left - parentOffset.left
+                       top:  offset.top  - parentOffset.top - jQuery.css( elem, "marginTop", true ),
+                       left: offset.left - parentOffset.left - jQuery.css( elem, "marginLeft", true)
                };
        },
 
        offsetParent: function() {
                return this.map(function() {
-                       var offsetParent = this.offsetParent || document.body;
-                       while ( offsetParent && (!rroot.test(offsetParent.nodeName) && jQuery.css(offsetParent, "position") === "static") ) {
+                       var offsetParent = this.offsetParent || docElem;
+
+                       while ( offsetParent && ( !jQuery.nodeName( offsetParent, "html" ) && jQuery.css( offsetParent, "position" ) === "static" ) ) {
                                offsetParent = offsetParent.offsetParent;
                        }
-                       return offsetParent || document.body;
+                       return offsetParent || docElem;
                });
        }
 });
 
-
 // Create scrollLeft and scrollTop methods
-jQuery.each( {scrollLeft: "pageXOffset", scrollTop: "pageYOffset"}, function( method, prop ) {
+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 ) {
+               return access( this, function( elem, method, val ) {
                        var win = getWindow( elem );
 
                        if ( val === undefined ) {
@@ -9392,7 +10170,7 @@ jQuery.each( {scrollLeft: "pageXOffset", scrollTop: "pageYOffset"}, function( me
                        if ( win ) {
                                win.scrollTo(
                                        !top ? val : jQuery( win ).scrollLeft(),
-                                        top ? val : jQuery( win ).scrollTop()
+                                       top ? val : jQuery( win ).scrollTop()
                                );
 
                        } else {
@@ -9402,13 +10180,25 @@ jQuery.each( {scrollLeft: "pageXOffset", scrollTop: "pageYOffset"}, function( me
        };
 });
 
-function getWindow( elem ) {
-       return jQuery.isWindow( elem ) ?
-               elem :
-               elem.nodeType === 9 ?
-                       elem.defaultView || elem.parentWindow :
-                       false;
-}
+// Add the top/left cssHooks using jQuery.fn.position
+// 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
+jQuery.each( [ "top", "left" ], function( i, prop ) {
+       jQuery.cssHooks[ prop ] = addGetHookIf( support.pixelPosition,
+               function( elem, computed ) {
+                       if ( computed ) {
+                               computed = curCSS( elem, prop );
+                               // if curCSS returns percentage, fallback to offset
+                               return rnumnonpx.test( computed ) ?
+                                       jQuery( elem ).position()[ prop ] + "px" :
+                                       computed;
+                       }
+               }
+       );
+});
+
+
 // 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 ) {
@@ -9417,7 +10207,7 @@ jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
                        var chainable = arguments.length && ( defaultExtra || typeof margin !== "boolean" ),
                                extra = defaultExtra || ( margin === true || value === true ? "margin" : "border" );
 
-                       return jQuery.access( this, function( elem, type, value ) {
+                       return access( this, function( elem, type, value ) {
                                var doc;
 
                                if ( jQuery.isWindow( elem ) ) {
@@ -9442,7 +10232,7 @@ jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
 
                                return value === undefined ?
                                        // Get width or height on the element, requesting but not forcing parseFloat
-                                       jQuery.css( elem, type, value, extra ) :
+                                       jQuery.css( elem, type, extra ) :
 
                                        // Set width or height on the element
                                        jQuery.style( elem, type, value, extra );
@@ -9450,23 +10240,69 @@ jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
                };
        });
 });
-// Expose jQuery to the global object
-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
-// in a page that all might call define(). The loader will indicate
-// they have special allowances for multiple jQuery versions by
-// specifying define.amd.jQuery = true. Register as a named module,
-// since jQuery can be concatenated with other files that may use define,
-// but not use a proper concatenation script that understands anonymous
-// AMD modules. A named AMD is safest and most robust way to register.
-// Lowercase jquery is used because AMD module names are derived from
-// 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; } );
+
+
+// The number of elements contained in the matched element set
+jQuery.fn.size = function() {
+       return this.length;
+};
+
+jQuery.fn.andSelf = jQuery.fn.addBack;
+
+
+
+
+// Register as a named AMD module, since jQuery can be concatenated with other
+// files that may use define, but not via a proper concatenation script that
+// understands anonymous AMD modules. A named AMD is safest and most robust
+// way to register. Lowercase jquery is used because AMD module names are
+// derived from 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.
+
+// Note that for maximum portability, libraries that are not jQuery should
+// declare themselves as anonymous modules, and avoid setting a global if an
+// AMD loader is present. jQuery is a special case. For more information, see
+// https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon
+
+if ( typeof define === "function" && define.amd ) {
+       define( "jquery", [], function() {
+               return jQuery;
+       });
 }
 
-})( window );
+
+
+
+var
+       // Map over jQuery in case of overwrite
+       _jQuery = window.jQuery,
+
+       // Map over the $ in case of overwrite
+       _$ = window.$;
+
+jQuery.noConflict = function( deep ) {
+       if ( window.$ === jQuery ) {
+               window.$ = _$;
+       }
+
+       if ( deep && window.jQuery === jQuery ) {
+               window.jQuery = _jQuery;
+       }
+
+       return jQuery;
+};
+
+// Expose jQuery and $ identifiers, even in
+// AMD (#7102#comment:10, https://github.com/jquery/jquery/pull/557)
+// and CommonJS for browser emulators (#13566)
+if ( typeof noGlobal === strundefined ) {
+       window.jQuery = window.$ = jQuery;
+}
+
+
+
+
+return jQuery;
+
+}));
diff --git a/resources/lib/jquery/jquery.migrate.js b/resources/lib/jquery/jquery.migrate.js
new file mode 100644 (file)
index 0000000..25b6c81
--- /dev/null
@@ -0,0 +1,521 @@
+/*!
+ * jQuery Migrate - v1.2.1 - 2013-05-08
+ * https://github.com/jquery/jquery-migrate
+ * Copyright 2005, 2013 jQuery Foundation, Inc. and other contributors; Licensed MIT
+ */
+(function( jQuery, window, undefined ) {
+// See http://bugs.jquery.com/ticket/13335
+// "use strict";
+
+
+var warnedAbout = {};
+
+// List of warnings already given; public read only
+jQuery.migrateWarnings = [];
+
+// Set to true to prevent console output; migrateWarnings still maintained
+// jQuery.migrateMute = false;
+
+// Show a message on the console so devs know we're active
+if ( !jQuery.migrateMute && window.console && window.console.log ) {
+       window.console.log("JQMIGRATE: Logging is active");
+}
+
+// Set to false to disable traces that appear with warnings
+if ( jQuery.migrateTrace === undefined ) {
+       jQuery.migrateTrace = true;
+}
+
+// Forget any warnings we've already given; public
+jQuery.migrateReset = function() {
+       warnedAbout = {};
+       jQuery.migrateWarnings.length = 0;
+};
+
+function migrateWarn( msg) {
+       var console = window.console;
+       if ( !warnedAbout[ msg ] ) {
+               warnedAbout[ msg ] = true;
+               jQuery.migrateWarnings.push( msg );
+               if ( console && console.warn && !jQuery.migrateMute ) {
+                       console.warn( "JQMIGRATE: " + msg );
+                       if ( jQuery.migrateTrace && console.trace ) {
+                               console.trace();
+                       }
+               }
+       }
+}
+
+function migrateWarnProp( obj, prop, value, msg ) {
+       if ( Object.defineProperty ) {
+               // On ES5 browsers (non-oldIE), warn if the code tries to get prop;
+               // allow property to be overwritten in case some other plugin wants it
+               try {
+                       Object.defineProperty( obj, prop, {
+                               configurable: true,
+                               enumerable: true,
+                               get: function() {
+                                       migrateWarn( msg );
+                                       return value;
+                               },
+                               set: function( newValue ) {
+                                       migrateWarn( msg );
+                                       value = newValue;
+                               }
+                       });
+                       return;
+               } catch( err ) {
+                       // IE8 is a dope about Object.defineProperty, can't warn there
+               }
+       }
+
+       // Non-ES5 (or broken) browser; just set the property
+       jQuery._definePropertyBroken = true;
+       obj[ prop ] = value;
+}
+
+if ( document.compatMode === "BackCompat" ) {
+       // jQuery has never supported or tested Quirks Mode
+       migrateWarn( "jQuery is not compatible with Quirks Mode" );
+}
+
+
+var attrFn = jQuery( "<input/>", { size: 1 } ).attr("size") && jQuery.attrFn,
+       oldAttr = jQuery.attr,
+       valueAttrGet = jQuery.attrHooks.value && jQuery.attrHooks.value.get ||
+               function() { return null; },
+       valueAttrSet = jQuery.attrHooks.value && jQuery.attrHooks.value.set ||
+               function() { return undefined; },
+       rnoType = /^(?:input|button)$/i,
+       rnoAttrNodeType = /^[238]$/,
+       rboolean = /^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,
+       ruseDefault = /^(?:checked|selected)$/i;
+
+// jQuery.attrFn
+migrateWarnProp( jQuery, "attrFn", attrFn || {}, "jQuery.attrFn is deprecated" );
+
+jQuery.attr = function( elem, name, value, pass ) {
+       var lowerName = name.toLowerCase(),
+               nType = elem && elem.nodeType;
+
+       if ( pass ) {
+               // Since pass is used internally, we only warn for new jQuery
+               // versions where there isn't a pass arg in the formal params
+               if ( oldAttr.length < 4 ) {
+                       migrateWarn("jQuery.fn.attr( props, pass ) is deprecated");
+               }
+               if ( elem && !rnoAttrNodeType.test( nType ) &&
+                       (attrFn ? name in attrFn : jQuery.isFunction(jQuery.fn[name])) ) {
+                       return jQuery( elem )[ name ]( value );
+               }
+       }
+
+       // Warn if user tries to set `type`, since it breaks on IE 6/7/8; by checking
+       // for disconnected elements we don't warn on $( "<button>", { type: "button" } ).
+       if ( name === "type" && value !== undefined && rnoType.test( elem.nodeName ) && elem.parentNode ) {
+               migrateWarn("Can't change the 'type' of an input or button in IE 6/7/8");
+       }
+
+       // Restore boolHook for boolean property/attribute synchronization
+       if ( !jQuery.attrHooks[ lowerName ] && rboolean.test( lowerName ) ) {
+               jQuery.attrHooks[ lowerName ] = {
+                       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;
+                       }
+               };
+
+               // Warn only for attributes that can remain distinct from their properties post-1.9
+               if ( ruseDefault.test( lowerName ) ) {
+                       migrateWarn( "jQuery.fn.attr('" + lowerName + "') may use property instead of attribute" );
+               }
+       }
+
+       return oldAttr.call( jQuery, elem, name, value );
+};
+
+// attrHooks: value
+jQuery.attrHooks.value = {
+       get: function( elem, name ) {
+               var nodeName = ( elem.nodeName || "" ).toLowerCase();
+               if ( nodeName === "button" ) {
+                       return valueAttrGet.apply( this, arguments );
+               }
+               if ( nodeName !== "input" && nodeName !== "option" ) {
+                       migrateWarn("jQuery.fn.attr('value') no longer gets properties");
+               }
+               return name in elem ?
+                       elem.value :
+                       null;
+       },
+       set: function( elem, value ) {
+               var nodeName = ( elem.nodeName || "" ).toLowerCase();
+               if ( nodeName === "button" ) {
+                       return valueAttrSet.apply( this, arguments );
+               }
+               if ( nodeName !== "input" && nodeName !== "option" ) {
+                       migrateWarn("jQuery.fn.attr('value', val) no longer sets properties");
+               }
+               // Does not return so that setAttribute is also used
+               elem.value = value;
+       }
+};
+
+
+var matched, browser,
+       oldInit = jQuery.fn.init,
+       oldParseJSON = jQuery.parseJSON,
+       // Note: XSS check is done below after string is trimmed
+       rquickExpr = /^([^<]*)(<[\w\W]+>)([^>]*)$/;
+
+// $(html) "looks like html" rule change
+jQuery.fn.init = function( selector, context, rootjQuery ) {
+       var match;
+
+       if ( selector && typeof selector === "string" && !jQuery.isPlainObject( context ) &&
+                       (match = rquickExpr.exec( jQuery.trim( selector ) )) && match[ 0 ] ) {
+               // This is an HTML string according to the "old" rules; is it still?
+               if ( selector.charAt( 0 ) !== "<" ) {
+                       migrateWarn("$(html) HTML strings must start with '<' character");
+               }
+               if ( match[ 3 ] ) {
+                       migrateWarn("$(html) HTML text after last tag is ignored");
+               }
+               // Consistently reject any HTML-like string starting with a hash (#9521)
+               // Note that this may break jQuery 1.6.x code that otherwise would work.
+               if ( match[ 0 ].charAt( 0 ) === "#" ) {
+                       migrateWarn("HTML string cannot start with a '#' character");
+                       jQuery.error("JQMIGRATE: Invalid selector string (XSS)");
+               }
+               // Now process using loose rules; let pre-1.8 play too
+               if ( context && context.context ) {
+                       // jQuery object as context; parseHTML expects a DOM object
+                       context = context.context;
+               }
+               if ( jQuery.parseHTML ) {
+                       return oldInit.call( this, jQuery.parseHTML( match[ 2 ], context, true ),
+                                       context, rootjQuery );
+               }
+       }
+       return oldInit.apply( this, arguments );
+};
+jQuery.fn.init.prototype = jQuery.fn;
+
+// Let $.parseJSON(falsy_value) return null
+jQuery.parseJSON = function( json ) {
+       if ( !json && json !== null ) {
+               migrateWarn("jQuery.parseJSON requires a valid JSON string");
+               return null;
+       }
+       return oldParseJSON.apply( this, arguments );
+};
+
+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"
+       };
+};
+
+// Don't clobber any existing jQuery.browser in case it's different
+if ( !jQuery.browser ) {
+       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;
+       }
+
+       jQuery.browser = browser;
+}
+
+// Warn if the code tries to get jQuery.browser
+migrateWarnProp( jQuery, "browser", jQuery.browser, "jQuery.browser is deprecated" );
+
+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 );
+               }
+
+               return jQuery.fn.init.call( this, selector, context, rootjQuerySub );
+       };
+       jQuerySub.fn.init.prototype = jQuerySub.fn;
+       var rootjQuerySub = jQuerySub(document);
+       migrateWarn( "jQuery.sub() is deprecated" );
+       return jQuerySub;
+};
+
+
+// Ensure that $.ajax gets the new parseJSON defined in core.js
+jQuery.ajaxSetup({
+       converters: {
+               "text json": jQuery.parseJSON
+       }
+});
+
+
+var oldFnData = jQuery.fn.data;
+
+jQuery.fn.data = function( name ) {
+       var ret, evt,
+               elem = this[0];
+
+       // Handles 1.7 which has this behavior and 1.8 which doesn't
+       if ( elem && name === "events" && arguments.length === 1 ) {
+               ret = jQuery.data( elem, name );
+               evt = jQuery._data( elem, name );
+               if ( ( ret === undefined || ret === evt ) && evt !== undefined ) {
+                       migrateWarn("Use of jQuery.fn.data('events') is deprecated");
+                       return evt;
+               }
+       }
+       return oldFnData.apply( this, arguments );
+};
+
+
+var rscriptType = /\/(java|ecma)script/i,
+       oldSelf = jQuery.fn.andSelf || jQuery.fn.addBack;
+
+jQuery.fn.andSelf = function() {
+       migrateWarn("jQuery.fn.andSelf() replaced by jQuery.fn.addBack()");
+       return oldSelf.apply( this, arguments );
+};
+
+// Since jQuery.clean is used internally on older versions, we only shim if it's missing
+if ( !jQuery.clean ) {
+       jQuery.clean = function( elems, context, fragment, scripts ) {
+               // Set context per 1.8 logic
+               context = context || document;
+               context = !context.nodeType && context[0] || context;
+               context = context.ownerDocument || context;
+
+               migrateWarn("jQuery.clean() is deprecated");
+
+               var i, elem, handleScript, jsTags,
+                       ret = [];
+
+               jQuery.merge( ret, jQuery.buildFragment( elems, context ).childNodes );
+
+               // Complex logic lifted directly from jQuery 1.8
+               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;
+                                       }
+                               }
+                       }
+               }
+
+               return ret;
+       };
+}
+
+var eventAdd = jQuery.event.add,
+       eventRemove = jQuery.event.remove,
+       eventTrigger = jQuery.event.trigger,
+       oldToggle = jQuery.fn.toggle,
+       oldLive = jQuery.fn.live,
+       oldDie = jQuery.fn.die,
+       ajaxEvents = "ajaxStart|ajaxStop|ajaxSend|ajaxComplete|ajaxError|ajaxSuccess",
+       rajaxEvent = new RegExp( "\\b(?:" + ajaxEvents + ")\\b" ),
+       rhoverHack = /(?:^|\s)hover(\.\S+|)\b/,
+       hoverHack = function( events ) {
+               if ( typeof( events ) !== "string" || jQuery.event.special.hover ) {
+                       return events;
+               }
+               if ( rhoverHack.test( events ) ) {
+                       migrateWarn("'hover' pseudo-event is deprecated, use 'mouseenter mouseleave'");
+               }
+               return events && events.replace( rhoverHack, "mouseenter$1 mouseleave$1" );
+       };
+
+// Event props removed in 1.9, put them back if needed; no practical way to warn them
+if ( jQuery.event.props && jQuery.event.props[ 0 ] !== "attrChange" ) {
+       jQuery.event.props.unshift( "attrChange", "attrName", "relatedNode", "srcElement" );
+}
+
+// Undocumented jQuery.event.handle was "deprecated" in jQuery 1.7
+if ( jQuery.event.dispatch ) {
+       migrateWarnProp( jQuery.event, "handle", jQuery.event.dispatch, "jQuery.event.handle is undocumented and deprecated" );
+}
+
+// Support for 'hover' pseudo-event and ajax event warnings
+jQuery.event.add = function( elem, types, handler, data, selector ){
+       if ( elem !== document && rajaxEvent.test( types ) ) {
+               migrateWarn( "AJAX events should be attached to document: " + types );
+       }
+       eventAdd.call( this, elem, hoverHack( types || "" ), handler, data, selector );
+};
+jQuery.event.remove = function( elem, types, handler, selector, mappedTypes ){
+       eventRemove.call( this, elem, hoverHack( types ) || "", handler, selector, mappedTypes );
+};
+
+jQuery.fn.error = function() {
+       var args = Array.prototype.slice.call( arguments, 0);
+       migrateWarn("jQuery.fn.error() is deprecated");
+       args.splice( 0, 0, "error" );
+       if ( arguments.length ) {
+               return this.bind.apply( this, args );
+       }
+       // error event should not bubble to window, although it does pre-1.7
+       this.triggerHandler.apply( this, args );
+       return this;
+};
+
+jQuery.fn.toggle = function( fn, fn2 ) {
+
+       // Don't mess with animation or css toggles
+       if ( !jQuery.isFunction( fn ) || !jQuery.isFunction( fn2 ) ) {
+               return oldToggle.apply( this, arguments );
+       }
+       migrateWarn("jQuery.fn.toggle(handler, handler...) is deprecated");
+
+       // 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 );
+};
+
+jQuery.fn.live = function( types, data, fn ) {
+       migrateWarn("jQuery.fn.live() is deprecated");
+       if ( oldLive ) {
+               return oldLive.apply( this, arguments );
+       }
+       jQuery( this.context ).on( types, this.selector, data, fn );
+       return this;
+};
+
+jQuery.fn.die = function( types, fn ) {
+       migrateWarn("jQuery.fn.die() is deprecated");
+       if ( oldDie ) {
+               return oldDie.apply( this, arguments );
+       }
+       jQuery( this.context ).off( types, this.selector || "**", fn );
+       return this;
+};
+
+// Turn global events into document-triggered events
+jQuery.event.trigger = function( event, data, elem, onlyHandlers  ){
+       if ( !elem && !rajaxEvent.test( event ) ) {
+               migrateWarn( "Global events are undocumented and deprecated" );
+       }
+       return eventTrigger.call( this,  event, data, elem || document, onlyHandlers  );
+};
+jQuery.each( ajaxEvents.split("|"),
+       function( _, name ) {
+               jQuery.event.special[ name ] = {
+                       setup: function() {
+                               var elem = this;
+
+                               // The document needs no shimming; must be !== for oldIE
+                               if ( elem !== document ) {
+                                       jQuery.event.add( document, name + "." + jQuery.guid, function() {
+                                               jQuery.event.trigger( name, null, elem, true );
+                                       });
+                                       jQuery._data( this, name, jQuery.guid++ );
+                               }
+                               return false;
+                       },
+                       teardown: function() {
+                               if ( this !== document ) {
+                                       jQuery.event.remove( document, name + "." + jQuery._data( this, name ) );
+                               }
+                               return false;
+                       }
+               };
+       }
+);
+
+
+})( jQuery, window );
index 278c4b4..97ed48c 100644 (file)
@@ -17,5 +17,9 @@
        "ooui-outline-control-move-down": "Element nach unten verschieben",
        "ooui-outline-control-move-up": "Element nach oben verschieben",
        "ooui-outline-control-remove": "Element entfernen",
-       "ooui-toolbar-more": "Mehr"
+       "ooui-toolbar-more": "Mehr",
+       "ooui-dialog-confirm-title": "Bestätigen",
+       "ooui-dialog-confirm-default-prompt": "Bist du sicher?",
+       "ooui-dialog-confirm-default-ok": "Okay",
+       "ooui-dialog-confirm-default-cancel": "Abbrechen"
 }
index 5ff9915..2498a76 100644 (file)
@@ -20,5 +20,9 @@
     "ooui-outline-control-move-down": "Move item down",
     "ooui-outline-control-move-up": "Move item up",
     "ooui-outline-control-remove": "Remove item",
-    "ooui-toolbar-more": "More"
+    "ooui-toolbar-more": "More",
+    "ooui-dialog-confirm-title": "Confirm",
+    "ooui-dialog-confirm-default-prompt": "Are you sure?",
+    "ooui-dialog-confirm-default-ok": "OK",
+    "ooui-dialog-confirm-default-cancel": "Cancel"
 }
index b2587ca..ec051ac 100644 (file)
@@ -17,5 +17,9 @@
        "ooui-outline-control-move-down": "انتقال مورد به پایین",
        "ooui-outline-control-move-up": "انتقال مورد به بالا",
        "ooui-outline-control-remove": "حذف مورد",
-       "ooui-toolbar-more": "بیشتر"
+       "ooui-toolbar-more": "بیشتر",
+       "ooui-dialog-confirm-title": "تأیید",
+       "ooui-dialog-confirm-default-prompt": "آیا مطمئن هستید؟",
+       "ooui-dialog-confirm-default-ok": "تأیید",
+       "ooui-dialog-confirm-default-cancel": "لغو"
 }
index dfb3d22..18c66e9 100644 (file)
@@ -6,5 +6,7 @@
        },
        "ooui-dialog-action-close": "Джаб",
        "ooui-outline-control-move-down": "Элементни тюбюне кёчюр",
-       "ooui-outline-control-move-up": "Элементни башына кёчюр"
+       "ooui-outline-control-move-up": "Элементни башына кёчюр",
+       "ooui-outline-control-remove": "Пунктну кетер",
+       "ooui-toolbar-more": "Энтда"
 }
index d433fe1..13707ce 100644 (file)
@@ -23,5 +23,9 @@
        "ooui-outline-control-move-down": "Tool tip for a button that moves items in a list down one place",
        "ooui-outline-control-move-up": "Tool tip for a button that moves items in a list up one place",
        "ooui-outline-control-remove": "Tool tip for a button that removes items from a list.\n{{Identical|Remove item}}",
-       "ooui-toolbar-more": "Label for the toolbar group that contains a list of all other available tools.\n{{Identical|More}}"
+       "ooui-toolbar-more": "Label for the toolbar group that contains a list of all other available tools.\n{{Identical|More}}",
+       "ooui-dialog-confirm-title": "Title of the generic dialog used to confirm things",
+       "ooui-dialog-confirm-default-prompt": "The default prompt of a confirmation dialog",
+       "ooui-dialog-confirm-default-ok": "The default OK button text on a confirmation dialog",
+       "ooui-dialog-confirm-default-cancel": "The default cancel button text on a confirmation dialog"
 }
diff --git a/resources/lib/oojs-ui/i18n/sr-el.json b/resources/lib/oojs-ui/i18n/sr-el.json
new file mode 100644 (file)
index 0000000..1f2da2d
--- /dev/null
@@ -0,0 +1,12 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Milicevic01"
+               ]
+       },
+       "ooui-dialog-action-close": "Zatvori",
+       "ooui-outline-control-move-down": "Premesti stavku na dole",
+       "ooui-outline-control-move-up": "Premesti stavku na gore",
+       "ooui-outline-control-remove": "Ukloni stavku",
+       "ooui-toolbar-more": "Više"
+}
index b5f8824..d9468bf 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.1.0-pre (7d2507b267)
+ * OOjs UI v0.1.0-pre (80f1797a5c)
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2014 OOjs Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: Mon May 05 2014 14:13:13 GMT-0700 (PDT)
+ * Date: Wed May 14 2014 14:11:38 GMT-0700 (PDT)
  */
 ( function ( OO ) {
 
@@ -112,7 +112,16 @@ var messages = {
        // Tool tip for a button that removes items from a list
        'ooui-outline-control-remove': 'Remove item',
        // Label for the toolbar group that contains a list of all other available tools
-       'ooui-toolbar-more': 'More'
+       'ooui-toolbar-more': 'More',
+
+       // Label for the generic dialog used to confirm things
+       'ooui-dialog-confirm-title': 'Confirm',
+       // The default prompt of a confirmation dialog
+       'ooui-dialog-confirm-default-prompt': 'Are you sure?',
+       // The default OK button text on a confirmation dialog
+       'ooui-dialog-confirm-default-ok': 'OK',
+       // The default cancel button text on a confirmation dialog
+       'ooui-dialog-confirm-default-cancel': 'Cancel'
 };
 
 /**
@@ -1900,6 +1909,103 @@ OO.ui.Widget.prototype.setDisabled = function ( disabled ) {
        this.wasDisabled = isDisabled;
        return this;
 };
+/**
+ * Dialog for showing a confirmation/warning message.
+ *
+ * @class
+ * @extends OO.ui.Dialog
+ *
+ * @constructor
+ * @param {Object} [config] Configuration options
+ */
+OO.ui.ConfirmationDialog = function OoUiConfirmationDialog( config ) {
+       // Configuration initialization
+       config = $.extend( { 'size': 'small' }, config );
+
+       // Parent constructor
+       OO.ui.Dialog.call( this, config );
+};
+
+/* Inheritance */
+
+OO.inheritClass( OO.ui.ConfirmationDialog, OO.ui.Dialog );
+
+/* Static Properties */
+
+OO.ui.ConfirmationDialog.static.name = 'confirm';
+
+OO.ui.ConfirmationDialog.static.icon = 'help';
+
+OO.ui.ConfirmationDialog.static.title = OO.ui.deferMsg( 'ooui-dialog-confirm-title' );
+
+/* Methods */
+
+/**
+ * @inheritdoc
+ */
+OO.ui.ConfirmationDialog.prototype.initialize = function () {
+       // Parent method
+       OO.ui.Dialog.prototype.initialize.call( this );
+
+       // Set up the layout
+       var contentLayout = new OO.ui.PanelLayout( {
+               '$': this.$,
+               'padded': true
+       } );
+
+       this.$promptContainer = this.$( '<div>' ).addClass( 'oo-ui-dialog-confirm-promptContainer' );
+
+       this.cancelButton = new OO.ui.ButtonWidget( {
+               'flags': [ 'destructive' ]
+       } );
+       this.cancelButton.connect( this, { 'click': [ 'emit', 'cancel' ] } );
+
+       this.okButton = new OO.ui.ButtonWidget( {
+               'flags': [ 'constructive' ]
+       } );
+       this.okButton.connect( this, { 'click': [ 'emit', 'ok' ] } );
+
+       // Make the buttons
+       contentLayout.$element.append( this.$promptContainer );
+       this.$body.append( contentLayout.$element );
+
+       this.$foot.append(
+               this.okButton.$element,
+               this.cancelButton.$element
+       );
+
+       this.connect( this, {
+               'ok': 'close',
+               'cancel': 'close',
+               'close': [ 'emit', 'cancel' ]
+       } );
+};
+
+/*
+ * Open a confirmation dialog.
+ *
+ * @param {object} [data] Window opening data including text of the dialog and text for the buttons
+ * @param {jQuery|string} [data.prompt] The text of the dialog.
+ * @param {jQuery|string|Function|null} [data.okLabel] The text used on the OK button
+ * @param {jQuery|string|Function|null} [data.cancelLabel] The text used on the cancel button
+ */
+OO.ui.ConfirmationDialog.prototype.setup = function ( data ) {
+       // Parent method
+       OO.ui.Dialog.prototype.setup.call( this, data );
+
+       var prompt = data.prompt || OO.ui.deferMsg( 'ooui-dialog-confirm-default-prompt' ),
+               okLabel = data.okLabel || OO.ui.deferMsg( 'ooui-dialog-confirm-default-ok' ),
+               cancelLabel = data.cancelLabel || OO.ui.deferMsg( 'ooui-dialog-confirm-default-cancel' );
+
+       if ( typeof prompt === 'string' ) {
+               this.$promptContainer.text( prompt );
+       } else {
+               this.$promptContainer.empty().append( prompt );
+       }
+
+       this.okButton.setLabel( okLabel );
+       this.cancelButton.setLabel( cancelLabel );
+};
 /**
  * Element with a button.
  *
@@ -4777,7 +4883,6 @@ OO.ui.StackLayout.prototype.setItem = function ( item ) {
 /**
  * Horizontal bar layout of tools as icon buttons.
  *
- * @abstract
  * @class
  * @extends OO.ui.ToolGroup
  *
@@ -4948,7 +5053,6 @@ OO.ui.PopupToolGroup.prototype.setActive = function ( value ) {
 /**
  * Drop down list layout of tools as labeled icon buttons.
  *
- * @abstract
  * @class
  * @extends OO.ui.PopupToolGroup
  *
@@ -4976,7 +5080,6 @@ OO.ui.ListToolGroup.static.name = 'list';
 /**
  * Drop down menu layout of tools as selectable menu items.
  *
- * @abstract
  * @class
  * @extends OO.ui.PopupToolGroup
  *
@@ -5283,7 +5386,6 @@ OO.mixinClass( OO.ui.ButtonGroupWidget, OO.ui.GroupElement );
 /**
  * Button widget.
  *
- * @abstract
  * @class
  * @extends OO.ui.Widget
  * @mixins OO.ui.ButtonedElement
@@ -5373,9 +5475,9 @@ OO.ui.ButtonWidget.prototype.onClick = function () {
  * @fires click
  */
 OO.ui.ButtonWidget.prototype.onKeyPress = function ( e ) {
-       if ( !this.isDisabled() && e.which === OO.ui.Keys.SPACE ) {
+       if ( !this.isDisabled() && ( e.which === OO.ui.Keys.SPACE || e.which === OO.ui.Keys.ENTER ) ) {
+               this.onClick();
                if ( this.isHyperlink ) {
-                       this.onClick();
                        return true;
                }
        }
@@ -5932,7 +6034,6 @@ OO.ui.LookupInputWidget.prototype.getLookupMenuItemsFromData = function () {
  *
  * Use with OO.ui.SelectWidget.
  *
- * @abstract
  * @class
  * @extends OO.ui.Widget
  * @mixins OO.ui.IconedElement
@@ -6150,7 +6251,6 @@ OO.ui.OptionWidget.prototype.getData = function () {
  *
  * Use together with OO.ui.OptionWidget.
  *
- * @abstract
  * @class
  * @extends OO.ui.Widget
  * @mixins OO.ui.GroupElement
@@ -6679,6 +6779,7 @@ OO.inheritClass( OO.ui.MenuItemWidget, OO.ui.OptionWidget );
  * @constructor
  * @param {Object} [config] Configuration options
  * @cfg {OO.ui.InputWidget} [input] Input to bind keyboard handlers to
+ * @cfg {boolean} [autoHide=true] Hide the menu when the mouse is pressed outside the menu
  */
 OO.ui.MenuWidget = function OoUiMenuWidget( config ) {
        // Config intialization
@@ -6691,6 +6792,7 @@ OO.ui.MenuWidget = function OoUiMenuWidget( config ) {
        OO.ui.ClippableElement.call( this, this.$group, config );
 
        // Properties
+       this.autoHide = config.autoHide === undefined || !!config.autoHide;
        this.newItems = null;
        this.$input = config.input ? config.input.$input : null;
        this.$previousFocus = null;
@@ -6698,6 +6800,7 @@ OO.ui.MenuWidget = function OoUiMenuWidget( config ) {
        this.visible = false;
        this.flashing = false;
        this.onKeyDownHandler = OO.ui.bind( this.onKeyDown, this );
+       this.onDocumentMouseDownHandler = OO.ui.bind( this.onDocumentMouseDown, this );
 
        // Initialization
        this.$element.hide().addClass( 'oo-ui-menuWidget' );
@@ -6710,6 +6813,17 @@ OO.mixinClass( OO.ui.MenuWidget, OO.ui.ClippableElement );
 
 /* Methods */
 
+/**
+ * Handles document mouse down events.
+ *
+ * @param {jQuery.Event} e Key down event
+ */
+OO.ui.MenuWidget.prototype.onDocumentMouseDown = function ( e ) {
+       if ( !$.contains( this.$element[0], e.target ) ) {
+               this.hide();
+       }
+};
+
 /**
  * Handles key down events.
  *
@@ -6875,6 +6989,13 @@ OO.ui.MenuWidget.prototype.show = function () {
                }
 
                this.setClipping( true );
+
+               // Auto-hide
+               if ( this.autoHide ) {
+                       this.getElementDocument().addEventListener(
+                               'mousedown', this.onDocumentMouseDownHandler, true
+                       );
+               }
        }
 
        return this;
@@ -6895,6 +7016,10 @@ OO.ui.MenuWidget.prototype.hide = function () {
                this.$previousFocus = null;
        }
 
+       this.getElementDocument().removeEventListener(
+               'mousedown', this.onDocumentMouseDownHandler, true
+       );
+
        this.setClipping( false );
 
        return this;
@@ -8248,7 +8373,6 @@ OO.ui.ToggleButtonWidget.prototype.setValue = function ( value ) {
 /**
  * Switch that slides on and off.
  *
- * @abstract
  * @class
  * @extends OO.ui.Widget
  * @mixins OO.ui.ToggleWidget
index 0c2cfaf..40d65e6 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.1.0-pre (7d2507b267)
+ * OOjs UI v0.1.0-pre (80f1797a5c)
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2014 OOjs Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: Mon May 05 2014 14:13:12 GMT-0700 (PDT)
+ * Date: Wed May 14 2014 14:11:38 GMT-0700 (PDT)
  */
 
 /* Textures */
index 4caf072..80b8303 100644 (file)
@@ -3,7 +3,7 @@
  *
  * @class jQuery.plugin.accessKeyLabel
  */
-( function ( $ ) {
+( function ( $, mw ) {
 
 // Cached access key prefix for used browser
 var cachedAccessKeyPrefix,
@@ -111,8 +111,10 @@ function getAccessKeyLabel( element ) {
  * @param {HTMLElement} titleElement Element with the title to update (may be the same as `element`)
  */
 function updateTooltipOnElement( element, titleElement ) {
-       var oldTitle = titleElement.title,
-               rawTitle = oldTitle.replace( / \[.*?\]$/, '' ),
+       var array = ( mw.msg( 'word-separator' ) + mw.msg( 'brackets' ) ).split( '$1' ),
+               regexp = new RegExp( $.map( array, $.escapeRE ).join( '.*?' ) + '$' ),
+               oldTitle = titleElement.title,
+               rawTitle = oldTitle.replace( regexp, '' ),
                newTitle = rawTitle,
                accessKeyLabel = getAccessKeyLabel( element );
 
@@ -122,7 +124,8 @@ function updateTooltipOnElement( element, titleElement ) {
        }
 
        if ( accessKeyLabel ) {
-               newTitle += ' [' + accessKeyLabel + ']';
+               // Should be build the same as in Linker::titleAttrib
+               newTitle += mw.msg( 'word-separator' ) + mw.msg( 'brackets', accessKeyLabel );
        }
        if ( oldTitle !== newTitle ) {
                titleElement.title = newTitle;
@@ -194,4 +197,4 @@ $.fn.updateTooltipAccessKeys.setTestMode = function ( mode ) {
  * @mixins jQuery.plugin.accessKeyLabel
  */
 
-}( jQuery ) );
+}( jQuery, mediaWiki ) );
index 22e8652..7d200ff 100644 (file)
@@ -535,15 +535,20 @@ $.fn.suggestions = function () {
                                                        if ( $result.get( 0 ) !== $other.get( 0 ) ) {
                                                                return;
                                                        }
-                                                       // do not interfere with non-left clicks or if modifier keys are pressed (e.g. ctrl-click)
+                                                       // Do not interfere with non-left clicks or if modifier keys are pressed (e.g. ctrl-click).
                                                        if ( !( e.which !== 1 || e.altKey || e.ctrlKey || e.shiftKey || e.metaKey ) ) {
                                                                $.suggestions.highlight( context, $result, true );
-                                                               $.suggestions.hide( context );
                                                                if ( typeof context.config.result.select === 'function' ) {
                                                                        context.config.result.select.call( $result, context.data.$textbox );
                                                                }
+                                                               // This will hide the link we're just clicking on, which causes problems
+                                                               // when done synchronously in at least Firefox 3.6 (bug 62858).
+                                                               setTimeout( function () {
+                                                                       $.suggestions.hide( context );
+                                                               }, 0 );
                                                        }
-                                                       // but still restore focus to the textbox, so that the suggestions will be hidden properly
+                                                       // Always bring focus to the textbox, as that's probably where the user expects it
+                                                       // if they were just typing.
                                                        context.data.$textbox.focus();
                                                } )
                                )
@@ -563,14 +568,19 @@ $.fn.suggestions = function () {
                                                        if ( $special.get( 0 ) !== $other.get( 0 ) ) {
                                                                return;
                                                        }
-                                                       // do not interfere with non-left clicks or if modifier keys are pressed (e.g. ctrl-click)
+                                                       // Do not interfere with non-left clicks or if modifier keys are pressed (e.g. ctrl-click).
                                                        if ( !( e.which !== 1 || e.altKey || e.ctrlKey || e.shiftKey || e.metaKey ) ) {
-                                                               $.suggestions.hide( context );
                                                                if ( typeof context.config.special.select === 'function' ) {
                                                                        context.config.special.select.call( $special, context.data.$textbox );
                                                                }
+                                                               // This will hide the link we're just clicking on, which causes problems
+                                                               // when done synchronously in at least Firefox 3.6 (bug 62858).
+                                                               setTimeout( function () {
+                                                                       $.suggestions.hide( context );
+                                                               }, 0 );
                                                        }
-                                                       // but still restore focus to the textbox, so that the suggestions will be hidden properly
+                                                       // Always bring focus to the textbox, as that's probably where the user expects it
+                                                       // if they were just typing.
                                                        context.data.$textbox.focus();
                                                } )
                                                .mousemove( function ( e ) {
index 9962534..6444d93 100644 (file)
 
                        // Return the Promise
                        return apiDeferred.promise( { abort: xhr.abort } ).fail( function ( code, details ) {
-                               mw.log( 'mw.Api error: ', code, details );
+                               if ( code !== 'abort' ) {
+                                       mw.log( 'mw.Api error: ', code, details );
+                               }
                        } );
                },
 
index aa33d86..af2dee1 100644 (file)
        function doWatchInternal( pages, ok, err, addParams ) {
                // XXX: Parameter addParams is undocumented because we inherit this
                // documentation in the public method...
-               var apiPromise = this.post(
+               var apiPromise = this.postWithToken( 'watch',
                        $.extend(
                                {
                                        action: 'watch',
                                        titles: $.isArray( pages ) ? pages.join( '|' ) : String( pages ),
-                                       token: mw.user.tokens.get( 'watchToken' ),
                                        uselang: mw.config.get( 'wgUserLanguage' )
                                },
                                addParams
index 850177f..3b0aeee 100644 (file)
@@ -17,7 +17,7 @@
         * @param {string} [state="idle"] 'idle' or 'loading'. Default is 'idle'
         */
        function updateWatchLink( $link, action, state ) {
-               var accesskeyTip, msgKey, $li, otherAction;
+               var msgKey, $li, otherAction;
 
                // A valid but empty jQuery object shouldn't throw a TypeError
                if ( !$link.length ) {
@@ -32,7 +32,6 @@
                // message keys 'watch', 'watching', 'unwatch' or 'unwatching'.
                msgKey = state === 'loading' ? action + 'ing' : action;
                otherAction = action === 'watch' ? 'unwatch' : 'watch';
-               accesskeyTip = $link.attr( 'title' ).match( mw.util.tooltipAccessKeyRegexp );
                $li = $link.closest( 'li' );
 
                // Trigger a 'watchpage' event for this List item.
@@ -45,9 +44,8 @@
 
                $link
                        .text( mw.msg( msgKey ) )
-                       .attr( 'title', mw.msg( 'tooltip-ca-' + action ) +
-                               ( accesskeyTip ? ' ' + accesskeyTip[0] : '' )
-                       )
+                       .attr( 'title', mw.msg( 'tooltip-ca-' + action ) )
+                       .updateTooltipAccessKeys()
                        .attr( 'href', mw.util.wikiScript() + '?' + $.param( {
                                        title: title,
                                        action: action
index 4ec5ffa..eb7072c 100644 (file)
@@ -19,9 +19,6 @@
 table.mw-allpages-table-form, table.mw-allpages-table-chunk {
        width: 100%;
 }
-td.mw-allpages-alphaindexline {
-       text-align: right;
-}
 .mw-allpages-nav {
        text-align: right;
        margin-bottom: 1em;
diff --git a/resources/src/mediawiki/mediawiki.cookie.js b/resources/src/mediawiki/mediawiki.cookie.js
new file mode 100644 (file)
index 0000000..6f9f0ab
--- /dev/null
@@ -0,0 +1,126 @@
+( function ( mw, $ ) {
+       'use strict';
+
+       /**
+        * Provides an API for getting and setting cookies that is
+        * syntactically and functionally similar to the server-side cookie
+        * API (`WebRequest#getCookie` and `WebResponse#setcookie`).
+        *
+        * @author Sam Smith <samsmith@wikimedia.org>
+        * @author Matthew Flaschen <mflaschen@wikimedia.org>
+        * @author Timo Tijhof <krinklemail@gmail.com>
+        *
+        * @class mw.cookie
+        * @singleton
+        */
+       mw.cookie = {
+
+               /**
+                * Sets or deletes a cookie.
+                *
+                * While this is natural in JavaScript, contrary to `WebResponse#setcookie` in PHP, the
+                * default values for the `options` properties only apply if that property isn't set
+                * already in your options object (e.g. passing `{ secure: null }` or `{ secure: undefined }`
+                * overrides the default value for `options.secure`).
+                *
+                * @param {string} key
+                * @param {string|null} value Value of cookie. If `value` is `null` then this method will
+                *   instead remove a cookie by name of `key`.
+                * @param {Object|Date} [options] Options object, or expiry date
+                * @param {Date|null} [options.expires=wgCookieExpiration] The expiry date of the cookie.
+                *
+                *   Default cookie expiration is based on `wgCookieExpiration`.  If `wgCookieExpiration` is
+                *   0, a session cookie is set (expires when the browser is closed). For non-zero values of
+                *   `wgCookieExpiration`, the cookie expires `wgCookieExpiration` seconds from now.
+                *
+                *   If options.expires is null, then a session cookie is set.
+                * @param {string} [options.prefix=wgCookiePrefix] The prefix of the key
+                * @param {string} [options.domain=wgCookieDomain] The domain attribute of the cookie
+                * @param {string} [options.path=wgCookiePath] The path attribute of the cookie
+                * @param {boolean} [options.secure=false] Whether or not to include the secure attribute.
+                *   (Does **not** use the wgCookieSecure configuration variable)
+                */
+               set: function ( key, value, options ) {
+                       var config, defaultOptions, date;
+
+                       // wgCookieSecure is not used for now, since 'detect' could not work with
+                       // ResourceLoaderStartUpModule, as module cache is not fragmented by protocol.
+                       config = mw.config.get( [
+                               'wgCookiePrefix',
+                               'wgCookieDomain',
+                               'wgCookiePath',
+                               'wgCookieExpiration'
+                       ] );
+
+                       defaultOptions = {
+                               prefix: config.wgCookiePrefix,
+                               domain: config.wgCookieDomain,
+                               path: config.wgCookiePath,
+                               secure: false
+                       };
+
+                       // Options argument can also be a shortcut for the expiry
+                       // Expiry can be a Date or null
+                       if ( $.type( options ) !== 'object' ) {
+                               // Also takes care of options = undefined, in which case we also don't need $.extend()
+                               defaultOptions.expires = options;
+                               options = defaultOptions;
+                       } else {
+                               options = $.extend( defaultOptions, options );
+                       }
+
+                       // $.cookie makes session cookies when expiry is omitted,
+                       // however our default is to expire wgCookieExpiration seconds from now.
+                       // Note: If wgCookieExpiration is 0, that is considered a special value indicating
+                       // all cookies should be session cookies by default.
+                       if ( options.expires === undefined && config.wgCookieExpiration !== 0 ) {
+                               date = new Date();
+                               date.setTime( Number( date ) + ( config.wgCookieExpiration * 1000 ) );
+                               options.expires = date;
+                       } else if ( options.expires === null ) {
+                               // $.cookie makes a session cookie when expires is omitted
+                               delete options.expires;
+                       }
+
+                       // Process prefix
+                       key = options.prefix + key;
+                       delete options.prefix;
+
+                       // Process value
+                       if ( value !== null ) {
+                               value = String( value );
+                       }
+
+                       // Other options are handled by $.cookie
+                       $.cookie( key, value, options );
+               },
+
+               /**
+                * Gets the value of a cookie.
+                *
+                * @param {string} key
+                * @param {string} [prefix=wgCookiePrefix] The prefix of the key. If `prefix` is
+                *   `undefined` or `null`, then `wgCookiePrefix` is used
+                * @param {Mixed} [defaultValue=null]
+                * @return {string} If the cookie exists, then the value of the
+                *   cookie, otherwise `defaultValue`
+                */
+               get: function ( key, prefix, defaultValue ) {
+                       var result;
+
+                       if ( prefix === undefined || prefix === null ) {
+                               prefix = mw.config.get( 'wgCookiePrefix' );
+                       }
+
+                       // Was defaultValue omitted?
+                       if ( arguments.length < 3 ) {
+                               defaultValue = null;
+                       }
+
+                       result = $.cookie( prefix + key );
+
+                       return result !== null ? result : defaultValue;
+               }
+       };
+
+} ( mediaWiki, jQuery ) );
index 221ac74..298415c 100644 (file)
         *
         * Should match:
         *
-        * - "ctrl-option-"
-        * - "alt-shift-"
-        * - "ctrl-alt-"
-        * - "ctrl-"
+        * - "[ctrl-option-x]"
+        * - "[alt-shift-x]"
+        * - "[ctrl-alt-x]"
+        * - "[ctrl-x]"
         *
         * The accesskey is matched in group $6.
         *
index b64ceb0..a6d3b55 100644 (file)
@@ -104,16 +104,6 @@ img.thumbborder {
        border: 1px solid #dddddd;
 }
 
-/* table standards */
-table.rimage {
-       float: right;
-       width: 1pt;
-       position: relative;
-       margin-left: 1em;
-       margin-bottom: 1em;
-       text-align: center;
-}
-
 body {
        background: white;
        color: black;
@@ -277,7 +267,6 @@ span.texhtml {
 /* Galleries (see shared.css for more info) */
 li.gallerybox {
        vertical-align: top;
-       display: -moz-inline-box;
        display: inline-block;
 }
 
index e1f7a83..aedb6a9 100644 (file)
 
 .config-cc-wrapper {
        clear: left;
-       /* If you change this height, also change it in WebInstaller_Options::submitCC() */
+       /* If you change this height, also change it in WebInstallerOptions::submitCC() */
        height: 54em;
 }
 
        margin-left: 2em;
 }
 
+.config-download-link a {
+       background: url(images/download-32.png) no-repeat center left;
+       padding-left: 40px; /* 32 px for the image (above), plus some breathing room */
+       height: 32px; /* provide enough vertical room for the image */
+       display: inline-block; /* allow the height property (above) to work */
+       line-height: 32px; /* center the text vertically */
+}
+
 #config-live-log {
        overflow: hidden;
        min-width: 20em;
index ac7f407..a5612e2 100644 (file)
@@ -39,6 +39,12 @@ mark {
        color: black;
 }
 
+/* Helper for wbr element on IE 8+; in HTML5, but not supported by default as of IE 11. */
+/* Note canonical HTML5 styles recommend "content: \u200B", but this doesn't work as of IE 11. */
+wbr {
+       display: inline-block;
+}
+
 /* Input types that should follow user direction, like buttons */
 /* TODO: What about buttons in wikipage content ? */
 input[type="submit"],
index d30f554..fdfca0a 100644 (file)
@@ -157,11 +157,12 @@ mw.log.deprecate( win, 'jsMsg', function ( message ) {
  * @deprecated since 1.17 Use mediawiki.util instead
  */
 msg = 'Use mediawiki.util instead.';
-mw.log.deprecate( win, 'tooltipAccessKeyPrefix', 'alt-', msg );
-mw.log.deprecate( win, 'tooltipAccessKeyRegexp', /\[(alt-)?(.)\]$/, msg );
 mw.log.deprecate( win, 'updateTooltipAccessKeys', mw.util.updateTooltipAccessKeys, msg );
 mw.log.deprecate( win, 'addPortletLink', mw.util.addPortletLink, msg );
 mw.log.deprecate( win, 'appendCSS', mw.util.addCSS, msg );
+msg = 'Use jquery.accessKeyLabel instead.';
+mw.log.deprecate( win, 'tooltipAccessKeyPrefix', 'alt-', msg );
+mw.log.deprecate( win, 'tooltipAccessKeyRegexp', /\[(alt-)?(.)\]$/, msg );
 
 /**
  * Wikipage import methods
index b4e903d..1875ac5 100644 (file)
@@ -763,6 +763,7 @@ class ParserTest {
 
                $settings = array(
                        'wgServer' => 'http://example.org',
+                       'wgServerName' => 'example.org',
                        'wgScript' => '/index.php',
                        'wgScriptPath' => '/',
                        'wgArticlePath' => '/wiki/$1',
index 49fdd48..350e83f 100644 (file)
@@ -36,7 +36,7 @@ class MWNamespaceTest extends MediaWikiTestCase {
         * @covers MWNamespace::isMovable
         */
        public function testIsMovable() {
-               $this->assertFalse( MWNamespace::isMovable( NS_CATEGORY ) );
+               $this->assertFalse( MWNamespace::isMovable( NS_SPECIAL ) );
                # @todo FIXME: Write more tests!!
        }
 
index ecfcfa3..2add9f2 100644 (file)
@@ -491,4 +491,18 @@ class DummyContentForTesting extends AbstractContent {
        ) {
                return new ParserOutput( $this->getNativeData() );
        }
+
+       /**
+        * @see AbstractContent::fillParserOutput()
+        *
+        * @param Title $title Context title for parsing
+        * @param int|null $revId Revision ID (for {{REVISIONID}})
+        * @param ParserOptions|null $options Parser options
+        * @param bool $generateHtml Whether or not to generate HTML
+        * @param ParserOutput &$output The output object to fill (reference).
+        */
+       protected function fillParserOutput( Title $title, $revId,
+                       ParserOptions $options, $generateHtml, ParserOutput &$output ) {
+               $output = new ParserOutput( $this->getNativeData() );
+       }
 }
index bd6d41f..40484d3 100644 (file)
@@ -5,7 +5,7 @@
  * @group Database
  *        ^--- needed, because we do need the database to test link updates
  */
-class CssContentTest extends MediaWikiTestCase {
+class CssContentTest extends JavaScriptContentTest {
 
        protected function setUp() {
                parent::setUp();
index 253a035..03cbbc0 100644 (file)
@@ -7,14 +7,21 @@
  */
 class TextContentTest extends MediaWikiLangTestCase {
        protected $context;
+       protected $savedContentGetParserOutput;
 
        protected function setUp() {
+               global $wgHooks;
+
                parent::setUp();
 
                // Anon user
                $user = new User();
                $user->setName( '127.0.0.1' );
 
+               $this->context = new RequestContext( new FauxRequest() );
+               $this->context->setTitle( Title::newFromText( 'Test' ) );
+               $this->context->setUser( $user );
+
                $this->setMwGlobals( array(
                        'wgUser' => $user,
                        'wgTextModelsToParse' => array(
@@ -26,9 +33,22 @@ class TextContentTest extends MediaWikiLangTestCase {
                        'wgAlwaysUseTidy' => false,
                ) );
 
-               $this->context = new RequestContext( new FauxRequest() );
-               $this->context->setTitle( Title::newFromText( 'Test' ) );
-               $this->context->setUser( $user );
+               // bypass hooks that force custom rendering
+               if ( isset( $wgHooks['ContentGetParserOutput'] )  ) {
+                       $this->savedContentGetParserOutput = $wgHooks['ContentGetParserOutput'];
+                       unset( $wgHooks['ContentGetParserOutput'] );
+               }
+       }
+
+       public function teardown() {
+               global $wgHooks;
+
+               // restore hooks that force custom rendering
+               if ( $this->savedContentGetParserOutput !== null ) {
+                       $wgHooks['ContentGetParserOutput'] = $this->savedContentGetParserOutput;
+               }
+
+               parent::teardown();
        }
 
        public function newContent( $text ) {
index 66ed020..14bcac0 100644 (file)
@@ -65,6 +65,7 @@ class NewParserTest extends MediaWikiTestCase {
                $tmpGlobals['wgContLang'] = Language::factory( 'en' );
                $tmpGlobals['wgSitename'] = 'MediaWiki';
                $tmpGlobals['wgServer'] = 'http://example.org';
+               $tmpGlobals['wgServerName'] = 'example.org';
                $tmpGlobals['wgScript'] = '/index.php';
                $tmpGlobals['wgScriptPath'] = '/';
                $tmpGlobals['wgArticlePath'] = '/wiki/$1';
index 229eeb4..4ea8fc6 100644 (file)
@@ -29,6 +29,26 @@ class ParserMethodsTest extends MediaWikiLangTestCase {
                $this->assertEquals( $expected, $text );
        }
 
+       /**
+        * @expectedException MWException
+        * @expectedExceptionMessage Parser state cleared while parsing. Did you call Parser::parse recursively?
+        * @covers Parser::lock
+        */
+       public function testRecursiveParse() {
+               global $wgParser;
+               $title = Title::newFromText( 'foo' );
+               $po = new ParserOptions;
+               $wgParser->setHook( 'recursivecallparser', array( $this, 'helperParserFunc' ) );
+               $wgParser->parse( '<recursivecallparser>baz</recursivecallparser>', $title, $po );
+       }
+
+       public function helperParserFunc( $input, $args, $parser) {
+               $title = Title::newFromText( 'foo' );
+               $po = new ParserOptions;
+               $parser->parse( $input, $title, $po );
+               return 'bar';
+       }
+
        /**
         * @covers Parser::callParserFunction
         */
index 1f60293..022f998 100755 (executable)
@@ -20,7 +20,8 @@ else if ( has_binary pear ); then
     pear channel-discover components.ez.no
     pear channel-discover pear.symfony.com
     pear update-channels
-    pear install --alldeps phpunit/PHPUnit
+    #Temporary fix for 64597
+    pear install --alldeps phpunit/PHPUnit-3.7.35
 else if ( has_binary apt-get ); then
     echo Installing phpunit with apt-get
     apt-get install phpunit
index 5cfd18f..b2b5322 100644 (file)
@@ -77,6 +77,7 @@ return array(
                        'tests/qunit/suites/resources/mediawiki.special/mediawiki.special.recentchanges.test.js',
                        'tests/qunit/suites/resources/mediawiki/mediawiki.language.test.js',
                        'tests/qunit/suites/resources/mediawiki/mediawiki.cldr.test.js',
+                       'tests/qunit/suites/resources/mediawiki/mediawiki.cookie.test.js',
                ),
                'dependencies' => array(
                        'jquery.accessKeyLabel',
@@ -109,6 +110,7 @@ return array(
                        'mediawiki.special.recentchanges',
                        'mediawiki.language',
                        'mediawiki.cldr',
+                       'mediawiki.cookie',
                        'test.mediawiki.qunit.testrunner',
                ),
        )
index d5c5d27..60a63f9 100644 (file)
@@ -1,5 +1,10 @@
 ( function ( $ ) {
-       QUnit.module( 'jquery.accessKeyLabel', QUnit.newMwEnvironment() );
+       QUnit.module( 'jquery.accessKeyLabel', QUnit.newMwEnvironment( {
+               messages: {
+                       'brackets': '[$1]',
+                       'word-separator': ' '
+               }
+       } ) );
 
        var getAccessKeyPrefixTestData = [
                        //ua string, platform string, expected prefix
index d9801d9..9216ac9 100644 (file)
@@ -1,5 +1,5 @@
 ( function ( $, mw ) {
-       var config, header,
+       var header,
 
                // Data set "simple"
                a1 = [ 'A', '1' ],
                        ['February 05 2010']
                ];
 
-       config = {
-               wgMonthNames: ['', 'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],
-               wgMonthNamesShort: ['', 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
-               wgDefaultDateFormat: 'dmy',
-               wgSeparatorTransformTable: ['', ''],
-               wgDigitTransformTable: ['', ''],
-               wgContentLanguage: 'en'
-       };
-
-       QUnit.module( 'jquery.tablesorter', QUnit.newMwEnvironment( { config: config } ) );
+       QUnit.module( 'jquery.tablesorter', QUnit.newMwEnvironment( {
+               config: {
+                       wgMonthNames: ['', 'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],
+                       wgMonthNamesShort: ['', 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
+                       wgDefaultDateFormat: 'dmy',
+                       wgSeparatorTransformTable: ['', ''],
+                       wgDigitTransformTable: ['', ''],
+                       wgContentLanguage: 'en'
+               }
+       } ) );
 
        /**
         * Create an HTML table from an array of row arrays containing text strings.
index 61d662b..077ce70 100644 (file)
@@ -1,60 +1,6 @@
 /*jshint -W024 */
 ( function ( mw, $ ) {
-       // mw.Title relies on these three config vars
-       // Restore them after each test run
-       var config = {
-               wgFormattedNamespaces: {
-                       '-2': 'Media',
-                       '-1': 'Special',
-                       0: '',
-                       1: 'Talk',
-                       2: 'User',
-                       3: 'User talk',
-                       4: 'Wikipedia',
-                       5: 'Wikipedia talk',
-                       6: 'File',
-                       7: 'File talk',
-                       8: 'MediaWiki',
-                       9: 'MediaWiki talk',
-                       10: 'Template',
-                       11: 'Template talk',
-                       12: 'Help',
-                       13: 'Help talk',
-                       14: 'Category',
-                       15: 'Category talk',
-                       // testing custom / localized namespace
-                       100: 'Penguins'
-               },
-               wgNamespaceIds: {
-                       'media': -2,
-                       'special': -1,
-                       '': 0,
-                       'talk': 1,
-                       'user': 2,
-                       'user_talk': 3,
-                       'wikipedia': 4,
-                       'wikipedia_talk': 5,
-                       'file': 6,
-                       'file_talk': 7,
-                       'mediawiki': 8,
-                       'mediawiki_talk': 9,
-                       'template': 10,
-                       'template_talk': 11,
-                       'help': 12,
-                       'help_talk': 13,
-                       'category': 14,
-                       'category_talk': 15,
-                       'image': 6,
-                       'image_talk': 7,
-                       'project': 4,
-                       'project_talk': 5,
-                       // Testing custom namespaces and aliases
-                       'penguins': 100,
-                       'antarctic_waterfowl': 100
-               },
-               wgCaseSensitiveNamespaces: []
-       },
-       repeat = function ( input, multiplier ) {
+       var repeat = function ( input, multiplier ) {
                return new Array( multiplier + 1 ).join( input );
        },
        cases = {
                ]
        };
 
-       QUnit.module( 'mediawiki.Title', QUnit.newMwEnvironment( { config: config } ) );
+       QUnit.module( 'mediawiki.Title', QUnit.newMwEnvironment( {
+               // mw.Title relies on these three config vars
+               // Restore them after each test run
+               config: {
+                       wgFormattedNamespaces: {
+                               '-2': 'Media',
+                               '-1': 'Special',
+                               0: '',
+                               1: 'Talk',
+                               2: 'User',
+                               3: 'User talk',
+                               4: 'Wikipedia',
+                               5: 'Wikipedia talk',
+                               6: 'File',
+                               7: 'File talk',
+                               8: 'MediaWiki',
+                               9: 'MediaWiki talk',
+                               10: 'Template',
+                               11: 'Template talk',
+                               12: 'Help',
+                               13: 'Help talk',
+                               14: 'Category',
+                               15: 'Category talk',
+                               // testing custom / localized namespace
+                               100: 'Penguins'
+                       },
+                       wgNamespaceIds: {
+                               'media': -2,
+                               'special': -1,
+                               '': 0,
+                               'talk': 1,
+                               'user': 2,
+                               'user_talk': 3,
+                               'wikipedia': 4,
+                               'wikipedia_talk': 5,
+                               'file': 6,
+                               'file_talk': 7,
+                               'mediawiki': 8,
+                               'mediawiki_talk': 9,
+                               'template': 10,
+                               'template_talk': 11,
+                               'help': 12,
+                               'help_talk': 13,
+                               'category': 14,
+                               'category_talk': 15,
+                               'image': 6,
+                               'image_talk': 7,
+                               'project': 4,
+                               'project_talk': 5,
+                               // Testing custom namespaces and aliases
+                               'penguins': 100,
+                               'antarctic_waterfowl': 100
+                       },
+                       wgCaseSensitiveNamespaces: []
+               }
+       } ) );
 
        QUnit.test( 'constructor', cases.invalid.length, function ( assert ) {
                var i, title;
diff --git a/tests/qunit/suites/resources/mediawiki/mediawiki.cookie.test.js b/tests/qunit/suites/resources/mediawiki/mediawiki.cookie.test.js
new file mode 100644 (file)
index 0000000..c9653da
--- /dev/null
@@ -0,0 +1,172 @@
+( function ( mw, $ ) {
+
+       var NOW = 9012, // miliseconds
+               DEFAULT_DURATION = 5678, // seconds
+               expiryDate = new Date();
+
+       expiryDate.setTime( NOW + ( DEFAULT_DURATION * 1000 ) );
+
+       QUnit.module( 'mediawiki.cookie', QUnit.newMwEnvironment( {
+               setup: function () {
+                       this.stub( $, 'cookie' ).returns( null );
+
+                       this.sandbox.useFakeTimers( NOW );
+               },
+               config: {
+                       wgCookiePrefix: 'mywiki',
+                       wgCookieDomain: 'example.org',
+                       wgCookiePath: '/path',
+                       wgCookieExpiration: DEFAULT_DURATION
+               }
+       } ) );
+
+       QUnit.test( 'set( key, value )', 7, function ( assert ) {
+               var call;
+
+               // Simple case
+               mw.cookie.set( 'foo', 'bar' );
+
+               call = $.cookie.lastCall.args;
+               assert.strictEqual( call[ 0 ], 'mywikifoo' );
+               assert.strictEqual( call[ 1 ], 'bar' );
+               assert.deepEqual( call[ 2 ], {
+                       expires: expiryDate,
+                       domain: 'example.org',
+                       path: '/path',
+                       secure: false
+               } );
+
+               mw.cookie.set( 'foo', null );
+               call = $.cookie.lastCall.args;
+               assert.strictEqual( call[ 1 ], null, 'null removes cookie' );
+
+               mw.cookie.set( 'foo', undefined );
+               call = $.cookie.lastCall.args;
+               assert.strictEqual( call[ 1 ], 'undefined', 'undefined is value' );
+
+               mw.cookie.set( 'foo', false );
+               call = $.cookie.lastCall.args;
+               assert.strictEqual( call[ 1 ], 'false', 'false is a value' );
+
+               mw.cookie.set( 'foo', 0 );
+               call = $.cookie.lastCall.args;
+               assert.strictEqual( call[ 1 ], '0', '0 is value' );
+       } );
+
+       QUnit.test( 'set( key, value, expires )', 5, function ( assert ) {
+               var date, options;
+
+               date = new Date();
+               date.setTime( 1234 );
+
+               mw.cookie.set( 'foo', 'bar' );
+               options = $.cookie.lastCall.args[ 2 ];
+               assert.deepEqual( options.expires, expiryDate, 'Default cookie expiration is used' );
+
+               mw.cookie.set( 'foo', 'bar', date );
+               options = $.cookie.lastCall.args[ 2 ];
+               assert.strictEqual( options.expires, date, 'Custom expiration date' );
+
+               mw.cookie.set( 'foo', 'bar', null );
+               options = $.cookie.lastCall.args[ 2 ];
+               assert.strictEqual( options.expires, undefined, 'Expiry null forces session cookie' );
+
+               // Per DefaultSettings.php, when wgCookieExpiration is 0, the default should
+               // be session cookies
+               mw.config.set( 'wgCookieExpiration', 0 );
+
+               mw.cookie.set( 'foo', 'bar' );
+               options = $.cookie.lastCall.args[ 2 ];
+               assert.strictEqual( options.expires, undefined, 'wgCookieExpiration=0 results in session cookies by default' );
+
+               mw.cookie.set( 'foo', 'bar', date );
+               options = $.cookie.lastCall.args[ 2 ];
+               assert.strictEqual( options.expires, date, 'Custom expiration when default is session cookies' );
+       } );
+
+       QUnit.test( 'set( key, value, options )', 4, function ( assert ) {
+               var date, call;
+
+               mw.cookie.set( 'foo', 'bar', {
+                       prefix: 'myPrefix',
+                       domain: 'myDomain',
+                       path: 'myPath',
+                       secure: true
+               } );
+
+               call = $.cookie.lastCall.args;
+               assert.strictEqual( call[0], 'myPrefixfoo' );
+               assert.deepEqual( call[ 2 ], {
+                       expires: expiryDate,
+                       domain: 'myDomain',
+                       path: 'myPath',
+                       secure: true
+               }, 'Options (without expires)' );
+
+               date = new Date();
+               date.setTime( 1234 );
+
+               mw.cookie.set( 'foo', 'bar', {
+                       expires: date,
+                       prefix: 'myPrefix',
+                       domain: 'myDomain',
+                       path: 'myPath',
+                       secure: true
+               } );
+
+               call = $.cookie.lastCall.args;
+               assert.strictEqual( call[0], 'myPrefixfoo' );
+               assert.deepEqual( call[ 2 ], {
+                       expires: date,
+                       domain: 'myDomain',
+                       path: 'myPath',
+                       secure: true
+               }, 'Options (incl. expires)' );
+       } );
+
+       QUnit.test( 'get( key ) - no values', 6, function ( assert ) {
+               var key, value;
+
+               mw.cookie.get( 'foo' );
+
+               key = $.cookie.lastCall.args[ 0 ];
+               assert.strictEqual( key, 'mywikifoo', 'Default prefix' );
+
+               mw.cookie.get( 'foo', undefined );
+               key = $.cookie.lastCall.args[ 0 ];
+               assert.strictEqual( key, 'mywikifoo', 'Use default prefix for undefined' );
+
+               mw.cookie.get( 'foo', null );
+               key = $.cookie.lastCall.args[ 0 ];
+               assert.strictEqual( key, 'mywikifoo', 'Use default prefix for null' );
+
+               mw.cookie.get( 'foo', '' );
+               key = $.cookie.lastCall.args[ 0 ];
+               assert.strictEqual( key, 'foo', 'Don\'t use default prefix for empty string' );
+
+               value = mw.cookie.get( 'foo' );
+               assert.strictEqual( value, null, 'Return null by default' );
+
+               value = mw.cookie.get( 'foo', null, 'bar' );
+               assert.strictEqual( value, 'bar', 'Custom default value' );
+       } );
+
+       QUnit.test( 'get( key ) - with value', 1, function ( assert ) {
+               var value;
+
+               $.cookie.returns( 'bar' );
+
+               value = mw.cookie.get( 'foo' );
+               assert.strictEqual( value, 'bar', 'Return value of cookie' );
+       } );
+
+       QUnit.test( 'get( key, prefix )', 1, function ( assert ) {
+               var key;
+
+               mw.cookie.get( 'foo', 'bar' );
+
+               key = $.cookie.lastCall.args[ 0 ];
+               assert.strictEqual( key, 'barfoo' );
+       } );
+
+} ( mediaWiki, jQuery ) );
index 995c1ed..682eb3d 100644 (file)
                setup: function () {
                        this.originalMwLanguage = mw.language;
 
-                       // Messages that are reused in multiple tests
-                       mw.messages.set( {
-                               // The values for gender are not significant,
-                               // what matters is which of the values is choosen by the parser
-                               'gender-msg': '$1: {{GENDER:$2|blue|pink|green}}',
-                               'gender-msg-currentuser': '{{GENDER:|blue|pink|green}}',
-
-                               'plural-msg': 'Found $1 {{PLURAL:$1|item|items}}',
-
-                               // Assume the grammar form grammar_case_foo is not valid in any language
-                               'grammar-msg': 'Przeszukaj {{GRAMMAR:grammar_case_foo|{{SITENAME}}}}',
-
-                               'formatnum-msg': '{{formatnum:$1}}',
-
-                               'portal-url': 'Project:Community portal',
-                               'see-portal-url': '{{Int:portal-url}} is an important community page.',
-
-                               'jquerymsg-test-statistics-users': '注册[[Special:ListUsers|用户]]',
-
-                               'jquerymsg-test-version-entrypoints-index-php': '[https://www.mediawiki.org/wiki/Manual:index.php index.php]',
-
-                               'external-link-replace': 'Foo [$1 bar]'
-                       } );
-
-                       mw.config.set( {
-                               wgArticlePath: '/wiki/$1'
-                       } );
-
                        specialCharactersPageName = '"Who" wants to be a millionaire & live on \'Exotic Island\'?';
 
                        expectedListUsers = '注册<a title="Special:ListUsers" href="/wiki/Special:ListUsers">用户</a>';
                },
                teardown: function () {
                        mw.language = this.originalMwLanguage;
+               },
+               config: {
+                       wgArticlePath: '/wiki/$1'
+               },
+               // Messages that are reused in multiple tests
+               messages: {
+                       // The values for gender are not significant,
+                       // what matters is which of the values is choosen by the parser
+                       'gender-msg': '$1: {{GENDER:$2|blue|pink|green}}',
+                       'gender-msg-currentuser': '{{GENDER:|blue|pink|green}}',
+
+                       'plural-msg': 'Found $1 {{PLURAL:$1|item|items}}',
+
+                       // Assume the grammar form grammar_case_foo is not valid in any language
+                       'grammar-msg': 'Przeszukaj {{GRAMMAR:grammar_case_foo|{{SITENAME}}}}',
+
+                       'formatnum-msg': '{{formatnum:$1}}',
+
+                       'portal-url': 'Project:Community portal',
+                       'see-portal-url': '{{Int:portal-url}} is an important community page.',
+
+                       'jquerymsg-test-statistics-users': '注册[[Special:ListUsers|用户]]',
+
+                       'jquerymsg-test-version-entrypoints-index-php': '[https://www.mediawiki.org/wiki/Manual:index.php index.php]',
+
+                       'external-link-replace': 'Foo [$1 bar]'
                }
        } ) );
 
index a9b2f33..90700ca 100644 (file)
@@ -9,26 +9,24 @@
 
        QUnit.module( 'mediawiki', QUnit.newMwEnvironment( {
                setup: function () {
-                       // Messages used in multiple tests
-                       mw.messages.set( {
-                               'other-message': 'Other Message',
-                               'mediawiki-test-pagetriage-del-talk-page-notify-summary': 'Notifying author of deletion nomination for [[$1]]',
-                               'gender-plural-msg': '{{GENDER:$1|he|she|they}} {{PLURAL:$2|is|are}} awesome',
-                               'grammar-msg': 'Przeszukaj {{GRAMMAR:grammar_case_foo|{{SITENAME}}}}',
-                               'formatnum-msg': '{{formatnum:$1}}',
-                               'int-msg': 'Some {{int:other-message}}',
-                               'mediawiki-test-version-entrypoints-index-php': '[https://www.mediawiki.org/wiki/Manual:index.php index.php]',
-                               'external-link-replace': 'Foo [$1 bar]'
-                       } );
-
-                       mw.config.set( {
-                               wgArticlePath: '/wiki/$1',
-
-                               // For formatnum tests
-                               wgUserLanguage: 'en'
-                       } );
-
                        specialCharactersPageName = '"Who" wants to be a millionaire & live on \'Exotic Island\'?';
+               },
+               config: {
+                       wgArticlePath: '/wiki/$1',
+
+                       // For formatnum tests
+                       wgUserLanguage: 'en'
+               },
+               // Messages used in multiple tests
+               messages: {
+                       'other-message': 'Other Message',
+                       'mediawiki-test-pagetriage-del-talk-page-notify-summary': 'Notifying author of deletion nomination for [[$1]]',
+                       'gender-plural-msg': '{{GENDER:$1|he|she|they}} {{PLURAL:$2|is|are}} awesome',
+                       'grammar-msg': 'Przeszukaj {{GRAMMAR:grammar_case_foo|{{SITENAME}}}}',
+                       'formatnum-msg': '{{formatnum:$1}}',
+                       'int-msg': 'Some {{int:other-message}}',
+                       'mediawiki-test-version-entrypoints-index-php': '[https://www.mediawiki.org/wiki/Manual:index.php index.php]',
+                       'external-link-replace': 'Foo [$1 bar]'
                }
        } ) );
 
index f422bc1..e6c2b5c 100644 (file)
@@ -6,14 +6,8 @@
        } );
 
        QUnit.test( 'user status', 11, function ( assert ) {
-               /**
-                * Tests can be run under three different conditions:
-                *   1) From tests/qunit/index.html, user will be anonymous.
-                *   2) Logged in on [[Special:JavaScriptTest/qunit]]
-                *   3) Anonymously at the same special page.
-                */
 
-               // Forge an anonymous user:
+               // Forge an anonymous user
                mw.config.set( 'wgUserName', null );
                delete mw.config.values.wgUserId;
 
index 81fda7e..b2587be 100644 (file)
@@ -5,6 +5,11 @@
                },
                teardown: function () {
                        $.fn.updateTooltipAccessKeys.setTestMode( false );
+               },
+               messages: {
+                       // Used by accessKeyLabel in test for addPortletLink
+                       'brackets': '[$1]',
+                       'word-separator': ' '
                }
        } ) );
 
index 59bf8dc..d7bf453 100644 (file)
--- a/thumb.php
+++ b/thumb.php
@@ -116,6 +116,10 @@ function wfStreamThumb( array $params ) {
                $params['width'] = $params['w'];
                unset( $params['w'] );
        }
+       if ( isset( $params['width'] ) && substr( $params['width'], -2 ) == 'px' ) {
+               // strip the px (pixel) suffix, if found
+               $params['width'] = substr( $width, 0, strlen( $width ) - 2 );
+       }
        if ( isset( $params['p'] ) ) {
                $params['page'] = $params['p'];
        }