MediaWiki master
MainConfigSchema.php
Go to the documentation of this file.
1<?php
10// phpcs:disable Generic.NamingConventions.UpperCaseConstantName.ClassConstantNotUpperCase
11// phpcs:disable Generic.Files.LineLength.TooLong
12namespace MediaWiki;
13
17use CdnPurgeJob;
19use DateTime;
20use DateTimeZone;
25use EmaillingJob;
27use Generator;
30use InvalidArgumentException;
31use JobQueueDB;
33use LocalRepo;
34use LogFormatter;
62use MediaWiki\Settings\Source\JsonSchemaTrait;
74use NullJob;
80use ReflectionClass;
85use SqlBagOStuff;
99
132 use JsonSchemaTrait;
133
155 public static function listDefaultValues( string $prefix = '' ): Generator {
156 $class = new ReflectionClass( self::class );
157 foreach ( $class->getReflectionConstants() as $const ) {
158 if ( !$const->isPublic() ) {
159 continue;
160 }
161
162 $value = $const->getValue();
163
164 if ( !is_array( $value ) ) {
165 // Just in case we end up having some other kind of constant on this class.
166 continue;
167 }
168
169 if ( isset( $value['obsolete'] ) ) {
170 continue;
171 }
172
173 $name = $const->getName();
174 yield "$prefix$name" => self::getDefaultFromJsonSchema( $value );
175 }
176 }
177
190 public static function getDefaultValue( string $name ) {
191 $class = new ReflectionClass( self::class );
192 if ( !$class->hasConstant( $name ) ) {
193 throw new InvalidArgumentException( "Unknown setting: $name" );
194 }
195 $value = $class->getConstant( $name );
196
197 if ( !is_array( $value ) ) {
198 // Might happen if we end up having other kinds of constants on this class.
199 throw new InvalidArgumentException( "Unknown setting: $name" );
200 }
201
202 return self::getDefaultFromJsonSchema( $value );
203 }
204
205 /***************************************************************************/
213 public const ConfigRegistry = [
214 'default' => [
215 'main' => 'GlobalVarConfig::newInstance',
216 ],
217 'type' => 'map',
218 ];
219
223 public const Sitename = [
224 'default' => 'MediaWiki',
225 ];
226
227 /***************************************************************************/
228 // region Server URLs and file paths
253 public const Server = [
254 'default' => false,
255 ];
256
266 public const CanonicalServer = [
267 'default' => false,
268 ];
269
276 public const ServerName = [
277 'default' => false,
278 ];
279
286 public const AssumeProxiesUseDefaultProtocolPorts = [
287 'default' => true,
288 'type' => 'boolean',
289 ];
290
301 public const HttpsPort = [
302 'default' => 443,
303 ];
304
322 public const ForceHTTPS = [
323 'default' => false,
324 'type' => 'boolean',
325 ];
326
337 public const ScriptPath = [
338 'default' => '/wiki',
339 ];
340
355 public const UsePathInfo = [
356 'dynamicDefault' => true,
357 ];
358
362 public static function getDefaultUsePathInfo(): bool {
363 // These often break when PHP is set up in CGI mode.
364 // PATH_INFO *may* be correct if cgi.fix_pathinfo is set, but then again it may not;
365 // lighttpd converts incoming path data to lowercase on systems
366 // with case-insensitive filesystems, and there have been reports of
367 // problems on Apache as well.
368 return !str_contains( PHP_SAPI, 'cgi' ) && !str_contains( PHP_SAPI, 'apache2filter' ) &&
369 !str_contains( PHP_SAPI, 'isapi' );
370 }
371
377 public const Script = [
378 'default' => false,
379 'dynamicDefault' => [ 'use' => [ 'ScriptPath' ] ]
380 ];
381
386 public static function getDefaultScript( $scriptPath ): string {
387 return "$scriptPath/index.php";
388 }
389
397 public const LoadScript = [
398 'default' => false,
399 'dynamicDefault' => [ 'use' => [ 'ScriptPath' ] ]
400 ];
401
406 public static function getDefaultLoadScript( $scriptPath ): string {
407 return "$scriptPath/load.php";
408 }
409
416 public const RestPath = [
417 'default' => false,
418 'dynamicDefault' => [ 'use' => [ 'ScriptPath' ] ]
419 ];
420
425 public static function getDefaultRestPath( $scriptPath ): string {
426 return "$scriptPath/rest.php";
427 }
428
436 public const StylePath = [
437 'default' => false,
438 'dynamicDefault' => [ 'use' => [ 'ResourceBasePath' ] ]
439 ];
440
445 public static function getDefaultStylePath( $resourceBasePath ): string {
446 return "$resourceBasePath/skins";
447 }
448
456 public const LocalStylePath = [
457 'default' => false,
458 'dynamicDefault' => [ 'use' => [ 'ScriptPath' ] ]
459 ];
460
465 public static function getDefaultLocalStylePath( $scriptPath ): string {
466 // Avoid ResourceBasePath here since that may point to a different domain (e.g. CDN)
467 return "$scriptPath/skins";
468 }
469
477 public const ExtensionAssetsPath = [
478 'default' => false,
479 'dynamicDefault' => [ 'use' => [ 'ResourceBasePath' ] ]
480 ];
481
486 public static function getDefaultExtensionAssetsPath( $resourceBasePath ): string {
487 return "$resourceBasePath/extensions";
488 }
489
497 public const ExtensionDirectory = [
498 'default' => null,
499 'type' => '?string',
500 ];
501
509 public const StyleDirectory = [
510 'default' => null,
511 'type' => '?string',
512 ];
513
523 public const BaseDirectory = [
524 'default' => null,
525 ];
526
534 public const ArticlePath = [
535 'default' => false,
536 'dynamicDefault' => [ 'use' => [ 'Script', 'UsePathInfo' ] ]
537 ];
538
544 public static function getDefaultArticlePath( string $script, $usePathInfo ): string {
545 if ( $usePathInfo ) {
546 return "$script/$1";
547 }
548 return "$script?title=$1";
549 }
550
556 public const UploadPath = [
557 'default' => false,
558 'dynamicDefault' => [ 'use' => [ 'ScriptPath' ] ]
559 ];
560
565 public static function getDefaultUploadPath( $scriptPath ): string {
566 return "$scriptPath/images";
567 }
568
581 public const ImgAuthPath = [
582 'default' => false,
583 ];
584
591 public const ThumbPath = [
592 'default' => false,
593 ];
594
598 public const UploadDirectory = [
599 'default' => false,
600 'dynamicDefault' => [ 'use' => [ 'BaseDirectory' ] ]
601 ];
602
607 public static function getDefaultUploadDirectory( $baseDirectory ): string {
608 return "$baseDirectory/images";
609 }
610
616 public const FileCacheDirectory = [
617 'default' => false,
618 'dynamicDefault' => [ 'use' => [ 'UploadDirectory' ] ]
619 ];
620
625 public static function getDefaultFileCacheDirectory( $uploadDirectory ): string {
626 return "$uploadDirectory/cache";
627 }
628
637 public const Logo = [
638 'default' => false,
639 'dynamicDefault' => [ 'use' => [ 'ResourceBasePath' ] ]
640 ];
641
646 public static function getDefaultLogo( $resourceBasePath ): string {
647 return "$resourceBasePath/resources/assets/change-your-logo.svg";
648 }
649
699 public const Logos = [
700 'default' => false,
701 'type' => 'map|false',
702 ];
703
709 public const Favicon = [
710 'default' => '/favicon.ico',
711 ];
712
720 public const AppleTouchIcon = [
721 'default' => false,
722 ];
723
742 public const ReferrerPolicy = [
743 'default' => false,
744 'type' => 'list|string|false',
745 ];
746
768 public const TmpDirectory = [
769 'default' => false,
770 ];
771
778 public const UploadBaseUrl = [
779 'default' => '',
780 ];
781
794 public const UploadStashScalerBaseUrl = [
795 'default' => false,
796 'deprecated' => 'since 1.36 Use thumbProxyUrl in $wgLocalFileRepo',
797 ];
798
813 public const ActionPaths = [
814 'default' => [],
815 'type' => 'map',
816 ];
817
824 public const MainPageIsDomainRoot = [
825 'default' => false,
826 'type' => 'boolean',
827 ];
828
829 // endregion -- end of server URLs and file paths
830
831 /***************************************************************************/
832 // region Files and file uploads
844 public const EnableUploads = [
845 'default' => false,
846 ];
847
851 public const UploadStashMaxAge = [
852 'default' => 6 * 3600, // 6 hours
853 ];
854
861 public const EnableAsyncUploads = [
862 'default' => false,
863 ];
864
870 public const EnableAsyncUploadsByURL = [
871 'default' => false,
872 ];
873
877 public const UploadMaintenance = [
878 'default' => false,
879 ];
880
890 public const IllegalFileChars = [
891 'default' => ':\\/\\\\',
892 'deprecated' => 'since 1.41; no longer customizable',
893 ];
894
900 public const DeletedDirectory = [
901 'default' => false,
902 'dynamicDefault' => [ 'use' => [ 'UploadDirectory' ] ]
903 ];
904
909 public static function getDefaultDeletedDirectory( $uploadDirectory ): string {
910 return "$uploadDirectory/deleted";
911 }
912
916 public const ImgAuthDetails = [
917 'default' => false,
918 ];
919
935 public const ImgAuthUrlPathMap = [
936 'default' => [],
937 'type' => 'map',
938 ];
939
1075 public const LocalFileRepo = [
1076 'default' => false,
1077 'type' => 'map|false',
1078 'dynamicDefault' => [ 'use' => [ 'UploadDirectory', 'ScriptPath', 'Favicon', 'UploadBaseUrl',
1079 'UploadPath', 'HashedUploadDirectory', 'ThumbnailScriptPath',
1080 'GenerateThumbnailOnParse', 'DeletedDirectory', 'UpdateCompatibleMetadata' ] ],
1081 ];
1082
1083 public static function getDefaultLocalFileRepo(
1084 $uploadDirectory, $scriptPath, $favicon, $uploadBaseUrl, $uploadPath,
1085 $hashedUploadDirectory, $thumbnailScriptPath, $generateThumbnailOnParse, $deletedDirectory,
1086 $updateCompatibleMetadata
1087 ) {
1088 return [
1089 'class' => LocalRepo::class,
1090 'name' => 'local',
1091 'directory' => $uploadDirectory,
1092 'scriptDirUrl' => $scriptPath,
1093 'favicon' => $favicon,
1094 'url' => $uploadBaseUrl ? $uploadBaseUrl . $uploadPath : $uploadPath,
1095 'hashLevels' => $hashedUploadDirectory ? 2 : 0,
1096 'thumbScriptUrl' => $thumbnailScriptPath,
1097 'transformVia404' => !$generateThumbnailOnParse,
1098 'deletedDir' => $deletedDirectory,
1099 'deletedHashLevels' => $hashedUploadDirectory ? 3 : 0,
1100 'updateCompatibleMetadata' => $updateCompatibleMetadata,
1101 'reserializeMetadata' => $updateCompatibleMetadata,
1102 ];
1103 }
1104
1118 public const ForeignFileRepos = [
1119 'default' => [],
1120 'type' => 'list',
1121 ];
1122
1132 public const UseInstantCommons = [
1133 'default' => false,
1134 ];
1135
1163 public const UseSharedUploads = [
1164 'default' => false,
1165 'type' => 'boolean',
1166 ];
1167
1175 public const SharedUploadDirectory = [
1176 'default' => null,
1177 'type' => '?string',
1178 ];
1179
1187 public const SharedUploadPath = [
1188 'default' => null,
1189 'type' => '?string',
1190 ];
1191
1199 public const HashedSharedUploadDirectory = [
1200 'default' => true,
1201 'type' => 'boolean',
1202 ];
1203
1211 public const RepositoryBaseUrl = [
1212 'default' => 'https://commons.wikimedia.org/wiki/File:',
1213 ];
1214
1222 public const FetchCommonsDescriptions = [
1223 'default' => false,
1224 'type' => 'boolean',
1225 ];
1226
1235 public const SharedUploadDBname = [
1236 'default' => false,
1237 'type' => 'false|string',
1238 ];
1239
1247 public const SharedUploadDBprefix = [
1248 'default' => '',
1249 'type' => 'string',
1250 ];
1251
1259 public const CacheSharedUploads = [
1260 'default' => true,
1261 'type' => 'boolean',
1262 ];
1263
1274 public const ForeignUploadTargets = [
1275 'default' => [ 'local', ],
1276 'type' => 'list',
1277 ];
1278
1288 public const UploadDialog = [
1289 'default' =>
1290 [
1291 'fields' =>
1292 [
1293 'description' => true,
1294 'date' => false,
1295 'categories' => false,
1296 ],
1297 'licensemessages' =>
1298 [
1299 'local' => 'generic-local',
1300 'foreign' => 'generic-foreign',
1301 ],
1302 'comment' =>
1303 [
1304 'local' => '',
1305 'foreign' => '',
1306 ],
1307 'format' =>
1308 [
1309 'filepage' => '$DESCRIPTION',
1310 'description' => '$TEXT',
1311 'ownwork' => '',
1312 'license' => '',
1313 'uncategorized' => '',
1314 ],
1315 ],
1316 'type' => 'map',
1317 ];
1318
1355 public const FileBackends = [
1356 'default' => [],
1357 'type' => 'map',
1358 ];
1359
1371 public const LockManagers = [
1372 'default' => [],
1373 'type' => 'list',
1374 ];
1375
1391 public const ShowEXIF = [
1392 'dynamicDefault' => [ 'callback' => [ self::class, 'getDefaultShowEXIF' ] ],
1393 ];
1394
1398 public static function getDefaultShowEXIF(): bool {
1399 return function_exists( 'exif_read_data' );
1400 }
1401
1405 public const UpdateCompatibleMetadata = [
1406 'default' => false,
1407 ];
1408
1415 public const AllowCopyUploads = [
1416 'default' => false,
1417 ];
1418
1424 public const CopyUploadsDomains = [
1425 'default' => [],
1426 'type' => 'list',
1427 ];
1428
1434 public const CopyUploadsFromSpecialUpload = [
1435 'default' => false,
1436 ];
1437
1443 public const CopyUploadProxy = [
1444 'default' => false,
1445 ];
1446
1455 public const CopyUploadTimeout = [
1456 'default' => false,
1457 'type' => 'false|integer',
1458 ];
1459
1466 public const CopyUploadAllowOnWikiDomainConfig = [
1467 'default' => false,
1468 ];
1469
1490 public const MaxUploadSize = [
1491 'default' => 1024 * 1024 * 100,
1492 ];
1493
1508 public const MinUploadChunkSize = [
1509 'default' => 1024,
1510 ];
1511
1523 public const UploadNavigationUrl = [
1524 'default' => false,
1525 ];
1526
1532 public const UploadMissingFileUrl = [
1533 'default' => false,
1534 ];
1535
1549 public const ThumbnailScriptPath = [
1550 'default' => false,
1551 ];
1552
1560 public const SharedThumbnailScriptPath = [
1561 'default' => false,
1562 'type' => 'string|false',
1563 ];
1564
1570 public const HashedUploadDirectory = [
1571 'default' => true,
1572 'type' => 'boolean',
1573 ];
1574
1583 public const FileExtensions = [
1584 'default' => [ 'png', 'gif', 'jpg', 'jpeg', 'webp', ],
1585 'type' => 'list',
1586 ];
1587
1596 public const ProhibitedFileExtensions = [
1597 'default' => [
1598 # HTML may contain cookie-stealing JavaScript and web bugs
1599 'html', 'htm', 'js', 'jsb', 'mhtml', 'mht', 'xhtml', 'xht',
1600 # PHP scripts may execute arbitrary code on the server
1601 'php', 'phtml', 'php3', 'php4', 'php5', 'phps', 'phar',
1602 # Other types that may be interpreted by some servers
1603 'shtml', 'jhtml', 'pl', 'py', 'cgi',
1604 # May contain harmful executables for Windows victims
1605 'exe', 'scr', 'dll', 'msi', 'vbs', 'bat', 'com', 'pif', 'cmd', 'vxd', 'cpl',
1606 # T341565
1607 'xml',
1608 ],
1609 'type' => 'list',
1610 ];
1611
1618 public const MimeTypeExclusions = [
1619 'default' => [
1620 # HTML may contain cookie-stealing JavaScript and web bugs
1621 'text/html',
1622 # Similarly with JavaScript itself
1623 'application/javascript', 'text/javascript', 'text/x-javascript', 'application/x-shellscript',
1624 # PHP scripts may execute arbitrary code on the server
1625 'application/x-php', 'text/x-php',
1626 # Other types that may be interpreted by some servers
1627 'text/x-python', 'text/x-perl', 'text/x-bash', 'text/x-sh', 'text/x-csh',
1628 # Client-side hazards on Internet Explorer
1629 'text/scriptlet', 'application/x-msdownload',
1630 # Windows metafile, client-side vulnerability on some systems
1631 'application/x-msmetafile',
1632 # Files that look like java files
1633 'application/java',
1634 # XML files generally - T341565
1635 'application/xml', 'text/xml',
1636 ],
1637 'type' => 'list',
1638 ];
1639
1645 public const CheckFileExtensions = [
1646 'default' => true,
1647 ];
1648
1655 public const StrictFileExtensions = [
1656 'default' => true,
1657 ];
1658
1665 public const DisableUploadScriptChecks = [
1666 'default' => false,
1667 ];
1668
1672 public const UploadSizeWarning = [
1673 'default' => false,
1674 ];
1675
1687 public const TrustedMediaFormats = [
1688 'default' => [
1689 MEDIATYPE_BITMAP, // all bitmap formats
1690 MEDIATYPE_AUDIO, // all audio formats
1691 MEDIATYPE_VIDEO, // all plain video formats
1692 "image/svg+xml", // svg (only needed if inline rendering of svg is not supported)
1693 "application/pdf", // PDF files
1694 # "application/x-shockwave-flash", //flash/shockwave movie
1695 ],
1696 'type' => 'list',
1697 ];
1698
1707 public const MediaHandlers = [
1708 'default' => [],
1709 'type' => 'map',
1710 ];
1711
1718 public const NativeImageLazyLoading = [
1719 'default' => false,
1720 'type' => 'boolean',
1721 ];
1722
1727 public const ParserTestMediaHandlers = [
1728 'default' => [
1729 'image/jpeg' => 'MockBitmapHandler',
1730 'image/png' => 'MockBitmapHandler',
1731 'image/gif' => 'MockBitmapHandler',
1732 'image/tiff' => 'MockBitmapHandler',
1733 'image/webp' => 'MockBitmapHandler',
1734 'image/x-ms-bmp' => 'MockBitmapHandler',
1735 'image/x-bmp' => 'MockBitmapHandler',
1736 'image/x-xcf' => 'MockBitmapHandler',
1737 'image/svg+xml' => 'MockSvgHandler',
1738 'image/vnd.djvu' => 'MockDjVuHandler',
1739 ],
1740 'type' => 'map',
1741 ];
1742
1748 public const UseImageResize = [
1749 'default' => true,
1750 ];
1751
1761 public const UseImageMagick = [
1762 'default' => false,
1763 ];
1764
1768 public const ImageMagickConvertCommand = [
1769 'default' => '/usr/bin/convert',
1770 ];
1771
1777 public const MaxInterlacingAreas = [
1778 'default' => [],
1779 'type' => 'map',
1780 ];
1781
1785 public const SharpenParameter = [
1786 'default' => '0x0.4',
1787 ];
1788
1792 public const SharpenReductionThreshold = [
1793 'default' => 0.85,
1794 ];
1795
1800 public const ImageMagickTempDir = [
1801 'default' => false,
1802 ];
1803
1816 public const CustomConvertCommand = [
1817 'default' => false,
1818 ];
1819
1825 public const JpegTran = [
1826 'default' => '/usr/bin/jpegtran',
1827 ];
1828
1848 public const JpegPixelFormat = [
1849 'default' => 'yuv420',
1850 ];
1851
1859 public const JpegQuality = [
1860 'default' => 80,
1861 ];
1862
1867 public const Exiv2Command = [
1868 'default' => '/usr/bin/exiv2',
1869 ];
1870
1876 public const Exiftool = [
1877 'default' => '/usr/bin/exiftool',
1878 ];
1879
1890 public const SVGConverters = [
1891 'default' => [
1892 'ImageMagick' => '$path/convert -background "#ffffff00" -thumbnail $widthx$height\\! $input PNG:$output',
1893 'sodipodi' => '$path/sodipodi -z -w $width -f $input -e $output',
1894 'inkscape' => '$path/inkscape -z -w $width -f $input -e $output',
1895 'batik' => 'java -Djava.awt.headless=true -jar $path/batik-rasterizer.jar -w $width -d $output $input',
1896 'rsvg' => '$path/rsvg-convert -w $width -h $height -o $output $input',
1897 'imgserv' => '$path/imgserv-wrapper -i svg -o png -w$width $input $output',
1898 'ImagickExt' => [ 'SvgHandler::rasterizeImagickExt', ],
1899 ],
1900 'type' => 'map',
1901 ];
1902
1906 public const SVGConverter = [
1907 'default' => 'ImageMagick',
1908 ];
1909
1913 public const SVGConverterPath = [
1914 'default' => '',
1915 ];
1916
1920 public const SVGMaxSize = [
1921 'default' => 5120,
1922 ];
1923
1929 public const SVGMetadataCutoff = [
1930 'default' => 1024 * 1024 * 5,
1931 ];
1932
1943 public const SVGNativeRendering = [
1944 'default' => false,
1945 'type' => 'string|boolean',
1946 ];
1947
1955 public const SVGNativeRenderingSizeLimit = [
1956 'default' => 50 * 1024,
1957 ];
1958
1968 public const MediaInTargetLanguage = [
1969 'default' => true,
1970 ];
1971
1989 public const MaxImageArea = [
1990 'default' => 12_500_000,
1991 'type' => 'string|integer|false',
1992 ];
1993
2002 public const MaxAnimatedGifArea = [
2003 'default' => 12_500_000,
2004 ];
2005
2021 public const TiffThumbnailType = [
2022 'default' => [],
2023 'type' => 'list',
2024 'mergeStrategy' => 'replace',
2025 ];
2026
2034 public const ThumbnailEpoch = [
2035 'default' => '20030516000000',
2036 ];
2037
2045 public const AttemptFailureEpoch = [
2046 'default' => 1,
2047 ];
2048
2060 public const IgnoreImageErrors = [
2061 'default' => false,
2062 ];
2063
2084 public const GenerateThumbnailOnParse = [
2085 'default' => true,
2086 'type' => 'boolean',
2087 ];
2088
2092 public const ShowArchiveThumbnails = [
2093 'default' => true,
2094 ];
2095
2101 public const EnableAutoRotation = [
2102 'default' => null,
2103 'type' => '?boolean',
2104 ];
2105
2111 public const Antivirus = [
2112 'default' => null,
2113 'type' => '?string',
2114 ];
2115
2151 public const AntivirusSetup = [
2152 'default' => [
2153 # setup for clamav
2154 'clamav' => [
2155 'command' => 'clamscan --no-summary ',
2156 'codemap' => [
2157 "0" => AV_NO_VIRUS, # no virus
2158 "1" => AV_VIRUS_FOUND, # virus found
2159 "52" => AV_SCAN_ABORTED, # unsupported file format (probably immune)
2160 "*" => AV_SCAN_FAILED, # else scan failed
2161 ],
2162 'messagepattern' => '/.*?:(.*)/sim',
2163 ],
2164 ],
2165 'type' => 'map',
2166 ];
2167
2171 public const AntivirusRequired = [
2172 'default' => true,
2173 ];
2174
2178 public const VerifyMimeType = [
2179 'default' => true,
2180 ];
2181
2192 public const MimeTypeFile = [
2193 'default' => 'internal',
2194 ];
2195
2201 public const MimeInfoFile = [
2202 'default' => 'internal',
2203 ];
2204
2218 public const MimeDetectorCommand = [
2219 'default' => null,
2220 'type' => '?string',
2221 ];
2222
2228 public const TrivialMimeDetection = [
2229 'default' => false,
2230 ];
2231
2237 public const XMLMimeTypes = [
2238 'default' => [
2239 'http://www.w3.org/2000/svg:svg' => 'image/svg+xml',
2240 'svg' => 'image/svg+xml',
2241 'http://www.lysator.liu.se/~alla/dia/:diagram' => 'application/x-dia-diagram',
2242 'http://www.w3.org/1999/xhtml:html' => 'text/html',
2243 'html' => 'text/html',
2244 ],
2245 'type' => 'map',
2246 ];
2247
2258 public const ImageLimits = [
2259 'default' => [
2260 [ 320, 240 ],
2261 [ 640, 480 ],
2262 [ 800, 600 ],
2263 [ 1024, 768 ],
2264 [ 1280, 1024 ],
2265 [ 2560, 2048 ],
2266 ],
2267 'type' => 'list',
2268 ];
2269
2275 public const ThumbLimits = [
2276 'default' => [
2277 120,
2278 150,
2279 180,
2280 200,
2281 250,
2282 300
2283 ],
2284 'type' => 'list',
2285 ];
2286
2292 public const ThumbnailNamespaces = [
2293 'default' => [ NS_FILE ],
2294 'type' => 'list',
2295 'items' => [ 'type' => 'integer', ],
2296 ];
2297
2308 public const ThumbnailBuckets = [
2309 'default' => null,
2310 'type' => '?list',
2311 ];
2312
2328 public const ThumbnailMinimumBucketDistance = [
2329 'default' => 50,
2330 ];
2331
2341 public const UploadThumbnailRenderMap = [
2342 'default' => [],
2343 'type' => 'map',
2344 ];
2345
2357 public const UploadThumbnailRenderMethod = [
2358 'default' => 'jobqueue',
2359 ];
2360
2367 public const UploadThumbnailRenderHttpCustomHost = [
2368 'default' => false,
2369 ];
2370
2377 public const UploadThumbnailRenderHttpCustomDomain = [
2378 'default' => false,
2379 ];
2380
2388 public const UseTinyRGBForJPGThumbnails = [
2389 'default' => false,
2390 ];
2391
2407 public const GalleryOptions = [
2408 'default' => [],
2409 'type' => 'map',
2410 ];
2411
2417 public const ThumbUpright = [
2418 'default' => 0.75,
2419 ];
2420
2424 public const DirectoryMode = [
2425 'default' => 0777, // octal!
2426 ];
2427
2434 public const ResponsiveImages = [
2435 'default' => true,
2436 ];
2437
2454 public const ImagePreconnect = [
2455 'default' => false,
2456 ];
2457
2458 /***************************************************************************/
2459 // region DJVU settings
2468 public const DjvuUseBoxedCommand = [
2469 'default' => false,
2470 ];
2471
2480 public const DjvuDump = [
2481 'default' => null,
2482 'type' => '?string',
2483 ];
2484
2490 public const DjvuRenderer = [
2491 'default' => null,
2492 'type' => '?string',
2493 ];
2494
2503 public const DjvuTxt = [
2504 'default' => null,
2505 'type' => '?string',
2506 ];
2507
2513 public const DjvuPostProcessor = [
2514 'default' => 'pnmtojpeg',
2515 'type' => '?string',
2516 ];
2517
2521 public const DjvuOutputExtension = [
2522 'default' => 'jpg',
2523 ];
2524
2525 // endregion -- end of DJvu
2526
2527 // endregion -- end of file uploads
2528
2529 /***************************************************************************/
2530 // region Email settings
2538 public const EmergencyContact = [
2539 'default' => false,
2540 ];
2541
2550 public const PasswordSender = [
2551 'default' => false,
2552 ];
2553
2559 public const NoReplyAddress = [
2560 'default' => false,
2561 ];
2562
2568 public const EnableEmail = [
2569 'default' => true,
2570 ];
2571
2577 public const EnableUserEmail = [
2578 'default' => true,
2579 ];
2580
2588 public const EnableSpecialMute = [
2589 'default' => false,
2590 ];
2591
2597 public const EnableUserEmailMuteList = [
2598 'default' => false,
2599 ];
2600
2610 public const UserEmailUseReplyTo = [
2611 'default' => true,
2612 ];
2613
2618 public const PasswordReminderResendTime = [
2619 'default' => 24,
2620 ];
2621
2625 public const NewPasswordExpiry = [
2626 'default' => 3600 * 24 * 7,
2627 ];
2628
2632 public const UserEmailConfirmationTokenExpiry = [
2633 'default' => 7 * 24 * 60 * 60,
2634 ];
2635
2640 public const PasswordExpirationDays = [
2641 'default' => false,
2642 ];
2643
2648 public const PasswordExpireGrace = [
2649 'default' => 3600 * 24 * 7,
2650 ];
2651
2669 public const SMTP = [
2670 'default' => false,
2671 'type' => 'false|map',
2672 ];
2673
2677 public const AdditionalMailParams = [
2678 'default' => null,
2679 ];
2680
2685 public const AllowHTMLEmail = [
2686 'default' => false,
2687 ];
2688
2698 public const EnotifFromEditor = [
2699 'default' => false,
2700 'type' => 'boolean',
2701 ];
2702
2709 public const EmailAuthentication = [
2710 'default' => true,
2711 ];
2712
2716 public const EnotifWatchlist = [
2717 'default' => false,
2718 ];
2719
2727 public const EnotifUserTalk = [
2728 'default' => false,
2729 ];
2730
2743 public const EnotifRevealEditorAddress = [
2744 'default' => false,
2745 'type' => 'boolean',
2746 ];
2747
2761 public const EnotifMinorEdits = [
2762 'default' => true,
2763 ];
2764
2772 public const EnotifImpersonal = [
2773 'default' => false,
2774 ];
2775
2780 public const EnotifMaxRecips = [
2781 'default' => 500,
2782 ];
2783
2787 public const EnotifUseRealName = [
2788 'default' => false,
2789 ];
2790
2795 public const UsersNotifiedOnAllChanges = [
2796 'default' => [],
2797 'type' => 'map',
2798 ];
2799
2800 // endregion -- end of email settings
2801
2802 /***************************************************************************/
2803 // region Database settings
2816 public const DBname = [
2817 'default' => 'my_wiki',
2818 ];
2819
2830 public const DBmwschema = [
2831 'default' => null,
2832 'type' => '?string',
2833 ];
2834
2846 public const DBprefix = [
2847 'default' => '',
2848 ];
2849
2853 public const DBserver = [
2854 'default' => 'localhost',
2855 ];
2856
2860 public const DBport = [
2861 'default' => 5432,
2862 ];
2863
2867 public const DBuser = [
2868 'default' => 'wikiuser',
2869 ];
2870
2874 public const DBpassword = [
2875 'default' => '',
2876 ];
2877
2881 public const DBtype = [
2882 'default' => 'mysql',
2883 ];
2884
2892 public const DBssl = [
2893 'default' => false,
2894 ];
2895
2904 public const DBcompress = [
2905 'default' => false,
2906 ];
2907
2919 public const DBStrictWarnings = [
2920 'default' => false,
2921 ];
2922
2926 public const DBadminuser = [
2927 'default' => null,
2928 ];
2929
2933 public const DBadminpassword = [
2934 'default' => null,
2935 ];
2936
2948 public const SearchType = [
2949 'default' => null,
2950 ];
2951
2964 public const SearchTypeAlternatives = [
2965 'default' => null,
2966 ];
2967
2971 public const DBTableOptions = [
2972 'default' => 'ENGINE=InnoDB, DEFAULT CHARSET=binary',
2973 ];
2974
2982 public const SQLMode = [
2983 'default' => '',
2984 ];
2985
2993 public const DBDefaultGroup = [
2994 'default' => null,
2995 ];
2996
3000 public const SQLiteDataDir = [
3001 'default' => '',
3002 ];
3003
3024 public const SharedDB = [
3025 'default' => null,
3026 ];
3027
3031 public const SharedPrefix = [
3032 'default' => false,
3033 'dynamicDefault' => [ 'use' => [ 'DBprefix' ] ]
3034 ];
3035
3040 public static function getDefaultSharedPrefix( $dbPrefix ) {
3041 return $dbPrefix;
3042 }
3043
3048 public const SharedTables = [
3049 'default' => [
3050 'user',
3051 'user_properties',
3052 'user_autocreate_serial',
3053 ],
3054 'type' => 'list',
3055 ];
3056
3061 public const SharedSchema = [
3062 'default' => false,
3063 'dynamicDefault' => [ 'use' => [ 'DBmwschema' ] ]
3064 ];
3065
3070 public static function getDefaultSharedSchema( $dbMwschema ) {
3071 return $dbMwschema;
3072 }
3073
3128 public const DBservers = [
3129 'default' => false,
3130 'type' => 'false|list',
3131 ];
3132
3143 public const LBFactoryConf = [
3144 'default' => [
3145 'class' => 'Wikimedia\\Rdbms\\LBFactorySimple',
3146 ],
3147 'type' => 'map',
3148 'mergeStrategy' => 'replace',
3149 ];
3150
3162 public const DataCenterUpdateStickTTL = [
3163 'default' => 10,
3164 ];
3165
3169 public const DBerrorLog = [
3170 'default' => false,
3171 ];
3172
3193 public const DBerrorLogTZ = [
3194 'default' => false,
3195 'dynamicDefault' => [ 'use' => [ 'Localtimezone' ] ]
3196 ];
3197
3198 public static function getDefaultDBerrorLogTZ( $localtimezone ) {
3199 // NOTE: Extra fallback, in case $localtimezone is ''.
3200 // Many extsing LocalSettings files have $wgLocaltimezone = ''
3201 // in them, erroneously generated by the installer.
3202 return $localtimezone ?: self::getDefaultLocaltimezone();
3203 }
3204
3218 public const LocalDatabases = [
3219 'default' => [],
3220 'type' => 'list',
3221 'items' => [ 'type' => 'string', ],
3222 ];
3223
3231 public const DatabaseReplicaLagWarning = [
3232 'default' => 10,
3233 ];
3234
3239 public const DatabaseReplicaLagCritical = [
3240 'default' => 30,
3241 ];
3242
3249 public const MaxExecutionTimeForExpensiveQueries = [
3250 'default' => 0,
3251 ];
3252
3268 public const VirtualDomainsMapping = [
3269 'default' => [],
3270 'type' => 'map',
3271 ];
3272
3284 public const PageLinksSchemaMigrationStage = [
3285 'default' => SCHEMA_COMPAT_NEW,
3286 'type' => 'integer',
3287 ];
3288
3307 public const ExternalLinksDomainGaps = [
3308 'default' => [],
3309 'type' => 'map',
3310 ];
3311
3312 // endregion -- End of DB settings
3313
3314 /***************************************************************************/
3315 // region Content handlers and storage
3326 public const ContentHandlers = [
3327 'default' =>
3328 [
3329 // the usual case
3331 'class' => WikitextContentHandler::class,
3332 'services' => [
3333 'TitleFactory',
3334 'ParserFactory',
3335 'GlobalIdGenerator',
3336 'LanguageNameUtils',
3337 'LinkRenderer',
3338 'MagicWordFactory',
3339 'ParsoidParserFactory',
3340 ],
3341 ],
3342 // dumb version, no syntax highlighting
3343 CONTENT_MODEL_JAVASCRIPT => JavaScriptContentHandler::class,
3344 // simple implementation, for use by extensions, etc.
3345 CONTENT_MODEL_JSON => JsonContentHandler::class,
3346 // dumb version, no syntax highlighting
3347 CONTENT_MODEL_CSS => CssContentHandler::class,
3348 // plain text, for use by extensions, etc.
3349 CONTENT_MODEL_TEXT => TextContentHandler::class,
3350 // fallback for unknown models, from imports or extensions that were removed
3351 CONTENT_MODEL_UNKNOWN => FallbackContentHandler::class,
3352 ],
3353 'type' => 'map',
3354 ];
3355
3367 public const NamespaceContentModels = [
3368 'default' => [],
3369 'type' => 'map',
3370 ];
3371
3387 public const TextModelsToParse = [
3388 'default' => [
3389 CONTENT_MODEL_WIKITEXT, // Just for completeness, wikitext will always be parsed.
3390 CONTENT_MODEL_JAVASCRIPT, // Make categories etc work, people put them into comments.
3391 CONTENT_MODEL_CSS, // Make categories etc work, people put them into comments.
3392 ],
3393 'type' => 'list',
3394 ];
3395
3402 public const CompressRevisions = [
3403 'default' => false,
3404 ];
3405
3415 public const ExternalStores = [
3416 'default' => [],
3417 'type' => 'list',
3418 ];
3419
3439 public const ExternalServers = [
3440 'default' => [],
3441 'type' => 'map',
3442 ];
3443
3456 public const DefaultExternalStore = [
3457 'default' => false,
3458 'type' => 'list|false',
3459 ];
3460
3467 public const RevisionCacheExpiry = [
3468 'default' => SqlBlobStore::DEFAULT_TTL,
3469 'type' => 'integer',
3470 ];
3471
3478 public const PageLanguageUseDB = [
3479 'default' => false,
3480 'type' => 'boolean',
3481 ];
3482
3495 public const DiffEngine = [
3496 'default' => null,
3497 'type' => '?string',
3498 ];
3499
3503 public const ExternalDiffEngine = [
3504 'default' => false,
3505 'type' => 'string|false',
3506 ];
3507
3532 public const Wikidiff2Options = [
3533 'default' => [],
3534 'type' => 'map'
3535 ];
3536
3537 // endregion -- end of Content handlers and storage
3538
3539 /***************************************************************************/
3540 // region Performance hacks and limits
3552 public const RequestTimeLimit = [
3553 'default' => null,
3554 'type' => '?integer',
3555 ];
3556
3566 public const TransactionalTimeLimit = [
3567 'default' => 120,
3568 ];
3569
3584 public const CriticalSectionTimeLimit = [
3585 'default' => 180.0,
3586 'type' => 'float',
3587 ];
3588
3592 public const MiserMode = [
3593 'default' => false,
3594 ];
3595
3599 public const DisableQueryPages = [
3600 'default' => false,
3601 ];
3602
3606 public const QueryCacheLimit = [
3607 'default' => 1000,
3608 ];
3609
3613 public const WantedPagesThreshold = [
3614 'default' => 1,
3615 ];
3616
3620 public const AllowSlowParserFunctions = [
3621 'default' => false,
3622 ];
3623
3627 public const AllowSchemaUpdates = [
3628 'default' => true,
3629 ];
3630
3634 public const MaxArticleSize = [
3635 'default' => 2048,
3636 ];
3637
3642 public const MemoryLimit = [
3643 'default' => '50M',
3644 ];
3645
3689 public const PoolCounterConf = [
3690 'default' => null,
3691 'type' => '?map',
3692 ];
3693
3706 public const PoolCountClientConf = [
3707 'default' => [
3708 'servers' => [
3709 '127.0.0.1'
3710 ],
3711 'timeout' => 0.1,
3712 ],
3713 'type' => 'map',
3714 ];
3715
3723 public const MaxUserDBWriteDuration = [
3724 'default' => false,
3725 'type' => 'integer|false',
3726 ];
3727
3735 public const MaxJobDBWriteDuration = [
3736 'default' => false,
3737 'type' => 'integer|false',
3738 ];
3739
3744 public const LinkHolderBatchSize = [
3745 'default' => 1000,
3746 ];
3747
3751 public const MaximumMovedPages = [
3752 'default' => 100,
3753 ];
3754
3767 public const ForceDeferredUpdatesPreSend = [
3768 'default' => false,
3769 ];
3770
3780 public const MultiShardSiteStats = [
3781 'default' => false,
3782 'type' => 'boolean',
3783 ];
3784
3785 // endregion -- end performance hacks
3786
3787 /***************************************************************************/
3788 // region Cache settings
3799 public const CacheDirectory = [
3800 'default' => false,
3801 ];
3802
3827 public const MainCacheType = [
3828 'default' => CACHE_NONE,
3829 ];
3830
3837 public const MessageCacheType = [
3838 'default' => CACHE_ANYTHING,
3839 ];
3840
3866 public const ParserCacheType = [
3867 'default' => CACHE_ANYTHING,
3868 ];
3869
3877 public const SessionCacheType = [
3878 'default' => CACHE_ANYTHING,
3879 ];
3880
3889 public const LanguageConverterCacheType = [
3890 'default' => CACHE_ANYTHING,
3891 ];
3892
3954 public const ObjectCaches = [
3955 'default' => [
3956 CACHE_NONE => [ 'class' => EmptyBagOStuff::class, 'reportDupes' => false ],
3957 CACHE_DB => [ 'class' => SqlBagOStuff::class, 'loggroup' => 'SQLBagOStuff' ],
3958
3959 'memcached-php' => [ 'class' => MemcachedPhpBagOStuff::class, 'loggroup' => 'memcached' ],
3960 'memcached-pecl' => [ 'class' => MemcachedPeclBagOStuff::class, 'loggroup' => 'memcached' ],
3961 'hash' => [ 'class' => HashBagOStuff::class, 'reportDupes' => false ],
3962
3963 // Deprecated since 1.35.
3964 // - To configure a wg*CacheType variable to use the local server cache,
3965 // use CACHE_ACCEL instead, which will select these automatically.
3966 // - To access the object for the local server cache at run-time,
3967 // use MediaWikiServices::getLocalServerObjectCache()
3968 // instead of e.g. ObjectCache::getInstance( 'apcu' ).
3969 // - To instantiate a new one of these explicitly, do so directly
3970 // by using `new APCUBagOStuff( [ … ] )`
3971 // - To instantiate a new one of these including auto-detection and fallback,
3972 // use ObjectCache::makeLocalServerCache().
3973 'apc' => [ 'class' => APCUBagOStuff::class, 'reportDupes' => false ],
3974 'apcu' => [ 'class' => APCUBagOStuff::class, 'reportDupes' => false ],
3975 ],
3976 'type' => 'map',
3977 ];
3978
3986 public const WANObjectCache = [
3987 'default' => [],
3988 'type' => 'map',
3989 ];
3990
4011 public const MicroStashType = [
4012 'default' => CACHE_ANYTHING,
4013 'type' => 'string|int',
4014 ];
4015
4043 public const MainStash = [
4044 'default' => CACHE_DB,
4045 ];
4046
4071 public const ParsoidCacheConfig = [
4072 'type' => 'object',
4073 'properties' => [
4074 'StashType' => [ 'type' => 'int|string|null', 'default' => null ],
4075 'StashDuration' => [ 'type' => 'int', 'default' => 24 * 60 * 60 ],
4076 'WarmParsoidParserCache' => [ 'type' => 'bool', 'default' => false ],
4077 ]
4078 ];
4079
4089 public const ParsoidSelectiveUpdateSampleRate = [
4090 'type' => 'integer',
4091 'default' => 0,
4092 ];
4093
4113 public const ParserCacheFilterConfig = [
4114 'type' => 'map',
4115 'default' => [ // default value
4116 'pcache' => [ // old parser cache
4117 'default' => [ // all namespaces
4118 // 0 means no threshold.
4119 // Use PHP_INT_MAX to disable cache.
4120 'minCpuTime' => 0
4121 ],
4122 ],
4123 'parsoid-pcache' => [ // parsoid output cache
4124 'default' => [ // all namespaces
4125 // 0 means no threshold.
4126 // Use PHP_INT_MAX to disable cache.
4127 'minCpuTime' => 0
4128 ],
4129 ],
4130 ],
4131 'additionalProperties' => [ // caches
4132 'type' => 'map',
4133 'description' => 'A map of namespace IDs to filter definitions.',
4134 'additionalProperties' => [ // namespaces
4135 'type' => 'map',
4136 'description' => 'A map of filter names to values.',
4137 'properties' => [ // filters
4138 'minCpuTime' => [ 'type' => 'float' ]
4139 ]
4140 ],
4141 ],
4142 ];
4143
4159 public const ChronologyProtectorStash = [
4160 'default' => null,
4161 'type' => '?string',
4162 ];
4163
4169 public const ChronologyProtectorSecret = [
4170 'default' => '',
4171 'type' => 'string',
4172 ];
4173
4179 public const ParserCacheExpireTime = [
4180 'default' => 60 * 60 * 24,
4181 ];
4182
4188 public const OldRevisionParserCacheExpireTime = [
4189 'default' => 60 * 60,
4190 ];
4191
4195 public const ObjectCacheSessionExpiry = [
4196 'default' => 60 * 60,
4197 ];
4198
4211 public const PHPSessionHandling = [
4212 'default' => 'enable',
4213 'type' => 'string',
4214 ];
4215
4223 public const SuspiciousIpExpiry = [
4224 'default' => false,
4225 'type' => 'integer|false',
4226 ];
4227
4233 public const SessionPbkdf2Iterations = [
4234 'default' => 10001,
4235 ];
4236
4240 public const MemCachedServers = [
4241 'default' => [ '127.0.0.1:11211', ],
4242 'type' => 'list',
4243 ];
4244
4249 public const MemCachedPersistent = [
4250 'default' => false,
4251 ];
4252
4256 public const MemCachedTimeout = [
4257 'default' => 500_000,
4258 ];
4259
4271 public const UseLocalMessageCache = [
4272 'default' => false,
4273 ];
4274
4282 public const AdaptiveMessageCache = [
4283 'default' => false,
4284 ];
4285
4317 public const LocalisationCacheConf = [
4318 'properties' => [
4319 'class' => [ 'type' => 'string', 'default' => LocalisationCache::class ],
4320 'store' => [ 'type' => 'string', 'default' => 'detect' ],
4321 'storeClass' => [ 'type' => 'false|string', 'default' => false ],
4322 'storeDirectory' => [ 'type' => 'false|string', 'default' => false ],
4323 'storeServer' => [ 'type' => 'object', 'default' => [] ],
4324 'forceRecache' => [ 'type' => 'bool', 'default' => false ],
4325 'manualRecache' => [ 'type' => 'bool', 'default' => false ],
4326 ],
4327 'type' => 'object',
4328 ];
4329
4333 public const CachePages = [
4334 'default' => true,
4335 ];
4336
4346 public const CacheEpoch = [
4347 'default' => '20030516000000',
4348 ];
4349
4354 public const GitInfoCacheDirectory = [
4355 'default' => false,
4356 ];
4357
4363 public const UseFileCache = [
4364 'default' => false,
4365 ];
4366
4373 public const FileCacheDepth = [
4374 'default' => 2,
4375 ];
4376
4381 public const RenderHashAppend = [
4382 'default' => '',
4383 ];
4384
4394 public const EnableSidebarCache = [
4395 'default' => false,
4396 ];
4397
4401 public const SidebarCacheExpiry = [
4402 'default' => 86400,
4403 ];
4404
4411 public const UseGzip = [
4412 'default' => false,
4413 ];
4414
4424 public const InvalidateCacheOnLocalSettingsChange = [
4425 'default' => true,
4426 ];
4427
4442 public const ExtensionInfoMTime = [
4443 'default' => false,
4444 'type' => 'integer|false',
4445 ];
4446
4453 public const EnableRemoteBagOStuffTests = [
4454 'default' => false,
4455 ];
4456
4457 // endregion -- end of cache settings
4458
4459 /***************************************************************************/
4460 // region HTTP proxy (CDN) settings
4479 public const UseCdn = [
4480 'default' => false,
4481 ];
4482
4491 public const VaryOnXFP = [
4492 'default' => false,
4493 ];
4494
4504 public const InternalServer = [
4505 'default' => false,
4506 ];
4507
4517 public const CdnMaxAge = [
4518 'default' => 18000,
4519 ];
4520
4527 public const CdnMaxageLagged = [
4528 'default' => 30,
4529 ];
4530
4537 public const CdnMaxageStale = [
4538 'default' => 10,
4539 ];
4540
4556 public const CdnReboundPurgeDelay = [
4557 'default' => 0,
4558 ];
4559
4566 public const CdnMaxageSubstitute = [
4567 'default' => 60,
4568 ];
4569
4575 public const ForcedRawSMaxage = [
4576 'default' => 300,
4577 ];
4578
4589 public const CdnServers = [
4590 'default' => [],
4591 'type' => 'map',
4592 ];
4593
4602 public const CdnServersNoPurge = [
4603 'default' => [],
4604 'type' => 'map',
4605 ];
4606
4655 public const HTCPRouting = [
4656 'default' => [],
4657 'type' => 'map',
4658 ];
4659
4665 public const HTCPMulticastTTL = [
4666 'default' => 1,
4667 ];
4668
4672 public const UsePrivateIPs = [
4673 'default' => false,
4674 ];
4675
4687 public const CdnMatchParameterOrder = [
4688 'default' => true,
4689 ];
4690
4691 // endregion -- end of HTTP proxy settings
4692
4693 /***************************************************************************/
4694 // region Language, regional and character encoding settings
4714 public const LanguageCode = [
4715 'default' => 'en',
4716 ];
4717
4729 public const GrammarForms = [
4730 'default' => [],
4731 'type' => 'map',
4732 ];
4733
4737 public const InterwikiMagic = [
4738 'default' => true,
4739 ];
4740
4744 public const HideInterlanguageLinks = [
4745 'default' => false,
4746 ];
4747
4768 public const ExtraInterlanguageLinkPrefixes = [
4769 'default' => [],
4770 'type' => 'list',
4771 ];
4772
4780 public const InterlanguageLinkCodeMap = [
4781 'default' => [],
4782 'type' => 'map',
4783 ];
4784
4788 public const ExtraLanguageNames = [
4789 'default' => [],
4790 'type' => 'map',
4791 ];
4792
4807 public const ExtraLanguageCodes = [
4808 'default' => [
4809 'bh' => 'bho',
4810 'no' => 'nb',
4811 'simple' => 'en',
4812 ],
4813 'type' => 'map',
4814 ];
4815
4824 public const DummyLanguageCodes = [
4825 'default' => [],
4826 'type' => 'map',
4827 ];
4828
4836 public const AllUnicodeFixes = [
4837 'default' => false,
4838 ];
4839
4850 public const LegacyEncoding = [
4851 'default' => false,
4852 ];
4853
4858 public const AmericanDates = [
4859 'default' => false,
4860 ];
4861
4866 public const TranslateNumerals = [
4867 'default' => true,
4868 ];
4869
4875 public const UseDatabaseMessages = [
4876 'default' => true,
4877 ];
4878
4882 public const MaxMsgCacheEntrySize = [
4883 'default' => 10000,
4884 ];
4885
4889 public const DisableLangConversion = [
4890 'default' => false,
4891 ];
4892
4897 public const DisableTitleConversion = [
4898 'default' => false,
4899 ];
4900
4905 public const DefaultLanguageVariant = [
4906 'default' => false,
4907 ];
4908
4913 public const UsePigLatinVariant = [
4914 'default' => false,
4915 ];
4916
4927 public const DisabledVariants = [
4928 'default' => [],
4929 'type' => 'map',
4930 ];
4931
4950 public const VariantArticlePath = [
4951 'default' => false,
4952 ];
4953
4969 public const UseXssLanguage = [
4970 'default' => false,
4971 ];
4972
4978 public const LoginLanguageSelector = [
4979 'default' => false,
4980 ];
4981
5002 public const ForceUIMsgAsContentMsg = [
5003 'default' => [],
5004 'type' => 'map',
5005 ];
5006
5019 public const RawHtmlMessages = [
5020 'default' => [
5021 'copyright',
5022 'history_copyright',
5023 'googlesearch',
5024 ],
5025 'type' => 'list',
5026 'items' => [ 'type' => 'string', ],
5027 ];
5028
5053 public const Localtimezone = [
5054 'dynamicDefault' => true,
5055 ];
5056
5057 public static function getDefaultLocaltimezone(): string {
5058 // This defaults to the `date.timezone` value of the PHP INI option. If this option is not set,
5059 // it falls back to UTC.
5060 $localtimezone = date_default_timezone_get();
5061 if ( !$localtimezone ) {
5062 // Make doubly sure we have a valid time zone, even if date_default_timezone_get()
5063 // returned garbage.
5064 $localtimezone = 'UTC';
5065 }
5066
5067 return $localtimezone;
5068 }
5069
5079 public const LocalTZoffset = [
5080 'dynamicDefault' => [ 'use' => [ 'Localtimezone' ] ]
5081 ];
5082
5083 public static function getDefaultLocalTZoffset( $localtimezone ): int {
5084 // NOTE: Extra fallback, in case $localtimezone is ''.
5085 // Many extsing LocalSettings files have $wgLocaltimezone = ''
5086 // in them, erroneously generated by the installer.
5087 $localtimezone = $localtimezone ?: self::getDefaultLocaltimezone();
5088
5089 $offset = ( new DateTimeZone( $localtimezone ) )->getOffset( new DateTime() );
5090 return (int)( $offset / 60 );
5091 }
5092
5101 public const OverrideUcfirstCharacters = [
5102 'default' => [],
5103 'type' => 'map',
5104 ];
5105
5106 // endregion -- End of language/charset settings
5107
5108 /***************************************************************************/
5109 // region Output format and skin settings
5115 public const MimeType = [
5116 'default' => 'text/html',
5117 ];
5118
5128 public const Html5Version = [
5129 'default' => null,
5130 ];
5131
5139 public const EditSubmitButtonLabelPublish = [
5140 'default' => false,
5141 ];
5142
5159 public const XhtmlNamespaces = [
5160 'default' => [],
5161 'type' => 'map',
5162 ];
5163
5171 public const SiteNotice = [
5172 'default' => '',
5173 ];
5174
5186 public const BrowserFormatDetection = [
5187 'default' => 'telephone=no',
5188 'type' => 'string',
5189 ];
5190
5199 public const SkinMetaTags = [
5200 'default' => [],
5201 'type' => 'map',
5202 ];
5203
5208 public const DefaultSkin = [
5209 'default' => 'vector-2022',
5210 ];
5211
5217 public const FallbackSkin = [
5218 'default' => 'fallback',
5219 ];
5220
5231 public const SkipSkins = [
5232 'default' => [],
5233 'type' => 'map',
5234 ];
5235
5239 public const DisableOutputCompression = [
5240 'default' => false,
5241 ];
5242
5272 public const FragmentMode = [
5273 'default' => [ 'html5', 'legacy', ],
5274 'type' => 'list',
5275 ];
5276
5285 public const ExternalInterwikiFragmentMode = [
5286 'default' => 'legacy',
5287 ];
5288
5320 public const FooterIcons = [
5321 'default' => [
5322 "copyright" => [
5323 "copyright" => [], // placeholder for the built in copyright icon
5324 ],
5325 "poweredby" => [
5326 "mediawiki" => [
5327 // Defaults to point at
5328 // "$wgResourceBasePath/resources/assets/poweredby_mediawiki_88x31.png"
5329 // plus srcset for 1.5x, 2x resolution variants.
5330 "src" => null,
5331 "url" => "https://www.mediawiki.org/",
5332 "alt" => "Powered by MediaWiki",
5333 ]
5334 ],
5335 ],
5336 'type' => 'map',
5337 ];
5338
5346 public const UseCombinedLoginLink = [
5347 'default' => false,
5348 ];
5349
5353 public const Edititis = [
5354 'default' => false,
5355 ];
5356
5368 public const Send404Code = [
5369 'default' => true,
5370 ];
5371
5382 public const ShowRollbackEditCount = [
5383 'default' => 10,
5384 ];
5385
5392 public const EnableCanonicalServerLink = [
5393 'default' => false,
5394 ];
5395
5409 public const InterwikiLogoOverride = [
5410 'default' => [],
5411 'type' => 'list',
5412 'items' => [ 'type' => 'string', ],
5413 ];
5414
5415 // endregion -- End of output format settings
5416
5417 /***************************************************************************/
5418 // region ResourceLoader settings
5428 public const MangleFlashPolicy = [
5429 'default' => true,
5430 'obsolete' => 'Since 1.39; no longer has any effect.',
5431 'description' => 'Has been emitting warnings since 1.39 (LTS). ' .
5432 'Can be removed completely in 1.44, assuming 1.43 is an LTS release.'
5433 ];
5434
5742 public const ResourceModules = [
5743 'default' => [],
5744 'type' => 'map',
5745 ];
5746
5841 public const ResourceModuleSkinStyles = [
5842 'default' => [],
5843 'type' => 'map',
5844 ];
5845
5857 public const ResourceLoaderSources = [
5858 'default' => [],
5859 'type' => 'map',
5860 ];
5861
5867 public const ResourceBasePath = [
5868 'default' => null,
5869 'dynamicDefault' => [ 'use' => [ 'ScriptPath' ] ]
5870 ];
5871
5876 public static function getDefaultResourceBasePath( $scriptPath ): string {
5877 return $scriptPath;
5878 }
5879
5892 public const ResourceLoaderMaxage = [
5893 'default' => [],
5894 'type' => 'map',
5895 ];
5896
5903 public const ResourceLoaderUseObjectCacheForDeps = [
5904 'default' => true,
5905 ];
5906
5912 public const ResourceLoaderDebug = [
5913 'default' => false,
5914 ];
5915
5928 public const ResourceLoaderMaxQueryLength = [
5929 'default' => false,
5930 'type' => 'integer|false',
5931 ];
5932
5943 public const ResourceLoaderValidateJS = [
5944 'default' => true,
5945 ];
5946
5955 public const ResourceLoaderEnableJSProfiler = [
5956 'default' => false,
5957 ];
5958
5963 public const ResourceLoaderStorageEnabled = [
5964 'default' => true,
5965 ];
5966
5973 public const ResourceLoaderStorageVersion = [
5974 'default' => 1,
5975 ];
5976
5983 public const ResourceLoaderEnableSourceMapLinks = [
5984 'default' => true,
5985 ];
5986
5998 public const AllowSiteCSSOnRestrictedPages = [
5999 'default' => false,
6000 ];
6001
6012 public const VueDevelopmentMode = [
6013 'default' => false,
6014 ];
6015
6029 public const CodexDevelopmentDir = [
6030 'default' => null,
6031 ];
6032
6033 // endregion -- End of ResourceLoader settings
6034
6035 /***************************************************************************/
6036 // region Page titles and redirects
6043 public const MetaNamespace = [
6044 'default' => false,
6045 'dynamicDefault' => [ 'use' => [ 'Sitename' ] ]
6046 ];
6047
6052 public static function getDefaultMetaNamespace( $sitename ): string {
6053 return str_replace( ' ', '_', $sitename );
6054 }
6055
6063 public const MetaNamespaceTalk = [
6064 'default' => false,
6065 ];
6066
6073 public const CanonicalNamespaceNames = [
6074 'default' => NamespaceInfo::CANONICAL_NAMES,
6075 'type' => 'map',
6076 ];
6077
6104 public const ExtraNamespaces = [
6105 'default' => [],
6106 'type' => 'map',
6107 ];
6108
6117 public const ExtraGenderNamespaces = [
6118 'default' => [],
6119 'type' => 'map',
6120 ];
6121
6144 public const NamespaceAliases = [
6145 'default' => [],
6146 'type' => 'map',
6147 ];
6148
6175 public const LegalTitleChars = [
6176 'default' => ' %!"$&\'()*,\\-.\\/0-9:;=?@A-Z\\\\^_`a-z~\\x80-\\xFF+',
6177 'deprecated' => 'since 1.41; use Extension:TitleBlacklist to customize',
6178 ];
6179
6187 public const CapitalLinks = [
6188 'default' => true,
6189 ];
6190
6205 public const CapitalLinkOverrides = [
6206 'default' => [],
6207 'type' => 'map',
6208 ];
6209
6214 public const NamespacesWithSubpages = [
6215 'default' => [
6216 NS_TALK => true,
6217 NS_USER => true,
6218 NS_USER_TALK => true,
6219 NS_PROJECT => true,
6220 NS_PROJECT_TALK => true,
6221 NS_FILE_TALK => true,
6222 NS_MEDIAWIKI => true,
6223 NS_MEDIAWIKI_TALK => true,
6224 NS_TEMPLATE => true,
6225 NS_TEMPLATE_TALK => true,
6226 NS_HELP => true,
6227 NS_HELP_TALK => true,
6228 NS_CATEGORY_TALK => true
6229 ],
6230 'type' => 'map',
6231 ];
6232
6239 public const ContentNamespaces = [
6240 'default' => [ NS_MAIN ],
6241 'type' => 'list',
6242 ];
6243
6252 public const ShortPagesNamespaceExclusions = [
6253 'default' => [],
6254 'type' => 'list',
6255 ];
6256
6265 public const ExtraSignatureNamespaces = [
6266 'default' => [],
6267 'type' => 'list',
6268 ];
6269
6281 public const InvalidRedirectTargets = [
6282 'default' => [ 'Filepath', 'Mypage', 'Mytalk', 'Redirect', 'Mylog' ],
6283 'type' => 'list',
6284 ];
6285
6294 public const DisableHardRedirects = [
6295 'default' => false,
6296 ];
6297
6303 public const FixDoubleRedirects = [
6304 'default' => false,
6305 ];
6306
6307 // endregion -- End of title and interwiki settings
6308
6309 /***************************************************************************/
6310 // region Interwiki links and sites
6319 public const LocalInterwikis = [
6320 'default' => [],
6321 'type' => 'list',
6322 ];
6323
6327 public const InterwikiExpiry = [
6328 'default' => 10800,
6329 ];
6330
6351 public const InterwikiCache = [
6352 'default' => false,
6353 'type' => 'false|map',
6354 'mergeStrategy' => 'replace',
6355 ];
6356
6364 public const InterwikiScopes = [
6365 'default' => 3,
6366 ];
6367
6371 public const InterwikiFallbackSite = [
6372 'default' => 'wiki',
6373 ];
6374
6391 public const RedirectSources = [
6392 'default' => false,
6393 ];
6394
6400 public const SiteTypes = [
6401 'default' => [ 'mediawiki' => MediaWikiSite::class, ],
6402 'type' => 'map',
6403 ];
6404
6405 // endregion -- Interwiki links and sites
6406
6407 /***************************************************************************/
6408 // region Parser settings
6416 public const MaxTocLevel = [
6417 'default' => 999,
6418 ];
6419
6424 public const MaxPPNodeCount = [
6425 'default' => 1_000_000,
6426 ];
6427
6435 public const MaxTemplateDepth = [
6436 'default' => 100,
6437 ];
6438
6442 public const MaxPPExpandDepth = [
6443 'default' => 100,
6444 ];
6445
6456 public const UrlProtocols = [
6457 'default' => [
6458 'bitcoin:', 'ftp://', 'ftps://', 'geo:', 'git://', 'gopher://', 'http://',
6459 'https://', 'irc://', 'ircs://', 'magnet:', 'mailto:', 'matrix:', 'mms://',
6460 'news:', 'nntp://', 'redis://', 'sftp://', 'sip:', 'sips:', 'sms:',
6461 'ssh://', 'svn://', 'tel:', 'telnet://', 'urn:', 'worldwind://', 'xmpp:',
6462 '//',
6463 ],
6464 'type' => 'list',
6465 ];
6466
6470 public const CleanSignatures = [
6471 'default' => true,
6472 ];
6473
6477 public const AllowExternalImages = [
6478 'default' => false,
6479 ];
6480
6495 public const AllowExternalImagesFrom = [
6496 'default' => '',
6497 ];
6498
6510 public const EnableImageWhitelist = [
6511 'default' => false,
6512 ];
6513
6532 public const TidyConfig = [
6533 'default' => [],
6534 'type' => 'map',
6535 ];
6536
6545 public const ParsoidSettings = [
6546 'default' => [
6547 'useSelser' => true,
6548 ],
6549 'type' => 'map',
6550 ];
6551
6560 public const ParserEnableLegacyMediaDOM = [
6561 'default' => false,
6562 'deprecated' => 'since 1.41',
6563 ];
6564
6575 public const ParserEnableLegacyHeadingDOM = [
6576 'default' => true,
6577 ];
6578
6589 public const UseContentMediaStyles = [
6590 'default' => false,
6591 'deprecated' => 'since 1.41',
6592 ];
6593
6603 public const UseLegacyMediaStyles = [
6604 'default' => false,
6605 ];
6606
6613 public const RawHtml = [
6614 'default' => false,
6615 ];
6616
6626 public const ExternalLinkTarget = [
6627 'default' => false,
6628 ];
6629
6636 public const NoFollowLinks = [
6637 'default' => true,
6638 ];
6639
6645 public const NoFollowNsExceptions = [
6646 'default' => [],
6647 'type' => 'list',
6648 ];
6649
6663 public const NoFollowDomainExceptions = [
6664 'default' => [ 'mediawiki.org', ],
6665 'type' => 'list',
6666 ];
6667
6672 public const RegisterInternalExternals = [
6673 'default' => false,
6674 ];
6675
6679 public const AllowDisplayTitle = [
6680 'default' => true,
6681 ];
6682
6688 public const RestrictDisplayTitle = [
6689 'default' => true,
6690 ];
6691
6696 public const ExpensiveParserFunctionLimit = [
6697 'default' => 100,
6698 ];
6699
6704 public const PreprocessorCacheThreshold = [
6705 'default' => 1000,
6706 ];
6707
6711 public const EnableScaryTranscluding = [
6712 'default' => false,
6713 ];
6714
6720 public const TranscludeCacheExpiry = [
6721 'default' => 3600,
6722 ];
6723
6730 public const EnableMagicLinks = [
6731 'default' => [
6732 'ISBN' => false,
6733 'PMID' => false,
6734 'RFC' => false,
6735 ],
6736 'type' => 'map',
6737 ];
6738
6748 public const ParserEnableUserLanguage = [
6749 'default' => false,
6750 ];
6751
6752 // endregion -- end of parser settings
6753
6754 /***************************************************************************/
6755 // region Statistics and content analysis
6774 public const ArticleCountMethod = [
6775 'default' => 'link',
6776 ];
6777
6786 public const ActiveUserDays = [
6787 'default' => 30,
6788 ];
6789
6802 public const LearnerEdits = [
6803 'default' => 10,
6804 ];
6805
6811 public const LearnerMemberSince = [
6812 'default' => 4,
6813 ];
6814
6820 public const ExperiencedUserEdits = [
6821 'default' => 500,
6822 ];
6823
6829 public const ExperiencedUserMemberSince = [
6830 'default' => 30,
6831 ];
6832
6851 public const ManualRevertSearchRadius = [
6852 'default' => 15,
6853 'type' => 'integer',
6854 ];
6855
6868 public const RevertedTagMaxDepth = [
6869 'default' => 15,
6870 'type' => 'integer',
6871 ];
6872
6873 // endregion -- End of statistics and content analysis
6874
6875 /***************************************************************************/
6876 // region User accounts, authentication
6885 public const CentralIdLookupProviders = [
6886 'default' => [
6887 'local' => [
6888 'class' => LocalIdLookup::class,
6889 'services' => [
6890 'MainConfig',
6891 'DBLoadBalancerFactory',
6892 'HideUserUtils',
6893 ]
6894 ]
6895 ],
6896 'type' => 'map',
6897 ];
6898
6902 public const CentralIdLookupProvider = [
6903 'default' => 'local',
6904 'type' => 'string',
6905 ];
6906
6911 public const UserRegistrationProviders = [
6912 'default' => [
6913 LocalUserRegistrationProvider::TYPE => [
6914 'class' => LocalUserRegistrationProvider::class,
6915 'services' => [
6916 'UserFactory'
6917 ]
6918 ]
6919 ],
6920 'type' => 'map',
6921 ];
6922
6988 public const PasswordPolicy = [
6989 'default' => [
6990 'policies' => [
6991 'bureaucrat' => [
6992 'MinimalPasswordLength' => 10,
6993 'MinimumPasswordLengthToLogin' => 1,
6994 ],
6995 'sysop' => [
6996 'MinimalPasswordLength' => 10,
6997 'MinimumPasswordLengthToLogin' => 1,
6998 ],
6999 'interface-admin' => [
7000 'MinimalPasswordLength' => 10,
7001 'MinimumPasswordLengthToLogin' => 1,
7002 ],
7003 'bot' => [
7004 'MinimalPasswordLength' => 10,
7005 'MinimumPasswordLengthToLogin' => 1,
7006 ],
7007 'default' => [
7008 'MinimalPasswordLength' => [ 'value' => 8, 'suggestChangeOnLogin' => true ],
7009 'PasswordCannotBeSubstringInUsername' => [
7010 'value' => true,
7011 'suggestChangeOnLogin' => true
7012 ],
7013 'PasswordCannotMatchDefaults' => [ 'value' => true, 'suggestChangeOnLogin' => true ],
7014 'MaximalPasswordLength' => [ 'value' => 4096, 'suggestChangeOnLogin' => true ],
7015 'PasswordNotInCommonList' => [ 'value' => true, 'suggestChangeOnLogin' => true ],
7016 ],
7017 ],
7018 'checks' => [
7019 'MinimalPasswordLength' => [ PasswordPolicyChecks::class, 'checkMinimalPasswordLength' ],
7020 'MinimumPasswordLengthToLogin' => [ PasswordPolicyChecks::class, 'checkMinimumPasswordLengthToLogin' ],
7021 'PasswordCannotBeSubstringInUsername' => [ PasswordPolicyChecks::class, 'checkPasswordCannotBeSubstringInUsername' ],
7022 'PasswordCannotMatchDefaults' => [ PasswordPolicyChecks::class, 'checkPasswordCannotMatchDefaults' ],
7023 'MaximalPasswordLength' => [ PasswordPolicyChecks::class, 'checkMaximalPasswordLength' ],
7024 'PasswordNotInCommonList' => [ PasswordPolicyChecks::class, 'checkPasswordNotInCommonList' ],
7025 ],
7026 ],
7027 'type' => 'map',
7028 'mergeStrategy' => 'array_replace_recursive',
7029 ];
7030
7050 public const AuthManagerConfig = [
7051 'default' => null,
7052 'type' => '?map',
7053 ];
7054
7059 public const AuthManagerAutoConfig = [
7060 'default' => [
7061 'preauth' => [
7062 ThrottlePreAuthenticationProvider::class => [
7063 'class' => ThrottlePreAuthenticationProvider::class,
7064 'sort' => 0,
7065 ],
7066 ],
7067 'primaryauth' => [
7068 // TemporaryPasswordPrimaryAuthenticationProvider should come before
7069 // any other PasswordAuthenticationRequest-based
7070 // PrimaryAuthenticationProvider (or at least any that might return
7071 // FAIL rather than ABSTAIN for a wrong password), or password reset
7072 // won't work right. Do not remove this (or change the key) or
7073 // auto-configuration of other such providers in extensions will
7074 // probably auto-insert themselves in the wrong place.
7075 TemporaryPasswordPrimaryAuthenticationProvider::class => [
7076 'class' => TemporaryPasswordPrimaryAuthenticationProvider::class,
7077 'services' => [
7078 'DBLoadBalancerFactory',
7079 'UserOptionsLookup',
7080 ],
7081 'args' => [ [
7082 // Fall through to LocalPasswordPrimaryAuthenticationProvider
7083 'authoritative' => false,
7084 ] ],
7085 'sort' => 0,
7086 ],
7087 LocalPasswordPrimaryAuthenticationProvider::class => [
7088 'class' => LocalPasswordPrimaryAuthenticationProvider::class,
7089 'services' => [
7090 'DBLoadBalancerFactory',
7091 ],
7092 'args' => [ [
7093 // Last one should be authoritative, or else the user will get
7094 // a less-than-helpful error message (something like "supplied
7095 // authentication info not supported" rather than "wrong
7096 // password") if it too fails.
7097 'authoritative' => true,
7098 ] ],
7099 'sort' => 100,
7100 ],
7101 ],
7102 'secondaryauth' => [
7103 CheckBlocksSecondaryAuthenticationProvider::class => [
7104 'class' => CheckBlocksSecondaryAuthenticationProvider::class,
7105 'sort' => 0,
7106 ],
7107 ResetPasswordSecondaryAuthenticationProvider::class => [
7108 'class' => ResetPasswordSecondaryAuthenticationProvider::class,
7109 'sort' => 100,
7110 ],
7111 // Linking during login is experimental, enable at your own risk - T134952
7112 // MediaWiki\Auth\ConfirmLinkSecondaryAuthenticationProvider::class => [
7113 // 'class' => MediaWiki\Auth\ConfirmLinkSecondaryAuthenticationProvider::class,
7114 // 'sort' => 100,
7115 // ],
7116 EmailNotificationSecondaryAuthenticationProvider::class => [
7117 'class' => EmailNotificationSecondaryAuthenticationProvider::class,
7118 'services' => [
7119 'DBLoadBalancerFactory',
7120 ],
7121 'sort' => 200,
7122 ],
7123 ],
7124 ],
7125 'type' => 'map',
7126 'mergeStrategy' => 'array_plus_2d',
7127 ];
7128
7139 public const RememberMe = [
7140 'default' => 'choose',
7141 'type' => 'string',
7142 ];
7143
7181 public const ReauthenticateTime = [
7182 'default' => [ 'default' => 300, ],
7183 'type' => 'map',
7184 'additionalProperties' => [ 'type' => 'integer', ],
7185 ];
7186
7201 public const AllowSecuritySensitiveOperationIfCannotReauthenticate = [
7202 'default' => [ 'default' => true, ],
7203 'type' => 'map',
7204 'additionalProperties' => [ 'type' => 'boolean', ],
7205 ];
7206
7217 public const ChangeCredentialsBlacklist = [
7218 'default' => [
7219 TemporaryPasswordAuthenticationRequest::class,
7220 ],
7221 'type' => 'list',
7222 'items' => [ 'type' => 'string', ],
7223 ];
7224
7235 public const RemoveCredentialsBlacklist = [
7236 'default' => [
7237 PasswordAuthenticationRequest::class,
7238 ],
7239 'type' => 'list',
7240 'items' => [ 'type' => 'string', ],
7241 ];
7242
7249 public const InvalidPasswordReset = [
7250 'default' => true,
7251 ];
7252
7261 public const PasswordDefault = [
7262 'default' => 'pbkdf2',
7263 ];
7264
7292 public const PasswordConfig = [
7293 'default' => [
7294 'A' => [
7295 'class' => MWOldPassword::class,
7296 ],
7297 'B' => [
7298 'class' => MWSaltedPassword::class,
7299 ],
7300 'pbkdf2-legacyA' => [
7301 'class' => LayeredParameterizedPassword::class,
7302 'types' => [
7303 'A',
7304 'pbkdf2',
7305 ],
7306 ],
7307 'pbkdf2-legacyB' => [
7308 'class' => LayeredParameterizedPassword::class,
7309 'types' => [
7310 'B',
7311 'pbkdf2',
7312 ],
7313 ],
7314 'bcrypt' => [
7315 'class' => BcryptPassword::class,
7316 'cost' => 9,
7317 ],
7318 'pbkdf2' => [
7319 'class' => Pbkdf2PasswordUsingOpenSSL::class,
7320 'algo' => 'sha512',
7321 'cost' => '30000',
7322 'length' => '64',
7323 ],
7324 'argon2' => [
7325 'class' => Argon2Password::class,
7326
7327 // Algorithm used:
7328 // * 'argon2i' is optimized against side-channel attacks
7329 // * 'argon2id' is optimized against both side-channel and GPU cracking
7330 // * 'auto' to use the best available algorithm. If you're using more than one server, be
7331 // careful when you're mixing PHP versions because newer PHP might generate hashes that
7332 // older versions would not understand.
7333 'algo' => 'auto',
7334
7335 // The parameters below are the same as options accepted by password_hash().
7336 // Set them to override that function's defaults.
7337 //
7338 // 'memory_cost' => PASSWORD_ARGON2_DEFAULT_MEMORY_COST,
7339 // 'time_cost' => PASSWORD_ARGON2_DEFAULT_TIME_COST,
7340 // 'threads' => PASSWORD_ARGON2_DEFAULT_THREADS,
7341 ],
7342 ],
7343 'type' => 'map',
7344 ];
7345
7352 public const PasswordResetRoutes = [
7353 'default' => [
7354 'username' => true,
7355 'email' => true,
7356 ],
7357 'type' => 'map',
7358 ];
7359
7363 public const MaxSigChars = [
7364 'default' => 255,
7365 ];
7366
7379 public const SignatureValidation = [
7380 'default' => 'warning',
7381 ];
7382
7389 public const SignatureAllowedLintErrors = [
7390 'default' => [ 'obsolete-tag', ],
7391 'type' => 'list',
7392 ];
7393
7398 public const MaxNameChars = [
7399 'default' => 255,
7400 ];
7401
7408 public const ReservedUsernames = [
7409 'default' => [
7410 'MediaWiki default', // Default 'Main Page' and MediaWiki: message pages
7411 'Conversion script', // Used for the old Wikipedia software upgrade
7412 'Maintenance script', // Maintenance scripts which perform editing, image import script
7413 'Template namespace initialisation script', // Used in 1.2->1.3 upgrade
7414 'ScriptImporter', // Default user name used by maintenance/importSiteScripts.php
7415 'Delete page script', // Default user name used by maintenance/deleteBatch.php
7416 'Move page script', // Default user name used by maintenance/deleteBatch.php
7417 'Command line script', // Default user name used by maintenance/undelete.php
7418 'Unknown user', // Used in WikiImporter & RevisionStore for revisions with no author and in User for invalid user id
7419 'msg:double-redirect-fixer', // Automatic double redirect fix
7420 'msg:usermessage-editor', // Default user for leaving user messages
7421 'msg:proxyblocker', // For $wgProxyList and Special:Blockme (removed in 1.22)
7422 'msg:sorbs', // For $wgEnableDnsBlacklist etc.
7423 'msg:spambot_username', // Used by cleanupSpam.php
7424 'msg:autochange-username', // Used by anon category RC entries (parser functions, Lua & purges)
7425 ],
7426 'type' => 'list',
7427 ];
7428
7445 public const DefaultUserOptions = [
7446 'default' =>
7447 // This array should be sorted by key
7448 [
7449 'ccmeonemails' => 0,
7450 'date' => 'default',
7451 'diffonly' => 0,
7452 'diff-type' => 'table',
7453 'disablemail' => 0,
7454 'editfont' => 'monospace',
7455 'editondblclick' => 0,
7456 'editrecovery' => 0,
7457 'editsectiononrightclick' => 0,
7458 'email-allow-new-users' => 1,
7459 'enotifminoredits' => 0,
7460 'enotifrevealaddr' => 0,
7461 'enotifusertalkpages' => 1,
7462 'enotifwatchlistpages' => 1,
7463 'extendwatchlist' => 1,
7464 'fancysig' => 0,
7465 'forceeditsummary' => 0,
7466 'forcesafemode' => 0,
7467 'gender' => 'unknown',
7468 'hidecategorization' => 1,
7469 'hideminor' => 0,
7470 'hidepatrolled' => 0,
7471 'imagesize' => 2,
7472 'minordefault' => 0,
7473 'newpageshidepatrolled' => 0,
7474 'nickname' => '',
7475 'norollbackdiff' => 0,
7476 'prefershttps' => 1,
7477 'previewonfirst' => 0,
7478 'previewontop' => 1,
7479 'pst-cssjs' => 1,
7480 'rcdays' => 7,
7481 'rcenhancedfilters-disable' => 0,
7482 'rclimit' => 50,
7483 'requireemail' => 0,
7484 'search-match-redirect' => true,
7485 'search-special-page' => 'Search',
7486 'search-thumbnail-extra-namespaces' => true,
7487 'searchlimit' => 20,
7488 'showhiddencats' => 0,
7489 'shownumberswatching' => 1,
7490 'showrollbackconfirmation' => 0,
7491 'skin' => false,
7492 'skin-responsive' => 1,
7493 'thumbsize' => 5,
7494 'underline' => 2,
7495 'useeditwarning' => 1,
7496 'uselivepreview' => 0,
7497 'usenewrc' => 1,
7498 'watchcreations' => 1,
7499 'watchdefault' => 1,
7500 'watchdeletion' => 0,
7501 'watchlistdays' => 7,
7502 'watchlisthideanons' => 0,
7503 'watchlisthidebots' => 0,
7504 'watchlisthidecategorization' => 1,
7505 'watchlisthideliu' => 0,
7506 'watchlisthideminor' => 0,
7507 'watchlisthideown' => 0,
7508 'watchlisthidepatrolled' => 0,
7509 'watchlistreloadautomatically' => 0,
7510 'watchlistunwatchlinks' => 0,
7511 'watchmoves' => 0,
7512 'watchrollback' => 0,
7513 'watchuploads' => 1,
7514 'wlenhancedfilters-disable' => 0,
7515 'wllimit' => 250,
7516 ],
7517 'type' => 'map',
7518 ];
7519
7551 public const ConditionalUserOptions = [
7552 'default' => [],
7553 'type' => 'map',
7554 ];
7555
7559 public const HiddenPrefs = [
7560 'default' => [],
7561 'type' => 'list',
7562 ];
7563
7570 public const InvalidUsernameCharacters = [
7571 'default' => '@:>=',
7572 ];
7573
7583 public const UserrightsInterwikiDelimiter = [
7584 'default' => '@',
7585 ];
7586
7595 public const SecureLogin = [
7596 'default' => false,
7597 ];
7598
7608 public const AuthenticationTokenVersion = [
7609 'default' => null,
7610 'type' => '?string',
7611 ];
7612
7622 public const SessionProviders = [
7623 'type' => 'map',
7624 'default' => [
7625 \MediaWiki\Session\CookieSessionProvider::class => [
7626 'class' => \MediaWiki\Session\CookieSessionProvider::class,
7627 'args' => [ [
7628 'priority' => 30,
7629 ] ],
7630 ],
7631 \MediaWiki\Session\BotPasswordSessionProvider::class => [
7632 'class' => \MediaWiki\Session\BotPasswordSessionProvider::class,
7633 'args' => [ [
7634 'priority' => 75,
7635 ] ],
7636 'services' => [
7637 'GrantsInfo'
7638 ],
7639 ],
7640 ],
7641 ];
7642
7713 public const AutoCreateTempUser = [
7714 'properties' => [
7715 'known' => [ 'type' => 'bool', 'default' => false ],
7716 'enabled' => [ 'type' => 'bool', 'default' => false ],
7717 'actions' => [ 'type' => 'list', 'default' => [ 'edit' ] ],
7718 'genPattern' => [ 'type' => 'string', 'default' => '~$1' ],
7719 'matchPattern' => [ 'type' => 'string|array|null', 'default' => null ],
7720 'reservedPattern' => [ 'type' => 'string|null', 'default' => '~$1' ],
7721 'serialProvider' => [ 'type' => 'object', 'default' => [ 'type' => 'local', 'useYear' => true ] ],
7722 'serialMapping' => [ 'type' => 'object', 'default' => [ 'type' => 'plain-numeric' ] ],
7723 'expireAfterDays' => [ 'type' => 'int|null', 'default' => 90 ],
7724 'notifyBeforeExpirationDays' => [ 'type' => 'int|null', 'default' => 10 ],
7725 ],
7726 'type' => 'object',
7727 ];
7728
7729 // endregion -- end user accounts
7730
7731 /***************************************************************************/
7732 // region User rights, access control and monitoring
7738 public const AutoblockExpiry = [
7739 'default' => 86400,
7740 ];
7741
7749 public const BlockAllowsUTEdit = [
7750 'default' => true,
7751 ];
7752
7767 public const BlockCIDRLimit = [
7768 'default' => [
7769 'IPv4' => 16,
7770 'IPv6' => 19,
7771 ],
7772 'type' => 'map',
7773 ];
7774
7780 public const BlockDisablesLogin = [
7781 'default' => false,
7782 ];
7783
7790 public const EnablePartialActionBlocks = [
7791 'default' => false,
7792 'type' => 'boolean',
7793 ];
7794
7800 public const EnableMultiBlocks = [
7801 'default' => false,
7802 'type' => 'boolean',
7803 ];
7804
7822 public const BlockTargetMigrationStage = [
7823 'default' => SCHEMA_COMPAT_NEW,
7824 'type' => 'integer',
7825 ];
7826
7846 public const WhitelistRead = [
7847 'default' => false,
7848 ];
7849
7877 public const WhitelistReadRegexp = [
7878 'default' => false,
7879 ];
7880
7885 public const EmailConfirmToEdit = [
7886 'default' => false,
7887 ];
7888
7893 public const HideIdentifiableRedirects = [
7894 'default' => true,
7895 ];
7896
7921 public const GroupPermissions = [
7922 'type' => 'map',
7923 'additionalProperties' => [
7924 'type' => 'map',
7925 'additionalProperties' => [ 'type' => 'boolean', ],
7926 ],
7927 'mergeStrategy' => 'array_plus_2d',
7928 'default' => [
7929 '*' => [
7930 'createaccount' => true,
7931 'read' => true,
7932 'edit' => true,
7933 'createpage' => true,
7934 'createtalk' => true,
7935 'viewmyprivateinfo' => true,
7936 'editmyprivateinfo' => true,
7937 'editmyoptions' => true,
7938 ],
7939 'user' => [
7940 'move' => true,
7941 'move-subpages' => true,
7942 'move-rootuserpages' => true,
7943 'move-categorypages' => true,
7944 'movefile' => true,
7945 'read' => true,
7946 'edit' => true,
7947 'createpage' => true,
7948 'createtalk' => true,
7949 'upload' => true,
7950 'reupload' => true,
7951 'reupload-shared' => true,
7952 'minoredit' => true,
7953 'editmyusercss' => true,
7954 'editmyuserjson' => true,
7955 'editmyuserjs' => true,
7956 'editmyuserjsredirect' => true,
7957 'sendemail' => true,
7958 'applychangetags' => true,
7959 'changetags' => true,
7960 'editcontentmodel' => true,
7961 'viewmywatchlist' => true,
7962 'editmywatchlist' => true,
7963 ],
7964 'autoconfirmed' => [
7965 'autoconfirmed' => true,
7966 'editsemiprotected' => true,
7967 ],
7968 'bot' => [
7969 'bot' => true,
7970 'autoconfirmed' => true,
7971 'editsemiprotected' => true,
7972 'nominornewtalk' => true,
7973 'autopatrol' => true,
7974 'suppressredirect' => true,
7975 'apihighlimits' => true,
7976 ],
7977 'sysop' => [
7978 'block' => true,
7979 'createaccount' => true,
7980 'delete' => true,
7981 'bigdelete' => true,
7982 'deletedhistory' => true,
7983 'deletedtext' => true,
7984 'undelete' => true,
7985 'editinterface' => true,
7986 'editsitejson' => true,
7987 'edituserjson' => true,
7988 'import' => true,
7989 'importupload' => true,
7990 'move' => true,
7991 'move-subpages' => true,
7992 'move-rootuserpages' => true,
7993 'move-categorypages' => true,
7994 'patrol' => true,
7995 'autopatrol' => true,
7996 'protect' => true,
7997 'editprotected' => true,
7998 'rollback' => true,
7999 'upload' => true,
8000 'reupload' => true,
8001 'reupload-shared' => true,
8002 'unwatchedpages' => true,
8003 'autoconfirmed' => true,
8004 'editsemiprotected' => true,
8005 'ipblock-exempt' => true,
8006 'blockemail' => true,
8007 'markbotedits' => true,
8008 'apihighlimits' => true,
8009 'browsearchive' => true,
8010 'noratelimit' => true,
8011 'movefile' => true,
8012 'unblockself' => true,
8013 'suppressredirect' => true,
8014 'mergehistory' => true,
8015 'managechangetags' => true,
8016 'deletechangetags' => true,
8017 ],
8018 'interface-admin' => [
8019 'editinterface' => true,
8020 'editsitecss' => true,
8021 'editsitejson' => true,
8022 'editsitejs' => true,
8023 'editusercss' => true,
8024 'edituserjson' => true,
8025 'edituserjs' => true,
8026 ],
8027 'bureaucrat' => [
8028 'userrights' => true,
8029 'noratelimit' => true,
8030 'renameuser' => true,
8031 ],
8032 'suppress' => [
8033 'hideuser' => true,
8034 'suppressrevision' => true,
8035 'viewsuppressed' => true,
8036 'suppressionlog' => true,
8037 'deleterevision' => true,
8038 'deletelogentry' => true,
8039 ],
8040 ],
8041 ];
8042
8050 public const PrivilegedGroups = [
8051 'default' => [
8052 'bureaucrat',
8053 'interface-admin',
8054 'suppress',
8055 'sysop',
8056 ],
8057 'type' => 'list',
8058 ];
8059
8069 public const RevokePermissions = [
8070 'default' => [],
8071 'type' => 'map',
8072 'mergeStrategy' => 'array_plus_2d',
8073 ];
8074
8094 public const GroupInheritsPermissions = [
8095 'default' => [],
8096 'type' => 'map',
8097 'additionalProperties' => [ 'type' => 'string', ],
8098 ];
8099
8103 public const ImplicitGroups = [
8104 'default' => [ '*', 'user', 'autoconfirmed' ],
8105 'type' => 'list',
8106 ];
8107
8132 public const GroupsAddToSelf = [
8133 'default' => [],
8134 'type' => 'map',
8135 ];
8136
8140 public const GroupsRemoveFromSelf = [
8141 'default' => [],
8142 'type' => 'map',
8143 ];
8144
8153 public const RestrictionTypes = [
8154 'default' => [ 'create', 'edit', 'move', 'upload' ],
8155 'type' => 'list',
8156 ];
8157
8169 public const RestrictionLevels = [
8170 'default' => [ '', 'autoconfirmed', 'sysop' ],
8171 'type' => 'list',
8172 ];
8173
8183 public const CascadingRestrictionLevels = [
8184 'default' => [ 'sysop', ],
8185 'type' => 'list',
8186 ];
8187
8200 public const SemiprotectedRestrictionLevels = [
8201 'default' => [ 'autoconfirmed', ],
8202 'type' => 'list',
8203 ];
8204
8212 public const NamespaceProtection = [
8213 'default' => [],
8214 'type' => 'map',
8215 ];
8216
8226 public const NonincludableNamespaces = [
8227 'default' => [],
8228 'type' => 'map',
8229 ];
8230
8254 public const AutoConfirmAge = [
8255 'default' => 0,
8256 ];
8257
8269 public const AutoConfirmCount = [
8270 'default' => 0,
8271 ];
8272
8330 public const Autopromote = [
8331 'default' => [
8332 'autoconfirmed' => [ '&',
8333 [ APCOND_EDITCOUNT, null ], // NOTE: null means $wgAutoConfirmCount
8334 [ APCOND_AGE, null ], // NOTE: null means AutoConfirmAge
8335 ],
8336 ],
8337 'type' => 'map',
8338 ];
8339
8360 public const AutopromoteOnce = [
8361 'default' => [ 'onEdit' => [], ],
8362 'type' => 'map',
8363 ];
8364
8370 public const AutopromoteOnceLogInRC = [
8371 'default' => true,
8372 ];
8373
8403 public const AddGroups = [
8404 'default' => [],
8405 'type' => 'map',
8406 ];
8407
8411 public const RemoveGroups = [
8412 'default' => [],
8413 'type' => 'map',
8414 ];
8415
8426 public const AvailableRights = [
8427 'default' => [],
8428 'type' => 'list',
8429 'items' => [ 'type' => 'string', ],
8430 ];
8431
8445 public const ImplicitRights = [
8446 'default' => [],
8447 'type' => 'list',
8448 'items' => [ 'type' => 'string', ]
8449 ];
8450
8455 public const DeleteRevisionsLimit = [
8456 'default' => 0,
8457 ];
8458
8464 public const DeleteRevisionsBatchSize = [
8465 'default' => 1000,
8466 ];
8467
8477 public const HideUserContribLimit = [
8478 'default' => 1000,
8479 ];
8480
8507 public const AccountCreationThrottle = [
8508 'default' => [ [
8509 'count' => 0,
8510 'seconds' => 86400,
8511 ] ],
8512 'type' => 'int|list',
8513 ];
8514
8540 public const TempAccountCreationThrottle = [
8541 'default' => [ [
8542 'count' => 6,
8543 'seconds' => 86400,
8544 ] ],
8545 'type' => 'list',
8546 ];
8547
8583 public const TempAccountNameAcquisitionThrottle = [
8584 'default' => [ [
8585 'count' => 60,
8586 'seconds' => 86400,
8587 ] ],
8588 'type' => 'list',
8589 ];
8590
8601 public const SpamRegex = [
8602 'default' => [],
8603 'type' => 'list',
8604 ];
8605
8609 public const SummarySpamRegex = [
8610 'default' => [],
8611 'type' => 'list',
8612 ];
8613
8620 public const EnableDnsBlacklist = [
8621 'default' => false,
8622 ];
8623
8648 public const DnsBlacklistUrls = [
8649 'default' => [ 'http.dnsbl.sorbs.net.', ],
8650 'type' => 'list',
8651 ];
8652
8661 public const ProxyList = [
8662 'default' => [],
8663 'type' => 'string|list',
8664 ];
8665
8670 public const ProxyWhitelist = [
8671 'default' => [],
8672 'type' => 'list',
8673 ];
8674
8682 public const SoftBlockRanges = [
8683 'default' => [],
8684 'type' => 'list',
8685 'items' => [ 'type' => 'string', ],
8686 ];
8687
8693 public const ApplyIpBlocksToXff = [
8694 'default' => false,
8695 ];
8696
8739 public const RateLimits = [
8740 'default' => [
8741 // Page edits
8742 'edit' => [
8743 'ip' => [ 8, 60 ],
8744 'newbie' => [ 8, 60 ],
8745 'user' => [ 90, 60 ],
8746 ],
8747 // Page moves
8748 'move' => [
8749 'newbie' => [ 2, 120 ],
8750 'user' => [ 8, 60 ],
8751 ],
8752 // File uploads
8753 'upload' => [
8754 'ip' => [ 8, 60 ],
8755 'newbie' => [ 8, 60 ],
8756 ],
8757 // Page rollbacks
8758 'rollback' => [
8759 'user' => [ 10, 60 ],
8760 'newbie' => [ 5, 120 ]
8761 ],
8762 // Triggering password resets emails
8763 'mailpassword' => [
8764 'ip' => [ 5, 3600 ],
8765 ],
8766 // Emailing other users using MediaWiki
8767 'sendemail' => [
8768 'ip' => [ 5, 86400 ],
8769 'newbie' => [ 5, 86400 ],
8770 'user' => [ 20, 86400 ],
8771 ],
8772 'changeemail' => [
8773 'ip-all' => [ 10, 3600 ],
8774 'user' => [ 4, 86400 ]
8775 ],
8776 // since 1.33 - rate limit email confirmations
8777 'confirmemail' => [
8778 'ip-all' => [ 10, 3600 ],
8779 'user' => [ 4, 86400 ]
8780 ],
8781 // Purging pages
8782 'purge' => [
8783 'ip' => [ 30, 60 ],
8784 'user' => [ 30, 60 ],
8785 ],
8786 // Purges of link tables
8787 'linkpurge' => [
8788 'ip' => [ 30, 60 ],
8789 'user' => [ 30, 60 ],
8790 ],
8791 // Files rendered via thumb.php or thumb_handler.php
8792 'renderfile' => [
8793 'ip' => [ 700, 30 ],
8794 'user' => [ 700, 30 ],
8795 ],
8796 // Same as above but for non-standard thumbnails
8797 'renderfile-nonstandard' => [
8798 'ip' => [ 70, 30 ],
8799 'user' => [ 70, 30 ],
8800 ],
8801 // Stashing edits into cache before save
8802 'stashedit' => [
8803 'ip' => [ 30, 60 ],
8804 'newbie' => [ 30, 60 ],
8805 ],
8806 // Stash base HTML for VE edits
8807 'stashbasehtml' => [
8808 'ip' => [ 5, 60 ],
8809 'newbie' => [ 5, 60 ],
8810 ],
8811 // Adding or removing change tags
8812 'changetags' => [
8813 'ip' => [ 8, 60 ],
8814 'newbie' => [ 8, 60 ],
8815 ],
8816 // Changing the content model of a page
8817 'editcontentmodel' => [
8818 'newbie' => [ 2, 120 ],
8819 'user' => [ 8, 60 ],
8820 ],
8821 ],
8822 'type' => 'map',
8823 'mergeStrategy' => 'array_plus_2d',
8824 ];
8825
8831 public const RateLimitsExcludedIPs = [
8832 'default' => [],
8833 'type' => 'list',
8834 ];
8835
8841 public const PutIPinRC = [
8842 'default' => true,
8843 ];
8844
8849 public const QueryPageDefaultLimit = [
8850 'default' => 50,
8851 ];
8852
8865 public const PasswordAttemptThrottle = [
8866 'default' => [
8867 // Short term limit
8868 [ 'count' => 5, 'seconds' => 300 ],
8869 // Long term limit. We need to balance the risk
8870 // of somebody using this as a DoS attack to lock someone
8871 // out of their account, and someone doing a brute force attack.
8872 [ 'count' => 150, 'seconds' => 60 * 60 * 48 ],
8873 ],
8874 'type' => 'list',
8875 ];
8876
8887 public const GrantPermissions = [
8888 'default' => [
8889 'basic' => [
8890 'autocreateaccount' => true,
8891 'autoconfirmed' => true,
8892 'autopatrol' => true,
8893 'editsemiprotected' => true,
8894 'ipblock-exempt' => true,
8895 'nominornewtalk' => true,
8896 'patrolmarks' => true,
8897 'read' => true,
8898 'unwatchedpages' => true,
8899 ],
8900 'highvolume' => [
8901 'bot' => true,
8902 'apihighlimits' => true,
8903 'noratelimit' => true,
8904 'markbotedits' => true,
8905 ],
8906 'import' => [
8907 'import' => true,
8908 'importupload' => true,
8909 ],
8910 'editpage' => [
8911 'edit' => true,
8912 'minoredit' => true,
8913 'applychangetags' => true,
8914 'changetags' => true,
8915 'editcontentmodel' => true,
8916 'pagelang' => true,
8917 ],
8918 'editprotected' => [
8919 'edit' => true,
8920 'minoredit' => true,
8921 'applychangetags' => true,
8922 'changetags' => true,
8923 'editcontentmodel' => true,
8924 'editprotected' => true,
8925 ],
8926 'editmycssjs' => [
8927 'edit' => true,
8928 'minoredit' => true,
8929 'applychangetags' => true,
8930 'changetags' => true,
8931 'editcontentmodel' => true,
8932 'editmyusercss' => true,
8933 'editmyuserjson' => true,
8934 'editmyuserjs' => true,
8935 ],
8936 'editmyoptions' => [
8937 'editmyoptions' => true,
8938 'editmyuserjson' => true,
8939 ],
8940 'editinterface' => [
8941 'edit' => true,
8942 'minoredit' => true,
8943 'applychangetags' => true,
8944 'changetags' => true,
8945 'editcontentmodel' => true,
8946 'editinterface' => true,
8947 'edituserjson' => true,
8948 'editsitejson' => true,
8949 ],
8950 'editsiteconfig' => [
8951 'edit' => true,
8952 'minoredit' => true,
8953 'applychangetags' => true,
8954 'changetags' => true,
8955 'editcontentmodel' => true,
8956 'editinterface' => true,
8957 'edituserjson' => true,
8958 'editsitejson' => true,
8959 'editusercss' => true,
8960 'edituserjs' => true,
8961 'editsitecss' => true,
8962 'editsitejs' => true,
8963 ],
8964 'createeditmovepage' => [
8965 'edit' => true,
8966 'minoredit' => true,
8967 'applychangetags' => true,
8968 'changetags' => true,
8969 'editcontentmodel' => true,
8970 'createpage' => true,
8971 'createtalk' => true,
8972 'delete-redirect' => true,
8973 'move' => true,
8974 'move-rootuserpages' => true,
8975 'move-subpages' => true,
8976 'move-categorypages' => true,
8977 'suppressredirect' => true,
8978 ],
8979 'uploadfile' => [
8980 'upload' => true,
8981 'reupload-own' => true,
8982 ],
8983 'uploadeditmovefile' => [
8984 'upload' => true,
8985 'reupload-own' => true,
8986 'reupload' => true,
8987 'reupload-shared' => true,
8988 'upload_by_url' => true,
8989 'movefile' => true,
8990 'suppressredirect' => true,
8991 ],
8992 'patrol' => [
8993 'patrol' => true,
8994 ],
8995 'rollback' => [
8996 'rollback' => true,
8997 ],
8998 'blockusers' => [
8999 'block' => true,
9000 'blockemail' => true,
9001 ],
9002 'viewdeleted' => [
9003 'browsearchive' => true,
9004 'deletedhistory' => true,
9005 'deletedtext' => true,
9006 ],
9007 'viewrestrictedlogs' => [
9008 'suppressionlog' => true,
9009 ],
9010 'delete' => [
9011 'edit' => true,
9012 'minoredit' => true,
9013 'applychangetags' => true,
9014 'changetags' => true,
9015 'editcontentmodel' => true,
9016 'browsearchive' => true,
9017 'deletedhistory' => true,
9018 'deletedtext' => true,
9019 'delete' => true,
9020 'bigdelete' => true,
9021 'deletelogentry' => true,
9022 'deleterevision' => true,
9023 'undelete' => true,
9024 ],
9025 'oversight' => [
9026 'suppressrevision' => true,
9027 'viewsuppressed' => true,
9028 ],
9029 'protect' => [
9030 'edit' => true,
9031 'minoredit' => true,
9032 'applychangetags' => true,
9033 'changetags' => true,
9034 'editcontentmodel' => true,
9035 'editprotected' => true,
9036 'protect' => true,
9037 ],
9038 'viewmywatchlist' => [
9039 'viewmywatchlist' => true,
9040 ],
9041 'editmywatchlist' => [
9042 'editmywatchlist' => true,
9043 ],
9044 'sendemail' => [
9045 'sendemail' => true,
9046 ],
9047 'createaccount' => [
9048 'createaccount' => true,
9049 ],
9050 'privateinfo' => [
9051 'viewmyprivateinfo' => true,
9052 ],
9053 'mergehistory' => [
9054 'mergehistory' => true,
9055 ],
9056 ],
9057 'type' => 'map',
9058 'mergeStrategy' => 'array_plus_2d',
9059 'additionalProperties' => [
9060 'type' => 'map',
9061 'additionalProperties' => [ 'type' => 'boolean', ],
9062 ],
9063 ];
9064
9075 public const GrantPermissionGroups = [
9076 'default' =>
9077 [
9078 // Hidden grants are implicitly present
9079 'basic' => 'hidden',
9080
9081 'editpage' => 'page-interaction',
9082 'createeditmovepage' => 'page-interaction',
9083 'editprotected' => 'page-interaction',
9084 'patrol' => 'page-interaction',
9085
9086 'uploadfile' => 'file-interaction',
9087 'uploadeditmovefile' => 'file-interaction',
9088
9089 'sendemail' => 'email',
9090
9091 'viewmywatchlist' => 'watchlist-interaction',
9092 'editviewmywatchlist' => 'watchlist-interaction',
9093
9094 'editmycssjs' => 'customization',
9095 'editmyoptions' => 'customization',
9096
9097 'editinterface' => 'administration',
9098 'editsiteconfig' => 'administration',
9099 'rollback' => 'administration',
9100 'blockusers' => 'administration',
9101 'delete' => 'administration',
9102 'viewdeleted' => 'administration',
9103 'viewrestrictedlogs' => 'administration',
9104 'protect' => 'administration',
9105 'oversight' => 'administration',
9106 'createaccount' => 'administration',
9107 'mergehistory' => 'administration',
9108 'import' => 'administration',
9109
9110 'highvolume' => 'high-volume',
9111
9112 'privateinfo' => 'private-information',
9113 ],
9114 'type' => 'map',
9115 'additionalProperties' => [ 'type' => 'string', ],
9116 ];
9117
9128 public const GrantRiskGroups = [
9129 'default' => [
9130 'basic' => GrantsInfo::RISK_LOW,
9131 'editpage' => GrantsInfo::RISK_LOW,
9132 'createeditmovepage' => GrantsInfo::RISK_LOW,
9133 'editprotected' => GrantsInfo::RISK_VANDALISM,
9134 'patrol' => GrantsInfo::RISK_LOW,
9135 'uploadfile' => GrantsInfo::RISK_LOW,
9136 'uploadeditmovefile' => GrantsInfo::RISK_LOW,
9137 'sendemail' => GrantsInfo::RISK_SECURITY,
9138 'viewmywatchlist' => GrantsInfo::RISK_LOW,
9139 'editviewmywatchlist' => GrantsInfo::RISK_LOW,
9140 'editmycssjs' => GrantsInfo::RISK_SECURITY,
9141 'editmyoptions' => GrantsInfo::RISK_SECURITY,
9142 'editinterface' => GrantsInfo::RISK_VANDALISM,
9143 'editsiteconfig' => GrantsInfo::RISK_SECURITY,
9144 'rollback' => GrantsInfo::RISK_LOW,
9145 'blockusers' => GrantsInfo::RISK_VANDALISM,
9146 'delete' => GrantsInfo::RISK_VANDALISM,
9147 'viewdeleted' => GrantsInfo::RISK_VANDALISM,
9148 'viewrestrictedlogs' => GrantsInfo::RISK_SECURITY,
9149 'protect' => GrantsInfo::RISK_VANDALISM,
9150 'oversight' => GrantsInfo::RISK_SECURITY,
9151 'createaccount' => GrantsInfo::RISK_LOW,
9152 'mergehistory' => GrantsInfo::RISK_VANDALISM,
9153 'import' => GrantsInfo::RISK_SECURITY,
9154 'highvolume' => GrantsInfo::RISK_LOW,
9155 'privateinfo' => GrantsInfo::RISK_LOW,
9156 ],
9157 'type' => 'map',
9158 ];
9159
9163 public const EnableBotPasswords = [
9164 'default' => true,
9165 'type' => 'boolean',
9166 ];
9167
9174 public const BotPasswordsCluster = [
9175 'default' => false,
9176 'type' => 'string|false',
9177 ];
9178
9188 public const BotPasswordsDatabase = [
9189 'default' => false,
9190 'type' => 'string|false',
9191 ];
9192
9193 // endregion -- end of user rights settings
9194
9195 /***************************************************************************/
9196 // region Security
9202 public const SecretKey = [
9203 'default' => false,
9204 ];
9205
9211 public const AllowUserJs = [
9212 'default' => false,
9213 ];
9214
9220 public const AllowUserCss = [
9221 'default' => false,
9222 ];
9223
9230 public const AllowUserCssPrefs = [
9231 'default' => true,
9232 ];
9233
9237 public const UseSiteJs = [
9238 'default' => true,
9239 ];
9240
9244 public const UseSiteCss = [
9245 'default' => true,
9246 ];
9247
9252 public const BreakFrames = [
9253 'default' => false,
9254 ];
9255
9275 public const EditPageFrameOptions = [
9276 'default' => 'DENY',
9277 ];
9278
9290 public const ApiFrameOptions = [
9291 'default' => 'DENY',
9292 ];
9293
9303 public const CSPHeader = [
9304 'default' => false,
9305 'type' => 'false|object',
9306 ];
9307
9313 public const CSPReportOnlyHeader = [
9314 'default' => false,
9315 'type' => 'false|object',
9316 ];
9317
9327 public const CSPFalsePositiveUrls = [
9328 'default' => [
9329 'https://3hub.co' => true,
9330 'https://morepro.info' => true,
9331 'https://p.ato.mx' => true,
9332 'https://s.ato.mx' => true,
9333 'https://adserver.adtech.de' => true,
9334 'https://ums.adtechus.com' => true,
9335 'https://cas.criteo.com' => true,
9336 'https://cat.nl.eu.criteo.com' => true,
9337 'https://atpixel.alephd.com' => true,
9338 'https://rtb.metrigo.com' => true,
9339 'https://d5p.de17a.com' => true,
9340 'https://ad.lkqd.net/vpaid/vpaid.js' => true,
9341 'https://ad.lkqd.net/vpaid/vpaid.js?fusion=1.0' => true,
9342 'https://t.lkqd.net/t' => true,
9343 'chrome-extension' => true,
9344 ],
9345 'type' => 'map',
9346 ];
9347
9355 public const AllowCrossOrigin = [
9356 'default' => false,
9357 'type' => 'boolean',
9358 ];
9359
9373 public const RestAllowCrossOriginCookieAuth = [
9374 'default' => false,
9375 'type' => 'boolean',
9376 ];
9377
9386 public const SessionSecret = [
9387 'default' => false,
9388 ];
9389
9400 public const HKDFSecret = [
9401 'default' => false,
9402 ];
9403
9412 public const HKDFAlgorithm = [
9413 'default' => 'sha256',
9414 ];
9415
9416 // endregion -- end of security
9417
9418 /***************************************************************************/
9419 // region Cookie settings
9425 public const CookieExpiration = [
9426 'default' => 30 * 86400,
9427 ];
9428
9435 public const ExtendedLoginCookieExpiration = [
9436 'default' => 180 * 86400,
9437 ];
9438
9443 public const CookieDomain = [
9444 'default' => '',
9445 ];
9446
9451 public const CookiePath = [
9452 'default' => '/',
9453 ];
9454
9465 public const CookieSecure = [
9466 'default' => 'detect',
9467 'dynamicDefault' => [ 'use' => [ 'ForceHTTPS' ] ]
9468 ];
9469
9470 public static function getDefaultCookieSecure( $forceHTTPS ): bool {
9471 return $forceHTTPS || ( WebRequest::detectProtocol() === 'https' );
9472 }
9473
9479 public const CookiePrefix = [
9480 'default' => false,
9481 'dynamicDefault' => [
9482 'use' => [ 'SharedDB', 'SharedPrefix', 'SharedTables', 'DBname', 'DBprefix' ]
9483 ],
9484 ];
9485
9486 public static function getDefaultCookiePrefix(
9487 $sharedDB, $sharedPrefix, $sharedTables, $dbName, $dbPrefix
9488 ): string {
9489 if ( $sharedDB && in_array( 'user', $sharedTables ) ) {
9490 return $sharedDB . ( $sharedPrefix ? "_$sharedPrefix" : '' );
9491 }
9492 return $dbName . ( $dbPrefix ? "_$dbPrefix" : '' );
9493 }
9494
9500 public const CookieHttpOnly = [
9501 'default' => true,
9502 ];
9503
9513 public const CookieSameSite = [
9514 'default' => null,
9515 'type' => '?string',
9516 ];
9517
9521 public const CacheVaryCookies = [
9522 'default' => [],
9523 'type' => 'list',
9524 ];
9525
9529 public const SessionName = [
9530 'default' => false,
9531 ];
9532
9540 public const CookieSetOnAutoblock = [
9541 'default' => true,
9542 ];
9543
9551 public const CookieSetOnIpBlock = [
9552 'default' => true,
9553 ];
9554
9555 // endregion -- end of cookie settings
9556
9557 /***************************************************************************/
9558 // region Profiling, testing and debugging
9560 // See $wgProfiler for how to enable profiling.
9561
9573 public const DebugLogFile = [
9574 'default' => '',
9575 ];
9576
9580 public const DebugLogPrefix = [
9581 'default' => '',
9582 ];
9583
9589 public const DebugRedirects = [
9590 'default' => false,
9591 ];
9592
9607 public const DebugRawPage = [
9608 'default' => false,
9609 ];
9610
9619 public const DebugComments = [
9620 'default' => false,
9621 ];
9622
9630 public const DebugDumpSql = [
9631 'default' => false,
9632 ];
9633
9639 public const TrxProfilerLimits = [
9640 'default' => [
9641 // HTTP GET/HEAD requests.
9642 // Primary queries should not happen on GET requests
9643 'GET' => [
9644 'masterConns' => 0,
9645 'writes' => 0,
9646 'readQueryTime' => 5,
9647 'readQueryRows' => 10000
9648 ],
9649 // HTTP POST requests.
9650 // Primary reads and writes will happen for a subset of these.
9651 'POST' => [
9652 'readQueryTime' => 5,
9653 'writeQueryTime' => 1,
9654 'readQueryRows' => 100_000,
9655 'maxAffected' => 1000
9656 ],
9657 'POST-nonwrite' => [
9658 'writes' => 0,
9659 'readQueryTime' => 5,
9660 'readQueryRows' => 10000
9661 ],
9662 // Deferred updates that run after HTTP response is sent for GET requests
9663 'PostSend-GET' => [
9664 'readQueryTime' => 5,
9665 'writeQueryTime' => 1,
9666 'readQueryRows' => 10000,
9667 'maxAffected' => 1000,
9668 // Log primary queries under the post-send entry point as they are discouraged
9669 'masterConns' => 0,
9670 'writes' => 0,
9671 ],
9672 // Deferred updates that run after HTTP response is sent for POST requests
9673 'PostSend-POST' => [
9674 'readQueryTime' => 5,
9675 'writeQueryTime' => 1,
9676 'readQueryRows' => 100_000,
9677 'maxAffected' => 1000
9678 ],
9679 // Background job runner
9680 'JobRunner' => [
9681 'readQueryTime' => 30,
9682 'writeQueryTime' => 5,
9683 'readQueryRows' => 100_000,
9684 'maxAffected' => 500 // ballpark of $wgUpdateRowsPerQuery
9685 ],
9686 // Command-line scripts
9687 'Maintenance' => [
9688 'writeQueryTime' => 5,
9689 'maxAffected' => 1000
9690 ]
9691 ],
9692 'type' => 'map',
9693 ];
9694
9727 public const DebugLogGroups = [
9728 'default' => [],
9729 'type' => 'map',
9730 ];
9731
9753 public const MWLoggerDefaultSpi = [
9754 'default' => [ 'class' => 'MediaWiki\\Logger\\LegacySpi', ],
9755 'mergeStrategy' => 'replace',
9756 'type' => 'map',
9757 ];
9758
9764 public const ShowDebug = [
9765 'default' => false,
9766 ];
9767
9771 public const SpecialVersionShowHooks = [
9772 'default' => false,
9773 ];
9774
9782 public const ShowExceptionDetails = [
9783 'default' => false,
9784 ];
9785
9789 public const LogExceptionBacktrace = [
9790 'default' => true,
9791 ];
9792
9797 public const PropagateErrors = [
9798 'default' => true,
9799 ];
9800
9804 public const ShowHostnames = [
9805 'default' => false,
9806 ];
9807
9815 public const OverrideHostname = [
9816 'default' => false,
9817 ];
9818
9823 public const DevelopmentWarnings = [
9824 'default' => false,
9825 ];
9826
9832 public const DeprecationReleaseLimit = [
9833 'default' => false,
9834 ];
9835
9902 public const Profiler = [
9903 'default' => [],
9904 'type' => 'map',
9905 'mergeStrategy' => 'replace',
9906 ];
9907
9918 public const StatsdServer = [
9919 'default' => false,
9920 ];
9921
9929 public const StatsdMetricPrefix = [
9930 'default' => 'MediaWiki',
9931 ];
9932
9941 public const StatsTarget = [
9942 'default' => null,
9943 'type' => '?string',
9944 ];
9945
9955 public const StatsFormat = [
9956 'default' => null,
9957 'type' => '?string',
9958 ];
9959
9969 public const StatsPrefix = [
9970 'default' => 'mediawiki',
9971 'type' => 'string',
9972 ];
9973
9980 public const PageInfoTransclusionLimit = [
9981 'default' => 50,
9982 ];
9983
9987 public const EnableJavaScriptTest = [
9988 'default' => false,
9989 ];
9990
9996 public const CachePrefix = [
9997 'default' => false,
9998 ];
9999
10008 public const DebugToolbar = [
10009 'default' => false,
10010 ];
10011
10012 // endregion -- end of profiling, testing and debugging
10013
10014 /***************************************************************************/
10015 // region Search
10021 public const DisableTextSearch = [
10022 'default' => false,
10023 ];
10024
10029 public const AdvancedSearchHighlighting = [
10030 'default' => false,
10031 ];
10032
10037 public const SearchHighlightBoundaries = [
10038 'default' => '[\\p{Z}\\p{P}\\p{C}]',
10039 ];
10040
10049 public const OpenSearchTemplates = [
10050 'default' => [
10051 'application/x-suggestions+json' => false,
10052 'application/x-suggestions+xml' => false,
10053 ],
10054 'type' => 'map',
10055 ];
10056
10063 public const EnableOpenSearchSuggest = [
10064 'default' => true,
10065 'obsolete' => 'Since 1.35, no longer used',
10066 'description' => 'Has been emitting warnings since 1.39 (LTS). ' .
10067 'Can be removed completely in 1.44, assuming 1.43 is an LTS release.'
10068 ];
10069
10074 public const OpenSearchDefaultLimit = [
10075 'default' => 10,
10076 ];
10077
10082 public const OpenSearchDescriptionLength = [
10083 'default' => 100,
10084 ];
10085
10089 public const SearchSuggestCacheExpiry = [
10090 'default' => 1200,
10091 ];
10092
10097 public const DisableSearchUpdate = [
10098 'default' => false,
10099 ];
10100
10111 public const NamespacesToBeSearchedDefault = [
10112 'default' => [ NS_MAIN => true, ],
10113 'type' => 'map',
10114 ];
10115
10120 public const DisableInternalSearch = [
10121 'default' => false,
10122 ];
10123
10141 public const SearchForwardUrl = [
10142 'default' => null,
10143 ];
10144
10150 public const SitemapNamespaces = [
10151 'default' => false,
10152 'type' => 'false|list',
10153 ];
10154
10171 public const SitemapNamespacesPriorities = [
10172 'default' => false,
10173 'type' => 'false|map',
10174 ];
10175
10181 public const EnableSearchContributorsByIP = [
10182 'default' => true,
10183 ];
10184
10195 public const SpecialSearchFormOptions = [
10196 'default' => [],
10197 'type' => 'map',
10198 ];
10199
10208 public const SearchMatchRedirectPreference = [
10209 'default' => false,
10210 'type' => 'boolean',
10211 ];
10212
10219 public const SearchRunSuggestedQuery = [
10220 'default' => true,
10221 'type' => 'boolean',
10222 ];
10223
10224 // endregion -- end of search settings
10225
10226 /***************************************************************************/
10227 // region Edit user interface
10234 public const Diff3 = [
10235 'default' => '/usr/bin/diff3',
10236 ];
10237
10241 public const Diff = [
10242 'default' => '/usr/bin/diff',
10243 ];
10244
10250 public const PreviewOnOpenNamespaces = [
10251 'default' => [
10252 NS_CATEGORY => true
10253 ],
10254 'type' => 'map',
10255 ];
10256
10262 public const UniversalEditButton = [
10263 'default' => true,
10264 ];
10265
10271 public const UseAutomaticEditSummaries = [
10272 'default' => true,
10273 ];
10274
10275 // endregion -- end edit UI
10276
10277 /***************************************************************************/
10278 // region Maintenance
10280 // See also $wgSiteNotice
10281
10285 public const CommandLineDarkBg = [
10286 'default' => false,
10287 ];
10288
10297 public const ReadOnly = [
10298 'default' => null,
10299 ];
10300
10306 public const ReadOnlyWatchedItemStore = [
10307 'default' => false,
10308 'type' => 'boolean',
10309 ];
10310
10319 public const ReadOnlyFile = [
10320 'default' => false,
10321 'dynamicDefault' => [ 'use' => [ 'UploadDirectory' ] ]
10322 ];
10323
10328 public static function getDefaultReadOnlyFile( $uploadDirectory ): string {
10329 return "$uploadDirectory/lock_yBgMBwiR";
10330 }
10331
10341 public const UpgradeKey = [
10342 'default' => false,
10343 ];
10344
10348 public const GitBin = [
10349 'default' => '/usr/bin/git',
10350 ];
10351
10365 public const GitRepositoryViewers = [
10366 'default' => [
10367 'https://(?:[a-z0-9_]+@)?gerrit.wikimedia.org/r/(?:p/)?(.*)' => 'https://gerrit.wikimedia.org/g/%R/+/%H',
10368 'ssh://(?:[a-z0-9_]+@)?gerrit.wikimedia.org:29418/(.*)' => 'https://gerrit.wikimedia.org/g/%R/+/%H',
10369 ],
10370 'type' => 'map',
10371 ];
10372
10373 // endregion -- End of maintenance
10374
10375 /***************************************************************************/
10376 // region Recent changes, new pages, watchlist and history
10385 public const RCMaxAge = [
10386 'default' => 90 * 24 * 3600,
10387 ];
10388
10396 public const WatchersMaxAge = [
10397 'default' => 180 * 24 * 3600,
10398 ];
10399
10408 public const UnwatchedPageSecret = [
10409 'default' => 1,
10410 ];
10411
10419 public const RCFilterByAge = [
10420 'default' => false,
10421 ];
10422
10427 public const RCLinkLimits = [
10428 'default' => [ 50, 100, 250, 500 ],
10429 'type' => 'list',
10430 ];
10431
10438 public const RCLinkDays = [
10439 'default' => [ 1, 3, 7, 14, 30 ],
10440 'type' => 'list',
10441 ];
10442
10506 public const RCFeeds = [
10507 'default' => [],
10508 'type' => 'map',
10509 ];
10510
10518 public const RCEngines = [
10519 'default' => [
10520 'redis' => RedisPubSubFeedEngine::class,
10521 'udp' => UDPRCFeedEngine::class,
10522 ],
10523 'type' => 'map',
10524 ];
10525
10538 public const RCWatchCategoryMembership = [
10539 'default' => false,
10540 ];
10541
10550 public const UseRCPatrol = [
10551 'default' => true,
10552 ];
10553
10560 public const StructuredChangeFiltersLiveUpdatePollingRate = [
10561 'default' => 3,
10562 ];
10563
10571 public const UseNPPatrol = [
10572 'default' => true,
10573 ];
10574
10583 public const UseFilePatrol = [
10584 'default' => true,
10585 ];
10586
10590 public const Feed = [
10591 'default' => true,
10592 ];
10593
10598 public const FeedLimit = [
10599 'default' => 50,
10600 ];
10601
10611 public const FeedCacheTimeout = [
10612 'default' => 60,
10613 ];
10614
10619 public const FeedDiffCutoff = [
10620 'default' => 32768,
10621 ];
10622
10638 public const OverrideSiteFeed = [
10639 'default' => [],
10640 'type' => 'map',
10641 ];
10642
10649 public const FeedClasses = [
10650 'default' => [
10651 'rss' => \MediaWiki\Feed\RSSFeed::class,
10652 'atom' => \MediaWiki\Feed\AtomFeed::class,
10653 ],
10654 'type' => 'map',
10655 ];
10656
10661 public const AdvertisedFeedTypes = [
10662 'default' => [ 'atom', ],
10663 'type' => 'list',
10664 ];
10665
10669 public const RCShowWatchingUsers = [
10670 'default' => false,
10671 ];
10672
10676 public const RCShowChangedSize = [
10677 'default' => true,
10678 ];
10679
10685 public const RCChangedSizeThreshold = [
10686 'default' => 500,
10687 ];
10688
10693 public const ShowUpdatedMarker = [
10694 'default' => true,
10695 ];
10696
10701 public const DisableAnonTalk = [
10702 'default' => false,
10703 ];
10704
10709 public const UseTagFilter = [
10710 'default' => true,
10711 ];
10712
10730 public const SoftwareTags = [
10731 'default' => [
10732 'mw-contentmodelchange' => true,
10733 'mw-new-redirect' => true,
10734 'mw-removed-redirect' => true,
10735 'mw-changed-redirect-target' => true,
10736 'mw-blank' => true,
10737 'mw-replace' => true,
10738 'mw-rollback' => true,
10739 'mw-undo' => true,
10740 'mw-manual-revert' => true,
10741 'mw-reverted' => true,
10742 'mw-server-side-upload' => true,
10743 ],
10744 'type' => 'map',
10745 'additionalProperties' => [ 'type' => 'boolean', ],
10746 ];
10747
10755 public const UnwatchedPageThreshold = [
10756 'default' => false,
10757 ];
10758
10784 public const RecentChangesFlags = [
10785 'default' => [
10786 'newpage' => [
10787 'letter' => 'newpageletter',
10788 'title' => 'recentchanges-label-newpage',
10789 'legend' => 'recentchanges-legend-newpage',
10790 'grouping' => 'any',
10791 ],
10792 'minor' => [
10793 'letter' => 'minoreditletter',
10794 'title' => 'recentchanges-label-minor',
10795 'legend' => 'recentchanges-legend-minor',
10796 'class' => 'minoredit',
10797 'grouping' => 'all',
10798 ],
10799 'bot' => [
10800 'letter' => 'boteditletter',
10801 'title' => 'recentchanges-label-bot',
10802 'legend' => 'recentchanges-legend-bot',
10803 'class' => 'botedit',
10804 'grouping' => 'all',
10805 ],
10806 'unpatrolled' => [
10807 'letter' => 'unpatrolledletter',
10808 'title' => 'recentchanges-label-unpatrolled',
10809 'legend' => 'recentchanges-legend-unpatrolled',
10810 'grouping' => 'any',
10811 ],
10812 ],
10813 'type' => 'map',
10814 ];
10815
10821 public const WatchlistExpiry = [
10822 'default' => false,
10823 'type' => 'boolean',
10824 ];
10825
10836 public const WatchlistPurgeRate = [
10837 'default' => 0.1,
10838 'type' => 'float',
10839 ];
10840
10855 public const WatchlistExpiryMaxDuration = [
10856 'default' => '1 year',
10857 'type' => '?string',
10858 ];
10859
10860 // endregion -- end RC/watchlist
10861
10862 /***************************************************************************/
10863 // region Copyright and credits settings
10873 public const RightsPage = [
10874 'default' => null,
10875 ];
10876
10883 public const RightsUrl = [
10884 'default' => null,
10885 ];
10886
10895 public const RightsText = [
10896 'default' => null,
10897 ];
10898
10902 public const RightsIcon = [
10903 'default' => null,
10904 ];
10905
10909 public const UseCopyrightUpload = [
10910 'default' => false,
10911 ];
10912
10920 public const MaxCredits = [
10921 'default' => 0,
10922 ];
10923
10929 public const ShowCreditsIfMax = [
10930 'default' => true,
10931 ];
10932
10933 // endregion -- end of copyright and credits settings
10934
10935 /***************************************************************************/
10936 // region Import / Export
10962 public const ImportSources = [
10963 'default' => [],
10964 'type' => 'map',
10965 ];
10966
10975 public const ImportTargetNamespace = [
10976 'default' => null,
10977 ];
10978
10985 public const ExportAllowHistory = [
10986 'default' => true,
10987 ];
10988
10994 public const ExportMaxHistory = [
10995 'default' => 0,
10996 ];
10997
11001 public const ExportAllowListContributors = [
11002 'default' => false,
11003 ];
11004
11016 public const ExportMaxLinkDepth = [
11017 'default' => 0,
11018 ];
11019
11023 public const ExportFromNamespaces = [
11024 'default' => false,
11025 ];
11026
11030 public const ExportAllowAll = [
11031 'default' => false,
11032 ];
11033
11040 public const ExportPagelistLimit = [
11041 'default' => 5000,
11042 ];
11043
11048 public const XmlDumpSchemaVersion = [
11049 'default' => XML_DUMP_SCHEMA_VERSION_11,
11050 ];
11051
11052 // endregion -- end of import/export
11053
11054 /***************************************************************************/
11055 // region Wiki Farm
11067 public const WikiFarmSettingsDirectory = [
11068 'default' => null
11069 ];
11070
11078 public const WikiFarmSettingsExtension = [
11079 'default' => 'yaml'
11080 ];
11081
11082 // endregion -- End Wiki Farm
11083
11084 /***************************************************************************/
11085 // region Extensions
11092 public const ExtensionFunctions = [
11093 'default' => [],
11094 'type' => 'list',
11095 ];
11096
11124 public const ExtensionMessagesFiles = [
11125 'default' => [],
11126 'type' => 'map',
11127 ];
11128
11157 public const MessagesDirs = [
11158 'default' => [],
11159 'type' => 'map',
11160 ];
11161
11188 public const TranslationAliasesDirs = [
11189 'default' => [],
11190 'type' => 'map',
11191 ];
11192
11199 public const ExtensionEntryPointListFiles = [
11200 'default' => [],
11201 'type' => 'map',
11202 ];
11203
11207 public const EnableParserLimitReporting = [
11208 'default' => true,
11209 ];
11210
11236 public const ValidSkinNames = [
11237 'default' => [],
11238 'type' => 'map',
11239 ];
11240
11246 public const SpecialPages = [
11247 'default' => [],
11248 'type' => 'map',
11249 ];
11250
11261 public const AutoloadAttemptLowercase = [
11262 'default' => false,
11263 'obsolete' => 'Since 1.40; no longer has any effect.',
11264 'description' => 'Has been emitting warnings since 1.39 (LTS). ' .
11265 'Can be removed completely in 1.44, assuming 1.43 is an LTS release.'
11266 ];
11267
11326 public const ExtensionCredits = [
11327 'default' => [],
11328 'type' => 'map',
11329 ];
11330
11360 public const Hooks = [
11361 'default' => [],
11362 'type' => 'map',
11363 'mergeStrategy' => 'array_merge_recursive',
11364 ];
11365
11380 public const ServiceWiringFiles = [
11381 'default' => [],
11382 'type' => 'list',
11383 ];
11384
11403 public const JobClasses = [
11404 'default' => [
11405 'deletePage' => DeletePageJob::class,
11406 'refreshLinks' => RefreshLinksJob::class,
11407 'deleteLinks' => DeleteLinksJob::class,
11408 'htmlCacheUpdate' => HTMLCacheUpdateJob::class,
11409 'sendMail' => [
11410 'class' => EmaillingJob::class,
11411 'services' => [
11412 0 => 'Emailer'
11413 ]
11414 ],
11415 'enotifNotify' => EnotifNotifyJob::class,
11416 'fixDoubleRedirect' => [
11417 'class' => DoubleRedirectJob::class,
11418 'services' => [
11419 'RevisionLookup',
11420 'MagicWordFactory',
11421 'WikiPageFactory',
11422 ],
11423 // This job requires a title
11424 'needsPage' => true,
11425 ],
11426 'AssembleUploadChunks' => AssembleUploadChunksJob::class,
11427 'PublishStashedFile' => PublishStashedFileJob::class,
11428 'ThumbnailRender' => ThumbnailRenderJob::class,
11429 'UploadFromUrl' => UploadFromUrlJob::class,
11430 'recentChangesUpdate' => RecentChangesUpdateJob::class,
11431 'refreshLinksPrioritized' => RefreshLinksJob::class,
11432 'refreshLinksDynamic' => RefreshLinksJob::class,
11433 'activityUpdateJob' => ActivityUpdateJob::class,
11434 'categoryMembershipChange' => CategoryMembershipChangeJob::class,
11435 'clearUserWatchlist' => ClearUserWatchlistJob::class,
11436 'watchlistExpiry' => WatchlistExpiryJob::class,
11437 'cdnPurge' => CdnPurgeJob::class,
11438 'userGroupExpiry' => UserGroupExpiryJob::class,
11439 'clearWatchlistNotifications' => ClearWatchlistNotificationsJob::class,
11440 'userOptionsUpdate' => UserOptionsUpdateJob::class,
11441 'revertedTagUpdate' => RevertedTagUpdateJob::class,
11442 'null' => NullJob::class,
11443 'userEditCountInit' => UserEditCountInitJob::class,
11444 'parsoidCachePrewarm' => [
11445 'class' => ParsoidCachePrewarmJob::class,
11446 'services' => [
11447 'ParserOutputAccess',
11448 'PageStore',
11449 'RevisionLookup',
11450 'ParsoidSiteConfig',
11451 ],
11452 // tell the JobFactory not to include the $page parameter in the constructor call
11453 'needsPage' => false
11454 ],
11455 'renameUser' => [
11456 'class' => RenameUserJob::class,
11457 'services' => [
11458 'MainConfig',
11459 'DBLoadBalancerFactory'
11460 ]
11461 ],
11462 ],
11463 'type' => 'map',
11464 ];
11465
11477 public const JobTypesExcludedFromDefaultQueue = [
11478 'default' => [ 'AssembleUploadChunks', 'PublishStashedFile', 'UploadFromUrl' ],
11479 'type' => 'list',
11480 ];
11481
11491 public const JobBackoffThrottling = [
11492 'default' => [],
11493 'type' => 'map',
11494 'additionalProperties' => [ 'type' => 'float', ],
11495 ];
11496
11504 public const JobTypeConf = [
11505 'default' => [
11506 'default' => [
11507 'class' => JobQueueDB::class,
11508 'order' => 'random',
11509 'claimTTL' => 3600
11510 ],
11511 ],
11512 'additionalProperties' => [
11513 'type' => 'object',
11514 'properties' => [
11515 'class' => [ 'type' => 'string' ],
11516 'order' => [ 'type' => 'string' ],
11517 'claimTTL' => [ 'type' => 'int' ]
11518 ],
11519 ],
11520 'type' => 'map',
11521 ];
11522
11535 public const JobQueueIncludeInMaxLagFactor = [
11536 'default' => false,
11537 ];
11538
11544 public const SpecialPageCacheUpdates = [
11545 'default' => [
11546 'Statistics' => [ SiteStatsUpdate::class, 'cacheUpdate' ]
11547 ],
11548 'type' => 'map',
11549 ];
11550
11559 public const PagePropLinkInvalidations = [
11560 'default' => [ 'hiddencat' => 'categorylinks', ],
11561 'type' => 'map',
11562 ];
11563
11564 // endregion -- End extensions
11565
11566 /***************************************************************************/
11567 // region Categories
11574 public const CategoryMagicGallery = [
11575 'default' => true,
11576 ];
11577
11581 public const CategoryPagingLimit = [
11582 'default' => 200,
11583 ];
11584
11611 public const CategoryCollation = [
11612 'default' => 'uppercase',
11613 ];
11614
11626 public const TempCategoryCollations = [
11627 'default' => [],
11628 'type' => 'list',
11629 ];
11630
11639 public const SortedCategories = [
11640 'default' => false,
11641 'type' => 'boolean',
11642 ];
11643
11658 public const TrackingCategories = [
11659 'default' => [],
11660 'type' => 'list',
11661 'deprecated' => 'since 1.25 Extensions should now register tracking categories using ' .
11662 'the new extension registration system.',
11663 ];
11664
11665 // endregion -- End categories
11666
11667 /***************************************************************************/
11668 // region Logging
11680 public const LogTypes = [
11681 'default' => [
11682 '',
11683 'block',
11684 'protect',
11685 'rights',
11686 'delete',
11687 'upload',
11688 'move',
11689 'import',
11690 'patrol',
11691 'merge',
11692 'suppress',
11693 'tag',
11694 'managetags',
11695 'contentmodel',
11696 'renameuser',
11697 ],
11698 'type' => 'list',
11699 ];
11700
11708 public const LogRestrictions = [
11709 'default' => [ 'suppress' => 'suppressionlog', ],
11710 'type' => 'map',
11711 ];
11712
11731 public const FilterLogTypes = [
11732 'default' => [
11733 'patrol' => true,
11734 'tag' => true,
11735 'newusers' => false,
11736 ],
11737 'type' => 'map',
11738 ];
11739
11749 public const LogNames = [
11750 'default' => [
11751 '' => 'all-logs-page',
11752 'block' => 'blocklogpage',
11753 'protect' => 'protectlogpage',
11754 'rights' => 'rightslog',
11755 'delete' => 'dellogpage',
11756 'upload' => 'uploadlogpage',
11757 'move' => 'movelogpage',
11758 'import' => 'importlogpage',
11759 'patrol' => 'patrol-log-page',
11760 'merge' => 'mergelog',
11761 'suppress' => 'suppressionlog',
11762 ],
11763 'type' => 'map',
11764 ];
11765
11775 public const LogHeaders = [
11776 'default' => [
11777 '' => 'alllogstext',
11778 'block' => 'blocklogtext',
11779 'delete' => 'dellogpagetext',
11780 'import' => 'importlogpagetext',
11781 'merge' => 'mergelogpagetext',
11782 'move' => 'movelogpagetext',
11783 'patrol' => 'patrol-log-header',
11784 'protect' => 'protectlogtext',
11785 'rights' => 'rightslogtext',
11786 'suppress' => 'suppressionlogtext',
11787 'upload' => 'uploadlogpagetext',
11788 ],
11789 'type' => 'map',
11790 ];
11791
11799 public const LogActions = [
11800 'default' => [],
11801 'type' => 'map',
11802 ];
11803
11813 public const LogActionsHandlers = [
11814 'default' => [
11815 'block/block' => BlockLogFormatter::class,
11816 'block/reblock' => BlockLogFormatter::class,
11817 'block/unblock' => BlockLogFormatter::class,
11818 'contentmodel/change' => ContentModelLogFormatter::class,
11819 'contentmodel/new' => ContentModelLogFormatter::class,
11820 'delete/delete' => DeleteLogFormatter::class,
11821 'delete/delete_redir' => DeleteLogFormatter::class,
11822 'delete/delete_redir2' => DeleteLogFormatter::class,
11823 'delete/event' => DeleteLogFormatter::class,
11824 'delete/restore' => DeleteLogFormatter::class,
11825 'delete/revision' => DeleteLogFormatter::class,
11826 'import/interwiki' => ImportLogFormatter::class,
11827 'import/upload' => ImportLogFormatter::class,
11828 'managetags/activate' => LogFormatter::class,
11829 'managetags/create' => LogFormatter::class,
11830 'managetags/deactivate' => LogFormatter::class,
11831 'managetags/delete' => LogFormatter::class,
11832 'merge/merge' => MergeLogFormatter::class,
11833 'move/move' => MoveLogFormatter::class,
11834 'move/move_redir' => MoveLogFormatter::class,
11835 'patrol/patrol' => PatrolLogFormatter::class,
11836 'patrol/autopatrol' => PatrolLogFormatter::class,
11837 'protect/modify' => ProtectLogFormatter::class,
11838 'protect/move_prot' => ProtectLogFormatter::class,
11839 'protect/protect' => ProtectLogFormatter::class,
11840 'protect/unprotect' => ProtectLogFormatter::class,
11841 'renameuser/renameuser' => RenameuserLogFormatter::class,
11842 'rights/autopromote' => RightsLogFormatter::class,
11843 'rights/rights' => RightsLogFormatter::class,
11844 'suppress/block' => BlockLogFormatter::class,
11845 'suppress/delete' => DeleteLogFormatter::class,
11846 'suppress/event' => DeleteLogFormatter::class,
11847 'suppress/reblock' => BlockLogFormatter::class,
11848 'suppress/revision' => DeleteLogFormatter::class,
11849 'tag/update' => TagLogFormatter::class,
11850 'upload/overwrite' => UploadLogFormatter::class,
11851 'upload/revert' => UploadLogFormatter::class,
11852 'upload/upload' => UploadLogFormatter::class,
11853 ],
11854 'type' => 'map',
11855 ];
11856
11866 public const ActionFilteredLogs = [
11867 'default' => [
11868 'block' => [
11869 'block' => [ 'block' ],
11870 'reblock' => [ 'reblock' ],
11871 'unblock' => [ 'unblock' ],
11872 ],
11873 'contentmodel' => [
11874 'change' => [ 'change' ],
11875 'new' => [ 'new' ],
11876 ],
11877 'delete' => [
11878 'delete' => [ 'delete' ],
11879 'delete_redir' => [ 'delete_redir', 'delete_redir2' ],
11880 'restore' => [ 'restore' ],
11881 'event' => [ 'event' ],
11882 'revision' => [ 'revision' ],
11883 ],
11884 'import' => [
11885 'interwiki' => [ 'interwiki' ],
11886 'upload' => [ 'upload' ],
11887 ],
11888 'managetags' => [
11889 'create' => [ 'create' ],
11890 'delete' => [ 'delete' ],
11891 'activate' => [ 'activate' ],
11892 'deactivate' => [ 'deactivate' ],
11893 ],
11894 'move' => [
11895 'move' => [ 'move' ],
11896 'move_redir' => [ 'move_redir' ],
11897 ],
11898 'newusers' => [
11899 'create' => [ 'create', 'newusers' ],
11900 'create2' => [ 'create2' ],
11901 'autocreate' => [ 'autocreate' ],
11902 'byemail' => [ 'byemail' ],
11903 ],
11904 'protect' => [
11905 'protect' => [ 'protect' ],
11906 'modify' => [ 'modify' ],
11907 'unprotect' => [ 'unprotect' ],
11908 'move_prot' => [ 'move_prot' ],
11909 ],
11910 'rights' => [
11911 'rights' => [ 'rights' ],
11912 'autopromote' => [ 'autopromote' ],
11913 ],
11914 'suppress' => [
11915 'event' => [ 'event' ],
11916 'revision' => [ 'revision' ],
11917 'delete' => [ 'delete' ],
11918 'block' => [ 'block' ],
11919 'reblock' => [ 'reblock' ],
11920 ],
11921 'upload' => [
11922 'upload' => [ 'upload' ],
11923 'overwrite' => [ 'overwrite' ],
11924 'revert' => [ 'revert' ],
11925 ],
11926 ],
11927 'type' => 'map',
11928 ];
11929
11933 public const NewUserLog = [
11934 'default' => true,
11935 ];
11936
11942 public const PageCreationLog = [
11943 'default' => true,
11944 ];
11945
11946 // endregion -- end logging
11947
11948 /***************************************************************************/
11949 // region Special pages (general and miscellaneous)
11955 public const AllowSpecialInclusion = [
11956 'default' => true,
11957 ];
11958
11965 public const DisableQueryPageUpdate = [
11966 'default' => false,
11967 ];
11968
11973 public const CountCategorizedImagesAsUsed = [
11974 'default' => false,
11975 ];
11976
11981 public const MaxRedirectLinksRetrieved = [
11982 'default' => 500,
11983 ];
11984
11991 public const RangeContributionsCIDRLimit = [
11992 'default' => [
11993 'IPv4' => 16,
11994 'IPv6' => 32,
11995 ],
11996 'type' => 'map',
11997 'additionalProperties' => [ 'type' => 'integer', ],
11998 ];
11999
12000 // endregion -- end special pages
12001
12002 /***************************************************************************/
12003 // region Actions
12012 public const Actions = [
12013 'default' => [],
12014 'type' => 'map',
12015 ];
12016
12017 // endregion -- end actions
12018
12019 /***************************************************************************/
12020 // region Robot (search engine crawler) policy
12022 // See also $wgNoFollowLinks.
12023
12029 public const DefaultRobotPolicy = [
12030 'default' => 'index,follow',
12031 ];
12032
12048 public const NamespaceRobotPolicies = [
12049 'default' => [],
12050 'type' => 'map',
12051 ];
12052
12082 public const ArticleRobotPolicies = [
12083 'default' => [],
12084 'type' => 'map',
12085 ];
12086
12098 public const ExemptFromUserRobotsControl = [
12099 'default' => null,
12100 'type' => '?list',
12101 ];
12102
12103 // endregion End robot policy
12104
12105 /***************************************************************************/
12106 // region Action API and REST API
12123 public const DebugAPI = [
12124 'default' => false,
12125 ];
12126
12162 public const APIModules = [
12163 'default' => [],
12164 'type' => 'map',
12165 ];
12166
12175 public const APIFormatModules = [
12176 'default' => [],
12177 'type' => 'map',
12178 ];
12179
12188 public const APIMetaModules = [
12189 'default' => [],
12190 'type' => 'map',
12191 ];
12192
12201 public const APIPropModules = [
12202 'default' => [],
12203 'type' => 'map',
12204 ];
12205
12214 public const APIListModules = [
12215 'default' => [],
12216 'type' => 'map',
12217 ];
12218
12223 public const APIMaxDBRows = [
12224 'default' => 5000,
12225 ];
12226
12232 public const APIMaxResultSize = [
12233 'default' => 8_388_608,
12234 ];
12235
12240 public const APIMaxUncachedDiffs = [
12241 'default' => 1,
12242 ];
12243
12250 public const APIMaxLagThreshold = [
12251 'default' => 7,
12252 ];
12253
12258 public const APIRequestLog = [
12259 'default' => false,
12260 'deprecated' => 'since 1.43; use api or api-request $wgDebugLogGroups channel',
12261 ];
12262
12266 public const APICacheHelpTimeout = [
12267 'default' => 60 * 60,
12268 ];
12269
12274 public const APIUselessQueryPages = [
12275 'default' => [
12276 'MIMEsearch',
12277 'LinkSearch',
12278 ],
12279 'type' => 'list',
12280 ];
12281
12285 public const AjaxLicensePreview = [
12286 'default' => true,
12287 ];
12288
12311 public const CrossSiteAJAXdomains = [
12312 'default' => [],
12313 'type' => 'map',
12314 ];
12315
12321 public const CrossSiteAJAXdomainExceptions = [
12322 'default' => [],
12323 'type' => 'map',
12324 ];
12325
12329 public const AllowedCorsHeaders = [
12330 'default' => [
12331 /* simple headers (see spec) */
12332 'Accept',
12333 'Accept-Language',
12334 'Content-Language',
12335 'Content-Type',
12336 /* non-authorable headers in XHR, which are however requested by some UAs */
12337 'Accept-Encoding',
12338 'DNT',
12339 'Origin',
12340 /* MediaWiki whitelist */
12341 'User-Agent',
12342 'Api-User-Agent',
12343 /* Allowing caching preflight requests, see T269636 */
12344 'Access-Control-Max-Age',
12345 /* OAuth 2.0, see T322944 */
12346 'Authorization',
12347 ],
12348 'type' => 'list',
12349 ];
12350
12356 public const RestAPIAdditionalRouteFiles = [
12357 'default' => [],
12358 'type' => 'list',
12359 ];
12360
12377 public const RestSandboxSpecs = [
12378 'default' => [],
12379 'type' => 'map',
12380 'additionalProperties' => [
12381 'type' => 'object',
12382 'properties' => [
12383 'url' => [ 'type' => 'string', 'format' => 'url' ],
12384 'name' => [ 'type' => 'string' ],
12385 'msg' => [ 'type' => 'string', 'description' => 'a message key' ]
12386 ],
12387 'required' => [ 'url' ]
12388 ]
12389 ];
12390
12391 // endregion -- End AJAX and API
12392
12393 /***************************************************************************/
12394 // region Shell and process control
12400 public const MaxShellMemory = [
12401 'default' => 307_200,
12402 ];
12403
12408 public const MaxShellFileSize = [
12409 'default' => 102_400,
12410 ];
12411
12415 public const MaxShellTime = [
12416 'default' => 180,
12417 ];
12418
12423 public const MaxShellWallClockTime = [
12424 'default' => 180,
12425 ];
12426
12450 public const ShellCgroup = [
12451 'default' => false,
12452 ];
12453
12457 public const PhpCli = [
12458 'default' => '/usr/bin/php',
12459 ];
12460
12473 public const ShellRestrictionMethod = [
12474 'default' => 'autodetect',
12475 'type' => 'string|false',
12476 ];
12477
12491 public const ShellboxUrls = [
12492 'default' => [ 'default' => null, ],
12493 'type' => 'map',
12494 'additionalProperties' => [
12495 'type' => 'string|false|null',
12496 ],
12497 ];
12498
12505 public const ShellboxSecretKey = [
12506 'default' => null,
12507 'type' => '?string',
12508 ];
12509
12519 public const ShellboxShell = [
12520 'default' => '/bin/sh',
12521 'type' => '?string',
12522 ];
12523
12524 // endregion -- end Shell and process control
12525
12526 /***************************************************************************/
12527 // region HTTP client
12535 public const HTTPTimeout = [
12536 'default' => 25,
12537 'type' => 'float',
12538 ];
12539
12547 public const HTTPConnectTimeout = [
12548 'default' => 5.0,
12549 'type' => 'float',
12550 ];
12551
12559 public const HTTPMaxTimeout = [
12560 'default' => 0,
12561 'type' => 'float',
12562 ];
12563
12571 public const HTTPMaxConnectTimeout = [
12572 'default' => 0,
12573 'type' => 'float',
12574 ];
12575
12581 public const HTTPImportTimeout = [
12582 'default' => 25,
12583 ];
12584
12588 public const AsyncHTTPTimeout = [
12589 'default' => 25,
12590 ];
12591
12595 public const HTTPProxy = [
12596 'default' => '',
12597 ];
12598
12614 public const LocalVirtualHosts = [
12615 'default' => [],
12616 'type' => 'map',
12617 ];
12618
12630 public const LocalHTTPProxy = [
12631 'default' => false,
12632 'type' => 'string|false',
12633 ];
12634
12644 public const AllowExternalReqID = [
12645 'default' => false,
12646 ];
12647
12648 // endregion -- End HTTP client
12649
12650 /***************************************************************************/
12651 // region Job queue
12671 public const JobRunRate = [
12672 'default' => 1,
12673 ];
12674
12682 public const RunJobsAsync = [
12683 'default' => false,
12684 ];
12685
12689 public const UpdateRowsPerJob = [
12690 'default' => 300,
12691 ];
12692
12696 public const UpdateRowsPerQuery = [
12697 'default' => 100,
12698 ];
12699
12700 // endregion -- End job queue
12701
12702 /***************************************************************************/
12703 // region Miscellaneous
12711 public const RedirectOnLogin = [
12712 'default' => null,
12713 ];
12714
12751 public const VirtualRestConfig = [
12752 'default' => [
12753 'paths' => [],
12754 'modules' => [],
12755 'global' => [
12756 # Timeout in seconds
12757 'timeout' => 360,
12758 # 'domain' is set to $wgCanonicalServer in Setup.php
12759 'forwardCookies' => false,
12760 'HTTPProxy' => null
12761 ]
12762 ],
12763 'mergeStrategy' => 'array_plus_2d',
12764 'type' => 'map',
12765 ];
12766
12789 public const EventRelayerConfig = [
12790 'default' => [
12791 'default' => [ 'class' => EventRelayerNull::class, ],
12792 ],
12793 'type' => 'map',
12794 ];
12795
12813 public const Pingback = [
12814 'default' => false,
12815 'type' => 'boolean',
12816 ];
12817
12823 public const OriginTrials = [
12824 'default' => [],
12825 'type' => 'list',
12826 ];
12827
12834 public const ReportToExpiry = [
12835 'default' => 86400,
12836 'type' => 'integer',
12837 ];
12838
12845 public const ReportToEndpoints = [
12846 'default' => [],
12847 'type' => 'list',
12848 ];
12849
12858 public const FeaturePolicyReportOnly = [
12859 'default' => [],
12860 'type' => 'list',
12861 ];
12862
12868 public const SkinsPreferred = [
12869 'default' => [ 'vector-2022', 'vector' ],
12870 'type' => 'list',
12871 ];
12872
12878 public const SpecialContributeSkinsEnabled = [
12879 'default' => [],
12880 'type' => 'list',
12881 ];
12882
12889 public const EnableEditRecovery = [
12890 'default' => false,
12891 'type' => 'boolean',
12892 ];
12893
12897 public const EditRecoveryExpiry = [
12898 'default' => 30 * 24 * 3600,
12899 'type' => 'integer',
12900 ];
12901
12908 public const UseCodexSpecialBlock = [
12909 'default' => false,
12910 'type' => 'boolean',
12911 ];
12912
12919 public const ShowLogoutConfirmation = [
12920 'default' => false,
12921 'type' => 'boolean',
12922 ];
12923
12929 public const EnableProtectionIndicators = [
12930 'default' => false,
12931 'type' => 'boolean',
12932 ];
12933
12940 public const OutputPipelineStages = [
12941 'default' => [],
12942 'type' => 'map',
12943 ];
12944 // endregion -- End Miscellaneous
12945
12946}
const AV_SCAN_FAILED
Definition Defines.php:100
const AV_VIRUS_FOUND
Definition Defines.php:98
const APCOND_AGE
Definition Defines.php:178
const NS_HELP
Definition Defines.php:77
const NS_USER
Definition Defines.php:67
const CONTENT_MODEL_CSS
Definition Defines.php:224
const NS_FILE
Definition Defines.php:71
const CACHE_NONE
Definition Defines.php:87
const CACHE_ANYTHING
Definition Defines.php:86
const NS_MEDIAWIKI_TALK
Definition Defines.php:74
const NS_MAIN
Definition Defines.php:65
const NS_PROJECT_TALK
Definition Defines.php:70
const NS_MEDIAWIKI
Definition Defines.php:73
const NS_TEMPLATE
Definition Defines.php:75
const NS_FILE_TALK
Definition Defines.php:72
const XML_DUMP_SCHEMA_VERSION_11
Definition Defines.php:328
const CONTENT_MODEL_WIKITEXT
Definition Defines.php:222
const CONTENT_MODEL_JSON
Definition Defines.php:226
const NS_HELP_TALK
Definition Defines.php:78
const NS_CATEGORY_TALK
Definition Defines.php:80
const CONTENT_MODEL_TEXT
Definition Defines.php:225
const CACHE_DB
Definition Defines.php:88
const AV_SCAN_ABORTED
Definition Defines.php:99
const APCOND_EDITCOUNT
Definition Defines.php:177
const NS_TALK
Definition Defines.php:66
const SCHEMA_COMPAT_NEW
Definition Defines.php:290
const AV_NO_VIRUS
Definition Defines.php:97
const NS_USER_TALK
Definition Defines.php:68
const CONTENT_MODEL_UNKNOWN
Definition Defines.php:227
const NS_PROJECT
Definition Defines.php:69
const NS_CATEGORY
Definition Defines.php:79
const CONTENT_MODEL_JAVASCRIPT
Definition Defines.php:223
const NS_TEMPLATE_TALK
Definition Defines.php:76
if(!defined('MW_SETUP_CALLBACK'))
Definition WebStart.php:81
Assemble the segments of a chunked upload.
This class formats block log entries.
Job to add recent change entries mentioning category membership changes.
Job to purge a set of URLs from CDN.
Job to prune link tables for pages that were deleted.
This class formats delete log entries.
Fix any double redirects after moving a page.
Send an arbitrary single email.
Send an email notification.
Maintenance script that fixes double redirects.
Job to purge the HTML/file cache for all pages that link to or use another page or file.
This class formats import log entries.
Database-backed job queue storage.
Local repository that stores files in the local filesystem and registers them in the wiki's own datab...
Definition LocalRepo.php:48
Caching for the contents of localisation files.
Implements the default log formatting.
Check if the user is blocked, and prevent authentication if so.
Handles email notification / email address confirmation for account creation.
A primary authentication provider that uses the password field in the 'user' table.
This is a value object for authentication requests with a username and password.
Reset the local password, if signalled via $this->manager->setAuthenticationSessionData()
This represents the intention to set a temporary password for the user.
A primary authentication provider that uses the temporary password field in the 'user' table.
A pre-authentication provider to throttle authentication actions.
This class performs some operations related to tracking categories, such as adding a tracking categor...
Content handler for CSS pages.
Content handler implementation for unknown content.
Content handler for JSON text.
Base content handler implementation for flat text contents.
Content handler for wiki text pages.
Class for handling updates to the site_stats table.
Send information about this MediaWiki instance to mediawiki.org.
Definition Pingback.php:47
This class contains schema declarations for all configuration variables known to MediaWiki core.
static getDefaultLocalTZoffset( $localtimezone)
Site language code.
static getDefaultLogo( $resourceBasePath)
static getDefaultLoadScript( $scriptPath)
static getDefaultCookieSecure( $forceHTTPS)
Default cookie lifetime, in seconds.
static getDefaultUploadDirectory( $baseDirectory)
static getDefaultLocalFileRepo( $uploadDirectory, $scriptPath, $favicon, $uploadBaseUrl, $uploadPath, $hashedUploadDirectory, $thumbnailScriptPath, $generateThumbnailOnParse, $deletedDirectory, $updateCompatibleMetadata)
Allow users to upload files.
static getDefaultValue(string $name)
Returns the default value of the given config setting.
static getDefaultReadOnlyFile( $uploadDirectory)
static getDefaultUploadPath( $scriptPath)
static getDefaultMetaNamespace( $sitename)
static getDefaultExtensionAssetsPath( $resourceBasePath)
static getDefaultDeletedDirectory( $uploadDirectory)
static listDefaultValues(string $prefix='')
Returns a generator for iterating over all config settings and their default values.
static getDefaultScript( $scriptPath)
static getDefaultResourceBasePath( $scriptPath)
static getDefaultDBerrorLogTZ( $localtimezone)
Current wiki database name.
static getDefaultSharedPrefix( $dbPrefix)
static getDefaultSharedSchema( $dbMwschema)
static getDefaultLocalStylePath( $scriptPath)
static getDefaultStylePath( $resourceBasePath)
static getDefaultCookiePrefix( $sharedDB, $sharedPrefix, $sharedTables, $dbName, $dbPrefix)
Default cookie lifetime, in seconds.
static getDefaultFileCacheDirectory( $uploadDirectory)
static getDefaultArticlePath(string $script, $usePathInfo)
static getDefaultLocaltimezone()
Site language code.
static getDefaultRestPath( $scriptPath)
Implements Argon2, a modern key derivation algorithm designed to resist GPU cracking and side-channel...
A Bcrypt-hashed password.
This password hash type layers one or more parameterized password types on top of each other.
The old style of MediaWiki password hashing.
The old style of MediaWiki password hashing, with a salt.
Functions to check passwords against a policy requirement.
Users can authorize applications to use their account via OAuth.
Send recent change to a Redis Pub/Sub channel.
Send recent change notifications to a destination address over UDP.
Custom job to perform updates on tables in busier environments.
The WebRequest class encapsulates getting at data passed in the URL or via a POSTed form,...
Class representing a MediaWiki site.
Service for storing and loading Content objects representing revision data blobs.
This is a utility class for dealing with namespaces that encodes all the "magic" behaviors of them ba...
A CentralIdLookup provider that just uses local IDs.
Job for updating user activity like "last viewed" timestamps.
Job to clear a users watchlist in batches.
Job for clearing all of the "last viewed" timestamps for a user's watchlist, or setting them all to t...
This class formats merge log entries.
This class formats move log entries.
No-op job that does nothing.
Definition NullJob.php:50
This class formats patrol log entries.
Profiler base class that defines the interface and some shared functionality.
Definition Profiler.php:37
This class formats protect log entries.
Upload a file from the upload stash into the local file repo.
Purge expired rows from the recentchanges table.
Job to update link tables for rerendered wiki pages.
LogFormatter for renameuser/renameuser logs.
Job for deferring the execution of RevertedTagUpdate.
This class formats rights log entries.
RDBMS-based caching module.
This class formats tag log entries.
Job for asynchronous rendering of thumbnails, e.g.
Upload a file by URL, via the jobqueue.
This class formats upload log entries.
Job that initializes an user's edit count.
Job that purges expired user group memberships.
Job that updates a user's preferences.
Multi-datacenter aware caching interface.
No-op class for publishing messages into a PubSub system.
Store data in the local server memory via APCu (php-apcu)
No-op implementation that stores nothing.
Store data in a memory for the current request/process only.
Store data on memcached server(s) via the php-memcached PECL extension.
Store data on memcached servers(s) via a pure-PHP memcached client.
return[0=> 'ـ', 1=> ' ', 2=> '`', 3=> '´', 4=> '˜', 5=> '^', 6=> '¯', 7=> '‾', 8=> '˘', 9=> '˙', 10=> '¨', 11=> '˚', 12=> '˝', 13=> '᾽', 14=> '῝', 15=> '¸', 16=> '˛', 17=> '_', 18=> '‗', 19=> '῀', 20=> '﮲', 21=> '﮳', 22=> '﮴', 23=> '﮵', 24=> '﮶', 25=> '﮷', 26=> '﮸', 27=> '﮹', 28=> '﮺', 29=> '﮻', 30=> '﮼', 31=> '﮽', 32=> '﮾', 33=> '﮿', 34=> '﯀', 35=> '﯁', 36=> '゛', 37=> '゜', 38=> '-', 39=> '֊', 40=> '᐀', 41=> '᭠', 42=> '᠆', 43=> '᠇', 44=> '‐', 45=> '‒', 46=> '–', 47=> '—', 48=> '―', 49=> '⁓', 50=> '⸗', 51=> '゠', 52=> '・', 53=> ',', 54=> '՝', 55=> '،', 56=> '؍', 57=> '٫', 58=> '٬', 59=> '߸', 60=> '᠂', 61=> '᠈', 62=> '꓾', 63=> '꘍', 64=> '꛵', 65=> '︑', 66=> ';', 67=> '؛', 68=> '⁏', 69=> '꛶', 70=> ':', 71=> '։', 72=> '؞', 73=> '܃', 74=> '܄', 75=> '܅', 76=> '܆', 77=> '܇', 78=> '܈', 79=> '࠰', 80=> '࠱', 81=> '࠲', 82=> '࠳', 83=> '࠴', 84=> '࠵', 85=> '࠶', 86=> '࠷', 87=> '࠸', 88=> '࠹', 89=> '࠺', 90=> '࠻', 91=> '࠼', 92=> '࠽', 93=> '࠾', 94=> '፡', 95=> '፣', 96=> '፤', 97=> '፥', 98=> '፦', 99=> '᠄', 100=> '᠅', 101=> '༔', 102=> '៖', 103=> '᭝', 104=> '꧇', 105=> '᛫', 106=> '᛬', 107=> '᛭', 108=> '꛴', 109=> '!', 110=> '¡', 111=> '՜', 112=> '߹', 113=> '᥄', 114=> '?', 115=> '¿', 116=> '⸮', 117=> '՞', 118=> '؟', 119=> '܉', 120=> '፧', 121=> '᥅', 122=> '⳺', 123=> '⳻', 124=> '꘏', 125=> '꛷', 126=> '‽', 127=> '⸘', 128=> '.', 129=> '᠁', 130=> '۔', 131=> '܁', 132=> '܂', 133=> '።', 134=> '᠃', 135=> '᠉', 136=> '᙮', 137=> '᭜', 138=> '⳹', 139=> '⳾', 140=> '⸰', 141=> '꓿', 142=> '꘎', 143=> '꛳', 144=> '︒', 145=> '·', 146=> '⸱', 147=> '।', 148=> '॥', 149=> '꣎', 150=> '꣏', 151=> '᰻', 152=> '᰼', 153=> '꡶', 154=> '꡷', 155=> '᜵', 156=> '᜶', 157=> '꤯', 158=> '၊', 159=> '။', 160=> '។', 161=> '៕', 162=> '᪨', 163=> '᪩', 164=> '᪪', 165=> '᪫', 166=> '᭞', 167=> '᭟', 168=> '꧈', 169=> '꧉', 170=> '꩝', 171=> '꩞', 172=> '꩟', 173=> '꯫', 174=> '𐩖', 175=> '𐩗', 176=> '𑁇', 177=> '𑁈', 178=> '𑃀', 179=> '𑃁', 180=> '᱾', 181=> '᱿', 182=> '܀', 183=> '߷', 184=> '჻', 185=> '፠', 186=> '፨', 187=> '᨞', 188=> '᨟', 189=> '᭚', 190=> '᭛', 191=> '꧁', 192=> '꧂', 193=> '꧃', 194=> '꧄', 195=> '꧅', 196=> '꧆', 197=> '꧊', 198=> '꧋', 199=> '꧌', 200=> '꧍', 201=> '꛲', 202=> '꥟', 203=> '𐡗', 204=> '𐬺', 205=> '𐬻', 206=> '𐬼', 207=> '𐬽', 208=> '𐬾', 209=> '𐬿', 210=> '𑂾', 211=> '𑂿', 212=> '⁕', 213=> '⁖', 214=> '⁘', 215=> '⁙', 216=> '⁚', 217=> '⁛', 218=> '⁜', 219=> '⁝', 220=> '⁞', 221=> '⸪', 222=> '⸫', 223=> '⸬', 224=> '⸭', 225=> '⳼', 226=> '⳿', 227=> '⸙', 228=> '𐤿', 229=> '𐄀', 230=> '𐄁', 231=> '𐄂', 232=> '𐎟', 233=> '𐏐', 234=> '𐤟', 235=> '𒑰', 236=> '𒑱', 237=> '𒑲', 238=> '𒑳', 239=> '\'', 240=> '‘', 241=> '’', 242=> '‚', 243=> '‛', 244=> '‹', 245=> '›', 246=> '"', 247 => '“', 248 => '”', 249 => '„', 250 => '‟', 251 => '«', 252 => '»', 253 => '(', 254 => ')', 255 => '[', 256 => ']', 257 => '{', 258 => '}', 259 => '༺', 260 => '༻', 261 => '༼', 262 => '༽', 263 => '᚛', 264 => '᚜', 265 => '⁅', 266 => '⁆', 267 => '⧼', 268 => '⧽', 269 => '⦃', 270 => '⦄', 271 => '⦅', 272 => '⦆', 273 => '⦇', 274 => '⦈', 275 => '⦉', 276 => '⦊', 277 => '⦋', 278 => '⦌', 279 => '⦍', 280 => '⦎', 281 => '⦏', 282 => '⦐', 283 => '⦑', 284 => '⦒', 285 => '⦓', 286 => '⦔', 287 => '⦕', 288 => '⦖', 289 => '⦗', 290 => '⦘', 291 => '⟬', 292 => '⟭', 293 => '⟮', 294 => '⟯', 295 => '⸂', 296 => '⸃', 297 => '⸄', 298 => '⸅', 299 => '⸉', 300 => '⸊', 301 => '⸌', 302 => '⸍', 303 => '⸜', 304 => '⸝', 305 => '⸠', 306 => '⸡', 307 => '⸢', 308 => '⸣', 309 => '⸤', 310 => '⸥', 311 => '⸦', 312 => '⸧', 313 => '⸨', 314 => '⸩', 315 => '〈', 316 => '〉', 317 => '「', 318 => '」', 319 => '﹝', 320 => '﹞', 321 => '︗', 322 => '︘', 323 => '﴾', 324 => '﴿', 325 => '§', 326 => '¶', 327 => '⁋', 328 => '©', 329 => '®', 330 => '@', 331 => '*', 332 => '⁎', 333 => '⁑', 334 => '٭', 335 => '꙳', 336 => '/', 337 => '⁄', 338 => '\\', 339 => '&', 340 => '⅋', 341 => '⁊', 342 => '#', 343 => '%', 344 => '٪', 345 => '‰', 346 => '؉', 347 => '‱', 348 => '؊', 349 => '⁒', 350 => '†', 351 => '‡', 352 => '•', 353 => '‣', 354 => '‧', 355 => '⁃', 356 => '⁌', 357 => '⁍', 358 => '′', 359 => '‵', 360 => '‸', 361 => '※', 362 => '‿', 363 => '⁔', 364 => '⁀', 365 => '⁐', 366 => '⁁', 367 => '⁂', 368 => '⸀', 369 => '⸁', 370 => '⸆', 371 => '⸇', 372 => '⸈', 373 => '⸋', 374 => '⸎', 375 => '⸏', 376 => '⸐', 377 => '⸑', 378 => '⸒', 379 => '⸓', 380 => '⸔', 381 => '⸕', 382 => '⸖', 383 => '⸚', 384 => '⸛', 385 => '⸞', 386 => '⸟', 387 => '꙾', 388 => '՚', 389 => '՛', 390 => '՟', 391 => '־', 392 => '׀', 393 => '׃', 394 => '׆', 395 => '׳', 396 => '״', 397 => '܊', 398 => '܋', 399 => '܌', 400 => '܍', 401 => '࡞', 402 => '᠀', 403 => '॰', 404 => '꣸', 405 => '꣹', 406 => '꣺', 407 => '෴', 408 => '๚', 409 => '๛', 410 => '꫞', 411 => '꫟', 412 => '༄', 413 => '༅', 414 => '༆', 415 => '༇', 416 => '༈', 417 => '༉', 418 => '༊', 419 => '࿐', 420 => '࿑', 421 => '་', 422 => '།', 423 => '༎', 424 => '༏', 425 => '༐', 426 => '༑', 427 => '༒', 428 => '྅', 429 => '࿒', 430 => '࿓', 431 => '࿔', 432 => '࿙', 433 => '࿚', 434 => '᰽', 435 => '᰾', 436 => '᰿', 437 => '᥀', 438 => '၌', 439 => '၍', 440 => '၎', 441 => '၏', 442 => '႞', 443 => '႟', 444 => '꩷', 445 => '꩸', 446 => '꩹', 447 => 'ៗ', 448 => '៘', 449 => '៙', 450 => '៚', 451 => '᪠', 452 => '᪡', 453 => '᪢', 454 => '᪣', 455 => '᪤', 456 => '᪥', 457 => '᪦', 458 => '᪬', 459 => '᪭', 460 => '᙭', 461 => '⵰', 462 => '꡴', 463 => '꡵', 464 => '᯼', 465 => '᯽', 466 => '᯾', 467 => '᯿', 468 => '꤮', 469 => '꧞', 470 => '꧟', 471 => '꩜', 472 => '𑁉', 473 => '𑁊', 474 => '𑁋', 475 => '𑁌', 476 => '𑁍', 477 => '𐩐', 478 => '𐩑', 479 => '𐩒', 480 => '𐩓', 481 => '𐩔', 482 => '𐩕', 483 => '𐩘', 484 => '𐬹', 485 => '𑂻', 486 => '𑂼', 487 => 'ʹ', 488 => '͵', 489 => 'ʺ', 490 => '˂', 491 => '˃', 492 => '˄', 493 => '˅', 494 => 'ˆ', 495 => 'ˇ', 496 => 'ˈ', 497 => 'ˉ', 498 => 'ˊ', 499 => 'ˋ', 500 => 'ˌ', 501 => 'ˍ', 502 => 'ˎ', 503 => 'ˏ', 504 => '˒', 505 => '˓', 506 => '˔', 507 => '˕', 508 => '˖', 509 => '˗', 510 => '˞', 511 => '˟', 512 => '˥', 513 => '˦', 514 => '˧', 515 => '˨', 516 => '˩', 517 => '˪', 518 => '˫', 519 => 'ˬ', 520 => '˭', 521 => '˯', 522 => '˰', 523 => '˱', 524 => '˲', 525 => '˳', 526 => '˴', 527 => '˵', 528 => '˶', 529 => '˷', 530 => '˸', 531 => '˹', 532 => '˺', 533 => '˻', 534 => '˼', 535 => '˽', 536 => '˾', 537 => '˿', 538 => '᎐', 539 => '᎑', 540 => '᎒', 541 => '᎓', 542 => '᎔', 543 => '᎕', 544 => '᎖', 545 => '᎗', 546 => '᎘', 547 => '᎙', 548 => '꜀', 549 => '꜁', 550 => '꜂', 551 => '꜃', 552 => '꜄', 553 => '꜅', 554 => '꜆', 555 => '꜇', 556 => '꜈', 557 => '꜉', 558 => '꜊', 559 => '꜋', 560 => '꜌', 561 => '꜍', 562 => '꜎', 563 => '꜏', 564 => '꜐', 565 => '꜑', 566 => '꜒', 567 => '꜓', 568 => '꜔', 569 => '꜕', 570 => '꜖', 571 => 'ꜗ', 572 => 'ꜘ', 573 => 'ꜙ', 574 => 'ꜚ', 575 => 'ꜛ', 576 => 'ꜜ', 577 => 'ꜝ', 578 => 'ꜞ', 579 => 'ꜟ', 580 => '꜠', 581 => '꜡', 582 => 'ꞈ', 583 => '꞉', 584 => '꞊', 585 => '°', 586 => '҂', 587 => '؈', 588 => '؎', 589 => '؏', 590 => '۞', 591 => '۩', 592 => '﷽', 593 => '߶', 594 => '৺', 595 => '୰', 596 => '௳', 597 => '௴', 598 => '௵', 599 => '௶', 600 => '௷', 601 => '௸', 602 => '௺', 603 => '౿', 604 => '൹', 605 => '꠨', 606 => '꠩', 607 => '꠪', 608 => '꠫', 609 => '꠶', 610 => '꠷', 611 => '꠹', 612 => '๏', 613 => '༁', 614 => '༂', 615 => '༃', 616 => '༓', 617 => '༕', 618 => '༖', 619 => '༗', 620 => '༚', 621 => '༛', 622 => '༜', 623 => '༝', 624 => '༞', 625 => '༟', 626 => '༴', 627 => '༶', 628 => '༸', 629 => '྾', 630 => '྿', 631 => '࿀', 632 => '࿁', 633 => '࿂', 634 => '࿃', 635 => '࿄', 636 => '࿅', 637 => '࿇', 638 => '࿈', 639 => '࿉', 640 => '࿊', 641 => '࿋', 642 => '࿌', 643 => '࿎', 644 => '࿏', 645 => '࿕', 646 => '࿖', 647 => '࿗', 648 => '࿘', 649 => '᧠', 650 => '᧡', 651 => '᧢', 652 => '᧣', 653 => '᧤', 654 => '᧥', 655 => '᧦', 656 => '᧧', 657 => '᧨', 658 => '᧩', 659 => '᧪', 660 => '᧫', 661 => '᧬', 662 => '᧭', 663 => '᧮', 664 => '᧯', 665 => '᧰', 666 => '᧱', 667 => '᧲', 668 => '᧳', 669 => '᧴', 670 => '᧵', 671 => '᧶', 672 => '᧷', 673 => '᧸', 674 => '᧹', 675 => '᧺', 676 => '᧻', 677 => '᧼', 678 => '᧽', 679 => '᧾', 680 => '᧿', 681 => '᭡', 682 => '᭢', 683 => '᭣', 684 => '᭤', 685 => '᭥', 686 => '᭦', 687 => '᭧', 688 => '᭨', 689 => '᭩', 690 => '᭪', 691 => '᭴', 692 => '᭵', 693 => '᭶', 694 => '᭷', 695 => '᭸', 696 => '᭹', 697 => '᭺', 698 => '᭻', 699 => '᭼', 700 => '℄', 701 => '℈', 702 => '℔', 703 => '℗', 704 => '℘', 705 => '℞', 706 => '℟', 707 => '℣', 708 => '℥', 709 => '℧', 710 => '℩', 711 => '℮', 712 => '℺', 713 => '⅁', 714 => '⅂', 715 => '⅃', 716 => '⅄', 717 => '⅊', 718 => '⅌', 719 => '⅍', 720 => '⅏', 721 => '←', 722 => '→', 723 => '↑', 724 => '↓', 725 => '↔', 726 => '↕', 727 => '↖', 728 => '↗', 729 => '↘', 730 => '↙', 731 => '↜', 732 => '↝', 733 => '↞', 734 => '↟', 735 => '↠', 736 => '↡', 737 => '↢', 738 => '↣', 739 => '↤', 740 => '↥', 741 => '↦', 742 => '↧', 743 => '↨', 744 => '↩', 745 => '↪', 746 => '↫', 747 => '↬', 748 => '↭', 749 => '↯', 750 => '↰', 751 => '↱', 752 => '↲', 753 => '↳', 754 => '↴', 755 => '↵', 756 => '↶', 757 => '↷', 758 => '↸', 759 => '↹', 760 => '↺', 761 => '↻', 762 => '↼', 763 => '↽', 764 => '↾', 765 => '↿', 766 => '⇀', 767 => '⇁', 768 => '⇂', 769 => '⇃', 770 => '⇄', 771 => '⇅', 772 => '⇆', 773 => '⇇', 774 => '⇈', 775 => '⇉', 776 => '⇊', 777 => '⇋', 778 => '⇌', 779 => '⇐', 780 => '⇑', 781 => '⇒', 782 => '⇓', 783 => '⇔', 784 => '⇕', 785 => '⇖', 786 => '⇗', 787 => '⇘', 788 => '⇙', 789 => '⇚', 790 => '⇛', 791 => '⇜', 792 => '⇝', 793 => '⇞', 794 => '⇟', 795 => '⇠', 796 => '⇡', 797 => '⇢', 798 => '⇣', 799 => '⇤', 800 => '⇥', 801 => '⇦', 802 => '⇧', 803 => '⇨', 804 => '⇩', 805 => '⇪', 806 => '⇫', 807 => '⇬', 808 => '⇭', 809 => '⇮', 810 => '⇯', 811 => '⇰', 812 => '⇱', 813 => '⇲', 814 => '⇳', 815 => '⇴', 816 => '⇵', 817 => '⇶', 818 => '⇷', 819 => '⇸', 820 => '⇹', 821 => '⇺', 822 => '⇻', 823 => '⇼', 824 => '⇽', 825 => '⇾', 826 => '⇿', 827 => '∀', 828 => '∁', 829 => '∂', 830 => '∃', 831 => '∅', 832 => '∆', 833 => '∇', 834 => '∈', 835 => '∊', 836 => '∋', 837 => '∍', 838 => '϶', 839 => '∎', 840 => '∏', 841 => '∐', 842 => '∑', 843 => '+', 844 => '±', 845 => '÷', 846 => '×', 847 => '<', 848 => '=', 849 => '>', 850 => '¬', 851 => '|', 852 => '¦', 853 => '‖', 854 => '~', 855 => '−', 856 => '∓', 857 => '∔', 858 => '∕', 859 => '∖', 860 => '∗', 861 => '∘', 862 => '∙', 863 => '√', 864 => '∛', 865 => '؆', 866 => '∜', 867 => '؇', 868 => '∝', 869 => '∞', 870 => '∟', 871 => '∠', 872 => '∡', 873 => '∢', 874 => '∣', 875 => '∥', 876 => '∧', 877 => '∨', 878 => '∩', 879 => '∪', 880 => '∫', 881 => '∮', 882 => '∱', 883 => '∲', 884 => '∳', 885 => '∴', 886 => '∵', 887 => '∶', 888 => '∷', 889 => '∸', 890 => '∹', 891 => '∺', 892 => '∻', 893 => '∼', 894 => '∽', 895 => '∾', 896 => '∿', 897 => '≀', 898 => '≂', 899 => '≃', 900 => '≅', 901 => '≆', 902 => '≈', 903 => '≊', 904 => '≋', 905 => '≌', 906 => '≍', 907 => '≎', 908 => '≏', 909 => '≐', 910 => '≑', 911 => '≒', 912 => '≓', 913 => '≔', 914 => '≕', 915 => '≖', 916 => '≗', 917 => '≘', 918 => '≙', 919 => '≚', 920 => '≛', 921 => '≜', 922 => '≝', 923 => '≞', 924 => '≟', 925 => '≡', 926 => '≣', 927 => '≤', 928 => '≥', 929 => '≦', 930 => '≧', 931 => '≨', 932 => '≩', 933 => '≪', 934 => '≫', 935 => '≬', 936 => '≲', 937 => '≳', 938 => '≶', 939 => '≷', 940 => '≺', 941 => '≻', 942 => '≼', 943 => '≽', 944 => '≾', 945 => '≿', 946 => '⊂', 947 => '⊃', 948 => '⊆', 949 => '⊇', 950 => '⊊', 951 => '⊋', 952 => '⊌', 953 => '⊍', 954 => '⊎', 955 => '⊏', 956 => '⊐', 957 => '⊑', 958 => '⊒', 959 => '⊓', 960 => '⊔', 961 => '⊕', 962 => '⊖', 963 => '⊗', 964 => '⊘', 965 => '⊙', 966 => '⊚', 967 => '⊛', 968 => '⊜', 969 => '⊝', 970 => '⊞', 971 => '⊟', 972 => '⊠', 973 => '⊡', 974 => '⊢', 975 => '⊣', 976 => '⊤', 977 => '⊥', 978 => '⊦', 979 => '⊧', 980 => '⊨', 981 => '⊩', 982 => '⊪', 983 => '⊫', 984 => '⊰', 985 => '⊱', 986 => '⊲', 987 => '⊳', 988 => '⊴', 989 => '⊵', 990 => '⊶', 991 => '⊷', 992 => '⊸', 993 => '⊹', 994 => '⊺', 995 => '⊻', 996 => '⊼', 997 => '⊽', 998 => '⊾', 999 => '⊿', 1000 => '⋀', 1001 => '⋁', 1002 => '⋂', 1003 => '⋃', 1004 => '⋄', 1005 => '⋅', 1006 => '⋆', 1007 => '⋇', 1008 => '⋈', 1009 => '⋉', 1010 => '⋊', 1011 => '⋋', 1012 => '⋌', 1013 => '⋍', 1014 => '⋎', 1015 => '⋏', 1016 => '⋐', 1017 => '⋑', 1018 => '⋒', 1019 => '⋓', 1020 => '⋔', 1021 => '⋕', 1022 => '⋖', 1023 => '⋗', 1024 => '⋘', 1025 => '⋙', 1026 => '⋚', 1027 => '⋛', 1028 => '⋜', 1029 => '⋝', 1030 => '⋞', 1031 => '⋟', 1032 => '⋤', 1033 => '⋥', 1034 => '⋦', 1035 => '⋧', 1036 => '⋨', 1037 => '⋩', 1038 => '⋮', 1039 => '⋯', 1040 => '⋰', 1041 => '⋱', 1042 => '⋲', 1043 => '⋳', 1044 => '⋴', 1045 => '⋵', 1046 => '⋶', 1047 => '⋷', 1048 => '⋸', 1049 => '⋹', 1050 => '⋺', 1051 => '⋻', 1052 => '⋼', 1053 => '⋽', 1054 => '⋾', 1055 => '⋿', 1056 => '⌀', 1057 => '⌁', 1058 => '⌂', 1059 => '⌃', 1060 => '⌄', 1061 => '⌅', 1062 => '⌆', 1063 => '⌇', 1064 => '⌈', 1065 => '⌉', 1066 => '⌊', 1067 => '⌋', 1068 => '⌌', 1069 => '⌍', 1070 => '⌎', 1071 => '⌏', 1072 => '⌐', 1073 => '⌑', 1074 => '⌒', 1075 => '⌓', 1076 => '⌔', 1077 => '⌕', 1078 => '⌖', 1079 => '⌗', 1080 => '⌘', 1081 => '⌙', 1082 => '⌚', 1083 => '⌛', 1084 => '⌜', 1085 => '⌝', 1086 => '⌞', 1087 => '⌟', 1088 => '⌠', 1089 => '⌡', 1090 => '⌢', 1091 => '⌣', 1092 => '⌤', 1093 => '⌥', 1094 => '⌦', 1095 => '⌧', 1096 => '⌨', 1097 => '⌫', 1098 => '⌬', 1099 => '⌭', 1100 => '⌮', 1101 => '⌯', 1102 => '⌰', 1103 => '⌱', 1104 => '⌲', 1105 => '⌳', 1106 => '⌴', 1107 => '⌵', 1108 => '⌶', 1109 => '⌷', 1110 => '⌸', 1111 => '⌹', 1112 => '⌺', 1113 => '⌻', 1114 => '⌼', 1115 => '⌽', 1116 => '⌾', 1117 => '⌿', 1118 => '⍀', 1119 => '⍁', 1120 => '⍂', 1121 => '⍃', 1122 => '⍄', 1123 => '⍅', 1124 => '⍆', 1125 => '⍇', 1126 => '⍈', 1127 => '⍉', 1128 => '⍊', 1129 => '⍋', 1130 => '⍌', 1131 => '⍍', 1132 => '⍎', 1133 => '⍏', 1134 => '⍐', 1135 => '⍑', 1136 => '⍒', 1137 => '⍓', 1138 => '⍔', 1139 => '⍕', 1140 => '⍖', 1141 => '⍗', 1142 => '⍘', 1143 => '⍙', 1144 => '⍚', 1145 => '⍛', 1146 => '⍜', 1147 => '⍝', 1148 => '⍞', 1149 => '⍟', 1150 => '⍠', 1151 => '⍡', 1152 => '⍢', 1153 => '⍣', 1154 => '⍤', 1155 => '⍥', 1156 => '⍦', 1157 => '⍧', 1158 => '⍨', 1159 => '⍩', 1160 => '⍪', 1161 => '⍫', 1162 => '⍬', 1163 => '⍭', 1164 => '⍮', 1165 => '⍯', 1166 => '⍰', 1167 => '⍱', 1168 => '⍲', 1169 => '⍳', 1170 => '⍴', 1171 => '⍵', 1172 => '⍶', 1173 => '⍷', 1174 => '⍸', 1175 => '⍹', 1176 => '⍺', 1177 => '⍻', 1178 => '⍼', 1179 => '⍽', 1180 => '⍾', 1181 => '⍿', 1182 => '⎀', 1183 => '⎁', 1184 => '⎂', 1185 => '⎃', 1186 => '⎄', 1187 => '⎅', 1188 => '⎆', 1189 => '⎇', 1190 => '⎈', 1191 => '⎉', 1192 => '⎊', 1193 => '⎋', 1194 => '⎌', 1195 => '⎍', 1196 => '⎎', 1197 => '⎏', 1198 => '⎐', 1199 => '⎑', 1200 => '⎒', 1201 => '⎓', 1202 => '⎔', 1203 => '⎕', 1204 => '⎖', 1205 => '⎗', 1206 => '⎘', 1207 => '⎙', 1208 => '⎚', 1209 => '⎛', 1210 => '⎜', 1211 => '⎝', 1212 => '⎞', 1213 => '⎟', 1214 => '⎠', 1215 => '⎡', 1216 => '⎢', 1217 => '⎣', 1218 => '⎤', 1219 => '⎥', 1220 => '⎦', 1221 => '⎧', 1222 => '⎨', 1223 => '⎩', 1224 => '⎪', 1225 => '⎫', 1226 => '⎬', 1227 => '⎭', 1228 => '⎮', 1229 => '⎯', 1230 => '⎰', 1231 => '⎱', 1232 => '⎲', 1233 => '⎳', 1234 => '⎴', 1235 => '⎵', 1236 => '⎶', 1237 => '⎷', 1238 => '⎸', 1239 => '⎹', 1240 => '⎺', 1241 => '⎻', 1242 => '⎼', 1243 => '⎽', 1244 => '⎾', 1245 => '⎿', 1246 => '⏀', 1247 => '⏁', 1248 => '⏂', 1249 => '⏃', 1250 => '⏄', 1251 => '⏅', 1252 => '⏆', 1253 => '⏇', 1254 => '⏈', 1255 => '⏉', 1256 => '⏊', 1257 => '⏋', 1258 => '⏌', 1259 => '⏍', 1260 => '⏎', 1261 => '⏏', 1262 => '⏐', 1263 => '⏑', 1264 => '⏒', 1265 => '⏓', 1266 => '⏔', 1267 => '⏕', 1268 => '⏖', 1269 => '⏗', 1270 => '⏘', 1271 => '⏙', 1272 => '⏚', 1273 => '⏛', 1274 => '⏜', 1275 => '⏝', 1276 => '⏞', 1277 => '⏟', 1278 => '⏠', 1279 => '⏡', 1280 => '⏢', 1281 => '⏣', 1282 => '⏤', 1283 => '⏥', 1284 => '⏦', 1285 => '⏧', 1286 => '⏨', 1287 => '⏩', 1288 => '⏪', 1289 => '⏫', 1290 => '⏬', 1291 => '⏭', 1292 => '⏮', 1293 => '⏯', 1294 => '⏰', 1295 => '⏱', 1296 => '⏲', 1297 => '⏳', 1298 => '␀', 1299 => '␁', 1300 => '␂', 1301 => '␃', 1302 => '␄', 1303 => '␅', 1304 => '␆', 1305 => '␇', 1306 => '␈', 1307 => '␉', 1308 => '␊', 1309 => '␋', 1310 => '␌', 1311 => '␍', 1312 => '␎', 1313 => '␏', 1314 => '␐', 1315 => '␑', 1316 => '␒', 1317 => '␓', 1318 => '␔', 1319 => '␕', 1320 => '␖', 1321 => '␗', 1322 => '␘', 1323 => '␙', 1324 => '␚', 1325 => '␛', 1326 => '␜', 1327 => '␝', 1328 => '␞', 1329 => '␟', 1330 => '␠', 1331 => '␡', 1332 => '␢', 1333 => '␣', 1334 => '␤', 1335 => '␥', 1336 => '␦', 1337 => '⑀', 1338 => '⑁', 1339 => '⑂', 1340 => '⑃', 1341 => '⑄', 1342 => '⑅', 1343 => '⑆', 1344 => '⑇', 1345 => '⑈', 1346 => '⑉', 1347 => '⑊', 1348 => '─', 1349 => '━', 1350 => '│', 1351 => '┃', 1352 => '┄', 1353 => '┅', 1354 => '┆', 1355 => '┇', 1356 => '┈', 1357 => '┉', 1358 => '┊', 1359 => '┋', 1360 => '┌', 1361 => '┍', 1362 => '┎', 1363 => '┏', 1364 => '┐', 1365 => '┑', 1366 => '┒', 1367 => '┓', 1368 => '└', 1369 => '┕', 1370 => '┖', 1371 => '┗', 1372 => '┘', 1373 => '┙', 1374 => '┚', 1375 => '┛', 1376 => '├', 1377 => '┝', 1378 => '┞', 1379 => '┟', 1380 => '┠', 1381 => '┡', 1382 => '┢', 1383 => '┣', 1384 => '┤', 1385 => '┥', 1386 => '┦', 1387 => '┧', 1388 => '┨', 1389 => '┩', 1390 => '┪', 1391 => '┫', 1392 => '┬', 1393 => '┭', 1394 => '┮', 1395 => '┯', 1396 => '┰', 1397 => '┱', 1398 => '┲', 1399 => '┳', 1400 => '┴', 1401 => '┵', 1402 => '┶', 1403 => '┷', 1404 => '┸', 1405 => '┹', 1406 => '┺', 1407 => '┻', 1408 => '┼', 1409 => '┽', 1410 => '┾', 1411 => '┿', 1412 => '╀', 1413 => '╁', 1414 => '╂', 1415 => '╃', 1416 => '╄', 1417 => '╅', 1418 => '╆', 1419 => '╇', 1420 => '╈', 1421 => '╉', 1422 => '╊', 1423 => '╋', 1424 => '╌', 1425 => '╍', 1426 => '╎', 1427 => '╏', 1428 => '═', 1429 => '║', 1430 => '╒', 1431 => '╓', 1432 => '╔', 1433 => '╕', 1434 => '╖', 1435 => '╗', 1436 => '╘', 1437 => '╙', 1438 => '╚', 1439 => '╛', 1440 => '╜', 1441 => '╝', 1442 => '╞', 1443 => '╟', 1444 => '╠', 1445 => '╡', 1446 => '╢', 1447 => '╣', 1448 => '╤', 1449 => '╥', 1450 => '╦', 1451 => '╧', 1452 => '╨', 1453 => '╩', 1454 => '╪', 1455 => '╫', 1456 => '╬', 1457 => '╭', 1458 => '╮', 1459 => '╯', 1460 => '╰', 1461 => '╱', 1462 => '╲', 1463 => '╳', 1464 => '╴', 1465 => '╵', 1466 => '╶', 1467 => '╷', 1468 => '╸', 1469 => '╹', 1470 => '╺', 1471 => '╻', 1472 => '╼', 1473 => '╽', 1474 => '╾', 1475 => '╿', 1476 => '▀', 1477 => '▁', 1478 => '▂', 1479 => '▃', 1480 => '▄', 1481 => '▅', 1482 => '▆', 1483 => '▇', 1484 => '█', 1485 => '▉', 1486 => '▊', 1487 => '▋', 1488 => '▌', 1489 => '▍', 1490 => '▎', 1491 => '▏', 1492 => '▐', 1493 => '░', 1494 => '▒', 1495 => '▓', 1496 => '▔', 1497 => '▕', 1498 => '▖', 1499 => '▗', 1500 => '▘', 1501 => '▙', 1502 => '▚', 1503 => '▛', 1504 => '▜', 1505 => '▝', 1506 => '▞', 1507 => '▟', 1508 => '■', 1509 => '□', 1510 => '▢', 1511 => '▣', 1512 => '▤', 1513 => '▥', 1514 => '▦', 1515 => '▧', 1516 => '▨', 1517 => '▩', 1518 => '▪', 1519 => '▫', 1520 => '▬', 1521 => '▭', 1522 => '▮', 1523 => '▯', 1524 => '▰', 1525 => '▱', 1526 => '▲', 1527 => '△', 1528 => '▴', 1529 => '▵', 1530 => '▶', 1531 => '▷', 1532 => '▸', 1533 => '▹', 1534 => '►', 1535 => '▻', 1536 => '▼', 1537 => '▽', 1538 => '▾', 1539 => '▿', 1540 => '◀', 1541 => '◁', 1542 => '◂', 1543 => '◃', 1544 => '◄', 1545 => '◅', 1546 => '◆', 1547 => '◇', 1548 => '◈', 1549 => '◉', 1550 => '◊', 1551 => '○', 1552 => '◌', 1553 => '◍', 1554 => '◎', 1555 => '●', 1556 => '◐', 1557 => '◑', 1558 => '◒', 1559 => '◓', 1560 => '◔', 1561 => '◕', 1562 => '◖', 1563 => '◗', 1564 => '◘', 1565 => '◙', 1566 => '◚', 1567 => '◛', 1568 => '◜', 1569 => '◝', 1570 => '◞', 1571 => '◟', 1572 => '◠', 1573 => '◡', 1574 => '◢', 1575 => '◣', 1576 => '◤', 1577 => '◥', 1578 => '◦', 1579 => '◧', 1580 => '◨', 1581 => '◩', 1582 => '◪', 1583 => '◫', 1584 => '◬', 1585 => '◭', 1586 => '◮', 1587 => '◯', 1588 => '◰', 1589 => '◱', 1590 => '◲', 1591 => '◳', 1592 => '◴', 1593 => '◵', 1594 => '◶', 1595 => '◷', 1596 => '◸', 1597 => '◹', 1598 => '◺', 1599 => '◻', 1600 => '◼', 1601 => '◽', 1602 => '◾', 1603 => '◿', 1604 => '☀', 1605 => '☁', 1606 => '☂', 1607 => '☃', 1608 => '☄', 1609 => '★', 1610 => '☆', 1611 => '☇', 1612 => '☈', 1613 => '☉', 1614 => '☊', 1615 => '☋', 1616 => '☌', 1617 => '☍', 1618 => '☎', 1619 => '☏', 1620 => '☐', 1621 => '☑', 1622 => '☒', 1623 => '☓', 1624 => '☔', 1625 => '☕', 1626 => '☖', 1627 => '☗', 1628 => '☘', 1629 => '☙', 1630 => '☚', 1631 => '☛', 1632 => '☜', 1633 => '☝', 1634 => '☞', 1635 => '☟', 1636 => '☠', 1637 => '☡', 1638 => '☢', 1639 => '☣', 1640 => '☤', 1641 => '☥', 1642 => '☦', 1643 => '☧', 1644 => '☨', 1645 => '☩', 1646 => '☪', 1647 => '☫', 1648 => '☬', 1649 => '☭', 1650 => '☮', 1651 => '☯', 1652 => '☸', 1653 => '☹', 1654 => '☺', 1655 => '☻', 1656 => '☼', 1657 => '☽', 1658 => '☾', 1659 => '☿', 1660 => '♀', 1661 => '♁', 1662 => '♂', 1663 => '♃', 1664 => '♄', 1665 => '♅', 1666 => '♆', 1667 => '♇', 1668 => '♈', 1669 => '♉', 1670 => '♊', 1671 => '♋', 1672 => '♌', 1673 => '♍', 1674 => '♎', 1675 => '♏', 1676 => '♐', 1677 => '♑', 1678 => '♒', 1679 => '♓', 1680 => '♔', 1681 => '♕', 1682 => '♖', 1683 => '♗', 1684 => '♘', 1685 => '♙', 1686 => '♚', 1687 => '♛', 1688 => '♜', 1689 => '♝', 1690 => '♞', 1691 => '♟', 1692 => '♠', 1693 => '♡', 1694 => '♢', 1695 => '♣', 1696 => '♤', 1697 => '♥', 1698 => '♦', 1699 => '♧', 1700 => '♨', 1701 => '♩', 1702 => '♪', 1703 => '♫', 1704 => '♬', 1705 => '♰', 1706 => '♱', 1707 => '♲', 1708 => '♳', 1709 => '♴', 1710 => '♵', 1711 => '♶', 1712 => '♷', 1713 => '♸', 1714 => '♹', 1715 => '♺', 1716 => '♻', 1717 => '♼', 1718 => '♽', 1719 => '♾', 1720 => '♿', 1721 => '⚀', 1722 => '⚁', 1723 => '⚂', 1724 => '⚃', 1725 => '⚄', 1726 => '⚅', 1727 => '⚆', 1728 => '⚇', 1729 => '⚈', 1730 => '⚉', 1731 => '⚐', 1732 => '⚑', 1733 => '⚒', 1734 => '⚓', 1735 => '⚔', 1736 => '⚕', 1737 => '⚖', 1738 => '⚗', 1739 => '⚘', 1740 => '⚙', 1741 => '⚚', 1742 => '⚛', 1743 => '⚜', 1744 => '⚝', 1745 => '⚞', 1746 => '⚟', 1747 => '⚠', 1748 => '⚡', 1749 => '⚢', 1750 => '⚣', 1751 => '⚤', 1752 => '⚥', 1753 => '⚦', 1754 => '⚧', 1755 => '⚨', 1756 => '⚩', 1757 => '⚪', 1758 => '⚫', 1759 => '⚬', 1760 => '⚭', 1761 => '⚮', 1762 => '⚯', 1763 => '⚰', 1764 => '⚱', 1765 => '⚲', 1766 => '⚳', 1767 => '⚴', 1768 => '⚵', 1769 => '⚶', 1770 => '⚷', 1771 => '⚸', 1772 => '⚹', 1773 => '⚺', 1774 => '⚻', 1775 => '⚼', 1776 => '⚽', 1777 => '⚾', 1778 => '⚿', 1779 => '⛀', 1780 => '⛁', 1781 => '⛂', 1782 => '⛃', 1783 => '⛄', 1784 => '⛅', 1785 => '⛆', 1786 => '⛇', 1787 => '⛈', 1788 => '⛉', 1789 => '⛊', 1790 => '⛋', 1791 => '⛌', 1792 => '⛍', 1793 => '⛎', 1794 => '⛏', 1795 => '⛐', 1796 => '⛑', 1797 => '⛒', 1798 => '⛓', 1799 => '⛔', 1800 => '⛕', 1801 => '⛖', 1802 => '⛗', 1803 => '⛘', 1804 => '⛙', 1805 => '⛚', 1806 => '⛛', 1807 => '⛜', 1808 => '⛝', 1809 => '⛞', 1810 => '⛟', 1811 => '⛠', 1812 => '⛡', 1813 => '⛢', 1814 => '⛣', 1815 => '⛤', 1816 => '⛥', 1817 => '⛦', 1818 => '⛧', 1819 => '⛨', 1820 => '⛩', 1821 => '⛪', 1822 => '⛫', 1823 => '⛬', 1824 => '⛭', 1825 => '⛮', 1826 => '⛯', 1827 => '⛰', 1828 => '⛱', 1829 => '⛲', 1830 => '⛳', 1831 => '⛴', 1832 => '⛵', 1833 => '⛶', 1834 => '⛷', 1835 => '⛸', 1836 => '⛹', 1837 => '⛺', 1838 => '⛻', 1839 => '⛼', 1840 => '⛽', 1841 => '⛾', 1842 => '⛿', 1843 => '✁', 1844 => '✂', 1845 => '✃', 1846 => '✄', 1847 => '✅', 1848 => '✆', 1849 => '✇', 1850 => '✈', 1851 => '✉', 1852 => '✊', 1853 => '✋', 1854 => '✌', 1855 => '✍', 1856 => '✎', 1857 => '✏', 1858 => '✐', 1859 => '✑', 1860 => '✒', 1861 => '✓', 1862 => '✔', 1863 => '✕', 1864 => '✖', 1865 => '✗', 1866 => '✘', 1867 => '✙', 1868 => '✚', 1869 => '✛', 1870 => '✜', 1871 => '✝', 1872 => '✞', 1873 => '✟', 1874 => '✠', 1875 => '✡', 1876 => '✢', 1877 => '✣', 1878 => '✤', 1879 => '✥', 1880 => '✦', 1881 => '✧', 1882 => '✨', 1883 => '✩', 1884 => '✪', 1885 => '✫', 1886 => '✬', 1887 => '✭', 1888 => '✮', 1889 => '✯', 1890 => '✰', 1891 => '✱', 1892 => '✲', 1893 => '✳', 1894 => '✴', 1895 => '✵', 1896 => '✶', 1897 => '✷', 1898 => '✸', 1899 => '✹', 1900 => '✺', 1901 => '✻', 1902 => '✼', 1903 => '✽', 1904 => '✾', 1905 => '✿', 1906 => '❀', 1907 => '❁', 1908 => '❂', 1909 => '❃', 1910 => '❄', 1911 => '❅', 1912 => '❆', 1913 => '❇', 1914 => '❈', 1915 => '❉', 1916 => '❊', 1917 => '❋', 1918 => '❌', 1919 => '❍', 1920 => '❎', 1921 => '❏', 1922 => '❐', 1923 => '❑', 1924 => '❒', 1925 => '❓', 1926 => '❔', 1927 => '❕', 1928 => '❖', 1929 => '❗', 1930 => '❘', 1931 => '❙', 1932 => '❚', 1933 => '❛', 1934 => '❜', 1935 => '❝', 1936 => '❞', 1937 => '❟', 1938 => '❠', 1939 => '❡', 1940 => '❢', 1941 => '❣', 1942 => '❤', 1943 => '❥', 1944 => '❦', 1945 => '❧', 1946 => '❨', 1947 => '❩', 1948 => '❪', 1949 => '❫', 1950 => '❬', 1951 => '❭', 1952 => '❮', 1953 => '❯', 1954 => '❰', 1955 => '❱', 1956 => '❲', 1957 => '❳', 1958 => '❴', 1959 => '❵', 1960 => '➔', 1961 => '➕', 1962 => '➖', 1963 => '➗', 1964 => '➘', 1965 => '➙', 1966 => '➚', 1967 => '➛', 1968 => '➜', 1969 => '➝', 1970 => '➞', 1971 => '➟', 1972 => '➠', 1973 => '➡', 1974 => '➢', 1975 => '➣', 1976 => '➤', 1977 => '➥', 1978 => '➦', 1979 => '➧', 1980 => '➨', 1981 => '➩', 1982 => '➪', 1983 => '➫', 1984 => '➬', 1985 => '➭', 1986 => '➮', 1987 => '➯', 1988 => '➰', 1989 => '➱', 1990 => '➲', 1991 => '➳', 1992 => '➴', 1993 => '➵', 1994 => '➶', 1995 => '➷', 1996 => '➸', 1997 => '➹', 1998 => '➺', 1999 => '➻', 2000 => '➼', 2001 => '➽', 2002 => '➾', 2003 => '➿', 2004 => '⟀', 2005 => '⟁', 2006 => '⟂', 2007 => '⟃', 2008 => '⟄', 2009 => '⟅', 2010 => '⟆', 2011 => '⟇', 2012 => '⟈', 2013 => '⟉', 2014 => '⟊', 2015 => '⟌', 2016 => '⟎', 2017 => '⟏', 2018 => '⟐', 2019 => '⟑', 2020 => '⟒', 2021 => '⟓', 2022 => '⟔', 2023 => '⟕', 2024 => '⟖', 2025 => '⟗', 2026 => '⟘', 2027 => '⟙', 2028 => '⟚', 2029 => '⟛', 2030 => '⟜', 2031 => '⟝', 2032 => '⟞', 2033 => '⟟', 2034 => '⟠', 2035 => '⟡', 2036 => '⟢', 2037 => '⟣', 2038 => '⟤', 2039 => '⟥', 2040 => '⟦', 2041 => '⟧', 2042 => '⟨', 2043 => '⟩', 2044 => '⟪', 2045 => '⟫', 2046 => '⟰', 2047 => '⟱', 2048 => '⟲', 2049 => '⟳', 2050 => '⟴', 2051 => '⟵', 2052 => '⟶', 2053 => '⟷', 2054 => '⟸', 2055 => '⟹', 2056 => '⟺', 2057 => '⟻', 2058 => '⟼', 2059 => '⟽', 2060 => '⟾', 2061 => '⟿', 2062 => '⤀', 2063 => '⤁', 2064 => '⤂', 2065 => '⤃', 2066 => '⤄', 2067 => '⤅', 2068 => '⤆', 2069 => '⤇', 2070 => '⤈', 2071 => '⤉', 2072 => '⤊', 2073 => '⤋', 2074 => '⤌', 2075 => '⤍', 2076 => '⤎', 2077 => '⤏', 2078 => '⤐', 2079 => '⤑', 2080 => '⤒', 2081 => '⤓', 2082 => '⤔', 2083 => '⤕', 2084 => '⤖', 2085 => '⤗', 2086 => '⤘', 2087 => '⤙', 2088 => '⤚', 2089 => '⤛', 2090 => '⤜', 2091 => '⤝', 2092 => '⤞', 2093 => '⤟', 2094 => '⤠', 2095 => '⤡', 2096 => '⤢', 2097 => '⤣', 2098 => '⤤', 2099 => '⤥', 2100 => '⤦', 2101 => '⤧', 2102 => '⤨', 2103 => '⤩', 2104 => '⤪', 2105 => '⤫', 2106 => '⤬', 2107 => '⤭', 2108 => '⤮', 2109 => '⤯', 2110 => '⤰', 2111 => '⤱', 2112 => '⤲', 2113 => '⤳', 2114 => '⤴', 2115 => '⤵', 2116 => '⤶', 2117 => '⤷', 2118 => '⤸', 2119 => '⤹', 2120 => '⤺', 2121 => '⤻', 2122 => '⤼', 2123 => '⤽', 2124 => '⤾', 2125 => '⤿', 2126 => '⥀', 2127 => '⥁', 2128 => '⥂', 2129 => '⥃', 2130 => '⥄', 2131 => '⥅', 2132 => '⥆', 2133 => '⥇', 2134 => '⥈', 2135 => '⥉', 2136 => '⥊', 2137 => '⥋', 2138 => '⥌', 2139 => '⥍', 2140 => '⥎', 2141 => '⥏', 2142 => '⥐', 2143 => '⥑', 2144 => '⥒', 2145 => '⥓', 2146 => '⥔', 2147 => '⥕', 2148 => '⥖', 2149 => '⥗', 2150 => '⥘', 2151 => '⥙', 2152 => '⥚', 2153 => '⥛', 2154 => '⥜', 2155 => '⥝', 2156 => '⥞', 2157 => '⥟', 2158 => '⥠', 2159 => '⥡', 2160 => '⥢', 2161 => '⥣', 2162 => '⥤', 2163 => '⥥', 2164 => '⥦', 2165 => '⥧', 2166 => '⥨', 2167 => '⥩', 2168 => '⥪', 2169 => '⥫', 2170 => '⥬', 2171 => '⥭', 2172 => '⥮', 2173 => '⥯', 2174 => '⥰', 2175 => '⥱', 2176 => '⥲', 2177 => '⥳', 2178 => '⥴', 2179 => '⥵', 2180 => '⥶', 2181 => '⥷', 2182 => '⥸', 2183 => '⥹', 2184 => '⥺', 2185 => '⥻', 2186 => '⥼', 2187 => '⥽', 2188 => '⥾', 2189 => '⥿', 2190 => '⦀', 2191 => '⦁', 2192 => '⦂', 2193 => '⦙', 2194 => '⦚', 2195 => '⦛', 2196 => '⦜', 2197 => '⦝', 2198 => '⦞', 2199 => '⦟', 2200 => '⦠', 2201 => '⦡', 2202 => '⦢', 2203 => '⦣', 2204 => '⦤', 2205 => '⦥', 2206 => '⦦', 2207 => '⦧', 2208 => '⦨', 2209 => '⦩', 2210 => '⦪', 2211 => '⦫', 2212 => '⦬', 2213 => '⦭', 2214 => '⦮', 2215 => '⦯', 2216 => '⦰', 2217 => '⦱', 2218 => '⦲', 2219 => '⦳', 2220 => '⦴', 2221 => '⦵', 2222 => '⦶', 2223 => '⦷', 2224 => '⦸', 2225 => '⦹', 2226 => '⦺', 2227 => '⦻', 2228 => '⦼', 2229 => '⦽', 2230 => '⦾', 2231 => '⦿', 2232 => '⧀', 2233 => '⧁', 2234 => '⧂', 2235 => '⧃', 2236 => '⧄', 2237 => '⧅', 2238 => '⧆', 2239 => '⧇', 2240 => '⧈', 2241 => '⧉', 2242 => '⧊', 2243 => '⧋', 2244 => '⧌', 2245 => '⧍', 2246 => '⧎', 2247 => '⧏', 2248 => '⧐', 2249 => '⧑', 2250 => '⧒', 2251 => '⧓', 2252 => '⧔', 2253 => '⧕', 2254 => '⧖', 2255 => '⧗', 2256 => '⧘', 2257 => '⧙', 2258 => '⧚', 2259 => '⧛', 2260 => '⧜', 2261 => '⧝', 2262 => '⧞', 2263 => '⧟', 2264 => '⧠', 2265 => '⧡', 2266 => '⧢', 2267 => '⧣', 2268 => '⧤', 2269 => '⧥', 2270 => '⧦', 2271 => '⧧', 2272 => '⧨', 2273 => '⧩', 2274 => '⧪', 2275 => '⧫', 2276 => '⧬', 2277 => '⧭', 2278 => '⧮', 2279 => '⧯', 2280 => '⧰', 2281 => '⧱', 2282 => '⧲', 2283 => '⧳', 2284 => '⧴', 2285 => '⧵', 2286 => '⧶', 2287 => '⧷', 2288 => '⧸', 2289 => '⧹', 2290 => '⧺', 2291 => '⧻', 2292 => '⧾', 2293 => '⧿', 2294 => '⨀', 2295 => '⨁', 2296 => '⨂', 2297 => '⨃', 2298 => '⨄', 2299 => '⨅', 2300 => '⨆', 2301 => '⨇', 2302 => '⨈', 2303 => '⨉', 2304 => '⨊', 2305 => '⨋', 2306 => '⨍', 2307 => '⨎', 2308 => '⨏', 2309 => '⨐', 2310 => '⨑', 2311 => '⨒', 2312 => '⨓', 2313 => '⨔', 2314 => '⨕', 2315 => '⨖', 2316 => '⨗', 2317 => '⨘', 2318 => '⨙', 2319 => '⨚', 2320 => '⨛', 2321 => '⨜', 2322 => '⨝', 2323 => '⨞', 2324 => '⨟', 2325 => '⨠', 2326 => '⨡', 2327 => '⨢', 2328 => '⨣', 2329 => '⨤', 2330 => '⨥', 2331 => '⨦', 2332 => '⨧', 2333 => '⨨', 2334 => '⨩', 2335 => '⨪', 2336 => '⨫', 2337 => '⨬', 2338 => '⨭', 2339 => '⨮', 2340 => '⨯', 2341 => '⨰', 2342 => '⨱', 2343 => '⨲', 2344 => '⨳', 2345 => '⨴', 2346 => '⨵', 2347 => '⨶', 2348 => '⨷', 2349 => '⨸', 2350 => '⨹', 2351 => '⨺', 2352 => '⨻', 2353 => '⨼', 2354 => '⨽', 2355 => '⨾', 2356 => '⨿', 2357 => '⩀', 2358 => '⩁', 2359 => '⩂', 2360 => '⩃', 2361 => '⩄', 2362 => '⩅', 2363 => '⩆', 2364 => '⩇', 2365 => '⩈', 2366 => '⩉', 2367 => '⩊', 2368 => '⩋', 2369 => '⩌', 2370 => '⩍', 2371 => '⩎', 2372 => '⩏', 2373 => '⩐', 2374 => '⩑', 2375 => '⩒', 2376 => '⩓', 2377 => '⩔', 2378 => '⩕', 2379 => '⩖', 2380 => '⩗', 2381 => '⩘', 2382 => '⩙', 2383 => '⩚', 2384 => '⩛', 2385 => '⩜', 2386 => '⩝', 2387 => '⩞', 2388 => '⩟', 2389 => '⩠', 2390 => '⩡', 2391 => '⩢', 2392 => '⩣', 2393 => '⩤', 2394 => '⩥', 2395 => '⩦', 2396 => '⩧', 2397 => '⩨', 2398 => '⩩', 2399 => '⩪', 2400 => '⩫', 2401 => '⩬', 2402 => '⩭', 2403 => '⩮', 2404 => '⩯', 2405 => '⩰', 2406 => '⩱', 2407 => '⩲', 2408 => '⩳', 2409 => '⩷', 2410 => '⩸', 2411 => '⩹', 2412 => '⩺', 2413 => '⩻', 2414 => '⩼', 2415 => '⩽', 2416 => '⩾', 2417 => '⩿', 2418 => '⪀', 2419 => '⪁', 2420 => '⪂', 2421 => '⪃', 2422 => '⪄', 2423 => '⪅', 2424 => '⪆', 2425 => '⪇', 2426 => '⪈', 2427 => '⪉', 2428 => '⪊', 2429 => '⪋', 2430 => '⪌', 2431 => '⪍', 2432 => '⪎', 2433 => '⪏', 2434 => '⪐', 2435 => '⪑', 2436 => '⪒', 2437 => '⪓', 2438 => '⪔', 2439 => '⪕', 2440 => '⪖', 2441 => '⪗', 2442 => '⪘', 2443 => '⪙', 2444 => '⪚', 2445 => '⪛', 2446 => '⪜', 2447 => '⪝', 2448 => '⪞', 2449 => '⪟', 2450 => '⪠', 2451 => '⪡', 2452 => '⪢', 2453 => '⪣', 2454 => '⪤', 2455 => '⪥', 2456 => '⪦', 2457 => '⪧', 2458 => '⪨', 2459 => '⪩', 2460 => '⪪', 2461 => '⪫', 2462 => '⪬', 2463 => '⪭', 2464 => '⪮', 2465 => '⪯', 2466 => '⪰', 2467 => '⪱', 2468 => '⪲', 2469 => '⪳', 2470 => '⪴', 2471 => '⪵', 2472 => '⪶', 2473 => '⪷', 2474 => '⪸', 2475 => '⪹', 2476 => '⪺', 2477 => '⪻', 2478 => '⪼', 2479 => '⪽', 2480 => '⪾', 2481 => '⪿', 2482 => '⫀', 2483 => '⫁', 2484 => '⫂', 2485 => '⫃', 2486 => '⫄', 2487 => '⫅', 2488 => '⫆', 2489 => '⫇', 2490 => '⫈', 2491 => '⫉', 2492 => '⫊', 2493 => '⫋', 2494 => '⫌', 2495 => '⫍', 2496 => '⫎', 2497 => '⫏', 2498 => '⫐', 2499 => '⫑', 2500 => '⫒', 2501 => '⫓', 2502 => '⫔', 2503 => '⫕', 2504 => '⫖', 2505 => '⫗', 2506 => '⫘', 2507 => '⫙', 2508 => '⫚', 2509 => '⫛', 2510 => '⫝', 2511 => '⫞', 2512 => '⫟', 2513 => '⫠', 2514 => '⫡', 2515 => '⫢', 2516 => '⫣', 2517 => '⫤', 2518 => '⫥', 2519 => '⫦', 2520 => '⫧', 2521 => '⫨', 2522 => '⫩', 2523 => '⫪', 2524 => '⫫', 2525 => '⫬', 2526 => '⫭', 2527 => '⫮', 2528 => '⫯', 2529 => '⫰', 2530 => '⫱', 2531 => '⫲', 2532 => '⫳', 2533 => '⫴', 2534 => '⫵', 2535 => '⫶', 2536 => '⫷', 2537 => '⫸', 2538 => '⫹', 2539 => '⫺', 2540 => '⫻', 2541 => '⫼', 2542 => '⫽', 2543 => '⫾', 2544 => '⫿', 2545 => '⬀', 2546 => '⬁', 2547 => '⬂', 2548 => '⬃', 2549 => '⬄', 2550 => '⬅', 2551 => '⬆', 2552 => '⬇', 2553 => '⬈', 2554 => '⬉', 2555 => '⬊', 2556 => '⬋', 2557 => '⬌', 2558 => '⬍', 2559 => '⬎', 2560 => '⬏', 2561 => '⬐', 2562 => '⬑', 2563 => '⬒', 2564 => '⬓', 2565 => '⬔', 2566 => '⬕', 2567 => '⬖', 2568 => '⬗', 2569 => '⬘', 2570 => '⬙', 2571 => '⬚', 2572 => '⬛', 2573 => '⬜', 2574 => '⬝', 2575 => '⬞', 2576 => '⬟', 2577 => '⬠', 2578 => '⬡', 2579 => '⬢', 2580 => '⬣', 2581 => '⬤', 2582 => '⬥', 2583 => '⬦', 2584 => '⬧', 2585 => '⬨', 2586 => '⬩', 2587 => '⬪', 2588 => '⬫', 2589 => '⬬', 2590 => '⬭', 2591 => '⬮', 2592 => '⬯', 2593 => '⬰', 2594 => '⬱', 2595 => '⬲', 2596 => '⬳', 2597 => '⬴', 2598 => '⬵', 2599 => '⬶', 2600 => '⬷', 2601 => '⬸', 2602 => '⬹', 2603 => '⬺', 2604 => '⬻', 2605 => '⬼', 2606 => '⬽', 2607 => '⬾', 2608 => '⬿', 2609 => '⭀', 2610 => '⭁', 2611 => '⭂', 2612 => '⭃', 2613 => '⭄', 2614 => '⭅', 2615 => '⭆', 2616 => '⭇', 2617 => '⭈', 2618 => '⭉', 2619 => '⭊', 2620 => '⭋', 2621 => '⭌', 2622 => '⭐', 2623 => '⭑', 2624 => '⭒', 2625 => '⭓', 2626 => '⭔', 2627 => '⭕', 2628 => '⭖', 2629 => '⭗', 2630 => '⭘', 2631 => '⭙', 2632 => '⳥', 2633 => '⳦', 2634 => '⳧', 2635 => '⳨', 2636 => '⳩', 2637 => '⳪', 2638 => '⠀', 2639 => '⠁', 2640 => '⠂', 2641 => '⠃', 2642 => '⠄', 2643 => '⠅', 2644 => '⠆', 2645 => '⠇', 2646 => '⠈', 2647 => '⠉', 2648 => '⠊', 2649 => '⠋', 2650 => '⠌', 2651 => '⠍', 2652 => '⠎', 2653 => '⠏', 2654 => '⠐', 2655 => '⠑', 2656 => '⠒', 2657 => '⠓', 2658 => '⠔', 2659 => '⠕', 2660 => '⠖', 2661 => '⠗', 2662 => '⠘', 2663 => '⠙', 2664 => '⠚', 2665 => '⠛', 2666 => '⠜', 2667 => '⠝', 2668 => '⠞', 2669 => '⠟', 2670 => '⠠', 2671 => '⠡', 2672 => '⠢', 2673 => '⠣', 2674 => '⠤', 2675 => '⠥', 2676 => '⠦', 2677 => '⠧', 2678 => '⠨', 2679 => '⠩', 2680 => '⠪', 2681 => '⠫', 2682 => '⠬', 2683 => '⠭', 2684 => '⠮', 2685 => '⠯', 2686 => '⠰', 2687 => '⠱', 2688 => '⠲', 2689 => '⠳', 2690 => '⠴', 2691 => '⠵', 2692 => '⠶', 2693 => '⠷', 2694 => '⠸', 2695 => '⠹', 2696 => '⠺', 2697 => '⠻', 2698 => '⠼', 2699 => '⠽', 2700 => '⠾', 2701 => '⠿', 2702 => '⡀', 2703 => '⡁', 2704 => '⡂', 2705 => '⡃', 2706 => '⡄', 2707 => '⡅', 2708 => '⡆', 2709 => '⡇', 2710 => '⡈', 2711 => '⡉', 2712 => '⡊', 2713 => '⡋', 2714 => '⡌', 2715 => '⡍', 2716 => '⡎', 2717 => '⡏', 2718 => '⡐', 2719 => '⡑', 2720 => '⡒', 2721 => '⡓', 2722 => '⡔', 2723 => '⡕', 2724 => '⡖', 2725 => '⡗', 2726 => '⡘', 2727 => '⡙', 2728 => '⡚', 2729 => '⡛', 2730 => '⡜', 2731 => '⡝', 2732 => '⡞', 2733 => '⡟', 2734 => '⡠', 2735 => '⡡', 2736 => '⡢', 2737 => '⡣', 2738 => '⡤', 2739 => '⡥', 2740 => '⡦', 2741 => '⡧', 2742 => '⡨', 2743 => '⡩', 2744 => '⡪', 2745 => '⡫', 2746 => '⡬', 2747 => '⡭', 2748 => '⡮', 2749 => '⡯', 2750 => '⡰', 2751 => '⡱', 2752 => '⡲', 2753 => '⡳', 2754 => '⡴', 2755 => '⡵', 2756 => '⡶', 2757 => '⡷', 2758 => '⡸', 2759 => '⡹', 2760 => '⡺', 2761 => '⡻', 2762 => '⡼', 2763 => '⡽', 2764 => '⡾', 2765 => '⡿', 2766 => '⢀', 2767 => '⢁', 2768 => '⢂', 2769 => '⢃', 2770 => '⢄', 2771 => '⢅', 2772 => '⢆', 2773 => '⢇', 2774 => '⢈', 2775 => '⢉', 2776 => '⢊', 2777 => '⢋', 2778 => '⢌', 2779 => '⢍', 2780 => '⢎', 2781 => '⢏', 2782 => '⢐', 2783 => '⢑', 2784 => '⢒', 2785 => '⢓', 2786 => '⢔', 2787 => '⢕', 2788 => '⢖', 2789 => '⢗', 2790 => '⢘', 2791 => '⢙', 2792 => '⢚', 2793 => '⢛', 2794 => '⢜', 2795 => '⢝', 2796 => '⢞', 2797 => '⢟', 2798 => '⢠', 2799 => '⢡', 2800 => '⢢', 2801 => '⢣', 2802 => '⢤', 2803 => '⢥', 2804 => '⢦', 2805 => '⢧', 2806 => '⢨', 2807 => '⢩', 2808 => '⢪', 2809 => '⢫', 2810 => '⢬', 2811 => '⢭', 2812 => '⢮', 2813 => '⢯', 2814 => '⢰', 2815 => '⢱', 2816 => '⢲', 2817 => '⢳', 2818 => '⢴', 2819 => '⢵', 2820 => '⢶', 2821 => '⢷', 2822 => '⢸', 2823 => '⢹', 2824 => '⢺', 2825 => '⢻', 2826 => '⢼', 2827 => '⢽', 2828 => '⢾', 2829 => '⢿', 2830 => '⣀', 2831 => '⣁', 2832 => '⣂', 2833 => '⣃', 2834 => '⣄', 2835 => '⣅', 2836 => '⣆', 2837 => '⣇', 2838 => '⣈', 2839 => '⣉', 2840 => '⣊', 2841 => '⣋', 2842 => '⣌', 2843 => '⣍', 2844 => '⣎', 2845 => '⣏', 2846 => '⣐', 2847 => '⣑', 2848 => '⣒', 2849 => '⣓', 2850 => '⣔', 2851 => '⣕', 2852 => '⣖', 2853 => '⣗', 2854 => '⣘', 2855 => '⣙', 2856 => '⣚', 2857 => '⣛', 2858 => '⣜', 2859 => '⣝', 2860 => '⣞', 2861 => '⣟', 2862 => '⣠', 2863 => '⣡', 2864 => '⣢', 2865 => '⣣', 2866 => '⣤', 2867 => '⣥', 2868 => '⣦', 2869 => '⣧', 2870 => '⣨', 2871 => '⣩', 2872 => '⣪', 2873 => '⣫', 2874 => '⣬', 2875 => '⣭', 2876 => '⣮', 2877 => '⣯', 2878 => '⣰', 2879 => '⣱', 2880 => '⣲', 2881 => '⣳', 2882 => '⣴', 2883 => '⣵', 2884 => '⣶', 2885 => '⣷', 2886 => '⣸', 2887 => '⣹', 2888 => '⣺', 2889 => '⣻', 2890 => '⣼', 2891 => '⣽', 2892 => '⣾', 2893 => '⣿', 2894 => '⚊', 2895 => '⚋', 2896 => '⚌', 2897 => '⚍', 2898 => '⚎', 2899 => '⚏', 2900 => '☰', 2901 => '☱', 2902 => '☲', 2903 => '☳', 2904 => '☴', 2905 => '☵', 2906 => '☶', 2907 => '☷', 2908 => '䷀', 2909 => '䷁', 2910 => '䷂', 2911 => '䷃', 2912 => '䷄', 2913 => '䷅', 2914 => '䷆', 2915 => '䷇', 2916 => '䷈', 2917 => '䷉', 2918 => '䷊', 2919 => '䷋', 2920 => '䷌', 2921 => '䷍', 2922 => '䷎', 2923 => '䷏', 2924 => '䷐', 2925 => '䷑', 2926 => '䷒', 2927 => '䷓', 2928 => '䷔', 2929 => '䷕', 2930 => '䷖', 2931 => '䷗', 2932 => '䷘', 2933 => '䷙', 2934 => '䷚', 2935 => '䷛', 2936 => '䷜', 2937 => '䷝', 2938 => '䷞', 2939 => '䷟', 2940 => '䷠', 2941 => '䷡', 2942 => '䷢', 2943 => '䷣', 2944 => '䷤', 2945 => '䷥', 2946 => '䷦', 2947 => '䷧', 2948 => '䷨', 2949 => '䷩', 2950 => '䷪', 2951 => '䷫', 2952 => '䷬', 2953 => '䷭', 2954 => '䷮', 2955 => '䷯', 2956 => '䷰', 2957 => '䷱', 2958 => '䷲', 2959 => '䷳', 2960 => '䷴', 2961 => '䷵', 2962 => '䷶', 2963 => '䷷', 2964 => '䷸', 2965 => '䷹', 2966 => '䷺', 2967 => '䷻', 2968 => '䷼', 2969 => '䷽', 2970 => '䷾', 2971 => '䷿', 2972 => '𝌀', 2973 => '𝌁', 2974 => '𝌂', 2975 => '𝌃', 2976 => '𝌄', 2977 => '𝌅', 2978 => '𝌆', 2979 => '𝌇', 2980 => '𝌈', 2981 => '𝌉', 2982 => '𝌊', 2983 => '𝌋', 2984 => '𝌌', 2985 => '𝌍', 2986 => '𝌎', 2987 => '𝌏', 2988 => '𝌐', 2989 => '𝌑', 2990 => '𝌒', 2991 => '𝌓', 2992 => '𝌔', 2993 => '𝌕', 2994 => '𝌖', 2995 => '𝌗', 2996 => '𝌘', 2997 => '𝌙', 2998 => '𝌚', 2999 => '𝌛', 3000 => '𝌜', 3001 => '𝌝', 3002 => '𝌞', 3003 => '𝌟', 3004 => '𝌠', 3005 => '𝌡', 3006 => '𝌢', 3007 => '𝌣', 3008 => '𝌤', 3009 => '𝌥', 3010 => '𝌦', 3011 => '𝌧', 3012 => '𝌨', 3013 => '𝌩', 3014 => '𝌪', 3015 => '𝌫', 3016 => '𝌬', 3017 => '𝌭', 3018 => '𝌮', 3019 => '𝌯', 3020 => '𝌰', 3021 => '𝌱', 3022 => '𝌲', 3023 => '𝌳', 3024 => '𝌴', 3025 => '𝌵', 3026 => '𝌶', 3027 => '𝌷', 3028 => '𝌸', 3029 => '𝌹', 3030 => '𝌺', 3031 => '𝌻', 3032 => '𝌼', 3033 => '𝌽', 3034 => '𝌾', 3035 => '𝌿', 3036 => '𝍀', 3037 => '𝍁', 3038 => '𝍂', 3039 => '𝍃', 3040 => '𝍄', 3041 => '𝍅', 3042 => '𝍆', 3043 => '𝍇', 3044 => '𝍈', 3045 => '𝍉', 3046 => '𝍊', 3047 => '𝍋', 3048 => '𝍌', 3049 => '𝍍', 3050 => '𝍎', 3051 => '𝍏', 3052 => '𝍐', 3053 => '𝍑', 3054 => '𝍒', 3055 => '𝍓', 3056 => '𝍔', 3057 => '𝍕', 3058 => '𝍖', 3059 => '꒐', 3060 => '꒑', 3061 => '꒒', 3062 => '꒓', 3063 => '꒔', 3064 => '꒕', 3065 => '꒖', 3066 => '꒗', 3067 => '꒘', 3068 => '꒙', 3069 => '꒚', 3070 => '꒛', 3071 => '꒜', 3072 => '꒝', 3073 => '꒞', 3074 => '꒟', 3075 => '꒠', 3076 => '꒡', 3077 => '꒢', 3078 => '꒣', 3079 => '꒤', 3080 => '꒥', 3081 => '꒦', 3082 => '꒧', 3083 => '꒨', 3084 => '꒩', 3085 => '꒪', 3086 => '꒫', 3087 => '꒬', 3088 => '꒭', 3089 => '꒮', 3090 => '꒯', 3091 => '꒰', 3092 => '꒱', 3093 => '꒲', 3094 => '꒳', 3095 => '꒴', 3096 => '꒵', 3097 => '꒶', 3098 => '꒷', 3099 => '꒸', 3100 => '꒹', 3101 => '꒺', 3102 => '꒻', 3103 => '꒼', 3104 => '꒽', 3105 => '꒾', 3106 => '꒿', 3107 => '꓀', 3108 => '꓁', 3109 => '꓂', 3110 => '꓃', 3111 => '꓄', 3112 => '꓅', 3113 => '꓆', 3114 => '𐄷', 3115 => '𐄸', 3116 => '𐄹', 3117 => '𐄺', 3118 => '𐄻', 3119 => '𐄼', 3120 => '𐄽', 3121 => '𐄾', 3122 => '𐄿', 3123 => '𐅹', 3124 => '𐅺', 3125 => '𐅻', 3126 => '𐅼', 3127 => '𐅽', 3128 => '𐅾', 3129 => '𐅿', 3130 => '𐆀', 3131 => '𐆁', 3132 => '𐆂', 3133 => '𐆃', 3134 => '𐆄', 3135 => '𐆅', 3136 => '𐆆', 3137 => '𐆇', 3138 => '𐆈', 3139 => '𐆉', 3140 => '𐆐', 3141 => '𐆑', 3142 => '𐆒', 3143 => '𐆓', 3144 => '𐆔', 3145 => '𐆕', 3146 => '𐆖', 3147 => '𐆗', 3148 => '𐆘', 3149 => '𐆙', 3150 => '𐆚', 3151 => '𐆛', 3152 => '𐇐', 3153 => '𐇑', 3154 => '𐇒', 3155 => '𐇓', 3156 => '𐇔', 3157 => '𐇕', 3158 => '𐇖', 3159 => '𐇗', 3160 => '𐇘', 3161 => '𐇙', 3162 => '𐇚', 3163 => '𐇛', 3164 => '𐇜', 3165 => '𐇝', 3166 => '𐇞', 3167 => '𐇟', 3168 => '𐇠', 3169 => '𐇡', 3170 => '𐇢', 3171 => '𐇣', 3172 => '𐇤', 3173 => '𐇥', 3174 => '𐇦', 3175 => '𐇧', 3176 => '𐇨', 3177 => '𐇩', 3178 => '𐇪', 3179 => '𐇫', 3180 => '𐇬', 3181 => '𐇭', 3182 => '𐇮', 3183 => '𐇯', 3184 => '𐇰', 3185 => '𐇱', 3186 => '𐇲', 3187 => '𐇳', 3188 => '𐇴', 3189 => '𐇵', 3190 => '𐇶', 3191 => '𐇷', 3192 => '𐇸', 3193 => '𐇹', 3194 => '𐇺', 3195 => '𐇻', 3196 => '𐇼', 3197 => '𝀀', 3198 => '𝀁', 3199 => '𝀂', 3200 => '𝀃', 3201 => '𝀄', 3202 => '𝀅', 3203 => '𝀆', 3204 => '𝀇', 3205 => '𝀈', 3206 => '𝀉', 3207 => '𝀊', 3208 => '𝀋', 3209 => '𝀌', 3210 => '𝀍', 3211 => '𝀎', 3212 => '𝀏', 3213 => '𝀐', 3214 => '𝀑', 3215 => '𝀒', 3216 => '𝀓', 3217 => '𝀔', 3218 => '𝀕', 3219 => '𝀖', 3220 => '𝀗', 3221 => '𝀘', 3222 => '𝀙', 3223 => '𝀚', 3224 => '𝀛', 3225 => '𝀜', 3226 => '𝀝', 3227 => '𝀞', 3228 => '𝀟', 3229 => '𝀠', 3230 => '𝀡', 3231 => '𝀢', 3232 => '𝀣', 3233 => '𝀤', 3234 => '𝀥', 3235 => '𝀦', 3236 => '𝀧', 3237 => '𝀨', 3238 => '𝀩', 3239 => '𝀪', 3240 => '𝀫', 3241 => '𝀬', 3242 => '𝀭', 3243 => '𝀮', 3244 => '𝀯', 3245 => '𝀰', 3246 => '𝀱', 3247 => '𝀲', 3248 => '𝀳', 3249 => '𝀴', 3250 => '𝀵', 3251 => '𝀶', 3252 => '𝀷', 3253 => '𝀸', 3254 => '𝀹', 3255 => '𝀺', 3256 => '𝀻', 3257 => '𝀼', 3258 => '𝀽', 3259 => '𝀾', 3260 => '𝀿', 3261 => '𝁀', 3262 => '𝁁', 3263 => '𝁂', 3264 => '𝁃', 3265 => '𝁄', 3266 => '𝁅', 3267 => '𝁆', 3268 => '𝁇', 3269 => '𝁈', 3270 => '𝁉', 3271 => '𝁊', 3272 => '𝁋', 3273 => '𝁌', 3274 => '𝁍', 3275 => '𝁎', 3276 => '𝁏', 3277 => '𝁐', 3278 => '𝁑', 3279 => '𝁒', 3280 => '𝁓', 3281 => '𝁔', 3282 => '𝁕', 3283 => '𝁖', 3284 => '𝁗', 3285 => '𝁘', 3286 => '𝁙', 3287 => '𝁚', 3288 => '𝁛', 3289 => '𝁜', 3290 => '𝁝', 3291 => '𝁞', 3292 => '𝁟', 3293 => '𝁠', 3294 => '𝁡', 3295 => '𝁢', 3296 => '𝁣', 3297 => '𝁤', 3298 => '𝁥', 3299 => '𝁦', 3300 => '𝁧', 3301 => '𝁨', 3302 => '𝁩', 3303 => '𝁪', 3304 => '𝁫', 3305 => '𝁬', 3306 => '𝁭', 3307 => '𝁮', 3308 => '𝁯', 3309 => '𝁰', 3310 => '𝁱', 3311 => '𝁲', 3312 => '𝁳', 3313 => '𝁴', 3314 => '𝁵', 3315 => '𝁶', 3316 => '𝁷', 3317 => '𝁸', 3318 => '𝁹', 3319 => '𝁺', 3320 => '𝁻', 3321 => '𝁼', 3322 => '𝁽', 3323 => '𝁾', 3324 => '𝁿', 3325 => '𝂀', 3326 => '𝂁', 3327 => '𝂂', 3328 => '𝂃', 3329 => '𝂄', 3330 => '𝂅', 3331 => '𝂆', 3332 => '𝂇', 3333 => '𝂈', 3334 => '𝂉', 3335 => '𝂊', 3336 => '𝂋', 3337 => '𝂌', 3338 => '𝂍', 3339 => '𝂎', 3340 => '𝂏', 3341 => '𝂐', 3342 => '𝂑', 3343 => '𝂒', 3344 => '𝂓', 3345 => '𝂔', 3346 => '𝂕', 3347 => '𝂖', 3348 => '𝂗', 3349 => '𝂘', 3350 => '𝂙', 3351 => '𝂚', 3352 => '𝂛', 3353 => '𝂜', 3354 => '𝂝', 3355 => '𝂞', 3356 => '𝂟', 3357 => '𝂠', 3358 => '𝂡', 3359 => '𝂢', 3360 => '𝂣', 3361 => '𝂤', 3362 => '𝂥', 3363 => '𝂦', 3364 => '𝂧', 3365 => '𝂨', 3366 => '𝂩', 3367 => '𝂪', 3368 => '𝂫', 3369 => '𝂬', 3370 => '𝂭', 3371 => '𝂮', 3372 => '𝂯', 3373 => '𝂰', 3374 => '𝂱', 3375 => '𝂲', 3376 => '𝂳', 3377 => '𝂴', 3378 => '𝂵', 3379 => '𝂶', 3380 => '𝂷', 3381 => '𝂸', 3382 => '𝂹', 3383 => '𝂺', 3384 => '𝂻', 3385 => '𝂼', 3386 => '𝂽', 3387 => '𝂾', 3388 => '𝂿', 3389 => '𝃀', 3390 => '𝃁', 3391 => '𝃂', 3392 => '𝃃', 3393 => '𝃄', 3394 => '𝃅', 3395 => '𝃆', 3396 => '𝃇', 3397 => '𝃈', 3398 => '𝃉', 3399 => '𝃊', 3400 => '𝃋', 3401 => '𝃌', 3402 => '𝃍', 3403 => '𝃎', 3404 => '𝃏', 3405 => '𝃐', 3406 => '𝃑', 3407 => '𝃒', 3408 => '𝃓', 3409 => '𝃔', 3410 => '𝃕', 3411 => '𝃖', 3412 => '𝃗', 3413 => '𝃘', 3414 => '𝃙', 3415 => '𝃚', 3416 => '𝃛', 3417 => '𝃜', 3418 => '𝃝', 3419 => '𝃞', 3420 => '𝃟', 3421 => '𝃠', 3422 => '𝃡', 3423 => '𝃢', 3424 => '𝃣', 3425 => '𝃤', 3426 => '𝃥', 3427 => '𝃦', 3428 => '𝃧', 3429 => '𝃨', 3430 => '𝃩', 3431 => '𝃪', 3432 => '𝃫', 3433 => '𝃬', 3434 => '𝃭', 3435 => '𝃮', 3436 => '𝃯', 3437 => '𝃰', 3438 => '𝃱', 3439 => '𝃲', 3440 => '𝃳', 3441 => '𝃴', 3442 => '𝃵', 3443 => '𝄀', 3444 => '𝄁', 3445 => '𝄂', 3446 => '𝄃', 3447 => '𝄄', 3448 => '𝄅', 3449 => '𝄆', 3450 => '𝄇', 3451 => '𝄈', 3452 => '𝄉', 3453 => '𝄊', 3454 => '𝄋', 3455 => '𝄌', 3456 => '𝄍', 3457 => '𝄎', 3458 => '𝄏', 3459 => '𝄐', 3460 => '𝄑', 3461 => '𝄒', 3462 => '𝄓', 3463 => '𝄔', 3464 => '𝄕', 3465 => '𝄖', 3466 => '𝄗', 3467 => '𝄘', 3468 => '𝄙', 3469 => '𝄚', 3470 => '𝄛', 3471 => '𝄜', 3472 => '𝄝', 3473 => '𝄞', 3474 => '𝄟', 3475 => '𝄠', 3476 => '𝄡', 3477 => '𝄢', 3478 => '𝄣', 3479 => '𝄤', 3480 => '𝄥', 3481 => '𝄦', 3482 => '♭', 3483 => '♮', 3484 => '♯', 3485 => '𝄪', 3486 => '𝄫', 3487 => '𝄬', 3488 => '𝄭', 3489 => '𝄮', 3490 => '𝄯', 3491 => '𝄰', 3492 => '𝄱', 3493 => '𝄲', 3494 => '𝄳', 3495 => '𝄴', 3496 => '𝄵', 3497 => '𝄶', 3498 => '𝄷', 3499 => '𝄸', 3500 => '𝄹', 3501 => '𝄩', 3502 => '𝄺', 3503 => '𝄻', 3504 => '𝄼', 3505 => '𝄽', 3506 => '𝄾', 3507 => '𝄿', 3508 => '𝅀', 3509 => '𝅁', 3510 => '𝅂', 3511 => '𝅃', 3512 => '𝅄', 3513 => '𝅅', 3514 => '𝅆', 3515 => '𝅇', 3516 => '𝅈', 3517 => '𝅉', 3518 => '𝅊', 3519 => '𝅋', 3520 => '𝅌', 3521 => '𝅍', 3522 => '𝅎', 3523 => '𝅏', 3524 => '𝅐', 3525 => '𝅑', 3526 => '𝅒', 3527 => '𝅓', 3528 => '𝅔', 3529 => '𝅕', 3530 => '𝅖', 3531 => '𝅗', 3532 => '𝅘', 3533 => '𝅙', 3534 => '𝅚', 3535 => '𝅛', 3536 => '𝅜', 3537 => '𝅝', 3538 => '𝅪', 3539 => '𝅫', 3540 => '𝅬', 3541 => '𝆃', 3542 => '𝆄', 3543 => '𝆌', 3544 => '𝆍', 3545 => '𝆎', 3546 => '𝆏', 3547 => '𝆐', 3548 => '𝆑', 3549 => '𝆒', 3550 => '𝆓', 3551 => '𝆔', 3552 => '𝆕', 3553 => '𝆖', 3554 => '𝆗', 3555 => '𝆘', 3556 => '𝆙', 3557 => '𝆚', 3558 => '𝆛', 3559 => '𝆜', 3560 => '𝆝', 3561 => '𝆞', 3562 => '𝆟', 3563 => '𝆠', 3564 => '𝆡', 3565 => '𝆢', 3566 => '𝆣', 3567 => '𝆤', 3568 => '𝆥', 3569 => '𝆦', 3570 => '𝆧', 3571 => '𝆨', 3572 => '𝆩', 3573 => '𝆮', 3574 => '𝆯', 3575 => '𝆰', 3576 => '𝆱', 3577 => '𝆲', 3578 => '𝆳', 3579 => '𝆴', 3580 => '𝆵', 3581 => '𝆶', 3582 => '𝆷', 3583 => '𝆸', 3584 => '𝆹', 3585 => '𝆺', 3586 => '𝇁', 3587 => '𝇂', 3588 => '𝇃', 3589 => '𝇄', 3590 => '𝇅', 3591 => '𝇆', 3592 => '𝇇', 3593 => '𝇈', 3594 => '𝇉', 3595 => '𝇊', 3596 => '𝇋', 3597 => '𝇌', 3598 => '𝇍', 3599 => '𝇎', 3600 => '𝇏', 3601 => '𝇐', 3602 => '𝇑', 3603 => '𝇒', 3604 => '𝇓', 3605 => '𝇔', 3606 => '𝇕', 3607 => '𝇖', 3608 => '𝇗', 3609 => '𝇘', 3610 => '𝇙', 3611 => '𝇚', 3612 => '𝇛', 3613 => '𝇜', 3614 => '𝇝', 3615 => '𝈀', 3616 => '𝈁', 3617 => '𝈂', 3618 => '𝈃', 3619 => '𝈄', 3620 => '𝈅', 3621 => '𝈆', 3622 => '𝈇', 3623 => '𝈈', 3624 => '𝈉', 3625 => '𝈊', 3626 => '𝈋', 3627 => '𝈌', 3628 => '𝈍', 3629 => '𝈎', 3630 => '𝈏', 3631 => '𝈐', 3632 => '𝈑', 3633 => '𝈒', 3634 => '𝈓', 3635 => '𝈔', 3636 => '𝈕', 3637 => '𝈖', 3638 => '𝈗', 3639 => '𝈘', 3640 => '𝈙', 3641 => '𝈚', 3642 => '𝈛', 3643 => '𝈜', 3644 => '𝈝', 3645 => '𝈞', 3646 => '𝈟', 3647 => '𝈠', 3648 => '𝈡', 3649 => '𝈢', 3650 => '𝈣', 3651 => '𝈤', 3652 => '𝈥', 3653 => '𝈦', 3654 => '𝈧', 3655 => '𝈨', 3656 => '𝈩', 3657 => '𝈪', 3658 => '𝈫', 3659 => '𝈬', 3660 => '𝈭', 3661 => '𝈮', 3662 => '𝈯', 3663 => '𝈰', 3664 => '𝈱', 3665 => '𝈲', 3666 => '𝈳', 3667 => '𝈴', 3668 => '𝈵', 3669 => '𝈶', 3670 => '𝈷', 3671 => '𝈸', 3672 => '𝈹', 3673 => '𝈺', 3674 => '𝈻', 3675 => '𝈼', 3676 => '𝈽', 3677 => '𝈾', 3678 => '𝈿', 3679 => '𝉀', 3680 => '𝉁', 3681 => '𝉅', 3682 => '🀀', 3683 => '🀁', 3684 => '🀂', 3685 => '🀃', 3686 => '🀄', 3687 => '🀅', 3688 => '🀆', 3689 => '🀇', 3690 => '🀈', 3691 => '🀉', 3692 => '🀊', 3693 => '🀋', 3694 => '🀌', 3695 => '🀍', 3696 => '🀎', 3697 => '🀏', 3698 => '🀐', 3699 => '🀑', 3700 => '🀒', 3701 => '🀓', 3702 => '🀔', 3703 => '🀕', 3704 => '🀖', 3705 => '🀗', 3706 => '🀘', 3707 => '🀙', 3708 => '🀚', 3709 => '🀛', 3710 => '🀜', 3711 => '🀝', 3712 => '🀞', 3713 => '🀟', 3714 => '🀠', 3715 => '🀡', 3716 => '🀢', 3717 => '🀣', 3718 => '🀤', 3719 => '🀥', 3720 => '🀦', 3721 => '🀧', 3722 => '🀨', 3723 => '🀩', 3724 => '🀪', 3725 => '🀫', 3726 => '🀰', 3727 => '🀱', 3728 => '🀲', 3729 => '🀳', 3730 => '🀴', 3731 => '🀵', 3732 => '🀶', 3733 => '🀷', 3734 => '🀸', 3735 => '🀹', 3736 => '🀺', 3737 => '🀻', 3738 => '🀼', 3739 => '🀽', 3740 => '🀾', 3741 => '🀿', 3742 => '🁀', 3743 => '🁁', 3744 => '🁂', 3745 => '🁃', 3746 => '🁄', 3747 => '🁅', 3748 => '🁆', 3749 => '🁇', 3750 => '🁈', 3751 => '🁉', 3752 => '🁊', 3753 => '🁋', 3754 => '🁌', 3755 => '🁍', 3756 => '🁎', 3757 => '🁏', 3758 => '🁐', 3759 => '🁑', 3760 => '🁒', 3761 => '🁓', 3762 => '🁔', 3763 => '🁕', 3764 => '🁖', 3765 => '🁗', 3766 => '🁘', 3767 => '🁙', 3768 => '🁚', 3769 => '🁛', 3770 => '🁜', 3771 => '🁝', 3772 => '🁞', 3773 => '🁟', 3774 => '🁠', 3775 => '🁡'