MediaWiki REL1_39
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
21use CdnPurgeJob;
26use DateTime;
27use DateTimeZone;
32use EmaillingJob;
35use EnqueueJob;
38use Generator;
42use InvalidArgumentException;
44use JobQueueDB;
49use LocalRepo;
50use LogFormatter;
51use MediaWiki\Settings\Source\JsonSchemaTrait;
60use NullJob;
67use ReflectionClass;
73use SqlBagOStuff;
84use WebRequest;
87
120 use JsonSchemaTrait;
121
143 public static function listDefaultValues( string $prefix = '' ): Generator {
144 $class = new ReflectionClass( self::class );
145 foreach ( $class->getReflectionConstants() as $const ) {
146 if ( !$const->isPublic() ) {
147 continue;
148 }
149
150 $value = $const->getValue();
151
152 if ( !is_array( $value ) ) {
153 // Just in case we end up having some other kind of constant on this class.
154 continue;
155 }
156
157 $name = $const->getName();
158 yield "$prefix$name" => self::getDefaultFromJsonSchema( $value );
159 }
160 }
161
174 public static function getDefaultValue( string $name ) {
175 $class = new ReflectionClass( self::class );
176 if ( !$class->hasConstant( $name ) ) {
177 throw new InvalidArgumentException( "Unknown setting: $name" );
178 }
179 $value = $class->getConstant( $name );
180
181 if ( !is_array( $value ) ) {
182 // Might happen if we end up having other kinds of constants on this class.
183 throw new InvalidArgumentException( "Unknown setting: $name" );
184 }
185
186 return self::getDefaultFromJsonSchema( $value );
187 }
188
189 /***************************************************************************/
197 public const ConfigRegistry = [
198 'default' => [
199 'main' => 'GlobalVarConfig::newInstance',
200 ],
201 'type' => 'map',
202 ];
203
207 public const Sitename = [
208 'default' => 'MediaWiki',
209 ];
210
211 /***************************************************************************/
212 // region Server URLs and file paths
237 public const Server = [
238 'default' => false,
239 ];
240
250 public const CanonicalServer = [
251 'default' => false,
252 ];
253
260 public const ServerName = [
261 'default' => false,
262 ];
263
270 public const AssumeProxiesUseDefaultProtocolPorts = [
271 'default' => true,
272 'type' => 'boolean',
273 ];
274
285 public const HttpsPort = [
286 'default' => 443,
287 ];
288
306 public const ForceHTTPS = [
307 'default' => false,
308 'type' => 'boolean',
309 ];
310
321 public const ScriptPath = [
322 'default' => '/wiki',
323 ];
324
339 public const UsePathInfo = [
340 'dynamicDefault' => true,
341 ];
342
346 public static function getDefaultUsePathInfo(): bool {
347 // These often break when PHP is set up in CGI mode.
348 // PATH_INFO *may* be correct if cgi.fix_pathinfo is set, but then again it may not;
349 // lighttpd converts incoming path data to lowercase on systems
350 // with case-insensitive filesystems, and there have been reports of
351 // problems on Apache as well.
352 return !str_contains( PHP_SAPI, 'cgi' ) && !str_contains( PHP_SAPI, 'apache2filter' ) &&
353 !str_contains( PHP_SAPI, 'isapi' );
354 }
355
361 public const Script = [
362 'default' => false,
363 'dynamicDefault' => [ 'use' => [ 'ScriptPath' ] ]
364 ];
365
370 public static function getDefaultScript( $scriptPath ): string {
371 return "$scriptPath/index.php";
372 }
373
381 public const LoadScript = [
382 'default' => false,
383 'dynamicDefault' => [ 'use' => [ 'ScriptPath' ] ]
384 ];
385
390 public static function getDefaultLoadScript( $scriptPath ): string {
391 return "$scriptPath/load.php";
392 }
393
400 public const RestPath = [
401 'default' => false,
402 'dynamicDefault' => [ 'use' => [ 'ScriptPath' ] ]
403 ];
404
409 public static function getDefaultRestPath( $scriptPath ): string {
410 return "$scriptPath/rest.php";
411 }
412
420 public const StylePath = [
421 'default' => false,
422 'dynamicDefault' => [ 'use' => [ 'ResourceBasePath' ] ]
423 ];
424
429 public static function getDefaultStylePath( $resourceBasePath ): string {
430 return "$resourceBasePath/skins";
431 }
432
440 public const LocalStylePath = [
441 'default' => false,
442 'dynamicDefault' => [ 'use' => [ 'ScriptPath' ] ]
443 ];
444
449 public static function getDefaultLocalStylePath( $scriptPath ): string {
450 // Avoid ResourceBasePath here since that may point to a different domain (e.g. CDN)
451 return "$scriptPath/skins";
452 }
453
461 public const ExtensionAssetsPath = [
462 'default' => false,
463 'dynamicDefault' => [ 'use' => [ 'ResourceBasePath' ] ]
464 ];
465
470 public static function getDefaultExtensionAssetsPath( $resourceBasePath ): string {
471 return "$resourceBasePath/extensions";
472 }
473
481 public const ExtensionDirectory = [
482 'default' => null,
483 'type' => '?string',
484 ];
485
493 public const StyleDirectory = [
494 'default' => null,
495 'type' => '?string',
496 ];
497
507 public const BaseDirectory = [
508 'default' => null,
509 ];
510
518 public const ArticlePath = [
519 'default' => false,
520 'dynamicDefault' => [ 'use' => [ 'Script', 'UsePathInfo' ] ]
521 ];
522
528 public static function getDefaultArticlePath( string $script, $usePathInfo ): string {
529 if ( $usePathInfo ) {
530 return "$script/$1";
531 }
532 return "$script?title=$1";
533 }
534
540 public const UploadPath = [
541 'default' => false,
542 'dynamicDefault' => [ 'use' => [ 'ScriptPath' ] ]
543 ];
544
549 public static function getDefaultUploadPath( $scriptPath ): string {
550 return "$scriptPath/images";
551 }
552
565 public const ImgAuthPath = [
566 'default' => false,
567 ];
568
575 public const ThumbPath = [
576 'default' => false,
577 ];
578
582 public const UploadDirectory = [
583 'default' => false,
584 'dynamicDefault' => [ 'use' => [ 'BaseDirectory' ] ]
585 ];
586
591 public static function getDefaultUploadDirectory( $baseDirectory ): string {
592 return "$baseDirectory/images";
593 }
594
600 public const FileCacheDirectory = [
601 'default' => false,
602 'dynamicDefault' => [ 'use' => [ 'UploadDirectory' ] ]
603 ];
604
609 public static function getDefaultFileCacheDirectory( $uploadDirectory ): string {
610 return "$uploadDirectory/cache";
611 }
612
621 public const Logo = [
622 'default' => false,
623 'dynamicDefault' => [ 'use' => [ 'ResourceBasePath' ] ]
624 ];
625
630 public static function getDefaultLogo( $resourceBasePath ): string {
631 return "$resourceBasePath/resources/assets/change-your-logo.svg";
632 }
633
683 public const Logos = [
684 'default' => false,
685 'type' => 'map|false',
686 ];
687
717 public const LogoHD = [
718 'default' => false,
719 'type' => 'map|false',
720 'deprecated' => 'since 1.35. Developers should retrieve this logo (and other variants) ' .
721 'using the static function MediaWiki\ResourceLoader\SkinModule::getAvailableLogos. $wgLogos ' .
722 'should be used instead.',
723 ];
724
730 public const Favicon = [
731 'default' => '/favicon.ico',
732 ];
733
741 public const AppleTouchIcon = [
742 'default' => false,
743 ];
744
763 public const ReferrerPolicy = [
764 'default' => false,
765 'type' => 'list|string|false',
766 ];
767
789 public const TmpDirectory = [
790 'default' => false,
791 ];
792
799 public const UploadBaseUrl = [
800 'default' => '',
801 ];
802
815 public const UploadStashScalerBaseUrl = [
816 'default' => false,
817 'deprecated' => 'since 1.36 Use thumbProxyUrl in $wgLocalFileRepo',
818 ];
819
834 public const ActionPaths = [
835 'default' => [],
836 'type' => 'map',
837 ];
838
845 public const MainPageIsDomainRoot = [
846 'default' => false,
847 'type' => 'boolean',
848 ];
849
850 // endregion -- end of server URLs and file paths
851
852 /***************************************************************************/
853 // region Files and file uploads
865 public const EnableUploads = [
866 'default' => false,
867 ];
868
872 public const UploadStashMaxAge = [
873 'default' => 6 * 3600, // 6 hours
874 ];
875
885 public const EnableAsyncUploads = [
886 'default' => false,
887 ];
888
892 public const UploadMaintenance = [
893 'default' => false,
894 ];
895
903 public const IllegalFileChars = [
904 'default' => ':\\/\\\\',
905 ];
906
912 public const DeletedDirectory = [
913 'default' => false,
914 'dynamicDefault' => [ 'use' => [ 'UploadDirectory' ] ]
915 ];
916
921 public static function getDefaultDeletedDirectory( $uploadDirectory ): string {
922 return "$uploadDirectory/deleted";
923 }
924
928 public const ImgAuthDetails = [
929 'default' => false,
930 ];
931
947 public const ImgAuthUrlPathMap = [
948 'default' => [],
949 'type' => 'map',
950 ];
951
1086 public const LocalFileRepo = [
1087 'default' => false,
1088 'type' => 'map|false',
1089 'dynamicDefault' => [ 'use' => [ 'UploadDirectory', 'ScriptPath', 'Favicon', 'UploadBaseUrl',
1090 'UploadPath', 'HashedUploadDirectory', 'ThumbnailScriptPath',
1091 'GenerateThumbnailOnParse', 'DeletedDirectory', 'UpdateCompatibleMetadata' ] ],
1092 ];
1093
1094 public static function getDefaultLocalFileRepo(
1095 $uploadDirectory, $scriptPath, $favicon, $uploadBaseUrl, $uploadPath,
1096 $hashedUploadDirectory, $thumbnailScriptPath, $generateThumbnailOnParse, $deletedDirectory,
1097 $updateCompatibleMetadata
1098 ) {
1099 return [
1100 'class' => LocalRepo::class,
1101 'name' => 'local',
1102 'directory' => $uploadDirectory,
1103 'scriptDirUrl' => $scriptPath,
1104 'favicon' => $favicon,
1105 'url' => $uploadBaseUrl ? $uploadBaseUrl . $uploadPath : $uploadPath,
1106 'hashLevels' => $hashedUploadDirectory ? 2 : 0,
1107 'thumbScriptUrl' => $thumbnailScriptPath,
1108 'transformVia404' => !$generateThumbnailOnParse,
1109 'deletedDir' => $deletedDirectory,
1110 'deletedHashLevels' => $hashedUploadDirectory ? 3 : 0,
1111 'updateCompatibleMetadata' => $updateCompatibleMetadata,
1112 'reserializeMetadata' => $updateCompatibleMetadata,
1113 ];
1114 }
1115
1129 public const ForeignFileRepos = [
1130 'default' => [],
1131 'type' => 'list',
1132 ];
1133
1143 public const UseInstantCommons = [
1144 'default' => false,
1145 ];
1146
1174 public const UseSharedUploads = [
1175 'default' => false,
1176 'type' => 'boolean',
1177 ];
1178
1186 public const SharedUploadDirectory = [
1187 'default' => null,
1188 'type' => '?string',
1189 ];
1190
1198 public const SharedUploadPath = [
1199 'default' => null,
1200 'type' => '?string',
1201 ];
1202
1210 public const HashedSharedUploadDirectory = [
1211 'default' => true,
1212 'type' => 'boolean',
1213 ];
1214
1222 public const RepositoryBaseUrl = [
1223 'default' => 'https://commons.wikimedia.org/wiki/File:',
1224 ];
1225
1233 public const FetchCommonsDescriptions = [
1234 'default' => false,
1235 'type' => 'boolean',
1236 ];
1237
1246 public const SharedUploadDBname = [
1247 'default' => false,
1248 'type' => 'false|string',
1249 ];
1250
1258 public const SharedUploadDBprefix = [
1259 'default' => '',
1260 'type' => 'string',
1261 ];
1262
1270 public const CacheSharedUploads = [
1271 'default' => true,
1272 'type' => 'boolean',
1273 ];
1274
1285 public const ForeignUploadTargets = [
1286 'default' => [ 'local', ],
1287 'type' => 'list',
1288 ];
1289
1299 public const UploadDialog = [
1300 'default' =>
1301 [
1302 'fields' =>
1303 [
1304 'description' => true,
1305 'date' => false,
1306 'categories' => false,
1307 ],
1308 'licensemessages' =>
1309 [
1310 'local' => 'generic-local',
1311 'foreign' => 'generic-foreign',
1312 ],
1313 'comment' =>
1314 [
1315 'local' => '',
1316 'foreign' => '',
1317 ],
1318 'format' =>
1319 [
1320 'filepage' => '$DESCRIPTION',
1321 'description' => '$TEXT',
1322 'ownwork' => '',
1323 'license' => '',
1324 'uncategorized' => '',
1325 ],
1326 ],
1327 'type' => 'map',
1328 ];
1329
1366 public const FileBackends = [
1367 'default' => [],
1368 'type' => 'map',
1369 ];
1370
1382 public const LockManagers = [
1383 'default' => [],
1384 'type' => 'list',
1385 ];
1386
1402 public const ShowEXIF = [
1403 'dynamicDefault' => [ 'callback' => [ self::class, 'getDefaultShowEXIF' ] ],
1404 ];
1405
1409 public static function getDefaultShowEXIF(): bool {
1410 return function_exists( 'exif_read_data' );
1411 }
1412
1416 public const UpdateCompatibleMetadata = [
1417 'default' => false,
1418 ];
1419
1426 public const AllowCopyUploads = [
1427 'default' => false,
1428 ];
1429
1435 public const CopyUploadsDomains = [
1436 'default' => [],
1437 'type' => 'list',
1438 ];
1439
1445 public const CopyUploadsFromSpecialUpload = [
1446 'default' => false,
1447 ];
1448
1454 public const CopyUploadProxy = [
1455 'default' => false,
1456 ];
1457
1466 public const CopyUploadTimeout = [
1467 'default' => false,
1468 'type' => 'false|integer',
1469 ];
1470
1477 public const CopyUploadAllowOnWikiDomainConfig = [
1478 'default' => false,
1479 ];
1480
1501 public const MaxUploadSize = [
1502 'default' => 1024 * 1024 * 100,
1503 ];
1504
1519 public const MinUploadChunkSize = [
1520 'default' => 1024,
1521 ];
1522
1534 public const UploadNavigationUrl = [
1535 'default' => false,
1536 ];
1537
1543 public const UploadMissingFileUrl = [
1544 'default' => false,
1545 ];
1546
1560 public const ThumbnailScriptPath = [
1561 'default' => false,
1562 ];
1563
1571 public const SharedThumbnailScriptPath = [
1572 'default' => false,
1573 'type' => 'string|false',
1574 ];
1575
1581 public const HashedUploadDirectory = [
1582 'default' => true,
1583 'type' => 'boolean',
1584 ];
1585
1594 public const FileExtensions = [
1595 'default' => [ 'png', 'gif', 'jpg', 'jpeg', 'webp', ],
1596 'type' => 'list',
1597 ];
1598
1607 public const ProhibitedFileExtensions = [
1608 'default' => [
1609 # HTML may contain cookie-stealing JavaScript and web bugs
1610 'html', 'htm', 'js', 'jsb', 'mhtml', 'mht', 'xhtml', 'xht',
1611 # PHP scripts may execute arbitrary code on the server
1612 'php', 'phtml', 'php3', 'php4', 'php5', 'phps', 'phar',
1613 # Other types that may be interpreted by some servers
1614 'shtml', 'jhtml', 'pl', 'py', 'cgi',
1615 # May contain harmful executables for Windows victims
1616 'exe', 'scr', 'dll', 'msi', 'vbs', 'bat', 'com', 'pif', 'cmd', 'vxd', 'cpl',
1617 # T341565
1618 'xml',
1619 ],
1620 'type' => 'list',
1621 ];
1622
1629 public const MimeTypeExclusions = [
1630 'default' => [
1631 # HTML may contain cookie-stealing JavaScript and web bugs
1632 'text/html',
1633 # Similarly with JavaScript itself
1634 'application/javascript', 'text/javascript', 'text/x-javascript', 'application/x-shellscript',
1635 # PHP scripts may execute arbitrary code on the server
1636 'application/x-php', 'text/x-php',
1637 # Other types that may be interpreted by some servers
1638 'text/x-python', 'text/x-perl', 'text/x-bash', 'text/x-sh', 'text/x-csh',
1639 # Client-side hazards on Internet Explorer
1640 'text/scriptlet', 'application/x-msdownload',
1641 # Windows metafile, client-side vulnerability on some systems
1642 'application/x-msmetafile',
1643 # Files that look like java files
1644 'application/java',
1645 # XML files generally - T341565
1646 'application/xml', 'text/xml',
1647 ],
1648 'type' => 'list',
1649 ];
1650
1656 public const CheckFileExtensions = [
1657 'default' => true,
1658 ];
1659
1666 public const StrictFileExtensions = [
1667 'default' => true,
1668 ];
1669
1676 public const DisableUploadScriptChecks = [
1677 'default' => false,
1678 ];
1679
1683 public const UploadSizeWarning = [
1684 'default' => false,
1685 ];
1686
1698 public const TrustedMediaFormats = [
1699 'default' => [
1700 MEDIATYPE_BITMAP, // all bitmap formats
1701 MEDIATYPE_AUDIO, // all audio formats
1702 MEDIATYPE_VIDEO, // all plain video formats
1703 "image/svg+xml", // svg (only needed if inline rendering of svg is not supported)
1704 "application/pdf", // PDF files
1705 # "application/x-shockwave-flash", //flash/shockwave movie
1706 ],
1707 'type' => 'list',
1708 ];
1709
1718 public const MediaHandlers = [
1719 'default' => [],
1720 'type' => 'map',
1721 ];
1722
1729 public const NativeImageLazyLoading = [
1730 'default' => false,
1731 'type' => 'boolean',
1732 ];
1733
1738 public const ParserTestMediaHandlers = [
1739 'default' => [
1740 'image/jpeg' => 'MockBitmapHandler',
1741 'image/png' => 'MockBitmapHandler',
1742 'image/gif' => 'MockBitmapHandler',
1743 'image/tiff' => 'MockBitmapHandler',
1744 'image/webp' => 'MockBitmapHandler',
1745 'image/x-ms-bmp' => 'MockBitmapHandler',
1746 'image/x-bmp' => 'MockBitmapHandler',
1747 'image/x-xcf' => 'MockBitmapHandler',
1748 'image/svg+xml' => 'MockSvgHandler',
1749 'image/vnd.djvu' => 'MockDjVuHandler',
1750 ],
1751 'type' => 'map',
1752 ];
1753
1759 public const UseImageResize = [
1760 'default' => true,
1761 ];
1762
1772 public const UseImageMagick = [
1773 'default' => false,
1774 ];
1775
1779 public const ImageMagickConvertCommand = [
1780 'default' => '/usr/bin/convert',
1781 ];
1782
1788 public const MaxInterlacingAreas = [
1789 'default' => [],
1790 'type' => 'map',
1791 ];
1792
1796 public const SharpenParameter = [
1797 'default' => '0x0.4',
1798 ];
1799
1803 public const SharpenReductionThreshold = [
1804 'default' => 0.85,
1805 ];
1806
1811 public const ImageMagickTempDir = [
1812 'default' => false,
1813 ];
1814
1827 public const CustomConvertCommand = [
1828 'default' => false,
1829 ];
1830
1836 public const JpegTran = [
1837 'default' => '/usr/bin/jpegtran',
1838 ];
1839
1859 public const JpegPixelFormat = [
1860 'default' => 'yuv420',
1861 ];
1862
1870 public const JpegQuality = [
1871 'default' => 80,
1872 ];
1873
1878 public const Exiv2Command = [
1879 'default' => '/usr/bin/exiv2',
1880 ];
1881
1887 public const Exiftool = [
1888 'default' => '/usr/bin/exiftool',
1889 ];
1890
1901 public const SVGConverters = [
1902 'default' => [
1903 'ImageMagick' => '$path/convert -background "#ffffff00" -thumbnail $widthx$height\\! $input PNG:$output',
1904 'sodipodi' => '$path/sodipodi -z -w $width -f $input -e $output',
1905 'inkscape' => '$path/inkscape -z -w $width -f $input -e $output',
1906 'batik' => 'java -Djava.awt.headless=true -jar $path/batik-rasterizer.jar -w $width -d $output $input',
1907 'rsvg' => '$path/rsvg-convert -w $width -h $height -o $output $input',
1908 'imgserv' => '$path/imgserv-wrapper -i svg -o png -w$width $input $output',
1909 'ImagickExt' => [ 'SvgHandler::rasterizeImagickExt', ],
1910 ],
1911 'type' => 'map',
1912 ];
1913
1917 public const SVGConverter = [
1918 'default' => 'ImageMagick',
1919 ];
1920
1924 public const SVGConverterPath = [
1925 'default' => '',
1926 ];
1927
1931 public const SVGMaxSize = [
1932 'default' => 5120,
1933 ];
1934
1940 public const SVGMetadataCutoff = [
1941 'default' => 262144,
1942 ];
1943
1953 public const MediaInTargetLanguage = [
1954 'default' => true,
1955 ];
1956
1974 public const MaxImageArea = [
1975 'default' => 12500000,
1976 'type' => 'string|integer|false',
1977 ];
1978
1987 public const MaxAnimatedGifArea = [
1988 'default' => 12500000,
1989 ];
1990
2006 public const TiffThumbnailType = [
2007 'default' => [],
2008 'type' => 'list',
2009 'mergeStrategy' => 'replace',
2010 ];
2011
2019 public const ThumbnailEpoch = [
2020 'default' => '20030516000000',
2021 ];
2022
2030 public const AttemptFailureEpoch = [
2031 'default' => 1,
2032 ];
2033
2045 public const IgnoreImageErrors = [
2046 'default' => false,
2047 ];
2048
2069 public const GenerateThumbnailOnParse = [
2070 'default' => true,
2071 'type' => 'boolean',
2072 ];
2073
2077 public const ShowArchiveThumbnails = [
2078 'default' => true,
2079 ];
2080
2086 public const EnableAutoRotation = [
2087 'default' => null,
2088 'type' => '?boolean',
2089 ];
2090
2096 public const Antivirus = [
2097 'default' => null,
2098 'type' => '?string',
2099 ];
2100
2136 public const AntivirusSetup = [
2137 'default' => [
2138 # setup for clamav
2139 'clamav' => [
2140 'command' => 'clamscan --no-summary ',
2141 'codemap' => [
2142 "0" => AV_NO_VIRUS, # no virus
2143 "1" => AV_VIRUS_FOUND, # virus found
2144 "52" => AV_SCAN_ABORTED, # unsupported file format (probably immune)
2145 "*" => AV_SCAN_FAILED, # else scan failed
2146 ],
2147 'messagepattern' => '/.*?:(.*)/sim',
2148 ],
2149 ],
2150 'type' => 'map',
2151 ];
2152
2156 public const AntivirusRequired = [
2157 'default' => true,
2158 ];
2159
2163 public const VerifyMimeType = [
2164 'default' => true,
2165 ];
2166
2176 public const VerifyMimeTypeIE = [
2177 'default' => true,
2178 ];
2179
2190 public const MimeTypeFile = [
2191 'default' => 'internal',
2192 ];
2193
2199 public const MimeInfoFile = [
2200 'default' => 'internal',
2201 ];
2202
2216 public const MimeDetectorCommand = [
2217 'default' => null,
2218 'type' => '?string',
2219 ];
2220
2226 public const TrivialMimeDetection = [
2227 'default' => false,
2228 ];
2229
2235 public const XMLMimeTypes = [
2236 'default' => [
2237 'http://www.w3.org/2000/svg:svg' => 'image/svg+xml',
2238 'svg' => 'image/svg+xml',
2239 'http://www.lysator.liu.se/~alla/dia/:diagram' => 'application/x-dia-diagram',
2240 'http://www.w3.org/1999/xhtml:html' => 'text/html',
2241 'html' => 'text/html',
2242 ],
2243 'type' => 'map',
2244 ];
2245
2256 public const ImageLimits = [
2257 'default' => [
2258 [ 320, 240 ],
2259 [ 640, 480 ],
2260 [ 800, 600 ],
2261 [ 1024, 768 ],
2262 [ 1280, 1024 ],
2263 [ 2560, 2048 ],
2264 ],
2265 'type' => 'list',
2266 ];
2267
2273 public const ThumbLimits = [
2274 'default' => [
2275 120,
2276 150,
2277 180,
2278 200,
2279 250,
2280 300
2281 ],
2282 'type' => 'list',
2283 ];
2284
2295 public const ThumbnailBuckets = [
2296 'default' => null,
2297 'type' => '?list',
2298 ];
2299
2315 public const ThumbnailMinimumBucketDistance = [
2316 'default' => 50,
2317 ];
2318
2328 public const UploadThumbnailRenderMap = [
2329 'default' => [],
2330 'type' => 'map',
2331 ];
2332
2344 public const UploadThumbnailRenderMethod = [
2345 'default' => 'jobqueue',
2346 ];
2347
2354 public const UploadThumbnailRenderHttpCustomHost = [
2355 'default' => false,
2356 ];
2357
2364 public const UploadThumbnailRenderHttpCustomDomain = [
2365 'default' => false,
2366 ];
2367
2375 public const UseTinyRGBForJPGThumbnails = [
2376 'default' => false,
2377 ];
2378
2394 public const GalleryOptions = [
2395 'default' => [],
2396 'type' => 'map',
2397 ];
2398
2404 public const ThumbUpright = [
2405 'default' => 0.75,
2406 ];
2407
2411 public const DirectoryMode = [
2412 'default' => 0777, // octal!
2413 ];
2414
2421 public const ResponsiveImages = [
2422 'default' => true,
2423 ];
2424
2441 public const ImagePreconnect = [
2442 'default' => false,
2443 ];
2444
2445 /***************************************************************************/
2446 // region DJVU settings
2454 public const DjvuDump = [
2455 'default' => null,
2456 'type' => '?string',
2457 ];
2458
2464 public const DjvuRenderer = [
2465 'default' => null,
2466 'type' => '?string',
2467 ];
2468
2474 public const DjvuTxt = [
2475 'default' => null,
2476 'type' => '?string',
2477 ];
2478
2484 public const DjvuPostProcessor = [
2485 'default' => 'pnmtojpeg',
2486 'type' => '?string',
2487 ];
2488
2492 public const DjvuOutputExtension = [
2493 'default' => 'jpg',
2494 ];
2495
2496 // endregion -- end of DJvu
2497
2498 // endregion -- end of file uploads
2499
2500 /***************************************************************************/
2501 // region Email settings
2509 public const EmergencyContact = [
2510 'default' => false,
2511 ];
2512
2521 public const PasswordSender = [
2522 'default' => false,
2523 ];
2524
2530 public const NoReplyAddress = [
2531 'default' => false,
2532 ];
2533
2539 public const EnableEmail = [
2540 'default' => true,
2541 ];
2542
2548 public const EnableUserEmail = [
2549 'default' => true,
2550 ];
2551
2559 public const EnableSpecialMute = [
2560 'default' => false,
2561 ];
2562
2568 public const EnableUserEmailMuteList = [
2569 'default' => false,
2570 ];
2571
2581 public const UserEmailUseReplyTo = [
2582 'default' => true,
2583 ];
2584
2589 public const PasswordReminderResendTime = [
2590 'default' => 24,
2591 ];
2592
2596 public const NewPasswordExpiry = [
2597 'default' => 3600 * 24 * 7,
2598 ];
2599
2603 public const UserEmailConfirmationTokenExpiry = [
2604 'default' => 7 * 24 * 60 * 60,
2605 ];
2606
2611 public const PasswordExpirationDays = [
2612 'default' => false,
2613 ];
2614
2619 public const PasswordExpireGrace = [
2620 'default' => 3600 * 24 * 7,
2621 ];
2622
2640 public const SMTP = [
2641 'default' => false,
2642 'type' => 'false|map',
2643 ];
2644
2648 public const AdditionalMailParams = [
2649 'default' => null,
2650 ];
2651
2656 public const AllowHTMLEmail = [
2657 'default' => false,
2658 ];
2659
2669 public const EnotifFromEditor = [
2670 'default' => false,
2671 'type' => 'boolean',
2672 ];
2673
2680 public const EmailAuthentication = [
2681 'default' => true,
2682 ];
2683
2687 public const EnotifWatchlist = [
2688 'default' => false,
2689 ];
2690
2698 public const EnotifUserTalk = [
2699 'default' => false,
2700 ];
2701
2714 public const EnotifRevealEditorAddress = [
2715 'default' => false,
2716 'type' => 'boolean',
2717 ];
2718
2732 public const EnotifMinorEdits = [
2733 'default' => true,
2734 ];
2735
2743 public const EnotifImpersonal = [
2744 'default' => false,
2745 ];
2746
2751 public const EnotifMaxRecips = [
2752 'default' => 500,
2753 ];
2754
2758 public const EnotifUseRealName = [
2759 'default' => false,
2760 ];
2761
2766 public const UsersNotifiedOnAllChanges = [
2767 'default' => [],
2768 'type' => 'map',
2769 ];
2770
2771 // endregion -- end of email settings
2772
2773 /***************************************************************************/
2774 // region Database settings
2785 public const DBname = [
2786 'default' => 'my_wiki',
2787 ];
2788
2797 public const DBmwschema = [
2798 'default' => null,
2799 'type' => '?string',
2800 ];
2801
2810 public const DBprefix = [
2811 'default' => '',
2812 ];
2813
2817 public const DBserver = [
2818 'default' => 'localhost',
2819 ];
2820
2824 public const DBport = [
2825 'default' => 5432,
2826 ];
2827
2831 public const DBuser = [
2832 'default' => 'wikiuser',
2833 ];
2834
2838 public const DBpassword = [
2839 'default' => '',
2840 ];
2841
2845 public const DBtype = [
2846 'default' => 'mysql',
2847 ];
2848
2856 public const DBssl = [
2857 'default' => false,
2858 ];
2859
2868 public const DBcompress = [
2869 'default' => false,
2870 ];
2871
2875 public const DBadminuser = [
2876 'default' => null,
2877 ];
2878
2882 public const DBadminpassword = [
2883 'default' => null,
2884 ];
2885
2897 public const SearchType = [
2898 'default' => null,
2899 ];
2900
2913 public const SearchTypeAlternatives = [
2914 'default' => null,
2915 ];
2916
2920 public const DBTableOptions = [
2921 'default' => 'ENGINE=InnoDB, DEFAULT CHARSET=binary',
2922 ];
2923
2931 public const SQLMode = [
2932 'default' => '',
2933 ];
2934
2942 public const DBDefaultGroup = [
2943 'default' => null,
2944 ];
2945
2949 public const SQLiteDataDir = [
2950 'default' => '',
2951 ];
2952
2973 public const SharedDB = [
2974 'default' => null,
2975 ];
2976
2980 public const SharedPrefix = [
2981 'default' => false,
2982 'dynamicDefault' => [ 'use' => [ 'DBprefix' ] ]
2983 ];
2984
2989 public static function getDefaultSharedPrefix( $dbPrefix ) {
2990 return $dbPrefix;
2991 }
2992
2997 public const SharedTables = [
2998 'default' => [
2999 'user',
3000 'user_properties',
3001 'user_autocreate_serial',
3002 ],
3003 'type' => 'list',
3004 ];
3005
3010 public const SharedSchema = [
3011 'default' => false,
3012 'dynamicDefault' => [ 'use' => [ 'DBmwschema' ] ]
3013 ];
3014
3019 public static function getDefaultSharedSchema( $dbMwschema ) {
3020 return $dbMwschema;
3021 }
3022
3077 public const DBservers = [
3078 'default' => false,
3079 'type' => 'false|list',
3080 ];
3081
3093 public const LBFactoryConf = [
3094 'default' => [
3095 'class' => 'Wikimedia\\Rdbms\\LBFactorySimple',
3096 ],
3097 'type' => 'map',
3098 'mergeStrategy' => 'replace',
3099 ];
3100
3112 public const DataCenterUpdateStickTTL = [
3113 'default' => 10,
3114 ];
3115
3119 public const DBerrorLog = [
3120 'default' => false,
3121 ];
3122
3143 public const DBerrorLogTZ = [
3144 'default' => false,
3145 'dynamicDefault' => [ 'use' => [ 'Localtimezone' ] ]
3146 ];
3147
3148 public static function getDefaultDBerrorLogTZ( $localtimezone ) {
3149 // NOTE: Extra fallback, in case $localtimezone is ''.
3150 // Many extsing LocalSettings files have $wgLocaltimezone = ''
3151 // in them, erroneously generated by the installer.
3152 return $localtimezone ?: self::getDefaultLocaltimezone();
3153 }
3154
3168 public const LocalDatabases = [
3169 'default' => [],
3170 'type' => 'list',
3171 'items' => [ 'type' => 'string', ],
3172 ];
3173
3181 public const DatabaseReplicaLagWarning = [
3182 'default' => 10,
3183 ];
3184
3189 public const DatabaseReplicaLagCritical = [
3190 'default' => 30,
3191 ];
3192
3199 public const MaxExecutionTimeForExpensiveQueries = [
3200 'default' => 0,
3201 ];
3202
3217 public const TemplateLinksSchemaMigrationStage = [
3219 'type' => 'integer',
3220 ];
3221
3222 // endregion -- End of DB settings
3223
3224 /***************************************************************************/
3225 // region Content handlers and storage
3236 public const ContentHandlers = [
3237 'default' =>
3238 [
3239 // the usual case
3240 CONTENT_MODEL_WIKITEXT => WikitextContentHandler::class,
3241 // dumb version, no syntax highlighting
3242 CONTENT_MODEL_JAVASCRIPT => JavaScriptContentHandler::class,
3243 // simple implementation, for use by extensions, etc.
3244 CONTENT_MODEL_JSON => JsonContentHandler::class,
3245 // dumb version, no syntax highlighting
3246 CONTENT_MODEL_CSS => CssContentHandler::class,
3247 // plain text, for use by extensions, etc.
3248 CONTENT_MODEL_TEXT => TextContentHandler::class,
3249 // fallback for unknown models, from imports or extensions that were removed
3250 CONTENT_MODEL_UNKNOWN => FallbackContentHandler::class,
3251 ],
3252 'type' => 'map',
3253 ];
3254
3266 public const NamespaceContentModels = [
3267 'default' => [],
3268 'type' => 'map',
3269 ];
3270
3282 public const ContentHandlerTextFallback = [
3283 'default' => 'ignore',
3284 'deprecated' => 'since 1.37',
3285 ];
3286
3302 public const TextModelsToParse = [
3303 'default' => [
3304 CONTENT_MODEL_WIKITEXT, // Just for completeness, wikitext will always be parsed.
3305 CONTENT_MODEL_JAVASCRIPT, // Make categories etc work, people put them into comments.
3306 CONTENT_MODEL_CSS, // Make categories etc work, people put them into comments.
3307 ],
3308 'type' => 'list',
3309 ];
3310
3317 public const CompressRevisions = [
3318 'default' => false,
3319 ];
3320
3330 public const ExternalStores = [
3331 'default' => [],
3332 'type' => 'list',
3333 ];
3334
3354 public const ExternalServers = [
3355 'default' => [],
3356 'type' => 'map',
3357 ];
3358
3371 public const DefaultExternalStore = [
3372 'default' => false,
3373 'type' => 'list|false',
3374 ];
3375
3382 public const RevisionCacheExpiry = [
3383 'default' => 86400 * 7,
3384 'type' => 'integer',
3385 ];
3386
3393 public const PageLanguageUseDB = [
3394 'default' => false,
3395 'type' => 'boolean',
3396 ];
3397
3410 public const DiffEngine = [
3411 'default' => null,
3412 'type' => '?string',
3413 ];
3414
3418 public const ExternalDiffEngine = [
3419 'default' => false,
3420 'type' => 'string|false',
3421 ];
3422
3423 // endregion -- end of Content handlers and storage
3424
3425 /***************************************************************************/
3426 // region Performance hacks and limits
3438 public const RequestTimeLimit = [
3439 'default' => null,
3440 'type' => '?integer',
3441 ];
3442
3452 public const TransactionalTimeLimit = [
3453 'default' => 120,
3454 ];
3455
3470 public const CriticalSectionTimeLimit = [
3471 'default' => 180.0,
3472 'type' => 'float',
3473 ];
3474
3478 public const MiserMode = [
3479 'default' => false,
3480 ];
3481
3485 public const DisableQueryPages = [
3486 'default' => false,
3487 ];
3488
3492 public const QueryCacheLimit = [
3493 'default' => 1000,
3494 ];
3495
3499 public const WantedPagesThreshold = [
3500 'default' => 1,
3501 ];
3502
3506 public const AllowSlowParserFunctions = [
3507 'default' => false,
3508 ];
3509
3513 public const AllowSchemaUpdates = [
3514 'default' => true,
3515 ];
3516
3520 public const MaxArticleSize = [
3521 'default' => 2048,
3522 ];
3523
3528 public const MemoryLimit = [
3529 'default' => '50M',
3530 ];
3531
3567 public const PoolCounterConf = [
3568 'default' => null,
3569 'type' => '?map',
3570 ];
3571
3579 public const MaxUserDBWriteDuration = [
3580 'default' => false,
3581 'type' => 'integer|false',
3582 ];
3583
3591 public const MaxJobDBWriteDuration = [
3592 'default' => false,
3593 'type' => 'integer|false',
3594 ];
3595
3600 public const LinkHolderBatchSize = [
3601 'default' => 1000,
3602 ];
3603
3607 public const MaximumMovedPages = [
3608 'default' => 100,
3609 ];
3610
3623 public const ForceDeferredUpdatesPreSend = [
3624 'default' => false,
3625 ];
3626
3636 public const MultiShardSiteStats = [
3637 'default' => false,
3638 'type' => 'boolean',
3639 ];
3640
3641 // endregion -- end performance hacks
3642
3643 /***************************************************************************/
3644 // region Cache settings
3655 public const CacheDirectory = [
3656 'default' => false,
3657 ];
3658
3676 public const MainCacheType = [
3677 'default' => CACHE_NONE,
3678 ];
3679
3686 public const MessageCacheType = [
3687 'default' => CACHE_ANYTHING,
3688 ];
3689
3696 public const ParserCacheType = [
3697 'default' => CACHE_ANYTHING,
3698 ];
3699
3707 public const SessionCacheType = [
3708 'default' => CACHE_ANYTHING,
3709 ];
3710
3719 public const LanguageConverterCacheType = [
3720 'default' => CACHE_ANYTHING,
3721 ];
3722
3727 public const StatsCacheType = [
3728 'default' => CACHE_ANYTHING,
3729 ];
3730
3795 public const ObjectCaches = [
3796 'default' => [
3797 CACHE_NONE => [ 'class' => EmptyBagOStuff::class, 'reportDupes' => false ],
3798 CACHE_DB => [ 'class' => SqlBagOStuff::class, 'loggroup' => 'SQLBagOStuff' ],
3799
3800 CACHE_ANYTHING => [ 'factory' => 'ObjectCache::newAnything' ],
3801 CACHE_ACCEL => [ 'factory' => 'ObjectCache::getLocalServerInstance' ],
3802
3803 'db-replicated' => [
3804 'class' => ReplicatedBagOStuff::class,
3805 'readFactory' => [
3806 'factory' => 'ObjectCache::newFromParams',
3807 'args' => [ [ 'class' => SqlBagOStuff::class, 'replicaOnly' => true ] ]
3808 ],
3809 'writeFactory' => [
3810 'factory' => 'ObjectCache::newFromParams',
3811 'args' => [ [ 'class' => SqlBagOStuff::class, 'replicaOnly' => false ] ]
3812 ],
3813 'loggroup' => 'SQLBagOStuff',
3814 'reportDupes' => false
3815 ],
3816 'memcached-php' => [ 'class' => MemcachedPhpBagOStuff::class, 'loggroup' => 'memcached' ],
3817 'memcached-pecl' => [ 'class' => MemcachedPeclBagOStuff::class, 'loggroup' => 'memcached' ],
3818 'hash' => [ 'class' => HashBagOStuff::class, 'reportDupes' => false ],
3819
3820 // Deprecated since 1.35.
3821 // - To configure a wg*CacheType variable to use the local server cache,
3822 // use CACHE_ACCEL instead, which will select these automatically.
3823 // - To access the object for the local server cache at run-time,
3824 // use MediaWikiServices::getLocalServerObjectCache()
3825 // instead of e.g. ObjectCache::getInstance( 'apcu' ).
3826 // - To instantiate a new one of these explicitly, do so directly
3827 // by using `new APCUBagOStuff( [ … ] )`
3828 // - To instantiate a new one of these including auto-detection and fallback,
3829 // use ObjectCache::makeLocalServerCache().
3830 'apc' => [ 'class' => APCUBagOStuff::class, 'reportDupes' => false ],
3831 'apcu' => [ 'class' => APCUBagOStuff::class, 'reportDupes' => false ],
3832 'wincache' => [ 'class' => WinCacheBagOStuff::class, 'reportDupes' => false ],
3833 ],
3834 'type' => 'map',
3835 ];
3836
3859 public const MainWANCache = [
3860 'default' => false,
3861 'type' => 'integer|string|false',
3862 ];
3863
3890 public const WANObjectCaches = [
3891 'default' => [
3892 CACHE_NONE => [
3893 'class' => WANObjectCache::class,
3894 'cacheId' => CACHE_NONE,
3895 ]
3896 ],
3897 'type' => 'map',
3898 ];
3899
3910 public const EnableWANCacheReaper = [
3911 'default' => false,
3912 'type' => 'boolean',
3913 ];
3914
3943 public const MainStash = [
3944 'default' => 'db-replicated',
3945 ];
3946
3975 public const ParsoidCacheConfig = [
3976 'type' => 'object',
3977 'properties' => [
3978 'StashType' => [ 'type' => 'int|string|null', 'default' => null ],
3979 'StashDuration' => [ 'type' => 'int', 'default' => 24 * 60 * 60 ],
3980 'CacheThresholdTime' => [ 'type' => 'float', 'default' => 0.0 ],
3981 'WarmParsoidParserCache' => [ 'type' => 'bool', 'default' => false ],
3982 ]
3983 ];
3984
4000 public const ChronologyProtectorStash = [
4001 'default' => null,
4002 'type' => '?string',
4003 ];
4004
4010 public const ParserCacheExpireTime = [
4011 'default' => 60 * 60 * 24,
4012 ];
4013
4019 public const OldRevisionParserCacheExpireTime = [
4020 'default' => 60 * 60,
4021 ];
4022
4026 public const ObjectCacheSessionExpiry = [
4027 'default' => 60 * 60,
4028 ];
4029
4042 public const PHPSessionHandling = [
4043 'default' => 'enable',
4044 'type' => 'string',
4045 ];
4046
4054 public const SuspiciousIpExpiry = [
4055 'default' => false,
4056 'type' => 'integer|false',
4057 ];
4058
4064 public const SessionPbkdf2Iterations = [
4065 'default' => 10001,
4066 ];
4067
4071 public const MemCachedServers = [
4072 'default' => [ '127.0.0.1:11211', ],
4073 'type' => 'list',
4074 ];
4075
4080 public const MemCachedPersistent = [
4081 'default' => false,
4082 ];
4083
4087 public const MemCachedTimeout = [
4088 'default' => 500000,
4089 ];
4090
4102 public const UseLocalMessageCache = [
4103 'default' => false,
4104 ];
4105
4113 public const AdaptiveMessageCache = [
4114 'default' => false,
4115 ];
4116
4148 public const LocalisationCacheConf = [
4149 'properties' => [
4150 'class' => [ 'type' => 'string', 'default' => LocalisationCache::class ],
4151 'store' => [ 'type' => 'string', 'default' => 'detect' ],
4152 'storeClass' => [ 'type' => 'false|string', 'default' => false ],
4153 'storeDirectory' => [ 'type' => 'false|string', 'default' => false ],
4154 'storeServer' => [ 'type' => 'object', 'default' => [] ],
4155 'forceRecache' => [ 'type' => 'bool', 'default' => false ],
4156 'manualRecache' => [ 'type' => 'bool', 'default' => false ],
4157 ],
4158 'type' => 'object',
4159 ];
4160
4164 public const CachePages = [
4165 'default' => true,
4166 ];
4167
4177 public const CacheEpoch = [
4178 'default' => '20030516000000',
4179 ];
4180
4185 public const GitInfoCacheDirectory = [
4186 'default' => false,
4187 ];
4188
4194 public const UseFileCache = [
4195 'default' => false,
4196 ];
4197
4204 public const FileCacheDepth = [
4205 'default' => 2,
4206 ];
4207
4212 public const RenderHashAppend = [
4213 'default' => '',
4214 ];
4215
4225 public const EnableSidebarCache = [
4226 'default' => false,
4227 ];
4228
4232 public const SidebarCacheExpiry = [
4233 'default' => 86400,
4234 ];
4235
4242 public const UseGzip = [
4243 'default' => false,
4244 ];
4245
4255 public const InvalidateCacheOnLocalSettingsChange = [
4256 'default' => true,
4257 ];
4258
4273 public const ExtensionInfoMTime = [
4274 'default' => false,
4275 'type' => 'integer|false',
4276 ];
4277
4284 public const EnableRemoteBagOStuffTests = [
4285 'default' => false,
4286 ];
4287
4288 // endregion -- end of cache settings
4289
4290 /***************************************************************************/
4291 // region HTTP proxy (CDN) settings
4310 public const UseCdn = [
4311 'default' => false,
4312 ];
4313
4322 public const VaryOnXFP = [
4323 'default' => false,
4324 ];
4325
4335 public const InternalServer = [
4336 'default' => false,
4337 ];
4338
4348 public const CdnMaxAge = [
4349 'default' => 18000,
4350 ];
4351
4358 public const CdnMaxageLagged = [
4359 'default' => 30,
4360 ];
4361
4368 public const CdnMaxageStale = [
4369 'default' => 10,
4370 ];
4371
4387 public const CdnReboundPurgeDelay = [
4388 'default' => 0,
4389 ];
4390
4397 public const CdnMaxageSubstitute = [
4398 'default' => 60,
4399 ];
4400
4406 public const ForcedRawSMaxage = [
4407 'default' => 300,
4408 ];
4409
4420 public const CdnServers = [
4421 'default' => [],
4422 'type' => 'map',
4423 ];
4424
4433 public const CdnServersNoPurge = [
4434 'default' => [],
4435 'type' => 'map',
4436 ];
4437
4458 public const SquidPurgeUseHostHeader = [
4459 'default' => true,
4460 'deprecated' => 'since 1.33',
4461 ];
4462
4511 public const HTCPRouting = [
4512 'default' => [],
4513 'type' => 'map',
4514 ];
4515
4521 public const HTCPMulticastTTL = [
4522 'default' => 1,
4523 ];
4524
4528 public const UsePrivateIPs = [
4529 'default' => false,
4530 ];
4531
4543 public const CdnMatchParameterOrder = [
4544 'default' => true,
4545 ];
4546
4547 // endregion -- end of HTTP proxy settings
4548
4549 /***************************************************************************/
4550 // region Language, regional and character encoding settings
4570 public const LanguageCode = [
4571 'default' => 'en',
4572 ];
4573
4585 public const GrammarForms = [
4586 'default' => [],
4587 'type' => 'map',
4588 ];
4589
4593 public const InterwikiMagic = [
4594 'default' => true,
4595 ];
4596
4600 public const HideInterlanguageLinks = [
4601 'default' => false,
4602 ];
4603
4618 public const ExtraInterlanguageLinkPrefixes = [
4619 'default' => [],
4620 'type' => 'map',
4621 ];
4622
4630 public const InterlanguageLinkCodeMap = [
4631 'default' => [],
4632 'type' => 'map',
4633 ];
4634
4638 public const ExtraLanguageNames = [
4639 'default' => [],
4640 'type' => 'map',
4641 ];
4642
4657 public const ExtraLanguageCodes = [
4658 'default' => [
4659 'bh' => 'bho',
4660 'no' => 'nb',
4661 'simple' => 'en',
4662 ],
4663 'type' => 'map',
4664 ];
4665
4674 public const DummyLanguageCodes = [
4675 'default' => [],
4676 'type' => 'map',
4677 ];
4678
4686 public const AllUnicodeFixes = [
4687 'default' => false,
4688 ];
4689
4700 public const LegacyEncoding = [
4701 'default' => false,
4702 ];
4703
4708 public const AmericanDates = [
4709 'default' => false,
4710 ];
4711
4716 public const TranslateNumerals = [
4717 'default' => true,
4718 ];
4719
4725 public const UseDatabaseMessages = [
4726 'default' => true,
4727 ];
4728
4732 public const MaxMsgCacheEntrySize = [
4733 'default' => 10000,
4734 ];
4735
4739 public const DisableLangConversion = [
4740 'default' => false,
4741 ];
4742
4746 public const DisableTitleConversion = [
4747 'default' => false,
4748 ];
4749
4753 public const DefaultLanguageVariant = [
4754 'default' => false,
4755 ];
4756
4761 public const UsePigLatinVariant = [
4762 'default' => false,
4763 ];
4764
4775 public const DisabledVariants = [
4776 'default' => [],
4777 'type' => 'map',
4778 ];
4779
4798 public const VariantArticlePath = [
4799 'default' => false,
4800 ];
4801
4807 public const LoginLanguageSelector = [
4808 'default' => false,
4809 ];
4810
4831 public const ForceUIMsgAsContentMsg = [
4832 'default' => [],
4833 'type' => 'map',
4834 ];
4835
4848 public const RawHtmlMessages = [
4849 'default' => [
4850 'copyright',
4851 'history_copyright',
4852 'googlesearch',
4853 'youhavenewmessagesmanyusers',
4854 'youhavenewmessages',
4855 ],
4856 'type' => 'list',
4857 'items' => [ 'type' => 'string', ],
4858 ];
4859
4884 public const Localtimezone = [
4885 'dynamicDefault' => true,
4886 ];
4887
4888 public static function getDefaultLocaltimezone(): string {
4889 // This defaults to the `date.timezone` value of the PHP INI option. If this option is not set,
4890 // it falls back to UTC. Prior to PHP 7.0, this fallback produced a warning.
4891 $localtimezone = date_default_timezone_get();
4892 if ( !$localtimezone ) {
4893 // Make doubly sure we have a valid time zone, even if date_default_timezone_get()
4894 // returned garbage.
4895 $localtimezone = 'UTC';
4896 }
4897
4898 return $localtimezone;
4899 }
4900
4910 public const LocalTZoffset = [
4911 'dynamicDefault' => [ 'use' => [ 'Localtimezone' ] ]
4912 ];
4913
4914 public static function getDefaultLocalTZoffset( $localtimezone ): int {
4915 // NOTE: Extra fallback, in case $localtimezone is ''.
4916 // Many extsing LocalSettings files have $wgLocaltimezone = ''
4917 // in them, erroneously generated by the installer.
4918 $localtimezone = $localtimezone ?: self::getDefaultLocaltimezone();
4919
4920 $offset = ( new DateTimeZone( $localtimezone ) )->getOffset( new DateTime() );
4921 return (int)( $offset / 60 );
4922 }
4923
4933 public const OverrideUcfirstCharacters = [
4934 'default' => [],
4935 'type' => 'map',
4936 ];
4937
4938 // endregion -- End of language/charset settings
4939
4940 /***************************************************************************/
4941 // region Output format and skin settings
4947 public const MimeType = [
4948 'default' => 'text/html',
4949 ];
4950
4960 public const Html5Version = [
4961 'default' => null,
4962 ];
4963
4973 public const HTMLFormAllowTableFormat = [
4974 'default' => true,
4975 ];
4976
4985 public const UseMediaWikiUIEverywhere = [
4986 'default' => false,
4987 ];
4988
4996 public const EditSubmitButtonLabelPublish = [
4997 'default' => false,
4998 ];
4999
5016 public const XhtmlNamespaces = [
5017 'default' => [],
5018 'type' => 'map',
5019 ];
5020
5028 public const SiteNotice = [
5029 'default' => '',
5030 ];
5031
5044 public const BrowserFormatDetection = [
5045 'default' => 'telephone=no',
5046 'type' => 'string',
5047 ];
5048
5057 public const SkinMetaTags = [
5058 'default' => [],
5059 'type' => 'map',
5060 ];
5061
5066 public const DefaultSkin = [
5067 'default' => 'vector',
5068 ];
5069
5075 public const FallbackSkin = [
5076 'default' => 'fallback',
5077 ];
5078
5089 public const SkipSkins = [
5090 'default' => [],
5091 'type' => 'map',
5092 ];
5093
5097 public const DisableOutputCompression = [
5098 'default' => false,
5099 ];
5100
5130 public const FragmentMode = [
5131 'default' => [ 'html5', 'legacy', ],
5132 'type' => 'list',
5133 ];
5134
5143 public const ExternalInterwikiFragmentMode = [
5144 'default' => 'legacy',
5145 ];
5146
5178 public const FooterIcons = [
5179 'default' => [
5180 "copyright" => [
5181 "copyright" => [], // placeholder for the built in copyright icon
5182 ],
5183 "poweredby" => [
5184 "mediawiki" => [
5185 // Defaults to point at
5186 // "$wgResourceBasePath/resources/assets/poweredby_mediawiki_88x31.png"
5187 // plus srcset for 1.5x, 2x resolution variants.
5188 "src" => null,
5189 "url" => "https://www.mediawiki.org/",
5190 "alt" => "Powered by MediaWiki",
5191 ]
5192 ],
5193 ],
5194 'type' => 'map',
5195 ];
5196
5204 public const UseCombinedLoginLink = [
5205 'default' => false,
5206 ];
5207
5211 public const Edititis = [
5212 'default' => false,
5213 ];
5214
5226 public const Send404Code = [
5227 'default' => true,
5228 ];
5229
5240 public const ShowRollbackEditCount = [
5241 'default' => 10,
5242 ];
5243
5250 public const EnableCanonicalServerLink = [
5251 'default' => false,
5252 ];
5253
5254 // endregion -- End of output format settings
5255
5256 /***************************************************************************/
5257 // region ResourceLoader settings
5267 public const MangleFlashPolicy = [
5268 'default' => true,
5269 'deprecated' => 'since 1.39; no longer has any effect',
5270 ];
5271
5592 public const ResourceModules = [
5593 'default' => [],
5594 'type' => 'map',
5595 ];
5596
5691 public const ResourceModuleSkinStyles = [
5692 'default' => [],
5693 'type' => 'map',
5694 ];
5695
5707 public const ResourceLoaderSources = [
5708 'default' => [],
5709 'type' => 'map',
5710 ];
5711
5717 public const ResourceBasePath = [
5718 'default' => null,
5719 'dynamicDefault' => [ 'use' => [ 'ScriptPath' ] ]
5720 ];
5721
5726 public static function getDefaultResourceBasePath( $scriptPath ): string {
5727 return $scriptPath;
5728 }
5729
5742 public const ResourceLoaderMaxage = [
5743 'default' => [],
5744 'type' => 'map',
5745 ];
5746
5753 public const ResourceLoaderUseObjectCacheForDeps = [
5754 'default' => false,
5755 ];
5756
5762 public const ResourceLoaderDebug = [
5763 'default' => false,
5764 ];
5765
5778 public const ResourceLoaderMaxQueryLength = [
5779 'default' => false,
5780 'type' => 'integer|false',
5781 ];
5782
5790 public const ResourceLoaderValidateJS = [
5791 'default' => true,
5792 ];
5793
5802 public const ResourceLoaderEnableJSProfiler = [
5803 'default' => false,
5804 ];
5805
5810 public const ResourceLoaderStorageEnabled = [
5811 'default' => true,
5812 ];
5813
5820 public const ResourceLoaderStorageVersion = [
5821 'default' => 1,
5822 ];
5823
5835 public const AllowSiteCSSOnRestrictedPages = [
5836 'default' => false,
5837 ];
5838
5849 public const VueDevelopmentMode = [
5850 'default' => false,
5851 ];
5852
5853 // endregion -- End of ResourceLoader settings
5854
5855 /***************************************************************************/
5856 // region Page titles and redirects
5863 public const MetaNamespace = [
5864 'default' => false,
5865 'dynamicDefault' => [ 'use' => [ 'Sitename' ] ]
5866 ];
5867
5872 public static function getDefaultMetaNamespace( $sitename ): string {
5873 return str_replace( ' ', '_', $sitename );
5874 }
5875
5883 public const MetaNamespaceTalk = [
5884 'default' => false,
5885 ];
5886
5893 public const CanonicalNamespaceNames = [
5894 'default' => NamespaceInfo::CANONICAL_NAMES,
5895 'type' => 'map',
5896 ];
5897
5924 public const ExtraNamespaces = [
5925 'default' => [],
5926 'type' => 'map',
5927 ];
5928
5937 public const ExtraGenderNamespaces = [
5938 'default' => [],
5939 'type' => 'map',
5940 ];
5941
5964 public const NamespaceAliases = [
5965 'default' => [],
5966 'type' => 'map',
5967 ];
5968
5993 public const LegalTitleChars = [
5994 'default' => ' %!"$&\'()*,\\-.\\/0-9:;=?@A-Z\\\\^_`a-z~\\x80-\\xFF+',
5995 ];
5996
6004 public const CapitalLinks = [
6005 'default' => true,
6006 ];
6007
6022 public const CapitalLinkOverrides = [
6023 'default' => [],
6024 'type' => 'map',
6025 ];
6026
6031 public const NamespacesWithSubpages = [
6032 'default' => [
6033 NS_TALK => true,
6034 NS_USER => true,
6035 NS_USER_TALK => true,
6036 NS_PROJECT => true,
6037 NS_PROJECT_TALK => true,
6038 NS_FILE_TALK => true,
6039 NS_MEDIAWIKI => true,
6040 NS_MEDIAWIKI_TALK => true,
6041 NS_TEMPLATE => true,
6042 NS_TEMPLATE_TALK => true,
6043 NS_HELP => true,
6044 NS_HELP_TALK => true,
6046 ],
6047 'type' => 'map',
6048 ];
6049
6056 public const ContentNamespaces = [
6057 'default' => [ NS_MAIN ],
6058 'type' => 'list',
6059 ];
6060
6069 public const ShortPagesNamespaceExclusions = [
6070 'default' => [],
6071 'type' => 'list',
6072 ];
6073
6082 public const ExtraSignatureNamespaces = [
6083 'default' => [],
6084 'type' => 'list',
6085 ];
6086
6098 public const InvalidRedirectTargets = [
6099 'default' => [ 'Filepath', 'Mypage', 'Mytalk', 'Redirect' ],
6100 'type' => 'list',
6101 ];
6102
6111 public const DisableHardRedirects = [
6112 'default' => false,
6113 ];
6114
6120 public const FixDoubleRedirects = [
6121 'default' => false,
6122 ];
6123
6124 // endregion -- End of title and interwiki settings
6125
6126 /***************************************************************************/
6127 // region Interwiki links and sites
6136 public const LocalInterwikis = [
6137 'default' => [],
6138 'type' => 'list',
6139 ];
6140
6144 public const InterwikiExpiry = [
6145 'default' => 10800,
6146 ];
6147
6164 public const InterwikiCache = [
6165 'default' => false,
6166 'type' => 'false|map|string',
6167 'mergeStrategy' => 'replace',
6168 ];
6169
6177 public const InterwikiScopes = [
6178 'default' => 3,
6179 ];
6180
6184 public const InterwikiFallbackSite = [
6185 'default' => 'wiki',
6186 ];
6187
6204 public const RedirectSources = [
6205 'default' => false,
6206 ];
6207
6213 public const SiteTypes = [
6214 'default' => [ 'mediawiki' => MediaWikiSite::class, ],
6215 'type' => 'map',
6216 ];
6217
6218 // endregion -- Interwiki links and sites
6219
6220 /***************************************************************************/
6221 // region Parser settings
6229 public const MaxTocLevel = [
6230 'default' => 999,
6231 ];
6232
6237 public const MaxPPNodeCount = [
6238 'default' => 1000000,
6239 ];
6240
6248 public const MaxTemplateDepth = [
6249 'default' => 100,
6250 ];
6251
6255 public const MaxPPExpandDepth = [
6256 'default' => 100,
6257 ];
6258
6269 public const UrlProtocols = [
6270 'default' => [
6271 'bitcoin:', 'ftp://', 'ftps://', 'geo:', 'git://', 'gopher://', 'http://',
6272 'https://', 'irc://', 'ircs://', 'magnet:', 'mailto:', 'matrix:', 'mms://',
6273 'news:', 'nntp://', 'redis://', 'sftp://', 'sip:', 'sips:', 'sms:',
6274 'ssh://', 'svn://', 'tel:', 'telnet://', 'urn:', 'worldwind://', 'xmpp:',
6275 '//',
6276 ],
6277 'type' => 'list',
6278 ];
6279
6283 public const CleanSignatures = [
6284 'default' => true,
6285 ];
6286
6290 public const AllowExternalImages = [
6291 'default' => false,
6292 ];
6293
6308 public const AllowExternalImagesFrom = [
6309 'default' => '',
6310 ];
6311
6323 public const EnableImageWhitelist = [
6324 'default' => false,
6325 ];
6326
6338 public const AllowImageTag = [
6339 'default' => false,
6340 'deprecated' => 'since 1.35; register an extension tag named <img> instead.',
6341 ];
6342
6361 public const TidyConfig = [
6362 'default' => [],
6363 'type' => 'map',
6364 ];
6365
6374 public const ParsoidSettings = [
6375 'default' => [
6376 'useSelser' => true,
6377 ],
6378 'type' => 'map',
6379 ];
6380
6388 public const ParserEnableLegacyMediaDOM = [
6389 'default' => true,
6390 ];
6391
6400 public const UseContentMediaStyles = [
6401 'default' => false,
6402 ];
6403
6410 public const RawHtml = [
6411 'default' => false,
6412 ];
6413
6423 public const ExternalLinkTarget = [
6424 'default' => false,
6425 ];
6426
6433 public const NoFollowLinks = [
6434 'default' => true,
6435 ];
6436
6442 public const NoFollowNsExceptions = [
6443 'default' => [],
6444 'type' => 'list',
6445 ];
6446
6460 public const NoFollowDomainExceptions = [
6461 'default' => [ 'mediawiki.org', ],
6462 'type' => 'list',
6463 ];
6464
6469 public const RegisterInternalExternals = [
6470 'default' => false,
6471 ];
6472
6476 public const AllowDisplayTitle = [
6477 'default' => true,
6478 ];
6479
6485 public const RestrictDisplayTitle = [
6486 'default' => true,
6487 ];
6488
6493 public const ExpensiveParserFunctionLimit = [
6494 'default' => 100,
6495 ];
6496
6501 public const PreprocessorCacheThreshold = [
6502 'default' => 1000,
6503 ];
6504
6508 public const EnableScaryTranscluding = [
6509 'default' => false,
6510 ];
6511
6517 public const TranscludeCacheExpiry = [
6518 'default' => 3600,
6519 ];
6520
6527 public const EnableMagicLinks = [
6528 'default' => [
6529 'ISBN' => false,
6530 'PMID' => false,
6531 'RFC' => false,
6532 ],
6533 'type' => 'map',
6534 ];
6535
6536 // endregion -- end of parser settings
6537
6538 /***************************************************************************/
6539 // region Statistics and content analysis
6558 public const ArticleCountMethod = [
6559 'default' => 'link',
6560 ];
6561
6570 public const ActiveUserDays = [
6571 'default' => 30,
6572 ];
6573
6586 public const LearnerEdits = [
6587 'default' => 10,
6588 ];
6589
6595 public const LearnerMemberSince = [
6596 'default' => 4,
6597 ];
6598
6604 public const ExperiencedUserEdits = [
6605 'default' => 500,
6606 ];
6607
6613 public const ExperiencedUserMemberSince = [
6614 'default' => 30,
6615 ];
6616
6635 public const ManualRevertSearchRadius = [
6636 'default' => 15,
6637 'type' => 'integer',
6638 ];
6639
6652 public const RevertedTagMaxDepth = [
6653 'default' => 15,
6654 'type' => 'integer',
6655 ];
6656
6657 // endregion -- End of statistics and content analysis
6658
6659 /***************************************************************************/
6660 // region User accounts, authentication
6669 public const CentralIdLookupProviders = [
6670 'default' => [
6671 'local' => [
6672 'class' => LocalIdLookup::class,
6673 'services' => [
6674 'MainConfig',
6675 'DBLoadBalancer',
6676 ]
6677 ]
6678 ],
6679 'type' => 'map',
6680 ];
6681
6685 public const CentralIdLookupProvider = [
6686 'default' => 'local',
6687 'type' => 'string',
6688 ];
6689
6755 public const PasswordPolicy = [
6756 'default' => [
6757 'policies' => [
6758 'bureaucrat' => [
6759 'MinimalPasswordLength' => 10,
6760 'MinimumPasswordLengthToLogin' => 1,
6761 ],
6762 'sysop' => [
6763 'MinimalPasswordLength' => 10,
6764 'MinimumPasswordLengthToLogin' => 1,
6765 ],
6766 'interface-admin' => [
6767 'MinimalPasswordLength' => 10,
6768 'MinimumPasswordLengthToLogin' => 1,
6769 ],
6770 'bot' => [
6771 'MinimalPasswordLength' => 10,
6772 'MinimumPasswordLengthToLogin' => 1,
6773 ],
6774 'default' => [
6775 'MinimalPasswordLength' => [ 'value' => 1, 'suggestChangeOnLogin' => true ],
6776 'PasswordCannotBeSubstringInUsername' => [
6777 'value' => true,
6778 'suggestChangeOnLogin' => true
6779 ],
6780 'PasswordCannotMatchDefaults' => [ 'value' => true, 'suggestChangeOnLogin' => true ],
6781 'MaximalPasswordLength' => [ 'value' => 4096, 'suggestChangeOnLogin' => true ],
6782 'PasswordNotInCommonList' => [ 'value' => true, 'suggestChangeOnLogin' => true ],
6783 ],
6784 ],
6785 'checks' => [
6786 'MinimalPasswordLength' => 'PasswordPolicyChecks::checkMinimalPasswordLength',
6787 'MinimumPasswordLengthToLogin' => 'PasswordPolicyChecks::checkMinimumPasswordLengthToLogin',
6788 'PasswordCannotBeSubstringInUsername' =>
6789 'PasswordPolicyChecks::checkPasswordCannotBeSubstringInUsername',
6790 'PasswordCannotMatchDefaults' => 'PasswordPolicyChecks::checkPasswordCannotMatchDefaults',
6791 'MaximalPasswordLength' => 'PasswordPolicyChecks::checkMaximalPasswordLength',
6792 'PasswordNotInCommonList' => 'PasswordPolicyChecks::checkPasswordNotInCommonList',
6793 ],
6794 ],
6795 'type' => 'map',
6796 'mergeStrategy' => 'array_replace_recursive',
6797 ];
6798
6818 public const AuthManagerConfig = [
6819 'default' => null,
6820 'type' => '?map',
6821 ];
6822
6827 public const AuthManagerAutoConfig = [
6828 'default' => [
6829 'preauth' => [
6830 \MediaWiki\Auth\ThrottlePreAuthenticationProvider::class => [
6831 'class' => \MediaWiki\Auth\ThrottlePreAuthenticationProvider::class,
6832 'sort' => 0,
6833 ],
6834 ],
6835 'primaryauth' => [
6836 // TemporaryPasswordPrimaryAuthenticationProvider should come before
6837 // any other PasswordAuthenticationRequest-based
6838 // PrimaryAuthenticationProvider (or at least any that might return
6839 // FAIL rather than ABSTAIN for a wrong password), or password reset
6840 // won't work right. Do not remove this (or change the key) or
6841 // auto-configuration of other such providers in extensions will
6842 // probably auto-insert themselves in the wrong place.
6843 \MediaWiki\Auth\TemporaryPasswordPrimaryAuthenticationProvider::class => [
6844 'class' => \MediaWiki\Auth\TemporaryPasswordPrimaryAuthenticationProvider::class,
6845 'services' => [
6846 'DBLoadBalancer',
6847 'UserOptionsLookup',
6848 ],
6849 'args' => [ [
6850 // Fall through to LocalPasswordPrimaryAuthenticationProvider
6851 'authoritative' => false,
6852 ] ],
6853 'sort' => 0,
6854 ],
6855 \MediaWiki\Auth\LocalPasswordPrimaryAuthenticationProvider::class => [
6856 'class' => \MediaWiki\Auth\LocalPasswordPrimaryAuthenticationProvider::class,
6857 'services' => [
6858 'DBLoadBalancer',
6859 ],
6860 'args' => [ [
6861 // Last one should be authoritative, or else the user will get
6862 // a less-than-helpful error message (something like "supplied
6863 // authentication info not supported" rather than "wrong
6864 // password") if it too fails.
6865 'authoritative' => true,
6866 ] ],
6867 'sort' => 100,
6868 ],
6869 ],
6870 'secondaryauth' => [
6871 \MediaWiki\Auth\CheckBlocksSecondaryAuthenticationProvider::class => [
6872 'class' => \MediaWiki\Auth\CheckBlocksSecondaryAuthenticationProvider::class,
6873 'sort' => 0,
6874 ],
6875 \MediaWiki\Auth\ResetPasswordSecondaryAuthenticationProvider::class => [
6876 'class' => \MediaWiki\Auth\ResetPasswordSecondaryAuthenticationProvider::class,
6877 'sort' => 100,
6878 ],
6879 // Linking during login is experimental, enable at your own risk - T134952
6880 // MediaWiki\Auth\ConfirmLinkSecondaryAuthenticationProvider::class => [
6881 // 'class' => MediaWiki\Auth\ConfirmLinkSecondaryAuthenticationProvider::class,
6882 // 'sort' => 100,
6883 // ],
6884 \MediaWiki\Auth\EmailNotificationSecondaryAuthenticationProvider::class => [
6885 'class' => \MediaWiki\Auth\EmailNotificationSecondaryAuthenticationProvider::class,
6886 'services' => [
6887 'DBLoadBalancer',
6888 ],
6889 'sort' => 200,
6890 ],
6891 ],
6892 ],
6893 'type' => 'map',
6894 'mergeStrategy' => 'array_plus_2d',
6895 ];
6896
6907 public const RememberMe = [
6908 'default' => 'choose',
6909 'type' => 'string',
6910 ];
6911
6949 public const ReauthenticateTime = [
6950 'default' => [ 'default' => 300, ],
6951 'type' => 'map',
6952 'additionalProperties' => [ 'type' => 'integer', ],
6953 ];
6954
6969 public const AllowSecuritySensitiveOperationIfCannotReauthenticate = [
6970 'default' => [ 'default' => true, ],
6971 'type' => 'map',
6972 'additionalProperties' => [ 'type' => 'boolean', ],
6973 ];
6974
6985 public const ChangeCredentialsBlacklist = [
6986 'default' => [
6987 \MediaWiki\Auth\TemporaryPasswordAuthenticationRequest::class,
6988 ],
6989 'type' => 'list',
6990 'items' => [ 'type' => 'string', ],
6991 ];
6992
7003 public const RemoveCredentialsBlacklist = [
7004 'default' => [
7005 \MediaWiki\Auth\PasswordAuthenticationRequest::class,
7006 ],
7007 'type' => 'list',
7008 'items' => [ 'type' => 'string', ],
7009 ];
7010
7017 public const MinimalPasswordLength = [
7018 'default' => false,
7019 'deprecated' => 'since 1.26, use $wgPasswordPolicy\'s MinimalPasswordLength.',
7020 ];
7021
7033 public const MaximalPasswordLength = [
7034 'default' => false,
7035 'deprecated' => 'since 1.26, use $wgPasswordPolicy\'s MaximalPasswordLength.',
7036 ];
7037
7044 public const InvalidPasswordReset = [
7045 'default' => true,
7046 ];
7047
7056 public const PasswordDefault = [
7057 'default' => 'pbkdf2',
7058 ];
7059
7080 public const PasswordConfig = [
7081 'default' => [
7082 'A' => [
7083 'class' => MWOldPassword::class,
7084 ],
7085 'B' => [
7086 'class' => MWSaltedPassword::class,
7087 ],
7088 'pbkdf2-legacyA' => [
7089 'class' => LayeredParameterizedPassword::class,
7090 'types' => [
7091 'A',
7092 'pbkdf2',
7093 ],
7094 ],
7095 'pbkdf2-legacyB' => [
7096 'class' => LayeredParameterizedPassword::class,
7097 'types' => [
7098 'B',
7099 'pbkdf2',
7100 ],
7101 ],
7102 'bcrypt' => [
7103 'class' => BcryptPassword::class,
7104 'cost' => 9,
7105 ],
7106 'pbkdf2' => [
7107 'class' => Pbkdf2Password::class,
7108 'algo' => 'sha512',
7109 'cost' => '30000',
7110 'length' => '64',
7111 ],
7112 'argon2' => [
7113 'class' => Argon2Password::class,
7114
7115 // Algorithm used:
7116 // * 'argon2i' is optimized against side-channel attacks (PHP 7.2+)
7117 // * 'argon2id' is optimized against both side-channel and GPU cracking (PHP 7.3+)
7118 // * 'auto' to use best available algorithm. If you're using more than one server, be
7119 // careful when you're mixing PHP versions because newer PHP might generate hashes that
7120 // older versions might would not understand.
7121 'algo' => 'auto',
7122
7123 // The parameters below are the same as options accepted by password_hash().
7124 // Set them to override that function's defaults.
7125 //
7126 // 'memory_cost' => PASSWORD_ARGON2_DEFAULT_MEMORY_COST,
7127 // 'time_cost' => PASSWORD_ARGON2_DEFAULT_TIME_COST,
7128 // 'threads' => PASSWORD_ARGON2_DEFAULT_THREADS,
7129 ],
7130 ],
7131 'type' => 'map',
7132 ];
7133
7140 public const PasswordResetRoutes = [
7141 'default' => [
7142 'username' => true,
7143 'email' => true,
7144 ],
7145 'type' => 'map',
7146 ];
7147
7151 public const MaxSigChars = [
7152 'default' => 255,
7153 ];
7154
7167 public const SignatureValidation = [
7168 'default' => 'warning',
7169 ];
7170
7177 public const SignatureAllowedLintErrors = [
7178 'default' => [ 'obsolete-tag', ],
7179 'type' => 'list',
7180 ];
7181
7186 public const MaxNameChars = [
7187 'default' => 255,
7188 ];
7189
7196 public const ReservedUsernames = [
7197 'default' => [
7198 'MediaWiki default', // Default 'Main Page' and MediaWiki: message pages
7199 'Conversion script', // Used for the old Wikipedia software upgrade
7200 'Maintenance script', // Maintenance scripts which perform editing, image import script
7201 'Template namespace initialisation script', // Used in 1.2->1.3 upgrade
7202 'ScriptImporter', // Default user name used by maintenance/importSiteScripts.php
7203 'Delete page script', // Default user name used by maintenance/deleteBatch.php
7204 'Move page script', // Default user name used by maintenance/deleteBatch.php
7205 'Command line script', // Default user name used by maintenance/undelete.php
7206 'Unknown user', // Used in WikiImporter & RevisionStore for revisions with no author and in User for invalid user id
7207 'msg:double-redirect-fixer', // Automatic double redirect fix
7208 'msg:usermessage-editor', // Default user for leaving user messages
7209 'msg:proxyblocker', // For $wgProxyList and Special:Blockme (removed in 1.22)
7210 'msg:sorbs', // For $wgEnableDnsBlacklist etc.
7211 'msg:spambot_username', // Used by cleanupSpam.php
7212 'msg:autochange-username', // Used by anon category RC entries (parser functions, Lua & purges)
7213 ],
7214 'type' => 'list',
7215 ];
7216
7224 public const DefaultUserOptions = [
7225 'default' =>
7226 [
7227 'ccmeonemails' => 0,
7228 'date' => 'default',
7229 'diffonly' => 0,
7230 'disablemail' => 0,
7231 'editfont' => 'monospace',
7232 'editondblclick' => 0,
7233 'editsectiononrightclick' => 0,
7234 'email-allow-new-users' => 1,
7235 'enotifminoredits' => 0,
7236 'enotifrevealaddr' => 0,
7237 'enotifusertalkpages' => 1,
7238 'enotifwatchlistpages' => 1,
7239 'extendwatchlist' => 1,
7240 'fancysig' => 0,
7241 'forceeditsummary' => 0,
7242 'gender' => 'unknown',
7243 'hideminor' => 0,
7244 'hidepatrolled' => 0,
7245 'hidecategorization' => 1,
7246 'imagesize' => 2,
7247 'minordefault' => 0,
7248 'newpageshidepatrolled' => 0,
7249 'nickname' => '',
7250 'pst-cssjs' => 1,
7251 'norollbackdiff' => 0,
7252 'previewonfirst' => 0,
7253 'previewontop' => 1,
7254 'rcdays' => 7,
7255 'rcenhancedfilters-disable' => 0,
7256 'rclimit' => 50,
7257 'search-match-redirect' => true,
7258 'search-special-page' => 'Search',
7259 'searchlimit' => 20,
7260 'showhiddencats' => 0,
7261 'shownumberswatching' => 1,
7262 'showrollbackconfirmation' => 0,
7263 'skin' => false,
7264 'thumbsize' => 5,
7265 'underline' => 2,
7266 'uselivepreview' => 0,
7267 'usenewrc' => 1,
7268 'watchcreations' => 1,
7269 'watchdefault' => 1,
7270 'watchdeletion' => 0,
7271 'watchuploads' => 1,
7272 'watchlistdays' => 7,
7273 'watchlisthideanons' => 0,
7274 'watchlisthidebots' => 0,
7275 'watchlisthideliu' => 0,
7276 'watchlisthideminor' => 0,
7277 'watchlisthideown' => 0,
7278 'watchlisthidepatrolled' => 0,
7279 'watchlisthidecategorization' => 1,
7280 'watchlistreloadautomatically' => 0,
7281 'watchlistunwatchlinks' => 0,
7282 'watchmoves' => 0,
7283 'watchrollback' => 0,
7284 'wlenhancedfilters-disable' => 0,
7285 'wllimit' => 250,
7286 'useeditwarning' => 1,
7287 'prefershttps' => 1,
7288 'requireemail' => 0,
7289 'skin-responsive' => 1,
7290 ],
7291 'type' => 'map',
7292 ];
7293
7297 public const HiddenPrefs = [
7298 'default' => [],
7299 'type' => 'list',
7300 ];
7301
7308 public const InvalidUsernameCharacters = [
7309 'default' => '@:>',
7310 ];
7311
7321 public const UserrightsInterwikiDelimiter = [
7322 'default' => '@',
7323 ];
7324
7333 public const SecureLogin = [
7334 'default' => false,
7335 ];
7336
7346 public const AuthenticationTokenVersion = [
7347 'default' => null,
7348 'type' => '?string',
7349 ];
7350
7360 public const SessionProviders = [
7361 'type' => 'map',
7362 'default' => [
7363 \MediaWiki\Session\CookieSessionProvider::class => [
7364 'class' => \MediaWiki\Session\CookieSessionProvider::class,
7365 'args' => [ [
7366 'priority' => 30,
7367 'callUserSetCookiesHook' => true,
7368 ] ],
7369 ],
7370 \MediaWiki\Session\BotPasswordSessionProvider::class => [
7371 'class' => \MediaWiki\Session\BotPasswordSessionProvider::class,
7372 'args' => [ [
7373 'priority' => 75,
7374 ] ],
7375 'services' => [
7376 'GrantsInfo'
7377 ],
7378 ],
7379 ],
7380 ];
7381
7389 public const AllowRequiringEmailForResets = [
7390 'default' => false,
7391 ];
7392
7440 public const AutoCreateTempUser = [
7441 'properties' => [
7442 'enabled' => [ 'type' => 'bool', 'default' => false ],
7443 'actions' => [ 'type' => 'list', 'default' => [ 'edit' ] ],
7444 'genPattern' => [ 'type' => 'string', 'default' => '*Unregistered $1' ],
7445 'matchPattern' => [ 'type' => 'string', 'default' => '*$1' ],
7446 'serialProvider' => [ 'type' => 'object', 'default' => [ 'type' => 'local' ] ],
7447 'serialMapping' => [ 'type' => 'object', 'default' => [ 'type' => 'plain-numeric' ] ]
7448 ],
7449 'type' => 'object',
7450 ];
7451
7452 // endregion -- end user accounts
7453
7454 /***************************************************************************/
7455 // region User rights, access control and monitoring
7461 public const AutoblockExpiry = [
7462 'default' => 86400,
7463 ];
7464
7472 public const BlockAllowsUTEdit = [
7473 'default' => true,
7474 ];
7475
7490 public const BlockCIDRLimit = [
7491 'default' => [
7492 'IPv4' => 16,
7493 'IPv6' => 19,
7494 ],
7495 'type' => 'map',
7496 ];
7497
7505 public const BlockDisablesLogin = [
7506 'default' => false,
7507 ];
7508
7514 public const EnablePartialActionBlocks = [
7515 'default' => false,
7516 'type' => 'boolean',
7517 ];
7518
7538 public const WhitelistRead = [
7539 'default' => false,
7540 ];
7541
7569 public const WhitelistReadRegexp = [
7570 'default' => false,
7571 ];
7572
7577 public const EmailConfirmToEdit = [
7578 'default' => false,
7579 ];
7580
7585 public const HideIdentifiableRedirects = [
7586 'default' => true,
7587 ];
7588
7613 public const GroupPermissions = [
7614 'type' => 'map',
7615 'additionalProperties' => [
7616 'type' => 'map',
7617 'additionalProperties' => [ 'type' => 'boolean', ],
7618 ],
7619 'mergeStrategy' => 'array_plus_2d',
7620 'default' => [
7621 '*' => [
7622 'createaccount' => true,
7623 'read' => true,
7624 'edit' => true,
7625 'createpage' => true,
7626 'createtalk' => true,
7627 'writeapi' => true,
7628 'viewmywatchlist' => true,
7629 'editmywatchlist' => true,
7630 'viewmyprivateinfo' => true,
7631 'editmyprivateinfo' => true,
7632 'editmyoptions' => true,
7633 ],
7634 'user' => [
7635 'move' => true,
7636 'move-subpages' => true,
7637 'move-rootuserpages' => true,
7638 'move-categorypages' => true,
7639 'movefile' => true,
7640 'read' => true,
7641 'edit' => true,
7642 'createpage' => true,
7643 'createtalk' => true,
7644 'writeapi' => true,
7645 'upload' => true,
7646 'reupload' => true,
7647 'reupload-shared' => true,
7648 'minoredit' => true,
7649 'editmyusercss' => true,
7650 'editmyuserjson' => true,
7651 'editmyuserjs' => true,
7652 'editmyuserjsredirect' => true,
7653 'purge' => true,
7654 'sendemail' => true,
7655 'applychangetags' => true,
7656 'changetags' => true,
7657 'editcontentmodel' => true,
7658 ],
7659 'autoconfirmed' => [
7660 'autoconfirmed' => true,
7661 'editsemiprotected' => true,
7662 ],
7663 'bot' => [
7664 'bot' => true,
7665 'autoconfirmed' => true,
7666 'editsemiprotected' => true,
7667 'nominornewtalk' => true,
7668 'autopatrol' => true,
7669 'suppressredirect' => true,
7670 'apihighlimits' => true,
7671 'writeapi' => true,
7672 ],
7673 'sysop' => [
7674 'block' => true,
7675 'createaccount' => true,
7676 'delete' => true,
7677 'bigdelete' => true,
7678 'deletedhistory' => true,
7679 'deletedtext' => true,
7680 'undelete' => true,
7681 'editinterface' => true,
7682 'editsitejson' => true,
7683 'edituserjson' => true,
7684 'import' => true,
7685 'importupload' => true,
7686 'move' => true,
7687 'move-subpages' => true,
7688 'move-rootuserpages' => true,
7689 'move-categorypages' => true,
7690 'patrol' => true,
7691 'autopatrol' => true,
7692 'protect' => true,
7693 'editprotected' => true,
7694 'rollback' => true,
7695 'upload' => true,
7696 'reupload' => true,
7697 'reupload-shared' => true,
7698 'unwatchedpages' => true,
7699 'autoconfirmed' => true,
7700 'editsemiprotected' => true,
7701 'ipblock-exempt' => true,
7702 'blockemail' => true,
7703 'markbotedits' => true,
7704 'apihighlimits' => true,
7705 'browsearchive' => true,
7706 'noratelimit' => true,
7707 'movefile' => true,
7708 'unblockself' => true,
7709 'suppressredirect' => true,
7710 'mergehistory' => true,
7711 'managechangetags' => true,
7712 'deletechangetags' => true,
7713 ],
7714 'interface-admin' => [
7715 'editinterface' => true,
7716 'editsitecss' => true,
7717 'editsitejson' => true,
7718 'editsitejs' => true,
7719 'editusercss' => true,
7720 'edituserjson' => true,
7721 'edituserjs' => true,
7722 ],
7723 'bureaucrat' => [
7724 'userrights' => true,
7725 'noratelimit' => true,
7726 ],
7727 'suppress' => [
7728 'hideuser' => true,
7729 'suppressrevision' => true,
7730 'viewsuppressed' => true,
7731 'suppressionlog' => true,
7732 'deleterevision' => true,
7733 'deletelogentry' => true,
7734 ],
7735 ],
7736 ];
7737
7745 public const PrivilegedGroups = [
7746 'default' => [
7747 'bureaucrat',
7748 'interface-admin',
7749 'suppress',
7750 'sysop',
7751 ],
7752 'type' => 'list',
7753 ];
7754
7764 public const RevokePermissions = [
7765 'default' => [],
7766 'type' => 'map',
7767 'mergeStrategy' => 'array_plus_2d',
7768 ];
7769
7789 public const GroupInheritsPermissions = [
7790 'default' => [],
7791 'type' => 'map',
7792 'additionalProperties' => [ 'type' => 'string', ],
7793 ];
7794
7798 public const ImplicitGroups = [
7799 'default' => [ '*', 'user', 'autoconfirmed' ],
7800 'type' => 'list',
7801 ];
7802
7827 public const GroupsAddToSelf = [
7828 'default' => [],
7829 'type' => 'map',
7830 ];
7831
7835 public const GroupsRemoveFromSelf = [
7836 'default' => [],
7837 'type' => 'map',
7838 ];
7839
7848 public const RestrictionTypes = [
7849 'default' => [ 'create', 'edit', 'move', 'upload' ],
7850 'type' => 'list',
7851 ];
7852
7864 public const RestrictionLevels = [
7865 'default' => [ '', 'autoconfirmed', 'sysop' ],
7866 'type' => 'list',
7867 ];
7868
7878 public const CascadingRestrictionLevels = [
7879 'default' => [ 'sysop', ],
7880 'type' => 'list',
7881 ];
7882
7895 public const SemiprotectedRestrictionLevels = [
7896 'default' => [ 'autoconfirmed', ],
7897 'type' => 'list',
7898 ];
7899
7907 public const NamespaceProtection = [
7908 'default' => [],
7909 'type' => 'map',
7910 ];
7911
7921 public const NonincludableNamespaces = [
7922 'default' => [],
7923 'type' => 'map',
7924 ];
7925
7949 public const AutoConfirmAge = [
7950 'default' => 0,
7951 ];
7952
7964 public const AutoConfirmCount = [
7965 'default' => 0,
7966 ];
7967
8025 public const Autopromote = [
8026 'default' => [
8027 'autoconfirmed' => [ '&',
8028 [ APCOND_EDITCOUNT, null ], // NOTE: null means $wgAutoConfirmCount
8029 [ APCOND_AGE, null ], // NOTE: null means AutoConfirmAge
8030 ],
8031 ],
8032 'type' => 'map',
8033 ];
8034
8055 public const AutopromoteOnce = [
8056 'default' => [ 'onEdit' => [], ],
8057 'type' => 'map',
8058 ];
8059
8065 public const AutopromoteOnceLogInRC = [
8066 'default' => true,
8067 ];
8068
8098 public const AddGroups = [
8099 'default' => [],
8100 'type' => 'map',
8101 ];
8102
8106 public const RemoveGroups = [
8107 'default' => [],
8108 'type' => 'map',
8109 ];
8110
8116 public const AvailableRights = [
8117 'default' => [],
8118 'type' => 'list',
8119 ];
8120
8125 public const DeleteRevisionsLimit = [
8126 'default' => 0,
8127 ];
8128
8134 public const DeleteRevisionsBatchSize = [
8135 'default' => 1000,
8136 ];
8137
8147 public const HideUserContribLimit = [
8148 'default' => 1000,
8149 ];
8150
8176 public const AccountCreationThrottle = [
8177 'default' => [ [
8178 'count' => 0,
8179 'seconds' => 86400,
8180 ] ],
8181 'type' => 'int|list',
8182 ];
8183
8194 public const SpamRegex = [
8195 'default' => [],
8196 'type' => 'list',
8197 ];
8198
8202 public const SummarySpamRegex = [
8203 'default' => [],
8204 'type' => 'list',
8205 ];
8206
8213 public const EnableDnsBlacklist = [
8214 'default' => false,
8215 ];
8216
8241 public const DnsBlacklistUrls = [
8242 'default' => [ 'http.dnsbl.sorbs.net.', ],
8243 'type' => 'list',
8244 ];
8245
8254 public const ProxyList = [
8255 'default' => [],
8256 'type' => 'string|list',
8257 ];
8258
8263 public const ProxyWhitelist = [
8264 'default' => [],
8265 'type' => 'list',
8266 ];
8267
8275 public const SoftBlockRanges = [
8276 'default' => [],
8277 'type' => 'list',
8278 'items' => [ 'type' => 'string', ],
8279 ];
8280
8286 public const ApplyIpBlocksToXff = [
8287 'default' => false,
8288 ];
8289
8331 public const RateLimits = [
8332 'default' => [
8333 // Page edits
8334 'edit' => [
8335 'ip' => [ 8, 60 ],
8336 'newbie' => [ 8, 60 ],
8337 'user' => [ 90, 60 ],
8338 ],
8339 // Page moves
8340 'move' => [
8341 'newbie' => [ 2, 120 ],
8342 'user' => [ 8, 60 ],
8343 ],
8344 // File uploads
8345 'upload' => [
8346 'ip' => [ 8, 60 ],
8347 'newbie' => [ 8, 60 ],
8348 ],
8349 // Page rollbacks
8350 'rollback' => [
8351 'user' => [ 10, 60 ],
8352 'newbie' => [ 5, 120 ]
8353 ],
8354 // Triggering password resets emails
8355 'mailpassword' => [
8356 'ip' => [ 5, 3600 ],
8357 ],
8358 // Emailing other users using MediaWiki
8359 'emailuser' => [
8360 'ip' => [ 5, 86400 ],
8361 'newbie' => [ 5, 86400 ],
8362 'user' => [ 20, 86400 ],
8363 ],
8364 'changeemail' => [
8365 'ip-all' => [ 10, 3600 ],
8366 'user' => [ 4, 86400 ]
8367 ],
8368 // since 1.33 - rate limit email confirmations
8369 'confirmemail' => [
8370 'ip-all' => [ 10, 3600 ],
8371 'user' => [ 4, 86400 ]
8372 ],
8373 // Purging pages
8374 'purge' => [
8375 'ip' => [ 30, 60 ],
8376 'user' => [ 30, 60 ],
8377 ],
8378 // Purges of link tables
8379 'linkpurge' => [
8380 'ip' => [ 30, 60 ],
8381 'user' => [ 30, 60 ],
8382 ],
8383 // Files rendered via thumb.php or thumb_handler.php
8384 'renderfile' => [
8385 'ip' => [ 700, 30 ],
8386 'user' => [ 700, 30 ],
8387 ],
8388 // Same as above but for non-standard thumbnails
8389 'renderfile-nonstandard' => [
8390 'ip' => [ 70, 30 ],
8391 'user' => [ 70, 30 ],
8392 ],
8393 // Stashing edits into cache before save
8394 'stashedit' => [
8395 'ip' => [ 30, 60 ],
8396 'newbie' => [ 30, 60 ],
8397 ],
8398 // Stash base HTML for VE edits
8399 'stashbasehtml' => [
8400 'ip' => [ 5, 60 ],
8401 'newbie' => [ 5, 60 ],
8402 ],
8403 // Adding or removing change tags
8404 'changetag' => [
8405 'ip' => [ 8, 60 ],
8406 'newbie' => [ 8, 60 ],
8407 ],
8408 // Changing the content model of a page
8409 'editcontentmodel' => [
8410 'newbie' => [ 2, 120 ],
8411 'user' => [ 8, 60 ],
8412 ],
8413 ],
8414 'type' => 'map',
8415 'mergeStrategy' => 'array_plus_2d',
8416 ];
8417
8423 public const RateLimitsExcludedIPs = [
8424 'default' => [],
8425 'type' => 'list',
8426 ];
8427
8433 public const PutIPinRC = [
8434 'default' => true,
8435 ];
8436
8441 public const QueryPageDefaultLimit = [
8442 'default' => 50,
8443 ];
8444
8457 public const PasswordAttemptThrottle = [
8458 'default' => [
8459 // Short term limit
8460 [ 'count' => 5, 'seconds' => 300 ],
8461 // Long term limit. We need to balance the risk
8462 // of somebody using this as a DoS attack to lock someone
8463 // out of their account, and someone doing a brute force attack.
8464 [ 'count' => 150, 'seconds' => 60 * 60 * 48 ],
8465 ],
8466 'type' => 'list',
8467 ];
8468
8479 public const GrantPermissions = [
8480 'default' => [
8481 'basic' => [
8482 'autocreateaccount' => true,
8483 'autoconfirmed' => true,
8484 'autopatrol' => true,
8485 'editsemiprotected' => true,
8486 'ipblock-exempt' => true,
8487 'nominornewtalk' => true,
8488 'patrolmarks' => true,
8489 'purge' => true,
8490 'read' => true,
8491 'writeapi' => true,
8492 'unwatchedpages' => true,
8493 ],
8494 'highvolume' => [
8495 'bot' => true,
8496 'apihighlimits' => true,
8497 'noratelimit' => true,
8498 'markbotedits' => true,
8499 ],
8500 'import' => [
8501 'import' => true,
8502 'importupload' => true,
8503 ],
8504 'editpage' => [
8505 'edit' => true,
8506 'minoredit' => true,
8507 'applychangetags' => true,
8508 'changetags' => true,
8509 'editcontentmodel' => true,
8510 ],
8511 'editprotected' => [
8512 'edit' => true,
8513 'minoredit' => true,
8514 'applychangetags' => true,
8515 'changetags' => true,
8516 'editcontentmodel' => true,
8517 'editprotected' => true,
8518 ],
8519 'editmycssjs' => [
8520 'edit' => true,
8521 'minoredit' => true,
8522 'applychangetags' => true,
8523 'changetags' => true,
8524 'editcontentmodel' => true,
8525 'editmyusercss' => true,
8526 'editmyuserjson' => true,
8527 'editmyuserjs' => true,
8528 ],
8529 'editmyoptions' => [
8530 'editmyoptions' => true,
8531 'editmyuserjson' => true,
8532 ],
8533 'editinterface' => [
8534 'edit' => true,
8535 'minoredit' => true,
8536 'applychangetags' => true,
8537 'changetags' => true,
8538 'editcontentmodel' => true,
8539 'editinterface' => true,
8540 'edituserjson' => true,
8541 'editsitejson' => true,
8542 ],
8543 'editsiteconfig' => [
8544 'edit' => true,
8545 'minoredit' => true,
8546 'applychangetags' => true,
8547 'changetags' => true,
8548 'editcontentmodel' => true,
8549 'editinterface' => true,
8550 'edituserjson' => true,
8551 'editsitejson' => true,
8552 'editusercss' => true,
8553 'edituserjs' => true,
8554 'editsitecss' => true,
8555 'editsitejs' => true,
8556 ],
8557 'createeditmovepage' => [
8558 'edit' => true,
8559 'minoredit' => true,
8560 'applychangetags' => true,
8561 'changetags' => true,
8562 'editcontentmodel' => true,
8563 'createpage' => true,
8564 'createtalk' => true,
8565 'delete-redirect' => true,
8566 'move' => true,
8567 'move-rootuserpages' => true,
8568 'move-subpages' => true,
8569 'move-categorypages' => true,
8570 'suppressredirect' => true,
8571 ],
8572 'uploadfile' => [
8573 'upload' => true,
8574 'reupload-own' => true,
8575 ],
8576 'uploadeditmovefile' => [
8577 'upload' => true,
8578 'reupload-own' => true,
8579 'reupload' => true,
8580 'reupload-shared' => true,
8581 'upload_by_url' => true,
8582 'movefile' => true,
8583 'suppressredirect' => true,
8584 ],
8585 'patrol' => [
8586 'patrol' => true,
8587 ],
8588 'rollback' => [
8589 'rollback' => true,
8590 ],
8591 'blockusers' => [
8592 'block' => true,
8593 'blockemail' => true,
8594 ],
8595 'viewdeleted' => [
8596 'browsearchive' => true,
8597 'deletedhistory' => true,
8598 'deletedtext' => true,
8599 ],
8600 'viewrestrictedlogs' => [
8601 'suppressionlog' => true,
8602 ],
8603 'delete' => [
8604 'edit' => true,
8605 'minoredit' => true,
8606 'applychangetags' => true,
8607 'changetags' => true,
8608 'editcontentmodel' => true,
8609 'browsearchive' => true,
8610 'deletedhistory' => true,
8611 'deletedtext' => true,
8612 'delete' => true,
8613 'bigdelete' => true,
8614 'deletelogentry' => true,
8615 'deleterevision' => true,
8616 'undelete' => true,
8617 ],
8618 'oversight' => [
8619 'suppressrevision' => true,
8620 'viewsuppressed' => true,
8621 ],
8622 'protect' => [
8623 'edit' => true,
8624 'minoredit' => true,
8625 'applychangetags' => true,
8626 'changetags' => true,
8627 'editcontentmodel' => true,
8628 'editprotected' => true,
8629 'protect' => true,
8630 ],
8631 'viewmywatchlist' => [
8632 'viewmywatchlist' => true,
8633 ],
8634 'editmywatchlist' => [
8635 'editmywatchlist' => true,
8636 ],
8637 'sendemail' => [
8638 'sendemail' => true,
8639 ],
8640 'createaccount' => [
8641 'createaccount' => true,
8642 ],
8643 'privateinfo' => [
8644 'viewmyprivateinfo' => true,
8645 ],
8646 'mergehistory' => [
8647 'mergehistory' => true,
8648 ],
8649 ],
8650 'type' => 'map',
8651 'mergeStrategy' => 'array_plus_2d',
8652 'additionalProperties' => [
8653 'type' => 'map',
8654 'additionalProperties' => [ 'type' => 'boolean', ],
8655 ],
8656 ];
8657
8661 public const GrantPermissionGroups = [
8662 'default' =>
8663 [
8664 // Hidden grants are implicitly present
8665 'basic' => 'hidden',
8666
8667 'editpage' => 'page-interaction',
8668 'createeditmovepage' => 'page-interaction',
8669 'editprotected' => 'page-interaction',
8670 'patrol' => 'page-interaction',
8671
8672 'uploadfile' => 'file-interaction',
8673 'uploadeditmovefile' => 'file-interaction',
8674
8675 'sendemail' => 'email',
8676
8677 'viewmywatchlist' => 'watchlist-interaction',
8678 'editviewmywatchlist' => 'watchlist-interaction',
8679
8680 'editmycssjs' => 'customization',
8681 'editmyoptions' => 'customization',
8682
8683 'editinterface' => 'administration',
8684 'editsiteconfig' => 'administration',
8685 'rollback' => 'administration',
8686 'blockusers' => 'administration',
8687 'delete' => 'administration',
8688 'viewdeleted' => 'administration',
8689 'viewrestrictedlogs' => 'administration',
8690 'protect' => 'administration',
8691 'oversight' => 'administration',
8692 'createaccount' => 'administration',
8693 'mergehistory' => 'administration',
8694 'import' => 'administration',
8695
8696 'highvolume' => 'high-volume',
8697
8698 'privateinfo' => 'private-information',
8699 ],
8700 'type' => 'map',
8701 'additionalProperties' => [ 'type' => 'string', ],
8702 ];
8703
8707 public const EnableBotPasswords = [
8708 'default' => true,
8709 'type' => 'boolean',
8710 ];
8711
8717 public const BotPasswordsCluster = [
8718 'default' => false,
8719 'type' => 'string|false',
8720 ];
8721
8730 public const BotPasswordsDatabase = [
8731 'default' => false,
8732 'type' => 'string|false',
8733 ];
8734
8735 // endregion -- end of user rights settings
8736
8737 /***************************************************************************/
8738 // region Security
8744 public const SecretKey = [
8745 'default' => false,
8746 ];
8747
8753 public const AllowUserJs = [
8754 'default' => false,
8755 ];
8756
8762 public const AllowUserCss = [
8763 'default' => false,
8764 ];
8765
8772 public const AllowUserCssPrefs = [
8773 'default' => true,
8774 ];
8775
8779 public const UseSiteJs = [
8780 'default' => true,
8781 ];
8782
8786 public const UseSiteCss = [
8787 'default' => true,
8788 ];
8789
8794 public const BreakFrames = [
8795 'default' => false,
8796 ];
8797
8817 public const EditPageFrameOptions = [
8818 'default' => 'DENY',
8819 ];
8820
8832 public const ApiFrameOptions = [
8833 'default' => 'DENY',
8834 ];
8835
8843 public const CSPHeader = [
8844 'default' => false,
8845 'type' => 'false|object',
8846 ];
8847
8853 public const CSPReportOnlyHeader = [
8854 'default' => false,
8855 'type' => 'false|object',
8856 ];
8857
8867 public const CSPFalsePositiveUrls = [
8868 'default' => [
8869 'https://3hub.co' => true,
8870 'https://morepro.info' => true,
8871 'https://p.ato.mx' => true,
8872 'https://s.ato.mx' => true,
8873 'https://adserver.adtech.de' => true,
8874 'https://ums.adtechus.com' => true,
8875 'https://cas.criteo.com' => true,
8876 'https://cat.nl.eu.criteo.com' => true,
8877 'https://atpixel.alephd.com' => true,
8878 'https://rtb.metrigo.com' => true,
8879 'https://d5p.de17a.com' => true,
8880 'https://ad.lkqd.net/vpaid/vpaid.js' => true,
8881 'https://ad.lkqd.net/vpaid/vpaid.js?fusion=1.0' => true,
8882 'https://t.lkqd.net/t' => true,
8883 'chrome-extension' => true,
8884 ],
8885 'type' => 'map',
8886 ];
8887
8895 public const AllowCrossOrigin = [
8896 'default' => false,
8897 'type' => 'boolean',
8898 ];
8899
8913 public const RestAllowCrossOriginCookieAuth = [
8914 'default' => false,
8915 'type' => 'boolean',
8916 ];
8917
8926 public const SessionSecret = [
8927 'default' => false,
8928 ];
8929
8938 public const SessionInsecureSecrets = [
8939 'default' => false,
8940 ];
8941
8952 public const HKDFSecret = [
8953 'default' => false,
8954 ];
8955
8964 public const HKDFAlgorithm = [
8965 'default' => 'sha256',
8966 ];
8967
8968 // endregion -- end of security
8969
8970 /***************************************************************************/
8971 // region Cookie settings
8977 public const CookieExpiration = [
8978 'default' => 30 * 86400,
8979 ];
8980
8987 public const ExtendedLoginCookieExpiration = [
8988 'default' => 180 * 86400,
8989 ];
8990
8995 public const CookieDomain = [
8996 'default' => '',
8997 ];
8998
9003 public const CookiePath = [
9004 'default' => '/',
9005 ];
9006
9017 public const CookieSecure = [
9018 'default' => 'detect',
9019 'dynamicDefault' => [ 'use' => [ 'ForceHTTPS' ] ]
9020 ];
9021
9022 public static function getDefaultCookieSecure( $forceHTTPS ): bool {
9023 return $forceHTTPS || ( WebRequest::detectProtocol() === 'https' );
9024 }
9025
9032 public const DisableCookieCheck = [
9033 'default' => false,
9034 ];
9035
9041 public const CookiePrefix = [
9042 'default' => false,
9043 'dynamicDefault' => [
9044 'use' => [ 'SharedDB', 'SharedPrefix', 'SharedTables', 'DBname', 'DBprefix' ]
9045 ],
9046 ];
9047
9048 public static function getDefaultCookiePrefix(
9049 $sharedDB, $sharedPrefix, $sharedTables, $dbName, $dbPrefix
9050 ): string {
9051 if ( $sharedDB && in_array( 'user', $sharedTables ) ) {
9052 return $sharedDB . ( $sharedPrefix ? "_$sharedPrefix" : '' );
9053 }
9054 return $dbName . ( $dbPrefix ? "_$dbPrefix" : '' );
9055 }
9056
9062 public const CookieHttpOnly = [
9063 'default' => true,
9064 ];
9065
9075 public const CookieSameSite = [
9076 'default' => null,
9077 'type' => '?string',
9078 ];
9079
9087 public const UseSameSiteLegacyCookies = [
9088 'default' => false,
9089 'type' => 'boolean',
9090 ];
9091
9095 public const CacheVaryCookies = [
9096 'default' => [],
9097 'type' => 'list',
9098 ];
9099
9103 public const SessionName = [
9104 'default' => false,
9105 ];
9106
9114 public const CookieSetOnAutoblock = [
9115 'default' => true,
9116 ];
9117
9125 public const CookieSetOnIpBlock = [
9126 'default' => true,
9127 ];
9128
9129 // endregion -- end of cookie settings
9130
9131 /***************************************************************************/
9132 // region Profiling, testing and debugging
9134 // See $wgProfiler for how to enable profiling.
9135
9147 public const DebugLogFile = [
9148 'default' => '',
9149 ];
9150
9154 public const DebugLogPrefix = [
9155 'default' => '',
9156 ];
9157
9163 public const DebugRedirects = [
9164 'default' => false,
9165 ];
9166
9181 public const DebugRawPage = [
9182 'default' => false,
9183 ];
9184
9193 public const DebugComments = [
9194 'default' => false,
9195 ];
9196
9204 public const DebugDumpSql = [
9205 'default' => false,
9206 ];
9207
9213 public const TrxProfilerLimits = [
9214 'default' => [
9215 // HTTP GET/HEAD requests.
9216 // Primary queries should not happen on GET requests
9217 'GET' => [
9218 'masterConns' => 0,
9219 'writes' => 0,
9220 'readQueryTime' => 5,
9221 'readQueryRows' => 10000
9222 ],
9223 // HTTP POST requests.
9224 // Primary reads and writes will happen for a subset of these.
9225 'POST' => [
9226 'readQueryTime' => 5,
9227 'writeQueryTime' => 1,
9228 'readQueryRows' => 100000,
9229 'maxAffected' => 1000
9230 ],
9231 'POST-nonwrite' => [
9232 'writes' => 0,
9233 'readQueryTime' => 5,
9234 'readQueryRows' => 10000
9235 ],
9236 // Deferred updates that run after HTTP response is sent for GET requests
9237 'PostSend-GET' => [
9238 'readQueryTime' => 5,
9239 'writeQueryTime' => 1,
9240 'readQueryRows' => 10000,
9241 'maxAffected' => 1000,
9242 // Log primary queries under the post-send entry point as they are discouraged
9243 'masterConns' => 0,
9244 'writes' => 0,
9245 ],
9246 // Deferred updates that run after HTTP response is sent for POST requests
9247 'PostSend-POST' => [
9248 'readQueryTime' => 5,
9249 'writeQueryTime' => 1,
9250 'readQueryRows' => 100000,
9251 'maxAffected' => 1000
9252 ],
9253 // Background job runner
9254 'JobRunner' => [
9255 'readQueryTime' => 30,
9256 'writeQueryTime' => 5,
9257 'readQueryRows' => 100000,
9258 'maxAffected' => 500 // ballpark of $wgUpdateRowsPerQuery
9259 ],
9260 // Command-line scripts
9261 'Maintenance' => [
9262 'writeQueryTime' => 5,
9263 'maxAffected' => 1000
9264 ]
9265 ],
9266 'type' => 'map',
9267 ];
9268
9301 public const DebugLogGroups = [
9302 'default' => [],
9303 'type' => 'map',
9304 ];
9305
9327 public const MWLoggerDefaultSpi = [
9328 'default' => [ 'class' => 'MediaWiki\\Logger\\LegacySpi', ],
9329 'mergeStrategy' => 'replace',
9330 'type' => 'map',
9331 ];
9332
9338 public const ShowDebug = [
9339 'default' => false,
9340 ];
9341
9345 public const SpecialVersionShowHooks = [
9346 'default' => false,
9347 ];
9348
9356 public const ShowExceptionDetails = [
9357 'default' => false,
9358 ];
9359
9363 public const LogExceptionBacktrace = [
9364 'default' => true,
9365 ];
9366
9371 public const PropagateErrors = [
9372 'default' => true,
9373 ];
9374
9378 public const ShowHostnames = [
9379 'default' => false,
9380 ];
9381
9389 public const OverrideHostname = [
9390 'default' => false,
9391 ];
9392
9397 public const DevelopmentWarnings = [
9398 'default' => false,
9399 ];
9400
9406 public const DeprecationReleaseLimit = [
9407 'default' => false,
9408 ];
9409
9476 public const Profiler = [
9477 'default' => [],
9478 'type' => 'map',
9479 'mergeStrategy' => 'replace',
9480 ];
9481
9492 public const StatsdServer = [
9493 'default' => false,
9494 ];
9495
9503 public const StatsdMetricPrefix = [
9504 'default' => 'MediaWiki',
9505 ];
9506
9515 public const StatsdSamplingRates = [
9516 'default' => [],
9517 'type' => 'map',
9518 ];
9519
9528 public const MetricsTarget = [
9529 'default' => null,
9530 'type' => '?string',
9531 ];
9532
9542 public const MetricsFormat = [
9543 'default' => null,
9544 'type' => '?string',
9545 ];
9546
9556 public const MetricsPrefix = [
9557 'default' => 'mediawiki',
9558 'type' => 'string',
9559 ];
9560
9567 public const PageInfoTransclusionLimit = [
9568 'default' => 50,
9569 ];
9570
9584 public const ParserTestFiles = [
9585 'default' => [],
9586 'type' => 'map',
9587 'deprecated' => 'since 1.30',
9588 ];
9589
9593 public const EnableJavaScriptTest = [
9594 'default' => false,
9595 ];
9596
9602 public const CachePrefix = [
9603 'default' => false,
9604 ];
9605
9614 public const DebugToolbar = [
9615 'default' => false,
9616 ];
9617
9618 // endregion -- end of profiling, testing and debugging
9619
9620 /***************************************************************************/
9621 // region Search
9627 public const DisableTextSearch = [
9628 'default' => false,
9629 ];
9630
9635 public const AdvancedSearchHighlighting = [
9636 'default' => false,
9637 ];
9638
9643 public const SearchHighlightBoundaries = [
9644 'default' => '[\\p{Z}\\p{P}\\p{C}]',
9645 ];
9646
9657 public const OpenSearchTemplate = [
9658 'default' => false,
9659 'deprecated' => 'since 1.25 ' .
9660 'Use $wgOpenSearchTemplates[\'application/x-suggestions+json\'] instead',
9661 ];
9662
9671 public const OpenSearchTemplates = [
9672 'default' => [
9673 'application/x-suggestions+json' => false,
9674 'application/x-suggestions+xml' => false,
9675 ],
9676 'type' => 'map',
9677 ];
9678
9685 public const EnableOpenSearchSuggest = [
9686 'default' => true,
9687 'deprecated' => 'since 1.35 No longer used',
9688 ];
9689
9694 public const OpenSearchDefaultLimit = [
9695 'default' => 10,
9696 ];
9697
9702 public const OpenSearchDescriptionLength = [
9703 'default' => 100,
9704 ];
9705
9709 public const SearchSuggestCacheExpiry = [
9710 'default' => 1200,
9711 ];
9712
9717 public const DisableSearchUpdate = [
9718 'default' => false,
9719 ];
9720
9731 public const NamespacesToBeSearchedDefault = [
9732 'default' => [ NS_MAIN => true, ],
9733 'type' => 'map',
9734 ];
9735
9740 public const DisableInternalSearch = [
9741 'default' => false,
9742 ];
9743
9761 public const SearchForwardUrl = [
9762 'default' => null,
9763 ];
9764
9770 public const SitemapNamespaces = [
9771 'default' => false,
9772 'type' => 'false|list',
9773 ];
9774
9791 public const SitemapNamespacesPriorities = [
9792 'default' => false,
9793 'type' => 'false|map',
9794 ];
9795
9801 public const EnableSearchContributorsByIP = [
9802 'default' => true,
9803 ];
9804
9815 public const SpecialSearchFormOptions = [
9816 'default' => [],
9817 'type' => 'map',
9818 ];
9819
9828 public const SearchMatchRedirectPreference = [
9829 'default' => false,
9830 'type' => 'boolean',
9831 ];
9832
9839 public const SearchRunSuggestedQuery = [
9840 'default' => true,
9841 'type' => 'boolean',
9842 ];
9843
9844 // endregion -- end of search settings
9845
9846 /***************************************************************************/
9847 // region Edit user interface
9854 public const Diff3 = [
9855 'default' => '/usr/bin/diff3',
9856 ];
9857
9861 public const Diff = [
9862 'default' => '/usr/bin/diff',
9863 ];
9864
9870 public const PreviewOnOpenNamespaces = [
9871 'default' => [
9872 NS_CATEGORY => true
9873 ],
9874 'type' => 'map',
9875 ];
9876
9882 public const UniversalEditButton = [
9883 'default' => true,
9884 ];
9885
9891 public const UseAutomaticEditSummaries = [
9892 'default' => true,
9893 ];
9894
9895 // endregion -- end edit UI
9896
9897 /***************************************************************************/
9898 // region Maintenance
9900 // See also $wgSiteNotice
9901
9905 public const CommandLineDarkBg = [
9906 'default' => false,
9907 ];
9908
9917 public const ReadOnly = [
9918 'default' => null,
9919 ];
9920
9926 public const ReadOnlyWatchedItemStore = [
9927 'default' => false,
9928 'type' => 'boolean',
9929 ];
9930
9939 public const ReadOnlyFile = [
9940 'default' => false,
9941 'dynamicDefault' => [ 'use' => [ 'UploadDirectory' ] ]
9942 ];
9943
9948 public static function getDefaultReadOnlyFile( $uploadDirectory ): string {
9949 return "$uploadDirectory/lock_yBgMBwiR";
9950 }
9951
9961 public const UpgradeKey = [
9962 'default' => false,
9963 ];
9964
9968 public const GitBin = [
9969 'default' => '/usr/bin/git',
9970 ];
9971
9985 public const GitRepositoryViewers = [
9986 'default' => [
9987 'https://(?:[a-z0-9_]+@)?gerrit.wikimedia.org/r/(?:p/)?(.*)' => 'https://gerrit.wikimedia.org/g/%R/+/%H',
9988 'ssh://(?:[a-z0-9_]+@)?gerrit.wikimedia.org:29418/(.*)' => 'https://gerrit.wikimedia.org/g/%R/+/%H',
9989 ],
9990 'type' => 'map',
9991 ];
9992
9993 // endregion -- End of maintenance
9994
9995 /***************************************************************************/
9996 // region Recent changes, new pages, watchlist and history
10005 public const RCMaxAge = [
10006 'default' => 90 * 24 * 3600,
10007 ];
10008
10016 public const WatchersMaxAge = [
10017 'default' => 180 * 24 * 3600,
10018 ];
10019
10028 public const UnwatchedPageSecret = [
10029 'default' => 1,
10030 ];
10031
10039 public const RCFilterByAge = [
10040 'default' => false,
10041 ];
10042
10047 public const RCLinkLimits = [
10048 'default' => [ 50, 100, 250, 500 ],
10049 'type' => 'list',
10050 ];
10051
10058 public const RCLinkDays = [
10059 'default' => [ 1, 3, 7, 14, 30 ],
10060 'type' => 'list',
10061 ];
10062
10126 public const RCFeeds = [
10127 'default' => [],
10128 'type' => 'map',
10129 ];
10130
10138 public const RCEngines = [
10139 'default' => [
10140 'redis' => RedisPubSubFeedEngine::class,
10141 'udp' => UDPRCFeedEngine::class,
10142 ],
10143 'type' => 'map',
10144 ];
10145
10158 public const RCWatchCategoryMembership = [
10159 'default' => false,
10160 ];
10161
10170 public const UseRCPatrol = [
10171 'default' => true,
10172 ];
10173
10180 public const StructuredChangeFiltersLiveUpdatePollingRate = [
10181 'default' => 3,
10182 ];
10183
10191 public const UseNPPatrol = [
10192 'default' => true,
10193 ];
10194
10203 public const UseFilePatrol = [
10204 'default' => true,
10205 ];
10206
10210 public const Feed = [
10211 'default' => true,
10212 ];
10213
10218 public const FeedLimit = [
10219 'default' => 50,
10220 ];
10221
10231 public const FeedCacheTimeout = [
10232 'default' => 60,
10233 ];
10234
10239 public const FeedDiffCutoff = [
10240 'default' => 32768,
10241 ];
10242
10258 public const OverrideSiteFeed = [
10259 'default' => [],
10260 'type' => 'map',
10261 ];
10262
10269 public const FeedClasses = [
10270 'default' => [
10271 'rss' => 'RSSFeed',
10272 'atom' => 'AtomFeed',
10273 ],
10274 'type' => 'map',
10275 ];
10276
10281 public const AdvertisedFeedTypes = [
10282 'default' => [ 'atom', ],
10283 'type' => 'list',
10284 ];
10285
10289 public const RCShowWatchingUsers = [
10290 'default' => false,
10291 ];
10292
10296 public const RCShowChangedSize = [
10297 'default' => true,
10298 ];
10299
10305 public const RCChangedSizeThreshold = [
10306 'default' => 500,
10307 ];
10308
10313 public const ShowUpdatedMarker = [
10314 'default' => true,
10315 ];
10316
10321 public const DisableAnonTalk = [
10322 'default' => false,
10323 ];
10324
10329 public const UseTagFilter = [
10330 'default' => true,
10331 ];
10332
10350 public const SoftwareTags = [
10351 'default' => [
10352 'mw-contentmodelchange' => true,
10353 'mw-new-redirect' => true,
10354 'mw-removed-redirect' => true,
10355 'mw-changed-redirect-target' => true,
10356 'mw-blank' => true,
10357 'mw-replace' => true,
10358 'mw-rollback' => true,
10359 'mw-undo' => true,
10360 'mw-manual-revert' => true,
10361 'mw-reverted' => true,
10362 'mw-server-side-upload' => true,
10363 ],
10364 'type' => 'map',
10365 'additionalProperties' => [ 'type' => 'boolean', ],
10366 ];
10367
10375 public const UnwatchedPageThreshold = [
10376 'default' => false,
10377 ];
10378
10404 public const RecentChangesFlags = [
10405 'default' => [
10406 'newpage' => [
10407 'letter' => 'newpageletter',
10408 'title' => 'recentchanges-label-newpage',
10409 'legend' => 'recentchanges-legend-newpage',
10410 'grouping' => 'any',
10411 ],
10412 'minor' => [
10413 'letter' => 'minoreditletter',
10414 'title' => 'recentchanges-label-minor',
10415 'legend' => 'recentchanges-legend-minor',
10416 'class' => 'minoredit',
10417 'grouping' => 'all',
10418 ],
10419 'bot' => [
10420 'letter' => 'boteditletter',
10421 'title' => 'recentchanges-label-bot',
10422 'legend' => 'recentchanges-legend-bot',
10423 'class' => 'botedit',
10424 'grouping' => 'all',
10425 ],
10426 'unpatrolled' => [
10427 'letter' => 'unpatrolledletter',
10428 'title' => 'recentchanges-label-unpatrolled',
10429 'legend' => 'recentchanges-legend-unpatrolled',
10430 'grouping' => 'any',
10431 ],
10432 ],
10433 'type' => 'map',
10434 ];
10435
10441 public const WatchlistExpiry = [
10442 'default' => false,
10443 'type' => 'boolean',
10444 ];
10445
10456 public const WatchlistPurgeRate = [
10457 'default' => 0.1,
10458 'type' => 'float',
10459 ];
10460
10475 public const WatchlistExpiryMaxDuration = [
10476 'default' => '6 months',
10477 'type' => '?string',
10478 ];
10479
10480 // endregion -- end RC/watchlist
10481
10482 /***************************************************************************/
10483 // region Copyright and credits settings
10493 public const RightsPage = [
10494 'default' => null,
10495 ];
10496
10503 public const RightsUrl = [
10504 'default' => null,
10505 ];
10506
10515 public const RightsText = [
10516 'default' => null,
10517 ];
10518
10522 public const RightsIcon = [
10523 'default' => null,
10524 ];
10525
10529 public const UseCopyrightUpload = [
10530 'default' => false,
10531 ];
10532
10540 public const MaxCredits = [
10541 'default' => 0,
10542 ];
10543
10549 public const ShowCreditsIfMax = [
10550 'default' => true,
10551 ];
10552
10553 // endregion -- end of copyright and credits settings
10554
10555 /***************************************************************************/
10556 // region Import / Export
10582 public const ImportSources = [
10583 'default' => [],
10584 'type' => 'map',
10585 ];
10586
10595 public const ImportTargetNamespace = [
10596 'default' => null,
10597 ];
10598
10605 public const ExportAllowHistory = [
10606 'default' => true,
10607 ];
10608
10614 public const ExportMaxHistory = [
10615 'default' => 0,
10616 ];
10617
10621 public const ExportAllowListContributors = [
10622 'default' => false,
10623 ];
10624
10636 public const ExportMaxLinkDepth = [
10637 'default' => 0,
10638 ];
10639
10643 public const ExportFromNamespaces = [
10644 'default' => false,
10645 ];
10646
10650 public const ExportAllowAll = [
10651 'default' => false,
10652 ];
10653
10660 public const ExportPagelistLimit = [
10661 'default' => 5000,
10662 ];
10663
10668 public const XmlDumpSchemaVersion = [
10669 'default' => XML_DUMP_SCHEMA_VERSION_11,
10670 ];
10671
10672 // endregion -- end of import/export
10673
10674 /***************************************************************************/
10675 // region Wiki Farm
10687 public const WikiFarmSettingsDirectory = [
10688 'default' => null
10689 ];
10690
10699 public const WikiFarmSettingsExtension = [
10700 'default' => 'yaml'
10701 ];
10702
10703 // endregion -- End Wiki Farm
10704
10705 /***************************************************************************/
10706 // region Extensions
10713 public const ExtensionFunctions = [
10714 'default' => [],
10715 'type' => 'list',
10716 ];
10717
10745 public const ExtensionMessagesFiles = [
10746 'default' => [],
10747 'type' => 'map',
10748 ];
10749
10778 public const MessagesDirs = [
10779 'default' => [],
10780 'type' => 'map',
10781 ];
10782
10789 public const ExtensionEntryPointListFiles = [
10790 'default' => [],
10791 'type' => 'map',
10792 ];
10793
10810 public const ParserOutputHooks = [
10811 'default' => [],
10812 'type' => 'map',
10813 ];
10814
10818 public const EnableParserLimitReporting = [
10819 'default' => true,
10820 ];
10821
10847 public const ValidSkinNames = [
10848 'default' => [],
10849 'type' => 'map',
10850 ];
10851
10858 public const SpecialPages = [
10859 'default' => [],
10860 'type' => 'map',
10861 ];
10862
10871 public const AutoloadAttemptLowercase = [
10872 'default' => false,
10873 'deprecated' => 'since 1.35',
10874 ];
10875
10934 public const ExtensionCredits = [
10935 'default' => [],
10936 'type' => 'map',
10937 ];
10938
10968 public const Hooks = [
10969 'default' => [],
10970 'type' => 'map',
10971 'mergeStrategy' => 'array_merge_recursive',
10972 ];
10973
10986 public const ServiceWiringFiles = [
10987 'default' => [],
10988 'type' => 'list',
10989 ];
10990
10999 public const JobClasses = [
11000 'default' => [
11001 'deletePage' => DeletePageJob::class,
11002 'refreshLinks' => RefreshLinksJob::class,
11003 'deleteLinks' => DeleteLinksJob::class,
11004 'htmlCacheUpdate' => HTMLCacheUpdateJob::class,
11005 'sendMail' => EmaillingJob::class,
11006 'enotifNotify' => EnotifNotifyJob::class,
11007 'fixDoubleRedirect' => DoubleRedirectJob::class,
11008 'AssembleUploadChunks' => AssembleUploadChunksJob::class,
11009 'PublishStashedFile' => PublishStashedFileJob::class,
11010 'ThumbnailRender' => ThumbnailRenderJob::class,
11011 'recentChangesUpdate' => RecentChangesUpdateJob::class,
11012 'refreshLinksPrioritized' => RefreshLinksJob::class,
11013 'refreshLinksDynamic' => RefreshLinksJob::class,
11014 'activityUpdateJob' => ActivityUpdateJob::class,
11015 'categoryMembershipChange' => CategoryMembershipChangeJob::class,
11016 'clearUserWatchlist' => ClearUserWatchlistJob::class,
11017 'watchlistExpiry' => WatchlistExpiryJob::class,
11018 'cdnPurge' => CdnPurgeJob::class,
11019 'userGroupExpiry' => UserGroupExpiryJob::class,
11020 'clearWatchlistNotifications' => ClearWatchlistNotificationsJob::class,
11021 'userOptionsUpdate' => UserOptionsUpdateJob::class,
11022 'revertedTagUpdate' => RevertedTagUpdateJob::class,
11023 'enqueue' => EnqueueJob::class, // local queue for multi-DC setups
11024 'null' => NullJob::class,
11025 'userEditCountInit' => UserEditCountInitJob::class,
11026 ],
11027 'type' => 'map',
11028 ];
11029
11041 public const JobTypesExcludedFromDefaultQueue = [
11042 'default' => [ 'AssembleUploadChunks', 'PublishStashedFile' ],
11043 'type' => 'list',
11044 ];
11045
11055 public const JobBackoffThrottling = [
11056 'default' => [],
11057 'type' => 'map',
11058 'additionalProperties' => [ 'type' => 'float', ],
11059 ];
11060
11074 public const JobSerialCommitThreshold = [
11075 'default' => false,
11076 'type' => 'float|false',
11077 ];
11078
11086 public const JobTypeConf = [
11087 'default' => [
11088 'default' => [
11089 'class' => JobQueueDB::class,
11090 'order' => 'random',
11091 'claimTTL' => 3600
11092 ],
11093 ],
11094 'additionalProperties' => [
11095 'type' => 'object',
11096 'properties' => [
11097 'class' => [ 'type' => 'string' ],
11098 'order' => [ 'type' => 'string' ],
11099 'claimTTL' => [ 'type' => 'int' ]
11100 ],
11101 ],
11102 'type' => 'map',
11103 ];
11104
11117 public const JobQueueIncludeInMaxLagFactor = [
11118 'default' => false,
11119 ];
11120
11126 public const SpecialPageCacheUpdates = [
11127 'default' => [
11128 'Statistics' => [ SiteStatsUpdate::class, 'cacheUpdate' ]
11129 ],
11130 'type' => 'map',
11131 ];
11132
11141 public const PagePropLinkInvalidations = [
11142 'default' => [ 'hiddencat' => 'categorylinks', ],
11143 'type' => 'map',
11144 ];
11145
11146 // endregion -- End extensions
11147
11148 /***************************************************************************/
11149 // region Categories
11156 public const CategoryMagicGallery = [
11157 'default' => true,
11158 ];
11159
11163 public const CategoryPagingLimit = [
11164 'default' => 200,
11165 ];
11166
11193 public const CategoryCollation = [
11194 'default' => 'uppercase',
11195 ];
11196
11208 public const TempCategoryCollations = [
11209 'default' => [],
11210 'type' => 'list',
11211 ];
11212
11227 public const TrackingCategories = [
11228 'default' => [],
11229 'type' => 'list',
11230 'deprecated' => 'since 1.25 Extensions should now register tracking categories using ' .
11231 'the new extension registration system.',
11232 ];
11233
11234 // endregion -- End categories
11235
11236 /***************************************************************************/
11237 // region Logging
11249 public const LogTypes = [
11250 'default' => [
11251 '',
11252 'block',
11253 'protect',
11254 'rights',
11255 'delete',
11256 'upload',
11257 'move',
11258 'import',
11259 'patrol',
11260 'merge',
11261 'suppress',
11262 'tag',
11263 'managetags',
11264 'contentmodel',
11265 ],
11266 'type' => 'list',
11267 ];
11268
11276 public const LogRestrictions = [
11277 'default' => [ 'suppress' => 'suppressionlog', ],
11278 'type' => 'map',
11279 ];
11280
11299 public const FilterLogTypes = [
11300 'default' => [
11301 'patrol' => true,
11302 'tag' => true,
11303 'newusers' => false,
11304 ],
11305 'type' => 'map',
11306 ];
11307
11317 public const LogNames = [
11318 'default' => [
11319 '' => 'all-logs-page',
11320 'block' => 'blocklogpage',
11321 'protect' => 'protectlogpage',
11322 'rights' => 'rightslog',
11323 'delete' => 'dellogpage',
11324 'upload' => 'uploadlogpage',
11325 'move' => 'movelogpage',
11326 'import' => 'importlogpage',
11327 'patrol' => 'patrol-log-page',
11328 'merge' => 'mergelog',
11329 'suppress' => 'suppressionlog',
11330 ],
11331 'type' => 'map',
11332 ];
11333
11343 public const LogHeaders = [
11344 'default' => [
11345 '' => 'alllogstext',
11346 'block' => 'blocklogtext',
11347 'delete' => 'dellogpagetext',
11348 'import' => 'importlogpagetext',
11349 'merge' => 'mergelogpagetext',
11350 'move' => 'movelogpagetext',
11351 'patrol' => 'patrol-log-header',
11352 'protect' => 'protectlogtext',
11353 'rights' => 'rightslogtext',
11354 'suppress' => 'suppressionlogtext',
11355 'upload' => 'uploadlogpagetext',
11356 ],
11357 'type' => 'map',
11358 ];
11359
11367 public const LogActions = [
11368 'default' => [],
11369 'type' => 'map',
11370 ];
11371
11379 public const LogActionsHandlers = [
11380 'default' => [
11381 'block/block' => BlockLogFormatter::class,
11382 'block/reblock' => BlockLogFormatter::class,
11383 'block/unblock' => BlockLogFormatter::class,
11384 'contentmodel/change' => ContentModelLogFormatter::class,
11385 'contentmodel/new' => ContentModelLogFormatter::class,
11386 'delete/delete' => DeleteLogFormatter::class,
11387 'delete/delete_redir' => DeleteLogFormatter::class,
11388 'delete/delete_redir2' => DeleteLogFormatter::class,
11389 'delete/event' => DeleteLogFormatter::class,
11390 'delete/restore' => DeleteLogFormatter::class,
11391 'delete/revision' => DeleteLogFormatter::class,
11392 'import/interwiki' => ImportLogFormatter::class,
11393 'import/upload' => ImportLogFormatter::class,
11394 'managetags/activate' => LogFormatter::class,
11395 'managetags/create' => LogFormatter::class,
11396 'managetags/deactivate' => LogFormatter::class,
11397 'managetags/delete' => LogFormatter::class,
11398 'merge/merge' => MergeLogFormatter::class,
11399 'move/move' => MoveLogFormatter::class,
11400 'move/move_redir' => MoveLogFormatter::class,
11401 'patrol/patrol' => PatrolLogFormatter::class,
11402 'patrol/autopatrol' => PatrolLogFormatter::class,
11403 'protect/modify' => ProtectLogFormatter::class,
11404 'protect/move_prot' => ProtectLogFormatter::class,
11405 'protect/protect' => ProtectLogFormatter::class,
11406 'protect/unprotect' => ProtectLogFormatter::class,
11407 'rights/autopromote' => RightsLogFormatter::class,
11408 'rights/rights' => RightsLogFormatter::class,
11409 'suppress/block' => BlockLogFormatter::class,
11410 'suppress/delete' => DeleteLogFormatter::class,
11411 'suppress/event' => DeleteLogFormatter::class,
11412 'suppress/reblock' => BlockLogFormatter::class,
11413 'suppress/revision' => DeleteLogFormatter::class,
11414 'tag/update' => TagLogFormatter::class,
11415 'upload/overwrite' => UploadLogFormatter::class,
11416 'upload/revert' => UploadLogFormatter::class,
11417 'upload/upload' => UploadLogFormatter::class,
11418 ],
11419 'type' => 'map',
11420 ];
11421
11431 public const ActionFilteredLogs = [
11432 'default' => [
11433 'block' => [
11434 'block' => [ 'block' ],
11435 'reblock' => [ 'reblock' ],
11436 'unblock' => [ 'unblock' ],
11437 ],
11438 'contentmodel' => [
11439 'change' => [ 'change' ],
11440 'new' => [ 'new' ],
11441 ],
11442 'delete' => [
11443 'delete' => [ 'delete' ],
11444 'delete_redir' => [ 'delete_redir', 'delete_redir2' ],
11445 'restore' => [ 'restore' ],
11446 'event' => [ 'event' ],
11447 'revision' => [ 'revision' ],
11448 ],
11449 'import' => [
11450 'interwiki' => [ 'interwiki' ],
11451 'upload' => [ 'upload' ],
11452 ],
11453 'managetags' => [
11454 'create' => [ 'create' ],
11455 'delete' => [ 'delete' ],
11456 'activate' => [ 'activate' ],
11457 'deactivate' => [ 'deactivate' ],
11458 ],
11459 'move' => [
11460 'move' => [ 'move' ],
11461 'move_redir' => [ 'move_redir' ],
11462 ],
11463 'newusers' => [
11464 'create' => [ 'create', 'newusers' ],
11465 'create2' => [ 'create2' ],
11466 'autocreate' => [ 'autocreate' ],
11467 'byemail' => [ 'byemail' ],
11468 ],
11469 'protect' => [
11470 'protect' => [ 'protect' ],
11471 'modify' => [ 'modify' ],
11472 'unprotect' => [ 'unprotect' ],
11473 'move_prot' => [ 'move_prot' ],
11474 ],
11475 'rights' => [
11476 'rights' => [ 'rights' ],
11477 'autopromote' => [ 'autopromote' ],
11478 ],
11479 'suppress' => [
11480 'event' => [ 'event' ],
11481 'revision' => [ 'revision' ],
11482 'delete' => [ 'delete' ],
11483 'block' => [ 'block' ],
11484 'reblock' => [ 'reblock' ],
11485 ],
11486 'upload' => [
11487 'upload' => [ 'upload' ],
11488 'overwrite' => [ 'overwrite' ],
11489 'revert' => [ 'revert' ],
11490 ],
11491 ],
11492 'type' => 'map',
11493 ];
11494
11498 public const NewUserLog = [
11499 'default' => true,
11500 ];
11501
11507 public const PageCreationLog = [
11508 'default' => true,
11509 ];
11510
11511 // endregion -- end logging
11512
11513 /***************************************************************************/
11514 // region Special pages (general and miscellaneous)
11520 public const AllowSpecialInclusion = [
11521 'default' => true,
11522 ];
11523
11530 public const DisableQueryPageUpdate = [
11531 'default' => false,
11532 ];
11533
11538 public const CountCategorizedImagesAsUsed = [
11539 'default' => false,
11540 ];
11541
11546 public const MaxRedirectLinksRetrieved = [
11547 'default' => 500,
11548 ];
11549
11556 public const RangeContributionsCIDRLimit = [
11557 'default' => [
11558 'IPv4' => 16,
11559 'IPv6' => 32,
11560 ],
11561 'type' => 'map',
11562 'additionalProperties' => [ 'type' => 'integer', ],
11563 ];
11564
11565 // endregion -- end special pages
11566
11567 /***************************************************************************/
11568 // region Actions
11577 public const Actions = [
11578 'default' => [],
11579 'type' => 'map',
11580 ];
11581
11582 // endregion -- end actions
11583
11584 /***************************************************************************/
11585 // region Robot (search engine crawler) policy
11587 // See also $wgNoFollowLinks.
11588
11594 public const DefaultRobotPolicy = [
11595 'default' => 'index,follow',
11596 ];
11597
11613 public const NamespaceRobotPolicies = [
11614 'default' => [],
11615 'type' => 'map',
11616 ];
11617
11647 public const ArticleRobotPolicies = [
11648 'default' => [],
11649 'type' => 'map',
11650 ];
11651
11663 public const ExemptFromUserRobotsControl = [
11664 'default' => null,
11665 'type' => '?list',
11666 ];
11667
11668 // endregion End robot policy
11669
11670 /***************************************************************************/
11671 // region Action API and REST API
11688 public const DebugAPI = [
11689 'default' => false,
11690 ];
11691
11727 public const APIModules = [
11728 'default' => [],
11729 'type' => 'map',
11730 ];
11731
11740 public const APIFormatModules = [
11741 'default' => [],
11742 'type' => 'map',
11743 ];
11744
11753 public const APIMetaModules = [
11754 'default' => [],
11755 'type' => 'map',
11756 ];
11757
11766 public const APIPropModules = [
11767 'default' => [],
11768 'type' => 'map',
11769 ];
11770
11779 public const APIListModules = [
11780 'default' => [],
11781 'type' => 'map',
11782 ];
11783
11788 public const APIMaxDBRows = [
11789 'default' => 5000,
11790 ];
11791
11797 public const APIMaxResultSize = [
11798 'default' => 8388608,
11799 ];
11800
11805 public const APIMaxUncachedDiffs = [
11806 'default' => 1,
11807 ];
11808
11815 public const APIMaxLagThreshold = [
11816 'default' => 7,
11817 ];
11818
11823 public const APIRequestLog = [
11824 'default' => false,
11825 ];
11826
11830 public const APICacheHelpTimeout = [
11831 'default' => 60 * 60,
11832 ];
11833
11838 public const APIUselessQueryPages = [
11839 'default' => [
11840 'MIMEsearch',
11841 'LinkSearch',
11842 ],
11843 'type' => 'list',
11844 ];
11845
11849 public const AjaxUploadDestCheck = [
11850 'default' => true,
11851 ];
11852
11856 public const AjaxLicensePreview = [
11857 'default' => true,
11858 ];
11859
11882 public const CrossSiteAJAXdomains = [
11883 'default' => [],
11884 'type' => 'map',
11885 ];
11886
11892 public const CrossSiteAJAXdomainExceptions = [
11893 'default' => [],
11894 'type' => 'map',
11895 ];
11896
11900 public const AllowedCorsHeaders = [
11901 'default' => [
11902 /* simple headers (see spec) */
11903 'Accept',
11904 'Accept-Language',
11905 'Content-Language',
11906 'Content-Type',
11907 /* non-authorable headers in XHR, which are however requested by some UAs */
11908 'Accept-Encoding',
11909 'DNT',
11910 'Origin',
11911 /* MediaWiki whitelist */
11912 'User-Agent',
11913 'Api-User-Agent',
11914 /* Allowing caching preflight requests, see T269636 */
11915 'Access-Control-Max-Age',
11916 /* OAuth 2.0, see T322944 */
11917 'Authorization',
11918 ],
11919 'type' => 'list',
11920 ];
11921
11927 public const RestAPIAdditionalRouteFiles = [
11928 'default' => [],
11929 'type' => 'list',
11930 ];
11931
11932 // endregion -- End AJAX and API
11933
11934 /***************************************************************************/
11935 // region Shell and process control
11941 public const MaxShellMemory = [
11942 'default' => 307200,
11943 ];
11944
11949 public const MaxShellFileSize = [
11950 'default' => 102400,
11951 ];
11952
11956 public const MaxShellTime = [
11957 'default' => 180,
11958 ];
11959
11964 public const MaxShellWallClockTime = [
11965 'default' => 180,
11966 ];
11967
11991 public const ShellCgroup = [
11992 'default' => false,
11993 ];
11994
11998 public const PhpCli = [
11999 'default' => '/usr/bin/php',
12000 ];
12001
12014 public const ShellRestrictionMethod = [
12015 'default' => 'autodetect',
12016 'type' => 'string|false',
12017 ];
12018
12022 public const ShellboxUrl = [
12023 'default' => null,
12024 'deprecated' => 'since 1.37; use $wgShellboxUrls instead',
12025 ];
12026
12040 public const ShellboxUrls = [
12041 'default' => [ 'default' => null, ],
12042 'type' => 'map',
12043 'additionalProperties' => [
12044 'type' => 'string|false|null',
12045 ],
12046 ];
12047
12054 public const ShellboxSecretKey = [
12055 'default' => null,
12056 'type' => '?string',
12057 ];
12058
12059 // endregion -- end Shell and process control
12060
12061 /***************************************************************************/
12062 // region HTTP client
12070 public const HTTPTimeout = [
12071 'default' => 25,
12072 'type' => 'float',
12073 ];
12074
12082 public const HTTPConnectTimeout = [
12083 'default' => 5.0,
12084 'type' => 'float',
12085 ];
12086
12094 public const HTTPMaxTimeout = [
12095 'default' => 0,
12096 'type' => 'float',
12097 ];
12098
12106 public const HTTPMaxConnectTimeout = [
12107 'default' => 0,
12108 'type' => 'float',
12109 ];
12110
12116 public const HTTPImportTimeout = [
12117 'default' => 25,
12118 ];
12119
12123 public const AsyncHTTPTimeout = [
12124 'default' => 25,
12125 ];
12126
12130 public const HTTPProxy = [
12131 'default' => '',
12132 ];
12133
12149 public const LocalVirtualHosts = [
12150 'default' => [],
12151 'type' => 'map',
12152 ];
12153
12165 public const LocalHTTPProxy = [
12166 'default' => false,
12167 'type' => 'string|false',
12168 ];
12169
12175 public const AllowExternalReqID = [
12176 'default' => false,
12177 ];
12178
12179 // endregion -- End HTTP client
12180
12181 /***************************************************************************/
12182 // region Job queue
12191 public const JobRunRate = [
12192 'default' => 1,
12193 ];
12194
12202 public const RunJobsAsync = [
12203 'default' => false,
12204 ];
12205
12209 public const UpdateRowsPerJob = [
12210 'default' => 300,
12211 ];
12212
12216 public const UpdateRowsPerQuery = [
12217 'default' => 100,
12218 ];
12219
12220 // endregion -- End job queue
12221
12222 /***************************************************************************/
12223 // region Miscellaneous
12231 public const RedirectOnLogin = [
12232 'default' => null,
12233 ];
12234
12271 public const VirtualRestConfig = [
12272 'default' => [
12273 'paths' => [],
12274 'modules' => [],
12275 'global' => [
12276 # Timeout in seconds
12277 'timeout' => 360,
12278 # 'domain' is set to $wgCanonicalServer in Setup.php
12279 'forwardCookies' => false,
12280 'HTTPProxy' => null
12281 ]
12282 ],
12283 'mergeStrategy' => 'array_plus_2d',
12284 'type' => 'map',
12285 ];
12286
12309 public const EventRelayerConfig = [
12310 'default' => [
12311 'default' => [ 'class' => EventRelayerNull::class, ],
12312 ],
12313 'type' => 'map',
12314 ];
12315
12333 public const Pingback = [
12334 'default' => false,
12335 'type' => 'boolean',
12336 ];
12337
12343 public const OriginTrials = [
12344 'default' => [],
12345 'type' => 'list',
12346 ];
12347
12354 public const ReportToExpiry = [
12355 'default' => 86400,
12356 'type' => 'integer',
12357 ];
12358
12365 public const ReportToEndpoints = [
12366 'default' => [],
12367 'type' => 'list',
12368 ];
12369
12378 public const FeaturePolicyReportOnly = [
12379 'default' => [],
12380 'type' => 'list',
12381 ];
12382
12388 public const SkinsPreferred = [
12389 'default' => [ 'vector-2022', 'vector' ],
12390 'type' => 'list',
12391 ];
12392
12393 // endregion -- End Miscellaneous
12394
12395}
const AV_SCAN_FAILED
Definition Defines.php:99
const SCHEMA_COMPAT_READ_NEW
Definition Defines.php:270
const AV_VIRUS_FOUND
Definition Defines.php:97
const APCOND_AGE
Definition Defines.php:179
const NS_HELP
Definition Defines.php:76
const NS_USER
Definition Defines.php:66
const CONTENT_MODEL_CSS
Definition Defines.php:213
const CACHE_NONE
Definition Defines.php:86
const CACHE_ANYTHING
Definition Defines.php:85
const NS_MEDIAWIKI_TALK
Definition Defines.php:73
const NS_MAIN
Definition Defines.php:64
const NS_PROJECT_TALK
Definition Defines.php:69
const NS_MEDIAWIKI
Definition Defines.php:72
const NS_TEMPLATE
Definition Defines.php:74
const CACHE_ACCEL
Definition Defines.php:89
const NS_FILE_TALK
Definition Defines.php:71
const XML_DUMP_SCHEMA_VERSION_11
Definition Defines.php:317
const CONTENT_MODEL_WIKITEXT
Definition Defines.php:211
const CONTENT_MODEL_JSON
Definition Defines.php:215
const NS_HELP_TALK
Definition Defines.php:77
const NS_CATEGORY_TALK
Definition Defines.php:79
const CONTENT_MODEL_TEXT
Definition Defines.php:214
const SCHEMA_COMPAT_WRITE_NEW
Definition Defines.php:269
const CACHE_DB
Definition Defines.php:87
const AV_SCAN_ABORTED
Definition Defines.php:98
const APCOND_EDITCOUNT
Definition Defines.php:178
const NS_TALK
Definition Defines.php:65
const AV_NO_VIRUS
Definition Defines.php:96
const NS_USER_TALK
Definition Defines.php:67
const CONTENT_MODEL_UNKNOWN
Definition Defines.php:216
const NS_PROJECT
Definition Defines.php:68
const NS_CATEGORY
Definition Defines.php:78
const CONTENT_MODEL_JAVASCRIPT
Definition Defines.php:212
const NS_TEMPLATE_TALK
Definition Defines.php:75
if(!defined('MW_SETUP_CALLBACK'))
The persistent session ID (if any) loaded at startup.
Definition WebStart.php:82
This is a wrapper for APCu's shared memory functions.
Job for updating user activity like "last viewed" timestamps.
Implements Argon2, a modern key derivation algorithm designed to resist GPU cracking and side-channel...
Assemble the segments of a chunked upload.
A Bcrypt-hashed password.
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 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...
Content handler for CSS pages.
Job to prune link tables for pages that were deleted.
This class formats delete log entries.
Class DeletePageJob.
This diff implementation is mainly lifted from the LCS algorithm of the Eclipse project which in turn...
Class representing a 'diff' between two sequences of strings.
Definition Diff.php:32
Job to fix double redirects after moving a page.
Old job used for sending single notification emails; kept for backwards-compatibility.
A BagOStuff object with no objects in it.
Job for email notification mails.
Router job that takes jobs and enqueues them to their proper queues.
No-op class for publishing messages into a PubSub system.
Content handler implementation for unknown content.
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.
Simple store for keeping values in an associative array for the current process.
Hooks class.
Definition Hooks.php:38
This class formats import log entries.
Content handler for JavaScript pages.
Class to handle job queues stored in the DB.
Content handler for JSON text.
Methods for dealing with language codes.
This password hash type layers one or more parameterized password types on top of each other.
A CentralIdLookup provider that just uses local IDs.
Local repository that stores files in the local filesystem and registers them in the wiki's own datab...
Definition LocalRepo.php:39
Caching for the contents of localisation files.
Implements the default log formatting.
The old style of MediaWiki password hashing.
The old style of MediaWiki password hashing, with a salt.
Class representing a MediaWiki site.
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)
A wrapper class for the PECL memcached client.
A wrapper class for the pure-PHP memcached client, exposing a BagOStuff interface.
This class formats merge log entries.
This class formats move log entries.
This is a utility class for dealing with namespaces that encodes all the "magic" behaviors of them ba...
Degenerate job that does nothing, but can optionally replace itself in the queue and/or sleep for a b...
Definition NullJob.php:49
This class formats patrol log entries.
A PBKDF2-hashed password.
Send information about this MediaWiki instance to mediawiki.org.
Definition Pingback.php:45
Profiler base class that defines the interface and some shared functionality.
Definition Profiler.php:36
This class formats protect log entries.
Upload a file from the upload stash into the local file repo.
Job for pruning recent changes.
Send recent change to a Redis Pub/Sub channel.
Job to update link tables for pages.
A cache class that directs writes to one set of servers and reads to another.
Job for deferring the execution of RevertedTagUpdate.
This class formats rights log entries.
Class for handling updates to the site_stats table.
RDBMS-based caching module.
This program is free software; you can redistribute it and/or modify it under the terms of the GNU Ge...
Base content handler implementation for flat text contents.
Job for asynchronous rendering of thumbnails.
This class performs some operations related to tracking categories, such as creating a list of all su...
Send recent change notifications to a destination address over UDP.
This class formats upload log entries.
Job that initializes an user's edit count if it's not yet set or the current value is outdated.
Job that updates a user's preferences.
Multi-datacenter aware caching interface.
The WebRequest class encapsulates getting at data passed in the URL or via a POSTed form stripping il...
Content handler for wiki text pages.
Wrapper for WinCache object caching functions; identical interface to the APC wrapper.
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 => '🁡', 3776 => '🁢', 3777 => '🁣', 3778 => '🁤', 3779 => '🁥', 3780 => '🁦', 3781 => '🁧', 3782 => '🁨', 3783 => '🁩', 3784 => '🁪', 3785 => '🁫', 3786 => '🁬', 3787 => '🁭', 3788 => '🁮', 3789 => '🁯', 3790 => '🁰', 3791 => '🁱', 3792 => '🁲', 3793 => '🁳', 3794 => '🁴', 3795 => '🁵', 3796 => '🁶', 3797 => '🁷', 3798 => '🁸', 3799 => '🁹', 3800 => '🁺', 3801 => '🁻', 3802 => '🁼', 3803 => '🁽', 3804 => '🁾', 3805 => '🁿', 3806 => '🂀', 3807 => '🂁', 3808 => '🂂', 3809 => '🂃', 3810 => '🂄', 3811 => '🂅', 3812 => '🂆', 3813 => '🂇', 3814 => '🂈', 3815 => '🂉', 3816 => '🂊', 3817 => '🂋', 3818 => '🂌', 3819 => '🂍', 3820 => '🂎', 3821 => '🂏', 3822 => '🂐', 3823 => '🂑', 3824 => '🂒', 3825 => '🂓', 3826 => '🂠', 3827 => '🂡', 3828 => '🂢', 3829 => '🂣', 3830 => '🂤', 3831 => '🂥', 3832 => '🂦', 3833 => '🂧', 3834 => '🂨', 3835 => '🂩', 3836 => '🂪', 3837 => '🂫', 3838 => '🂬', 3839 => '🂭', 3840 => '🂮', 3841 => '🂱', 3842 => '🂲', 3843 => '🂳', 3844 => '🂴', 3845 => '🂵', 3846 => '🂶', 3847 => '🂷', 3848 => '🂸', 3849 => '🂹', 3850 => '🂺', 3851 => '🂻', 3852 => '🂼', 3853 => '🂽', 3854 => '🂾', 3855 => '🃁', 3856 => '🃂', 3857 => '🃃', 3858 => '🃄', 3859 => '🃅', 3860 => '🃆', 3861 => '🃇', 3862 => '🃈', 3863 => '🃉', 3864 => '🃊', 3865 => '🃋', 3866 => '🃌', 3867 => '🃍', 3868 => '🃎', 3869 => '🃏', 3870 => '🃑', 3871 => '🃒', 3872 => '🃓', 3873 => '🃔', 3874 => '🃕', 3875 => '🃖', 3876 => '🃗', 3877 => '🃘', 3878 => '🃙', 3879 => '🃚', 3880 => '🃛', 3881 => '🃜', 3882 => '🃝', 3883 => '🃞', 3884 => '🃟', 3885 => '🌀', 3886 => '🌁', 3887 => '🌂', 3888 => '🌃', 3889 => '🌄', 3890 => '🌅', 3891 => '🌆', 3892 => '🌇', 3893 => '🌈', 3894 => '🌉', 3895 => '🌊', 3896 => '🌋', 3897 => '🌌', 3898 => '🌍', 3899 => '🌎', 3900 => '🌏', 3901 => '🌐', 3902 => '🌑', 3903 => '🌒', 3904 => '🌓', 3905 => '🌔', 3906 => '🌕', 3907 => '🌖', 3908 => '🌗', 3909 => '🌘', 3910 => '🌙', 3911 => '🌚', 3912 => '🌛', 3913 => '🌜', 3914 => '🌝', 3915 => '🌞', 3916 => '🌟', 3917 => '🌠', 3918 => '🌰', 3919 => '🌱', 3920 => '🌲', 3921 => '🌳', 3922 => '🌴', 3923 => '🌵', 3924 => '🌷', 3925 => '🌸', 3926 => '🌹', 3927 => '🌺', 3928 => '🌻', 3929 => '🌼', 3930 => '🌽', 3931 => '🌾', 3932 => '🌿', 3933 => '🍀', 3934 => '🍁', 3935 => '🍂', 3936 => '🍃', 3937 => '🍄', 3938 => '🍅', 3939 => '🍆', 3940 => '🍇', 3941 => '🍈', 3942 => '🍉', 3943 => '🍊', 3944 => '🍋', 3945 => '🍌', 3946 => '🍍', 3947 => '🍎', 3948 => '🍏', 3949 => '🍐', 3950 => '🍑', 3951 => '🍒', 3952 => '🍓', 3953 => '🍔', 3954 => '🍕', 3955 => '🍖', 3956 => '🍗', 3957 => '🍘', 3958 => '🍙', 3959 => '🍚', 3960 => '🍛', 3961 => '🍜', 3962 => '🍝', 3963 => '🍞', 3964 => '🍟', 3965 => '🍠', 3966 => '🍡', 3967 => '🍢', 3968 => '🍣', 3969 => '🍤', 3970 => '🍥', 3971 => '🍦', 3972 => '🍧', 3973 => '🍨', 3974 => '🍩', 3975 => '🍪', 3976 => '🍫', 3977 => '🍬', 3978 => '🍭', 3979 => '🍮', 3980 => '🍯', 3981 => '🍰', 3982 => '🍱', 3983 => '🍲', 3984 => '🍳', 3985 => '🍴', 3986 => '🍵', 3987 => '🍶', 3988 => '🍷', 3989 => '🍸', 3990 => '🍹', 3991 => '🍺', 3992 => '🍻', 3993 => '🍼', 3994 => '🎀', 3995 => '🎁', 3996 => '🎂', 3997 => '🎃', 3998 => '🎄', 3999 => '🎅', 4000 => '🎆', 4001 => '🎇', 4002 => '🎈', 4003 => '🎉', 4004 => '🎊', 4005 => '🎋', 4006 => '🎌', 4007 => '🎍', 4008 => '🎎', 4009 => '🎏', 4010 => '🎐', 4011 => '🎑', 4012 => '🎒', 4013 => '🎓', 4014 => '🎠', 4015 => '🎡', 4016 => '🎢', 4017 => '🎣', 4018 => '🎤', 4019 => '🎥', 4020 => '🎦', 4021 => '🎧', 4022 => '🎨', 4023 => '🎩', 4024 => '🎪', 4025 => '🎫', 4026 => '🎬', 4027 => '🎭', 4028 => '🎮', 4029 => '🎯', 4030 => '🎰', 4031 => '🎱', 4032 => '🎲', 4033 => '🎳', 4034 => '🎴', 4035 => '🎵', 4036 => '🎶', 4037 => '🎷', 4038 => '🎸', 4039 => '🎹', 4040 => '🎺', 4041 => '🎻', 4042 => '🎼', 4043 => '🎽', 4044 => '🎾', 4045 => '🎿', 4046 => '🏀', 4047 => '🏁', 4048 => '🏂', 4049 => '🏃', 4050 => '🏄', 4051 => '🏆', 4052 => '🏇', 4053 => '🏈', 4054 => '🏉', 4055 => '🏊', 4056 => '🏠', 4057 => '🏡', 4058 => '🏢', 4059 => '🏣', 4060 => '🏤', 4061 => '🏥', 4062 => '🏦', 4063 => '🏧', 4064 => '🏨', 4065 => '🏩', 4066 => '🏪', 4067 => '🏫', 4068 => '🏬', 4069 => '🏭', 4070 => '🏮', 4071 => '🏯', 4072 => '🏰', 4073 => '🐀', 4074 => '🐁', 4075 => '🐂', 4076 => '🐃', 4077 => '🐄', 4078 => '🐅', 4079 => '🐆', 4080 => '🐇', 4081 => '🐈', 4082 => '🐉', 4083 => '🐊', 4084 => '🐋', 4085 => '🐌', 4086 => '🐍', 4087 => '🐎', 4088 => '🐏', 4089 => '🐐', 4090 => '🐑', 4091 => '🐒', 4092 => '🐓', 4093 => '🐔', 4094 => '🐕', 4095 => '🐖', 4096 => '🐗', 4097 => '🐘', 4098 => '🐙', 4099 => '🐚', 4100 => '🐛', 4101 => '🐜', 4102 => '🐝', 4103 => '🐞', 4104 => '🐟', 4105 => '🐠', 4106 => '🐡', 4107 => '🐢', 4108 => '🐣', 4109 => '🐤', 4110 => '🐥', 4111 => '🐦', 4112 => '🐧', 4113 => '🐨', 4114 => '🐩', 4115 => '🐪', 4116 => '🐫', 4117 => '🐬', 4118 => '🐭', 4119 => '🐮', 4120 => '🐯', 4121 => '🐰', 4122 => '🐱', 4123 => '🐲', 4124 => '🐳', 4125 => '🐴', 4126 => '🐵', 4127 => '🐶', 4128 => '🐷', 4129 => '🐸', 4130 => '🐹', 4131 => '🐺', 4132 => '🐻', 4133 => '🐼', 4134 => '🐽', 4135 => '🐾', 4136 => '👀', 4137 => '👂', 4138 => '👃', 4139 => '👄', 4140 => '👅', 4141 => '👆', 4142 => '👇', 4143 => '👈', 4144 => '👉', 4145 => '👊', 4146 => '👋', 4147 => '👌', 4148 => '👍', 4149 => '👎', 4150 => '👏', 4151 => '👐', 4152 => '👑', 4153 => '👒', 4154 => '👓', 4155 => '👔', 4156 => '👕', 4157 => '👖', 4158 => '👗', 4159 => '👘', 4160 => '👙', 4161 => '👚', 4162 => '👛', 4163 => '👜', 4164 => '👝', 4165 => '👞', 4166 => '👟', 4167 => '👠', 4168 => '👡', 4169 => '👢', 4170 => '👣', 4171 => '👤', 4172 => '👥', 4173 => '👦', 4174 => '👧', 4175 => '👨', 4176 => '👩', 4177 => '👪', 4178 => '👫', 4179 => '👬', 4180 => '👭', 4181 => '👮', 4182 => '👯', 4183 => '👰', 4184 => '👱', 4185 => '👲', 4186 => '👳', 4187 => '👴', 4188 => '👵', 4189 => '👶', 4190 => '👷', 4191 => '👸', 4192 => '👹', 4193 => '👺', 4194 => '👻', 4195 => '👼', 4196 => '👽', 4197 => '👾', 4198 => '👿', 4199 => '💀', 4200 => '💁', 4201 => '💂', 4202 => '💃', 4203 => '💄', 4204 => '💅', 4205 => '💆', 4206 => '💇', 4207 => '💈', 4208 => '💉', 4209 => '💊', 4210 => '💋', 4211 => '💌', 4212 => '💍', 4213 => '💎', 4214 => '💏', 4215 => '💐', 4216 => '💑', 4217 => '💒', 4218 => '💓', 4219 => '💔', 4220 => '💕', 4221 => '💖', 4222 => '💗', 4223 => '💘', 4224 => '💙', 4225 => '💚', 4226 => '💛', 4227 => '💜', 4228 => '💝', 4229 => '💞', 4230 => '💟', 4231 => '💠', 4232 => '💡', 4233 => '💢', 4234 => '💣', 4235 => '💤', 4236 => '💥', 4237 => '💦', 4238 => '💧', 4239 => '💨', 4240 => '💩', 4241 => '💪', 4242 => '💫', 4243 => '💬', 4244 => '💭', 4245 => '💮', 4246 => '💯', 4247 => '💰', 4248 => '💱', 4249 => '💲', 4250 => '💳', 4251 => '💴', 4252 => '💵', 4253 => '💶', 4254 => '💷', 4255 => '💸', 4256 => '💹', 4257 => '💺', 4258 => '💻', 4259 => '💼', 4260 => '💽', 4261 => '💾', 4262 => '💿', 4263 => '📀', 4264 => '📁', 4265 => '📂', 4266 => '📃', 4267 => '📄', 4268 => '📅', 4269 => '📆', 4270 => '📇', 4271 => '📈', 4272 => '📉', 4273 => '📊', 4274 => '📋', 4275 => '📌', 4276 => '📍', 4277 => '📎', 4278 => '📏', 4279 => '📐', 4280 => '📑', 4281 => '📒', 4282 => '📓', 4283 => '📔', 4284 => '📕', 4285 => '📖', 4286 => '📗', 4287 => '📘', 4288 => '📙', 4289 => '📚', 4290 => '📛', 4291 => '📜', 4292 => '📝', 4293 => '📞', 4294 => '📟', 4295 => '📠', 4296 => '📡', 4297 => '📢', 4298 => '📣', 4299 => '📤', 4300 => '📥', 4301 => '📦', 4302 => '📧', 4303 => '📨', 4304 => '📩', 4305 => '📪', 4306 => '📫', 4307 => '📬', 4308 => '📭', 4309 => '📮', 4310 => '📯', 4311 => '📰', 4312 => '📱', 4313 => '📲', 4314 => '📳', 4315 => '📴', 4316 => '📵', 4317 => '📶', 4318 => '📷', 4319 => '📹', 4320 => '📺', 4321 => '📻', 4322 => '📼', 4323 => '🔀', 4324 => '🔁', 4325 => '🔂', 4326 => '🔃', 4327 => '🔄', 4328 => '🔅', 4329 => '🔆', 4330 => '🔇', 4331 => '🔈', 4332 => '🔉', 4333 => '🔊', 4334 => '🔋', 4335 => '🔌', 4336 => '🔍', 4337 => '🔎', 4338 => '🔏', 4339 => '🔐', 4340 => '🔑', 4341 => '🔒', 4342 => '🔓', 4343 => '🔔', 4344 => '🔕', 4345 => '🔖', 4346 => '🔗', 4347 => '🔘', 4348 => '🔙', 4349 => '🔚', 4350 => '🔛', 4351 => '🔜', 4352 => '🔝', 4353 => '🔞', 4354 => '🔟', 4355 => '🔠', 4356 => '🔡', 4357 => '🔢', 4358 => '🔣', 4359 => '🔤', 4360 => '🔥', 4361 => '🔦', 4362 => '🔧', 4363 => '🔨', 4364 => '🔩', 4365 => '🔪', 4366 => '🔫', 4367 => '🔬', 4368 => '🔭', 4369 => '🔮', 4370 => '🔯', 4371 => '🔰', 4372 => '🔱', 4373 => '🔲', 4374 => '🔳', 4375 => '🔴', 4376 => '🔵', 4377 => '🔶', 4378 => '🔷', 4379 => '🔸', 4380 => '🔹', 4381 => '🔺', 4382 => '🔻', 4383 => '🔼', 4384 => '🔽', 4385 => '🕐', 4386 => '🕑', 4387 => '🕒', 4388 => '🕓', 4389 => '🕔', 4390 => '🕕', 4391 => '🕖', 4392 => '🕗', 4393 => '🕘', 4394 => '🕙', 4395 => '🕚', 4396 => '🕛', 4397 => '🕜', 4398 => '🕝', 4399 => '🕞', 4400 => '🕟', 4401 => '🕠', 4402 => '🕡', 4403 => '🕢', 4404 => '🕣', 4405 => '🕤', 4406 => '🕥', 4407 => '🕦', 4408 => '🕧', 4409 => '🗻', 4410 => '🗼', 4411 => '🗽', 4412 => '🗾', 4413 => '🗿', 4414 => '😁', 4415 => '😂', 4416 => '😃', 4417 => '😄', 4418 => '😅', 4419 => '😆', 4420 => '😇', 4421 => '😈', 4422 => '😉', 4423 => '😊', 4424 => '😋', 4425 => '😌', 4426 => '😍', 4427 => '😎', 4428 => '😏', 4429 => '😐', 4430 => '😒', 4431 => '😓', 4432 => '😔', 4433 => '😖', 4434 => '😘', 4435 => '😚', 4436 => '😜', 4437 => '😝', 4438 => '😞', 4439 => '😠', 4440 => '😡', 4441 => '😢', 4442 => '😣', 4443 => '😤', 4444 => '😥', 4445 => '😨', 4446 => '😩', 4447 => '😪', 4448 => '😫', 4449 => '😭', 4450 => '😰', 4451 => '😱', 4452 => '😲', 4453 => '😳', 4454 => '😵', 4455 => '😶', 4456 => '😷', 4457 => '😸', 4458 => '😹', 4459 => '😺', 4460 => '😻', 4461 => '😼', 4462 => '😽', 4463 => '😾', 4464 => '😿', 4465 => '🙀', 4466 => '🙅', 4467 => '🙆', 4468 => '🙇', 4469 => '🙈', 4470 => '🙉', 4471 => '🙊', 4472 => '🙋', 4473 => '🙌', 4474 => '🙍', 4475 => '🙎', 4476 => '🙏', 4477 => '🚀', 4478 => '🚁', 4479 => '🚂', 4480 => '🚃', 4481 => '🚄', 4482 => '🚅', 4483 => '🚆', 4484 => '🚇', 4485 => '🚈', 4486 => '🚉', 4487 => '🚊', 4488 => '🚋', 4489 => '🚌', 4490 => '🚍', 4491 => '🚎', 4492 => '🚏', 4493 => '🚐', 4494 => '🚑', 4495 => '🚒', 4496 => '🚓', 4497 => '🚔', 4498 => '🚕', 4499 => '🚖', 4500 => '🚗', 4501 => '🚘', 4502 => '🚙', 4503 => '🚚', 4504 => '🚛', 4505 => '🚜', 4506 => '🚝', 4507 => '🚞', 4508 => '🚟', 4509 => '🚠', 4510 => '🚡', 4511 => '🚢', 4512 => '🚣', 4513 => '🚤', 4514 => '🚥', 4515 => '🚦', 4516 => '🚧', 4517 => '🚨', 4518 => '🚩', 4519 => '🚪', 4520 => '🚫', 4521 => '🚬', 4522 => '🚭', 4523 => '🚮', 4524 => '🚯', 4525 => '🚰', 4526 => '🚱', 4527 => '🚲', 4528 => '🚳', 4529 => '🚴', 4530 => '🚵', 4531 => '🚶', 4532 => '🚷', 4533 => '🚸', 4534 => '🚹', 4535 => '🚺', 4536 => '🚻', 4537 => '🚼', 4538 => '🚽', 4539 => '🚾', 4540 => '🚿', 4541 => '🛀', 4542 => '🛁', 4543 => '🛂', 4544 => '🛃', 4545 => '🛄', 4546 => '🛅', 4547 => '🜀', 4548 => '🜁', 4549 => '🜂', 4550 => '🜃', 4551 => '🜄', 4552 => '🜅', 4553 => '🜆', 4554 => '🜇', 4555 => '🜈', 4556 => '🜉', 4557 => '🜊', 4558 => '🜋', 4559 => '🜌', 4560 => '🜍', 4561 => '🜎', 4562 => '🜏', 4563 => '🜐', 4564 => '🜑', 4565 => '🜒', 4566 => '🜓', 4567 => '🜔', 4568 => '🜕', 4569 => '🜖', 4570 => '🜗', 4571 => '🜘', 4572 => '🜙', 4573 => '🜚', 4574 => '🜛', 4575 => '🜜', 4576 => '🜝', 4577 => '🜞', 4578 => '🜟', 4579 => '🜠', 4580 => '🜡', 4581 => '🜢', 4582 => '🜣', 4583 => '🜤', 4584 => '🜥', 4585 => '🜦', 4586 => '🜧', 4587 => '🜨', 4588 => '🜩', 4589 => '🜪', 4590 => '🜫', 4591 => '🜬', 4592 => '🜭', 4593 => '🜮', 4594 => '🜯', 4595 => '🜰', 4596 => '🜱', 4597 => '🜲', 4598 => '🜳', 4599 => '🜴', 4600 => '🜵', 4601 => '🜶', 4602 => '🜷', 4603 => '🜸', 4604 => '🜹', 4605 => '🜺', 4606 => '🜻', 4607 => '🜼', 4608 => '🜽', 4609 => '🜾', 4610 => '🜿', 4611 => '🝀', 4612 => '🝁', 4613 => '🝂', 4614 => '🝃', 4615 => '🝄', 4616 => '🝅', 4617 => '🝆', 4618 => '🝇', 4619 => '🝈', 4620 => '🝉', 4621 => '🝊', 4622 => '🝋', 4623 => '🝌', 4624 => '🝍', 4625 => '🝎', 4626 => '🝏', 4627 => '🝐', 4628 => '🝑', 4629 => '🝒', 4630 => '🝓', 4631 => '🝔', 4632 => '🝕', 4633 => '🝖', 4634 => '🝗', 4635 => '🝘', 4636 => '🝙', 4637 => '🝚', 4638 => '🝛', 4639 => '🝜', 4640 => '🝝', 4641 => '🝞', 4642 => '🝟', 4643 => '🝠', 4644 => '🝡', 4645 => '🝢', 4646 => '🝣', 4647 => '🝤', 4648 => '🝥', 4649 => '🝦', 4650 => '🝧', 4651 => '🝨', 4652 => '🝩', 4653 => '🝪', 4654 => '🝫', 4655 => '🝬', 4656 => '🝭', 4657 => '🝮', 4658 => '🝯', 4659 => '🝰', 4660 => '🝱', 4661 => '🝲', 4662 => '🝳', 4663 => '㆐', 4664 => '㆑', 4665 => '', 4666 => '�', 4667 => '৴', 4668 => '৵', 4669 => '৶', 4670 => '৷', 4671 => '৸', 4672 => '৹', 4673 => '୲', 4674 => '୳', 4675 => '୴', 4676 => '୵', 4677 => '୶', 4678 => '୷', 4679 => '꠰', 4680 => '꠱', 4681 => '꠲', 4682 => '꠳', 4683 => '꠴', 4684 => '꠵', 4685 => '௰', 4686 => '௱', 4687 => '௲', 4688 => '൰', 4689 => '൱', 4690 => '൲', 4691 => '൳', 4692 => '൴', 4693 => '൵', 4694 => '፲', 4695 => '፳', 4696 => '፴', 4697 => '፵', 4698 => '፶', 4699 => '፷', 4700 => '፸', 4701 => '፹', 4702 => '፺', 4703 => '፻', 4704 => '፼', 4705 => 'ↀ', 4706 => 'ↁ', 4707 => 'ↂ', 4708 => 'ↆ', 4709 => 'ↇ', 4710 => 'ↈ', 4711 => '𐹩', 4712 => '𐹪', 4713 => '𐹫', 4714 => '𐹬', 4715 => '𐹭', 4716 => '𐹮', 4717 => '𐹯', 4718 => '𐹰', 4719 => '𐹱', 4720 => '𐹲', 4721 => '𐹳', 4722 => '𐹴', 4723 => '𐹵', 4724 => '𐹶', 4725 => '𐹷', 4726 => '𐹸', 4727 => '𐹹', 4728 => '𐹺', 4729 => '𐹻', 4730 => '𐹼', 4731 => '𐹽', 4732 => '𐹾', 4733 => '⳽', 4734 => '𐌢', 4735 => '𐌣', 4736 => '𐄐', 4737 => '𐄑', 4738 => '𐄒', 4739 => '𐄓', 4740 => '𐄔', 4741 => '𐄕', 4742 => '𐄖', 4743 => '𐄗', 4744 => '𐄘', 4745 => '𐄙', 4746 => '𐄚', 4747 => '𐄛', 4748 => '𐄜', 4749 => '𐄝', 4750 => '𐄞', 4751 => '𐄟', 4752 => '𐄠', 4753 => '𐄡', 4754 => '𐄢', 4755 => '𐄣', 4756 => '𐄤', 4757 => '𐄥', 4758 => '𐄦', 4759 => '𐄧', 4760 => '𐄨', 4761 => '𐄩', 4762 => '𐄪', 4763 => '𐄫', 4764 => '𐄬', 4765 => '𐄭', 4766 => '𐄮', 4767 => '𐄯', 4768 => '𐄰', 4769 => '𐄱', 4770 => '𐄲', 4771 => '𐄳', 4772 => '𐅀', 4773 => '𐅁', 4774 => '𐅄', 4775 => '𐅅', 4776 => '𐅆', 4777 => '𐅇', 4778 => '𐅉', 4779 => '𐅊', 4780 => '𐅋', 4781 => '𐅌', 4782 => '𐅍', 4783 => '𐅎', 4784 => '𐅐', 4785 => '𐅑', 4786 => '𐅒', 4787 => '𐅓', 4788 => '𐅔', 4789 => '𐅕', 4790 => '𐅖', 4791 => '𐅗', 4792 => '𐅠', 4793 => '𐅡', 4794 => '𐅢', 4795 => '𐅣', 4796 => '𐅤', 4797 => '𐅥', 4798 => '𐅦', 4799 => '𐅧', 4800 => '𐅨', 4801 => '𐅩', 4802 => '𐅪', 4803 => '𐅫', 4804 => '𐅬', 4805 => '𐅭', 4806 => '𐅮', 4807 => '𐅯', 4808 => '𐅰', 4809 => '𐅱', 4810 => '𐅲', 4811 => '𐅴', 4812 => '𐅵', 4813 => '𐅶', 4814 => '𐅷', 4815 => '𐅸', 4816 => '𐏓', 4817 => '𐏔', 4818 => '𐏕', 4819 => '𐩾', 4820 => '𐩿', 4821 => '𐤗', 4822 => '𐤘', 4823 => '𐤙', 4824 => '𐡛', 4825 => '𐡜', 4826 => '𐡝', 4827 => '𐡞', 4828 => '𐡟', 4829 => '𐭜', 4830 => '𐭝', 4831 => '𐭞', 4832 => '𐭟', 4833 => '𐭼', 4834 => '𐭽', 4835 => '𐭾', 4836 => '𐭿', 4837 => '𑁛', 4838 => '𑁜', 4839 => '𑁝', 4840 => '𑁞', 4841 => '𑁟', 4842 => '𑁠', 4843 => '𑁡', 4844 => '𑁢', 4845 => '𑁣', 4846 => '𑁤', 4847 => '𑁥', 4848 => '𐩄', 4849 => '𐩅', 4850 => '𐩆', 4851 => '𐩇', 4852 => '𒐲', 4853 => '𒐳', 4854 => '𒑖', 4855 => '𒑗', 4856 => '𒑚', 4857 => '𒑛', 4858 => '𒑜', 4859 => '𒑝', 4860 => '𒑞', 4861 => '𒑟', 4862 => '𒑠', 4863 => '𒑡', 4864 => '𒑢', 4865 => '𝍩', 4866 => '𝍪', 4867 => '𝍫', 4868 => '𝍬', 4869 => '𝍭', 4870 => '𝍮', 4871 => '𝍯', 4872 => '𝍰', 4873 => '𝍱', 4874 => 'ː', 4875 => 'ˑ', 4876 => 'ॱ', 4877 => 'ๆ', 4878 => 'ໆ', 4879 => 'ᪧ', 4880 => 'ꧏ', 4881 => 'ꩰ', 4882 => 'ꫝ', 4883 => 'ゝ', 4884 => 'ー', 4885 => 'ヽ', 4886 => '¤', 4887 => '¢', 4888 => '$', 4889 => '£', 4890 => '¥', 4891 => '؋', 4892 => '৲', 4893 => '৳', 4894 => '৻', 4895 => '૱', 4896 => '꠸', 4897 => '௹', 4898 => '฿', 4899 => '៛', 4900 => '₠', 4901 => '₡', 4902 => '₢', 4903 => '₣', 4904 => '₤', 4905 => '₥', 4906 => '₦', 4907 => '₧', 4908 => '₩', 4909 => '₪', 4910 => '₫', 4911 => '€', 4912 => '₭', 4913 => '₮', 4914 => '₯', 4915 => '₰', 4916 => '₱', 4917 => '₲', 4918 => '₳', 4919 => '₴', 4920 => '₵', 4921 => '₶', 4922 => '₷', 4923 => '₸', 4924 => '₹', 4925 => '0', 4926 => '1', 4927 => '2', 4928 => '3', 4929 => '4', 4930 => '5', 4931 => '6', 4932 => '7', 4933 => '8', 4934 => '9', 4935 => 'A', 4936 => 'ᴀ', 4937 => 'Ⱥ', 4938 => 'ᶏ', 4939 => 'ᴁ', 4940 => 'ᴂ', 4941 => 'Ɐ', 4942 => 'Ɑ', 4943 => 'ᶐ', 4944 => 'Ɒ', 4945 => 'B', 4946 => 'ʙ', 4947 => 'Ƀ', 4948 => 'ᴯ', 4949 => 'ᴃ', 4950 => 'ᵬ', 4951 => 'ᶀ', 4952 => 'Ɓ', 4953 => 'Ƃ', 4954 => 'C', 4955 => 'ᴄ', 4956 => 'Ȼ', 4957 => 'Ƈ', 4958 => 'ɕ', 4959 => 'Ↄ', 4960 => 'Ꜿ', 4961 => 'D', 4962 => 'ᴅ', 4963 => 'ᴆ', 4964 => 'ᵭ', 4965 => 'ᶁ', 4966 => 'Ɖ', 4967 => 'Ɗ', 4968 => 'ᶑ', 4969 => 'Ƌ', 4970 => 'ȡ', 4971 => 'ꝱ', 4972 => 'ẟ', 4973 => 'E', 4974 => 'ᴇ', 4975 => 'Ɇ', 4976 => 'ᶒ', 4977 => 'ⱸ', 4978 => 'Ǝ', 4979 => 'ⱻ', 4980 => 'Ə', 4981 => 'ᶕ', 4982 => 'Ɛ', 4983 => 'ᶓ', 4984 => 'ɘ', 4985 => 'ɚ', 4986 => 'ɜ', 4987 => 'ᶔ', 4988 => 'ᴈ', 4989 => 'ɝ', 4990 => 'ɞ', 4991 => 'ʚ', 4992 => 'ɤ', 4993 => 'F', 4994 => 'ꜰ', 4995 => 'ᵮ', 4996 => 'ᶂ', 4997 => 'Ƒ', 4998 => 'Ⅎ', 4999 => 'ꟻ', 5000 => 'G', 5001 => 'ɡ', 5002 => 'ɢ', 5003 => 'Ǥ', 5004 => 'ᶃ', 5005 => 'Ɠ', 5006 => 'ʛ', 5007 => 'ᵷ', 5008 => 'Ꝿ', 5009 => 'Ɣ', 5010 => 'Ƣ', 5011 => 'H', 5012 => 'ʜ', 5013 => 'Ƕ', 5014 => 'ɦ', 5015 => 'Ⱨ', 5016 => 'Ⱶ', 5017 => 'Ꜧ', 5018 => 'ɧ', 5019 => 'ʻ', 5020 => 'ʽ', 5021 => 'I', 5022 => 'ı', 5023 => 'ɪ', 5024 => 'ꟾ', 5025 => 'ᴉ', 5026 => 'Ɨ', 5027 => 'ᵻ', 5028 => 'ᶖ', 5029 => 'Ɩ', 5030 => 'ᵼ', 5031 => 'J', 5032 => 'ȷ', 5033 => 'ᴊ', 5034 => 'Ɉ', 5035 => 'ʝ', 5036 => 'ɟ', 5037 => 'ʄ', 5038 => 'K', 5039 => 'ᴋ', 5040 => 'ᶄ', 5041 => 'Ƙ', 5042 => 'Ⱪ', 5043 => 'Ꝁ', 5044 => 'Ꝃ', 5045 => 'Ꝅ', 5046 => 'ʞ', 5047 => 'L', 5048 => 'ʟ', 5049 => 'Ꝇ', 5050 => 'ᴌ', 5051 => 'Ꝉ', 5052 => 'Ƚ', 5053 => 'Ⱡ', 5054 => 'Ɫ', 5055 => 'ɬ', 5056 => 'ᶅ', 5057 => 'ɭ', 5058 => 'ꞎ', 5059 => 'ȴ', 5060 => 'ꝲ', 5061 => 'ɮ', 5062 => 'Ꞁ', 5063 => 'ƛ', 5064 => 'ʎ', 5065 => 'M', 5066 => 'ᴍ', 5067 => 'ᵯ', 5068 => 'ᶆ', 5069 => 'Ɱ', 5070 => 'ꟽ', 5071 => 'ꟿ', 5072 => 'ꝳ', 5073 => 'N', 5074 => 'ɴ', 5075 => 'ᴻ', 5076 => 'ᴎ', 5077 => 'ᵰ', 5078 => 'Ɲ', 5079 => 'Ƞ', 5080 => 'Ꞑ', 5081 => 'ᶇ', 5082 => 'ɳ', 5083 => 'ȵ', 5084 => 'ꝴ', 5085 => 'Ŋ', 5086 => 'O', 5087 => 'ᴏ', 5088 => 'ᴑ', 5089 => 'ɶ', 5090 => 'ᴔ', 5091 => 'ᴓ', 5092 => 'Ɔ', 5093 => 'ᴐ', 5094 => 'ᴒ', 5095 => 'ᶗ', 5096 => 'Ꝍ', 5097 => 'ᴖ', 5098 => 'ᴗ', 5099 => 'ⱺ', 5100 => 'Ɵ', 5101 => 'Ꝋ', 5102 => 'ɷ', 5103 => 'Ȣ', 5104 => 'ᴕ', 5105 => 'P', 5106 => 'ᴘ', 5107 => 'Ᵽ', 5108 => 'Ꝑ', 5109 => 'ᵱ', 5110 => 'ᶈ', 5111 => 'Ƥ', 5112 => 'Ꝓ', 5113 => 'Ꝕ', 5114 => 'ꟼ', 5115 => 'ɸ', 5116 => 'ⱷ', 5117 => 'Q', 5118 => 'Ꝗ', 5119 => 'Ꝙ', 5120 => 'ʠ', 5121 => 'Ɋ', 5122 => 'ĸ', 5123 => 'R', 5124 => 'Ʀ', 5125 => 'Ꝛ', 5126 => 'ᴙ', 5127 => 'Ɍ', 5128 => 'ᵲ', 5129 => 'ɹ', 5130 => 'ᴚ', 5131 => 'ɺ', 5132 => 'ᶉ', 5133 => 'ɻ', 5134 => 'ⱹ', 5135 => 'ɼ', 5136 => 'Ɽ', 5137 => 'ɾ', 5138 => 'ᵳ', 5139 => 'ɿ', 5140 => 'ʁ', 5141 => 'ꝵ', 5142 => 'ꝶ', 5143 => 'Ꝝ', 5144 => 'S', 5145 => 'ꜱ', 5146 => 'ᵴ', 5147 => 'ᶊ', 5148 => 'ʂ', 5149 => 'Ȿ', 5150 => 'ẜ', 5151 => 'ẝ', 5152 => 'Ʃ', 5153 => 'ᶋ', 5154 => 'ƪ', 5155 => 'ʅ', 5156 => 'ᶘ', 5157 => 'ʆ', 5158 => 'T', 5159 => 'ᴛ', 5160 => 'Ŧ', 5161 => 'Ⱦ', 5162 => 'ᵵ', 5163 => 'ƫ', 5164 => 'Ƭ', 5165 => 'Ʈ', 5166 => 'ȶ', 5167 => 'ꝷ', 5168 => 'ʇ', 5169 => 'U', 5170 => 'ᴜ', 5171 => 'ᴝ', 5172 => 'ᴞ', 5173 => 'ᵫ', 5174 => 'Ʉ', 5175 => 'ᵾ', 5176 => 'ᶙ', 5177 => 'Ɥ', 5178 => 'ʮ', 5179 => 'ʯ', 5180 => 'Ɯ', 5181 => 'ꟺ', 5182 => 'ᴟ', 5183 => 'ɰ', 5184 => 'Ʊ', 5185 => 'ᵿ', 5186 => 'V', 5187 => 'ᴠ', 5188 => 'Ꝟ', 5189 => 'ᶌ', 5190 => 'Ʋ', 5191 => 'ⱱ', 5192 => 'ⱴ', 5193 => 'Ỽ', 5194 => 'Ʌ', 5195 => 'W', 5196 => 'ᴡ', 5197 => 'Ⱳ', 5198 => 'ʍ', 5199 => 'X', 5200 => 'ᶍ', 5201 => 'Y', 5202 => 'ʏ', 5203 => 'Ɏ', 5204 => 'Ƴ', 5205 => 'Ỿ', 5206 => 'Z', 5207 => 'ᴢ', 5208 => 'Ƶ', 5209 => 'ᵶ', 5210 => 'ᶎ', 5211 => 'Ȥ', 5212 => 'ʐ', 5213 => 'ʑ', 5214 => 'Ɀ', 5215 => 'Ⱬ', 5216 => 'Ꝣ', 5217 => 'Ʒ', 5218 => 'ᴣ', 5219 => 'Ƹ', 5220 => 'ᶚ', 5221 => 'ƺ', 5222 => 'ʓ', 5223 => 'Ȝ', 5224 => 'Þ', 5225 => 'Ꝥ', 5226 => 'Ꝧ', 5227 => 'Ƿ', 5228 => 'Ꝩ', 5229 => 'Ꝫ', 5230 => 'Ꝭ', 5231 => 'Ꝯ', 5232 => 'ꝸ', 5233 => 'ƻ', 5234 => 'Ꜫ', 5235 => 'Ꜭ', 5236 => 'Ꜯ', 5237 => 'Ƨ', 5238 => 'Ƽ', 5239 => 'Ƅ', 5240 => 'ʔ', 5241 => 'Ɂ', 5242 => 'ˀ', 5243 => 'ʼ', 5244 => 'ˮ', 5245 => 'ʾ', 5246 => 'Ꜣ', 5247 => 'Ꞌ', 5248 => 'ʕ', 5249 => 'ʿ', 5250 => 'ˁ', 5251 => 'ᴤ', 5252 => 'ᴥ', 5253 => 'Ꜥ', 5254 => 'ʡ', 5255 => 'ʢ', 5256 => 'ʖ', 5257 => 'ǀ', 5258 => 'ǁ', 5259 => 'ǂ', 5260 => 'ǃ', 5261 => 'ʗ', 5262 => 'ʘ', 5263 => 'ʬ', 5264 => 'ʭ', 5265 => 'Α', 5266 => 'Β', 5267 => 'Γ', 5268 => 'ᴦ', 5269 => 'Δ', 5270 => 'Ε', 5271 => 'Ϝ', 5272 => 'Ͷ', 5273 => 'Ϛ', 5274 => 'Ζ', 5275 => 'Ͱ', 5276 => 'Η', 5277 => 'Θ', 5278 => 'Ι', 5279 => 'ϳ', 5280 => 'Κ', 5281 => 'Λ', 5282 => 'ᴧ', 5283 => 'Μ', 5284 => 'Ν', 5285 => 'Ξ', 5286 => 'Ο', 5287 => 'Π', 5288 => 'ᴨ', 5289 => 'Ϻ', 5290 => 'Ϟ', 5291 => 'Ϙ', 5292 => 'Ρ', 5293 => 'ᴩ', 5294 => 'ϼ', 5295 => 'Σ', 5296 => 'Ͼ', 5297 => 'Ͻ', 5298 => 'Ͽ', 5299 => 'Τ', 5300 => 'Υ', 5301 => 'Φ', 5302 => 'Χ', 5303 => 'Ψ', 5304 => 'ᴪ', 5305 => 'Ω', 5306 => 'Ϡ', 5307 => 'Ͳ', 5308 => 'Ϸ', 5309 => 'Ⲁ', 5310 => 'Ⲃ', 5311 => 'Ⲅ', 5312 => 'Ⲇ', 5313 => 'Ⲉ', 5314 => 'Ⲷ', 5315 => 'Ⲋ', 5316 => 'Ⲍ', 5317 => 'Ⲏ', 5318 => 'Ⲑ', 5319 => 'Ⲓ', 5320 => 'Ⲕ', 5321 => 'Ⲹ', 5322 => 'Ⲗ', 5323 => 'Ⲙ', 5324 => 'Ⲛ', 5325 => 'Ⲻ', 5326 => 'Ⲽ', 5327 => 'Ⲝ', 5328 => 'Ⲟ', 5329 => 'Ⲡ', 5330 => 'Ⲣ', 5331 => 'Ⲥ', 5332 => 'Ⲧ', 5333 => 'Ⲩ', 5334 => 'Ⲫ', 5335 => 'Ⲭ', 5336 => 'Ⲯ', 5337 => 'Ⲱ', 5338 => 'Ⲿ', 5339 => 'Ⳁ', 5340 => 'Ϣ', 5341 => 'Ⳬ', 5342 => 'Ⳃ', 5343 => 'Ⳅ', 5344 => 'Ⳇ', 5345 => 'Ϥ', 5346 => 'Ϧ', 5347 => 'Ⳉ', 5348 => 'Ϩ', 5349 => 'Ⳋ', 5350 => 'Ⳍ', 5351 => 'Ⳏ', 5352 => 'Ⳑ', 5353 => 'Ⳓ', 5354 => 'Ⳕ', 5355 => 'Ϫ', 5356 => 'Ⳮ', 5357 => 'Ⳗ', 5358 => 'Ϭ', 5359 => 'Ⳙ', 5360 => 'Ⳛ', 5361 => 'Ⳝ', 5362 => 'Ϯ', 5363 => 'Ⲳ', 5364 => 'Ⲵ', 5365 => 'Ⳟ', 5366 => 'Ⳡ', 5367 => 'Ⳣ', 5368 => 'А', 5369 => 'Ӑ', 5370 => 'Ӓ', 5371 => 'Ә', 5372 => 'Ӛ', 5373 => 'Ӕ', 5374 => 'Б', 5375 => 'В', 5376 => 'Г', 5377 => 'Ғ', 5378 => 'Ӻ', 5379 => 'Ҕ', 5380 => 'Ӷ', 5381 => 'Д', 5382 => 'Ԁ', 5383 => 'Ꚁ', 5384 => 'Ђ', 5385 => 'Ꙣ', 5386 => 'Ԃ', 5387 => 'Ѓ', 5388 => 'Ҙ', 5389 => 'Е', 5390 => 'Ӗ', 5391 => 'Є', 5392 => 'Ж', 5393 => 'Ꚅ', 5394 => 'Ӝ', 5395 => 'Җ', 5396 => 'З', 5397 => 'Ꙁ', 5398 => 'Ԅ', 5399 => 'Ԑ', 5400 => 'Ӟ', 5401 => 'Ꙃ', 5402 => 'Ѕ', 5403 => 'Ꙅ', 5404 => 'Ӡ', 5405 => 'Ꚉ', 5406 => 'Ԇ', 5407 => 'Ꚃ', 5408 => 'И', 5409 => 'Ҋ', 5410 => 'Ӥ', 5411 => 'І', 5412 => 'Ꙇ', 5413 => 'Ї', 5414 => 'Й', 5415 => 'Ј', 5416 => 'Ꙉ', 5417 => 'К', 5418 => 'Қ', 5419 => 'Ӄ', 5420 => 'Ҡ', 5421 => 'Ҟ', 5422 => 'Ҝ', 5423 => 'Ԟ', 5424 => 'Ԛ', 5425 => 'Л', 5426 => 'ᴫ', 5427 => 'Ӆ', 5428 => 'Ԓ', 5429 => 'Ԡ', 5430 => 'Љ', 5431 => 'Ꙥ', 5432 => 'Ԉ', 5433 => 'Ԕ', 5434 => 'М', 5435 => 'Ӎ', 5436 => 'Ꙧ', 5437 => 'Н', 5438 => 'Ӊ', 5439 => 'Ң', 5440 => 'Ӈ', 5441 => 'Ԣ', 5442 => 'Ҥ', 5443 => 'Њ', 5444 => 'Ԋ', 5445 => 'О', 5446 => 'Ӧ', 5447 => 'Ө', 5448 => 'Ӫ', 5449 => 'П', 5450 => 'Ԥ', 5451 => 'Ҧ', 5452 => 'Ҁ', 5453 => 'Р', 5454 => 'Ҏ', 5455 => 'Ԗ', 5456 => 'С', 5457 => 'Ԍ', 5458 => 'Ҫ', 5459 => 'Т', 5460 => 'Ꚍ', 5461 => 'Ԏ', 5462 => 'Ҭ', 5463 => 'Ꚋ', 5464 => 'Ћ', 5465 => 'Ќ', 5466 => 'У', 5467 => 'Ў', 5468 => 'Ӱ', 5469 => 'Ӳ', 5470 => 'Ү', 5471 => 'Ұ', 5472 => 'Ꙋ', 5473 => 'Ѹ', 5474 => 'Ф', 5475 => 'Х', 5476 => 'Ӽ', 5477 => 'Ӿ', 5478 => 'Ҳ', 5479 => 'Һ', 5480 => 'Ԧ', 5481 => 'Ꚕ', 5482 => 'Ѡ', 5483 => 'Ѿ', 5484 => 'Ꙍ', 5485 => 'Ѽ', 5486 => 'Ѻ', 5487 => 'Ц', 5488 => 'Ꙡ', 5489 => 'Ꚏ', 5490 => 'Ҵ', 5491 => 'Ꚑ', 5492 => 'Ч', 5493 => 'Ꚓ', 5494 => 'Ӵ', 5495 => 'Ҷ', 5496 => 'Ӌ', 5497 => 'Ҹ', 5498 => 'Ꚇ', 5499 => 'Ҽ', 5500 => 'Ҿ', 5501 => 'Џ', 5502 => 'Ш', 5503 => 'Ꚗ', 5504 => 'Щ', 5505 => 'Ꙏ', 5506 => 'ⸯ', 5507 => 'ꙿ', 5508 => 'Ъ', 5509 => 'Ꙑ', 5510 => 'Ы', 5511 => 'Ӹ', 5512 => 'Ь', 5513 => 'Ҍ', 5514 => 'Ѣ', 5515 => 'Ꙓ', 5516 => 'Э', 5517 => 'Ӭ', 5518 => 'Ю', 5519 => 'Ꙕ', 5520 => 'Ꙗ', 5521 => 'Я', 5522 => 'Ԙ', 5523 => 'Ѥ', 5524 => 'Ѧ', 5525 => 'Ꙙ', 5526 => 'Ѫ', 5527 => 'Ꙛ', 5528 => 'Ѩ', 5529 => 'Ꙝ', 5530 => 'Ѭ', 5531 => 'Ѯ', 5532 => 'Ѱ', 5533 => 'Ѳ', 5534 => 'Ѵ', 5535 => 'Ѷ', 5536 => 'Ꙟ', 5537 => 'Ҩ', 5538 => 'Ԝ', 5539 => 'Ӏ', 5540 => 'Ⰰ', 5541 => 'Ⰱ', 5542 => 'Ⰲ', 5543 => 'Ⰳ', 5544 => 'Ⰴ', 5545 => 'Ⰵ', 5546 => 'Ⰶ', 5547 => 'Ⰷ', 5548 => 'Ⰸ', 5549 => 'Ⰹ', 5550 => 'Ⰺ', 5551 => 'Ⰻ', 5552 => 'Ⰼ', 5553 => 'Ⰽ', 5554 => 'Ⰾ', 5555 => 'Ⰿ', 5556 => 'Ⱀ', 5557 => 'Ⱁ', 5558 => 'Ⱂ', 5559 => 'Ⱃ', 5560 => 'Ⱄ', 5561 => 'Ⱅ', 5562 => 'Ⱆ', 5563 => 'Ⱇ', 5564 => 'Ⱈ', 5565 => 'Ⱉ', 5566 => 'Ⱊ', 5567 => 'Ⱋ', 5568 => 'Ⱌ', 5569 => 'Ⱍ', 5570 => 'Ⱎ', 5571 => 'Ⱏ', 5572 => 'Ⱐ', 5573 => 'Ⱑ', 5574 => 'Ⱒ', 5575 => 'Ⱓ', 5576 => 'Ⱔ', 5577 => 'Ⱕ', 5578 => 'Ⱖ', 5579 => 'Ⱗ', 5580 => 'Ⱘ', 5581 => 'Ⱙ', 5582 => 'Ⱚ', 5583 => 'Ⱛ', 5584 => 'Ⱜ', 5585 => 'Ⱝ', 5586 => 'Ⱞ', 5587 => 'ა', 5588 => 'Ⴀ', 5589 => 'ბ', 5590 => 'Ⴁ', 5591 => 'გ', 5592 => 'Ⴂ', 5593 => 'დ', 5594 => 'Ⴃ', 5595 => 'ე', 5596 => 'Ⴄ', 5597 => 'ვ', 5598 => 'Ⴅ', 5599 => 'ზ', 5600 => 'Ⴆ', 5601 => 'ჱ', 5602 => 'Ⴡ', 5603 => 'თ', 5604 => 'Ⴇ', 5605 => 'ი', 5606 => 'Ⴈ', 5607 => 'კ', 5608 => 'Ⴉ', 5609 => 'ლ', 5610 => 'Ⴊ', 5611 => 'მ', 5612 => 'Ⴋ', 5613 => 'ნ', 5614 => 'Ⴌ', 5615 => 'ჲ', 5616 => 'Ⴢ', 5617 => 'ო', 5618 => 'Ⴍ', 5619 => 'პ', 5620 => 'Ⴎ', 5621 => 'ჟ', 5622 => 'Ⴏ', 5623 => 'რ', 5624 => 'Ⴐ', 5625 => 'ს', 5626 => 'Ⴑ', 5627 => 'ტ', 5628 => 'Ⴒ', 5629 => 'ჳ', 5630 => 'Ⴣ', 5631 => 'უ', 5632 => 'Ⴓ', 5633 => 'ფ', 5634 => 'Ⴔ', 5635 => 'ქ', 5636 => 'Ⴕ', 5637 => 'ღ', 5638 => 'Ⴖ', 5639 => 'ყ', 5640 => 'Ⴗ', 5641 => 'შ', 5642 => 'Ⴘ', 5643 => 'ჩ', 5644 => 'Ⴙ', 5645 => 'ც', 5646 => 'Ⴚ', 5647 => 'ძ', 5648 => 'Ⴛ', 5649 => 'წ', 5650 => 'Ⴜ', 5651 => 'ჭ', 5652 => 'Ⴝ', 5653 => 'ხ', 5654 => 'Ⴞ', 5655 => 'ჴ', 5656 => 'Ⴤ', 5657 => 'ჯ', 5658 => 'Ⴟ', 5659 => 'ჰ', 5660 => 'Ⴠ', 5661 => 'ჵ', 5662 => 'Ⴥ', 5663 => 'ჶ', 5664 => 'ჷ', 5665 => 'ჸ', 5666 => 'ჹ', 5667 => 'ჺ', 5668 => 'Ա', 5669 => 'Բ', 5670 => 'Գ', 5671 => 'Դ', 5672 => 'Ե', 5673 => 'Զ', 5674 => 'Է', 5675 => 'Ը', 5676 => 'Թ', 5677 => 'Ժ', 5678 => 'Ի', 5679 => 'Լ', 5680 => 'Խ', 5681 => 'Ծ', 5682 => 'Կ', 5683 => 'Հ', 5684 => 'Ձ', 5685 => 'Ղ', 5686 => 'Ճ', 5687 => 'Մ', 5688 => 'Յ', 5689 => 'Ն', 5690 => 'Շ', 5691 => 'Ո', 5692 => 'Չ', 5693 => 'Պ', 5694 => 'Ջ', 5695 => 'Ռ', 5696 => 'Ս', 5697 => 'Վ', 5698 => 'Տ', 5699 => 'Ր', 5700 => 'Ց', 5701 => 'Ւ', 5702 => 'Փ', 5703 => 'Ք', 5704 => 'Օ', 5705 => 'Ֆ', 5706 => 'ՙ', 5707 => 'א', 5708 => 'ב', 5709 => 'ג', 5710 => 'ד', 5711 => 'ה', 5712 => 'ו', 5713 => 'ז', 5714 => 'ח', 5715 => 'ט', 5716 => 'י', 5717 => 'ך', 5718 => 'ל', 5719 => 'ם', 5720 => 'ן', 5721 => 'ס', 5722 => 'ע', 5723 => 'ף', 5724 => 'ץ', 5725 => 'ק', 5726 => 'ר', 5727 => 'ש', 5728 => 'ת', 5729 => '𐤀', 5730 => '𐤁', 5731 => '𐤂', 5732 => '𐤃', 5733 => '𐤄', 5734 => '𐤅', 5735 => '𐤆', 5736 => '𐤇', 5737 => '𐤈', 5738 => '𐤉', 5739 => '𐤊', 5740 => '𐤋', 5741 => '𐤌', 5742 => '𐤍', 5743 => '𐤎', 5744 => '𐤏', 5745 => '𐤐', 5746 => '𐤑', 5747 => '𐤒', 5748 => '𐤓', 5749 => '𐤔', 5750 => '𐤕', 5751 => 'ࠀ', 5752 => 'ࠁ', 5753 => 'ࠂ', 5754 => 'ࠃ', 5755 => 'ࠄ', 5756 => 'ࠅ', 5757 => 'ࠆ', 5758 => 'ࠇ', 5759 => 'ࠈ', 5760 => 'ࠉ', 5761 => 'ࠊ', 5762 => 'ࠋ', 5763 => 'ࠌ', 5764 => 'ࠍ', 5765 => 'ࠎ', 5766 => 'ࠏ', 5767 => 'ࠐ', 5768 => 'ࠑ', 5769 => 'ࠒ', 5770 => 'ࠓ', 5771 => 'ࠔ', 5772 => 'ࠕ', 5773 => 'ࠚ', 5774 => 'ء', 5775 => 'آ', 5776 => 'أ', 5777 => 'ٲ', 5778 => 'ٱ', 5779 => 'ؤ', 5780 => 'إ', 5781 => 'ٳ', 5782 => 'ݳ', 5783 => 'ݴ', 5784 => 'ئ', 5785 => 'ا', 5786 => 'ٮ', 5787 => 'ب', 5788 => 'ٻ', 5789 => 'پ', 5790 => 'ڀ', 5791 => 'ݐ', 5792 => 'ݑ', 5793 => 'ݒ', 5794 => 'ݓ', 5795 => 'ݔ', 5796 => 'ݕ', 5797 => 'ݖ', 5798 => 'ة', 5799 => 'ت', 5800 => 'ث', 5801 => 'ٹ', 5802 => 'ٺ', 5803 => 'ټ', 5804 => 'ٽ', 5805 => 'ٿ', 5806 => 'ج', 5807 => 'ڃ', 5808 => 'ڄ', 5809 => 'چ', 5810 => 'ڿ', 5811 => 'ڇ', 5812 => 'ح', 5813 => 'خ', 5814 => 'ځ', 5815 => 'ڂ', 5816 => 'څ', 5817 => 'ݗ', 5818 => 'ݘ', 5819 => 'ݮ', 5820 => 'ݯ', 5821 => 'ݲ', 5822 => 'ݼ', 5823 => 'د', 5824 => 'ذ', 5825 => 'ڈ', 5826 => 'ډ', 5827 => 'ڊ', 5828 => 'ڋ', 5829 => 'ڌ', 5830 => 'ڍ', 5831 => 'ڎ', 5832 => 'ڏ', 5833 => 'ڐ', 5834 => 'ۮ', 5835 => 'ݙ', 5836 => 'ݚ', 5837 => 'ر', 5838 => 'ز', 5839 => 'ڑ', 5840 => 'ڒ', 5841 => 'ړ', 5842 => 'ڔ', 5843 => 'ڕ', 5844 => 'ږ', 5845 => 'ڗ', 5846 => 'ژ', 5847 => 'ڙ', 5848 => 'ۯ', 5849 => 'ݛ', 5850 => 'ݫ', 5851 => 'ݬ', 5852 => 'ݱ', 5853 => 'س', 5854 => 'ش', 5855 => 'ښ', 5856 => 'ڛ', 5857 => 'ڜ', 5858 => 'ۺ', 5859 => 'ݜ', 5860 => 'ݭ', 5861 => 'ݰ', 5862 => 'ݽ', 5863 => 'ݾ', 5864 => 'ص', 5865 => 'ض', 5866 => 'ڝ', 5867 => 'ڞ', 5868 => 'ۻ', 5869 => 'ط', 5870 => 'ظ', 5871 => 'ڟ', 5872 => 'ع', 5873 => 'غ', 5874 => 'ڠ', 5875 => 'ۼ', 5876 => 'ݝ', 5877 => 'ݞ', 5878 => 'ݟ', 5879 => 'ف', 5880 => 'ڡ', 5881 => 'ڢ', 5882 => 'ڣ', 5883 => 'ڤ', 5884 => 'ڥ', 5885 => 'ڦ', 5886 => 'ݠ', 5887 => 'ݡ', 5888 => 'ٯ', 5889 => 'ق', 5890 => 'ڧ', 5891 => 'ڨ', 5892 => 'ك', 5893 => 'ک', 5894 => 'ڪ', 5895 => 'ګ', 5896 => 'ڬ', 5897 => 'ݿ', 5898 => 'ڭ', 5899 => 'ڮ', 5900 => 'گ', 5901 => 'ڰ', 5902 => 'ڱ', 5903 => 'ڲ', 5904 => 'ڳ', 5905 => 'ڴ', 5906 => 'ݢ', 5907 => 'ػ', 5908 => 'ؼ', 5909 => 'ݣ', 5910 => 'ݤ', 5911 => 'ل', 5912 => 'ڵ', 5913 => 'ڶ', 5914 => 'ڷ', 5915 => 'ڸ', 5916 => 'ݪ', 5917 => 'م', 5918 => 'ݥ', 5919 => 'ݦ', 5920 => 'ن', 5921 => 'ں', 5922 => 'ڻ', 5923 => 'ڼ', 5924 => 'ڽ', 5925 => 'ڹ', 5926 => 'ݧ', 5927 => 'ݨ', 5928 => 'ݩ', 5929 => 'ه', 5930 => 'ھ', 5931 => 'ہ', 5932 => 'ۃ', 5933 => 'ۿ', 5934 => 'ە', 5935 => 'و', 5936 => 'ۄ', 5937 => 'ۅ', 5938 => 'ۆ', 5939 => 'ۇ', 5940 => 'ۈ', 5941 => 'ۉ', 5942 => 'ۊ', 5943 => 'ۋ', 5944 => 'ۏ', 5945 => 'ݸ', 5946 => 'ݹ', 5947 => 'ى', 5948 => 'ي', 5949 => 'ی', 5950 => 'ۍ', 5951 => 'ێ', 5952 => 'ې', 5953 => 'ۑ', 5954 => 'ؽ', 5955 => 'ؾ', 5956 => 'ؿ', 5957 => 'ؠ', 5958 => 'ݵ', 5959 => 'ݶ', 5960 => 'ݷ', 5961 => 'ے', 5962 => 'ݺ', 5963 => 'ݻ', 5964 => 'ܐ', 5965 => 'ܒ', 5966 => 'ܓ', 5967 => 'ܖ', 5968 => 'ܕ', 5969 => 'ܗ', 5970 => 'ܘ', 5971 => 'ܙ', 5972 => 'ݍ', 5973 => 'ܚ', 5974 => 'ܛ', 5975 => 'ܝ', 5976 => 'ܞ', 5977 => 'ܟ', 5978 => 'ݎ', 5979 => 'ܠ', 5980 => 'ܡ', 5981 => 'ܢ', 5982 => 'ܣ', 5983 => 'ܥ', 5984 => 'ܦ', 5985 => 'ݏ', 5986 => 'ܨ', 5987 => 'ܩ', 5988 => 'ܪ', 5989 => 'ܫ', 5990 => 'ܬ', 5991 => 'ࡀ', 5992 => 'ࡁ', 5993 => 'ࡂ', 5994 => 'ࡃ', 5995 => 'ࡄ', 5996 => 'ࡅ', 5997 => 'ࡆ', 5998 => 'ࡇ', 5999 => 'ࡈ', 6000 => 'ࡉ', 6001 => 'ࡊ', 6002 => 'ࡋ', 6003 => 'ࡌ', 6004 => 'ࡍ', 6005 => 'ࡎ', 6006 => 'ࡏ', 6007 => 'ࡐ', 6008 => 'ࡑ', 6009 => 'ࡒ', 6010 => 'ࡓ', 6011 => 'ࡔ', 6012 => 'ࡕ', 6013 => 'ࡖ', 6014 => 'ࡗ', 6015 => 'ࡘ', 6016 => 'ހ', 6017 => 'ޙ', 6018 => 'ޚ', 6019 => 'ށ', 6020 => 'ނ', 6021 => 'ރ', 6022 => 'ޜ', 6023 => 'ބ', 6024 => 'ޅ', 6025 => 'ކ', 6026 => 'އ', 6027 => 'ޢ', 6028 => 'ޣ', 6029 => 'ވ', 6030 => 'ޥ', 6031 => 'މ', 6032 => 'ފ', 6033 => 'ދ', 6034 => 'ޛ', 6035 => 'ތ', 6036 => 'ޘ', 6037 => 'ޠ', 6038 => 'ޡ', 6039 => 'ލ', 6040 => 'ގ', 6041 => 'ޤ', 6042 => 'ޏ', 6043 => 'ސ', 6044 => 'ޝ', 6045 => 'ޞ', 6046 => 'ޟ', 6047 => 'ޑ', 6048 => 'ޒ', 6049 => 'ޓ', 6050 => 'ޔ', 6051 => 'ޕ', 6052 => 'ޖ', 6053 => 'ޗ', 6054 => 'ޱ', 6055 => 'ߊ', 6056 => 'ߋ', 6057 => 'ߌ', 6058 => 'ߍ', 6059 => 'ߎ', 6060 => 'ߏ', 6061 => 'ߐ', 6062 => 'ߑ', 6063 => 'ߒ', 6064 => 'ߓ', 6065 => 'ߔ', 6066 => 'ߕ', 6067 => 'ߖ', 6068 => 'ߗ', 6069 => 'ߘ', 6070 => 'ߙ', 6071 => 'ߚ', 6072 => 'ߛ', 6073 => 'ߜ', 6074 => 'ߝ', 6075 => 'ߞ', 6076 => 'ߟ', 6077 => 'ߠ', 6078 => 'ߡ', 6079 => 'ߢ', 6080 => 'ߣ', 6081 => 'ߤ', 6082 => 'ߥ', 6083 => 'ߦ', 6084 => 'ߧ', 6085 => 'ߴ', 6086 => 'ߵ', 6087 => 'ⴰ', 6088 => 'ⴱ', 6089 => 'ⴲ', 6090 => 'ⴳ', 6091 => 'ⴴ', 6092 => 'ⴵ', 6093 => 'ⴶ', 6094 => 'ⴷ', 6095 => 'ⴸ', 6096 => 'ⴹ', 6097 => 'ⴺ', 6098 => 'ⴻ', 6099 => 'ⴼ', 6100 => 'ⴽ', 6101 => 'ⴾ', 6102 => 'ⴿ', 6103 => 'ⵀ', 6104 => 'ⵁ', 6105 => 'ⵂ', 6106 => 'ⵃ', 6107 => 'ⵄ', 6108 => 'ⵅ', 6109 => 'ⵆ', 6110 => 'ⵇ', 6111 => 'ⵈ', 6112 => 'ⵉ', 6113 => 'ⵊ', 6114 => 'ⵋ', 6115 => 'ⵌ', 6116 => 'ⵍ', 6117 => 'ⵎ', 6118 => 'ⵏ', 6119 => 'ⵐ', 6120 => 'ⵑ', 6121 => 'ⵒ', 6122 => 'ⵓ', 6123 => 'ⵔ', 6124 => 'ⵕ', 6125 => 'ⵖ', 6126 => 'ⵗ', 6127 => 'ⵘ', 6128 => 'ⵙ', 6129 => 'ⵚ', 6130 => 'ⵛ', 6131 => 'ⵜ', 6132 => 'ⵝ', 6133 => 'ⵞ', 6134 => 'ⵟ', 6135 => 'ⵠ', 6136 => 'ⵡ', 6137 => 'ⵢ', 6138 => 'ⵣ', 6139 => 'ⵤ', 6140 => 'ⵥ', 6141 => 'ⵯ', 6142 => 'ሀ', 6143 => 'ሁ', 6144 => 'ሂ', 6145 => 'ሃ', 6146 => 'ሄ', 6147 => 'ህ', 6148 => 'ሆ', 6149 => 'ሇ', 6150 => 'ለ', 6151 => 'ሉ', 6152 => 'ሊ', 6153 => 'ላ', 6154 => 'ሌ', 6155 => 'ል', 6156 => 'ሎ', 6157 => 'ሏ', 6158 => 'ⶀ', 6159 => 'ሐ', 6160 => 'ሑ', 6161 => 'ሒ', 6162 => 'ሓ', 6163 => 'ሔ', 6164 => 'ሕ', 6165 => 'ሖ', 6166 => 'ሗ', 6167 => 'መ', 6168 => 'ሙ', 6169 => 'ሚ', 6170 => 'ማ', 6171 => 'ሜ', 6172 => 'ም', 6173 => 'ሞ', 6174 => 'ሟ', 6175 => 'ᎀ', 6176 => 'ᎁ', 6177 => 'ᎂ', 6178 => 'ᎃ', 6179 => 'ⶁ', 6180 => 'ሠ', 6181 => 'ሡ', 6182 => 'ሢ', 6183 => 'ሣ', 6184 => 'ሤ', 6185 => 'ሥ', 6186 => 'ሦ', 6187 => 'ሧ', 6188 => 'ረ', 6189 => 'ሩ', 6190 => 'ሪ', 6191 => 'ራ', 6192 => 'ሬ', 6193 => 'ር', 6194 => 'ሮ', 6195 => 'ሯ', 6196 => 'ⶂ', 6197 => 'ሰ', 6198 => 'ሱ', 6199 => 'ሲ', 62