the whole shebang

This commit is contained in:
2014-11-25 16:42:40 +01:00
parent 7f74c0613e
commit ab1334c0cf
3686 changed files with 496409 additions and 1 deletions

View File

@@ -0,0 +1,645 @@
<?php // vi: set fenc=utf-8 ts=4 sw=4 et:
/*
* Copyright (C) 2013 Nicolas Grekas - p@tchwork.com
*
* This library is free software; you can redistribute it and/or modify it
* under the terms of the (at your option):
* Apache License v2.0 (http://apache.org/licenses/LICENSE-2.0.txt), or
* GNU General Public License v2.0 (http://gnu.org/licenses/gpl-2.0.txt).
*/
namespace Patchwork\PHP\Shim;
/**
* iconv implementation in pure PHP, UTF-8 centric.
*
* Implemented:
* - iconv - Convert string to requested character encoding
* - iconv_mime_decode - Decodes a MIME header field
* - iconv_mime_decode_headers - Decodes multiple MIME header fields at once
* - iconv_get_encoding - Retrieve internal configuration variables of iconv extension
* - iconv_set_encoding - Set current setting for character encoding conversion
* - iconv_mime_encode - Composes a MIME header field
* - ob_iconv_handler - Convert character encoding as output buffer handler
* - iconv_strlen - Returns the character count of string
* - iconv_strpos - Finds position of first occurrence of a needle within a haystack
* - iconv_strrpos - Finds the last occurrence of a needle within a haystack
* - iconv_substr - Cut out part of a string
*
* Charsets available for convertion are defined by files
* in the charset/ directory and by Iconv::$alias below.
* You're welcome to send back any addition you make.
*/
class Iconv
{
const
ERROR_ILLEGAL_CHARACTER = 'iconv(): Detected an illegal character in input string',
ERROR_WRONG_CHARSET = 'iconv(): Wrong charset, conversion from `%s\' to `%s\' is not allowed';
protected static
$input_encoding = 'utf-8',
$output_encoding = 'utf-8',
$internal_encoding = 'utf-8',
$alias = array(
'utf8' => 'utf-8',
'ascii' => 'us-ascii',
'tis-620' => 'iso-8859-11',
'cp1250' => 'windows-1250',
'cp1251' => 'windows-1251',
'cp1252' => 'windows-1252',
'cp1253' => 'windows-1253',
'cp1254' => 'windows-1254',
'cp1255' => 'windows-1255',
'cp1256' => 'windows-1256',
'cp1257' => 'windows-1257',
'cp1258' => 'windows-1258',
'shift-jis' => 'cp932',
'shift_jis' => 'cp932',
'latin1' => 'iso-8859-1',
'latin2' => 'iso-8859-2',
'latin3' => 'iso-8859-3',
'latin4' => 'iso-8859-4',
'latin5' => 'iso-8859-9',
'latin6' => 'iso-8859-10',
'latin7' => 'iso-8859-13',
'latin8' => 'iso-8859-14',
'latin9' => 'iso-8859-15',
'latin10' => 'iso-8859-16',
'iso8859-1' => 'iso-8859-1',
'iso8859-2' => 'iso-8859-2',
'iso8859-3' => 'iso-8859-3',
'iso8859-4' => 'iso-8859-4',
'iso8859-5' => 'iso-8859-5',
'iso8859-6' => 'iso-8859-6',
'iso8859-7' => 'iso-8859-7',
'iso8859-8' => 'iso-8859-8',
'iso8859-9' => 'iso-8859-9',
'iso8859-10' => 'iso-8859-10',
'iso8859-11' => 'iso-8859-11',
'iso8859-12' => 'iso-8859-12',
'iso8859-13' => 'iso-8859-13',
'iso8859-14' => 'iso-8859-14',
'iso8859-15' => 'iso-8859-15',
'iso8859-16' => 'iso-8859-16',
'iso_8859-1' => 'iso-8859-1',
'iso_8859-2' => 'iso-8859-2',
'iso_8859-3' => 'iso-8859-3',
'iso_8859-4' => 'iso-8859-4',
'iso_8859-5' => 'iso-8859-5',
'iso_8859-6' => 'iso-8859-6',
'iso_8859-7' => 'iso-8859-7',
'iso_8859-8' => 'iso-8859-8',
'iso_8859-9' => 'iso-8859-9',
'iso_8859-10' => 'iso-8859-10',
'iso_8859-11' => 'iso-8859-11',
'iso_8859-12' => 'iso-8859-12',
'iso_8859-13' => 'iso-8859-13',
'iso_8859-14' => 'iso-8859-14',
'iso_8859-15' => 'iso-8859-15',
'iso_8859-16' => 'iso-8859-16',
'iso88591' => 'iso-8859-1',
'iso88592' => 'iso-8859-2',
'iso88593' => 'iso-8859-3',
'iso88594' => 'iso-8859-4',
'iso88595' => 'iso-8859-5',
'iso88596' => 'iso-8859-6',
'iso88597' => 'iso-8859-7',
'iso88598' => 'iso-8859-8',
'iso88599' => 'iso-8859-9',
'iso885910' => 'iso-8859-10',
'iso885911' => 'iso-8859-11',
'iso885912' => 'iso-8859-12',
'iso885913' => 'iso-8859-13',
'iso885914' => 'iso-8859-14',
'iso885915' => 'iso-8859-15',
'iso885916' => 'iso-8859-16',
),
$translit_map = array(),
$convert_map = array(),
$error_handler,
$last_error,
$ulen_mask = array("\xC0" => 2, "\xD0" => 2, "\xE0" => 3, "\xF0" => 4),
$is_valid_utf8;
static function iconv($in_charset, $out_charset, $str)
{
if ('' === (string) $str) return '';
// Prepare for //IGNORE and //TRANSLIT
$TRANSLIT = $IGNORE = '';
$out_charset = strtolower($out_charset);
$in_charset = strtolower($in_charset );
'' === $out_charset && $out_charset = 'iso-8859-1';
'' === $in_charset && $in_charset = 'iso-8859-1';
if ('//translit' === substr($out_charset, -10))
{
$TRANSLIT = '//TRANSLIT';
$out_charset = substr($out_charset, 0, -10);
}
if ('//ignore' === substr($out_charset, -8))
{
$IGNORE = '//IGNORE';
$out_charset = substr($out_charset, 0, -8);
}
'//translit' === substr($in_charset, -10) && $in_charset = substr($in_charset, 0, -10);
'//ignore' === substr($in_charset, -8) && $in_charset = substr($in_charset, 0, -8);
isset(self::$alias[ $in_charset]) && $in_charset = self::$alias[ $in_charset];
isset(self::$alias[$out_charset]) && $out_charset = self::$alias[$out_charset];
// Load charset maps
if ( ('utf-8' !== $in_charset && !self::loadMap('from.', $in_charset, $in_map))
|| ('utf-8' !== $out_charset && !self::loadMap( 'to.', $out_charset, $out_map)) )
{
user_error(sprintf(self::ERROR_WRONG_CHARSET, $in_charset, $out_charset));
return false;
}
if ('utf-8' !== $in_charset)
{
// Convert input to UTF-8
$result = '';
if (self::map_to_utf8($result, $in_map, $str, $IGNORE)) $str = $result;
else $str = false;
self::$is_valid_utf8 = true;
}
else
{
self::$is_valid_utf8 = preg_match('//u', $str);
if (!self::$is_valid_utf8 && !$IGNORE)
{
user_error(self::ERROR_ILLEGAL_CHARACTER);
return false;
}
if ('utf-8' === $out_charset)
{
// UTF-8 validation
$str = self::utf8_to_utf8($str, $IGNORE);
}
}
if ('utf-8' !== $out_charset && false !== $str)
{
// Convert output to UTF-8
$result = '';
if (self::map_from_utf8($result, $out_map, $str, $IGNORE, $TRANSLIT)) return $result;
else return false;
}
else return $str;
}
static function iconv_mime_decode_headers($str, $mode = 0, $charset = INF)
{
INF === $charset && $charset = self::$internal_encoding;
false !== strpos($str, "\r") && $str = strtr(str_replace("\r\n", "\n", $str), "\r", "\n");
$str = explode("\n\n", $str, 2);
$headers = array();
$str = preg_split('/\n(?![ \t])/', $str[0]);
foreach ($str as $str)
{
$str = self::iconv_mime_decode($str, $mode, $charset);
if (false === $str) return false;
$str = explode(':', $str, 2);
if (2 === count($str))
{
if (isset($headers[$str[0]]))
{
is_array($headers[$str[0]]) || $headers[$str[0]] = array($headers[$str[0]]);
$headers[$str[0]][] = ltrim($str[1]);
}
else $headers[$str[0]] = ltrim($str[1]);
}
}
return $headers;
}
static function iconv_mime_decode($str, $mode = 0, $charset = INF)
{
INF === $charset && $charset = self::$internal_encoding;
if (ICONV_MIME_DECODE_CONTINUE_ON_ERROR & $mode) $charset .= '//IGNORE';
false !== strpos($str, "\r") && $str = strtr(str_replace("\r\n", "\n", $str), "\r", "\n");
$str = preg_split('/\n(?![ \t])/', rtrim($str), 2);
$str = preg_replace('/[ \t]*\n[ \t]+/', ' ', rtrim($str[0]));
$str = preg_split('/=\?([^?]+)\?([bqBQ])\?(.*?)\?=/', $str, -1, PREG_SPLIT_DELIM_CAPTURE);
$result = self::iconv('utf-8', $charset, $str[0]);
if (false === $result) return false;
$i = 1;
$len = count($str);
while ($i < $len)
{
$c = strtolower($str[$i]);
if ( (ICONV_MIME_DECODE_CONTINUE_ON_ERROR & $mode)
&& 'utf-8' !== $c
&& !isset(self::$alias[$c])
&& !self::loadMap('from.', $c, $d) ) $d = false;
else if ('B' === strtoupper($str[$i+1])) $d = base64_decode($str[$i+2]);
else $d = rawurldecode(strtr(str_replace('%', '%25', $str[$i+2]), '=_', '% '));
if (false !== $d)
{
$result .= self::iconv($c, $charset, $d);
$d = self::iconv('utf-8' , $charset, $str[$i+3]);
if ('' !== trim($d)) $result .= $d;
}
else if (ICONV_MIME_DECODE_CONTINUE_ON_ERROR & $mode)
{
$result .= "=?{$str[$i]}?{$str[$i+1]}?{$str[$i+2]}?={$str[$i+3]}";
}
else
{
$result = false;
break;
}
$i += 4;
}
return $result;
}
static function iconv_get_encoding($type = 'all')
{
switch ($type)
{
case 'input_encoding' : return self::$input_encoding;
case 'output_encoding' : return self::$output_encoding;
case 'internal_encoding': return self::$internal_encoding;
}
return array(
'input_encoding' => self::$input_encoding,
'output_encoding' => self::$output_encoding,
'internal_encoding' => self::$internal_encoding
);
}
static function iconv_set_encoding($type, $charset)
{
switch ($type)
{
case 'input_encoding' : self::$input_encoding = $charset; break;
case 'output_encoding' : self::$output_encoding = $charset; break;
case 'internal_encoding': self::$internal_encoding = $charset; break;
default: return false;
}
return true;
}
static function iconv_mime_encode($field_name, $field_value, $pref = INF)
{
is_array($pref) || $pref = array();
$pref += array(
'scheme' => 'B',
'input-charset' => self::$internal_encoding,
'output-charset' => self::$internal_encoding,
'line-length' => 76,
'line-break-chars' => "\r\n"
);
preg_match('/[\x80-\xFF]/', $field_name) && $field_name = '';
$scheme = strtoupper(substr($pref['scheme'], 0, 1));
$in = strtolower($pref['input-charset']);
$out = strtolower($pref['output-charset']);
if ('utf-8' !== $in && false === $field_value = self::iconv($in, 'utf-8', $field_value)) return false;
preg_match_all('/./us', $field_value, $chars);
$chars = isset($chars[0]) ? $chars[0] : array();
$line_break = (int) $pref['line-length'];
$line_start = "=?{$pref['output-charset']}?{$scheme}?";
$line_length = strlen($field_name) + 2 + strlen($line_start) + 2;
$line_offset = strlen($line_start) + 3;
$line_data = '';
$field_value = array();
$Q = 'Q' === $scheme;
foreach ($chars as $c)
{
if ('utf-8' !== $out && false === $c = self::iconv('utf-8', $out, $c)) return false;
$o = $Q
? $c = preg_replace_callback(
'/[=_\?\x00-\x1F\x80-\xFF]/',
array(__CLASS__, 'qp_byte_callback'),
$c
)
: base64_encode($line_data . $c);
if (isset($o[$line_break - $line_length]))
{
$Q || $line_data = base64_encode($line_data);
$field_value[] = $line_start . $line_data . '?=';
$line_length = $line_offset;
$line_data = '';
}
$line_data .= $c;
$Q && $line_length += strlen($c);
}
if ('' !== $line_data)
{
$Q || $line_data = base64_encode($line_data);
$field_value[] = $line_start . $line_data . '?=';
}
return $field_name . ': ' . implode($pref['line-break-chars'] . ' ', $field_value);
}
static function ob_iconv_handler($buffer, $mode)
{
return self::iconv(self::$internal_encoding, self::$output_encoding, $buffer);
}
static function iconv_strlen($s, $encoding = INF)
{
/**/ if (extension_loaded('xml'))
return self::strlen1($s, $encoding);
/**/ else
return self::strlen2($s, $encoding);
}
static function strlen1($s, $encoding = INF)
{
INF === $encoding && $encoding = self::$internal_encoding;
if (0 !== strncasecmp($encoding, 'utf-8', 5) && false === $s = self::iconv($encoding, 'utf-8', $s)) return false;
return strlen(utf8_decode($s));
}
static function strlen2($s, $encoding = INF)
{
INF === $encoding && $encoding = self::$internal_encoding;
if (0 !== strncasecmp($encoding, 'utf-8', 5) && false === $s = self::iconv($encoding, 'utf-8', $s)) return false;
$ulen_mask = self::$ulen_mask;
$i = 0; $j = 0;
$len = strlen($s);
while ($i < $len)
{
$u = $s[$i] & "\xF0";
$i += isset($ulen_mask[$u]) ? $ulen_mask[$u] : 1;
++$j;
}
return $j;
}
static function iconv_strpos($haystack, $needle, $offset = 0, $encoding = INF)
{
INF === $encoding && $encoding = self::$internal_encoding;
if (0 !== strncasecmp($encoding, 'utf-8', 5))
{
if (false === $haystack = self::iconv($encoding, 'utf-8', $haystack)) return false;
if (false === $needle = self::iconv($encoding, 'utf-8', $needle)) return false;
}
if ($offset = (int) $offset) $haystack = self::iconv_substr($haystack, $offset, 2147483647, 'utf-8');
$pos = strpos($haystack, $needle);
return false === $pos ? false : ($offset + ($pos ? self::iconv_strlen(substr($haystack, 0, $pos), 'utf-8') : 0));
}
static function iconv_strrpos($haystack, $needle, $encoding = INF)
{
INF === $encoding && $encoding = self::$internal_encoding;
if (0 !== strncasecmp($encoding, 'utf-8', 5))
{
if (false === $haystack = self::iconv($encoding, 'utf-8', $haystack)) return false;
if (false === $needle = self::iconv($encoding, 'utf-8', $needle)) return false;
}
$pos = isset($needle[0]) ? strrpos($haystack, $needle) : false;
return false === $pos ? false : self::iconv_strlen($pos ? substr($haystack, 0, $pos) : $haystack, 'utf-8');
}
static function iconv_substr($s, $start, $length = 2147483647, $encoding = INF)
{
INF === $encoding && $encoding = self::$internal_encoding;
if (0 === strncasecmp($encoding, 'utf-8', 5)) $encoding = INF;
else if (false === $s = self::iconv($encoding, 'utf-8', $s)) return false;
$slen = self::iconv_strlen($s, 'utf-8');
$start = (int) $start;
if (0 > $start) $start += $slen;
if (0 > $start) return false;
if ($start >= $slen) return false;
$rx = $slen - $start;
if (0 > $length) $length += $rx;
if (0 === $length) return '';
if (0 > $length) return false;
if ($length > $rx) $length = $rx;
$rx = '/^' . ($start ? self::preg_offset($start) : '') . '(' . self::preg_offset($length) . ')/u';
$s = preg_match($rx, $s, $s) ? $s[1] : '';
if (INF === $encoding) return $s;
else return self::iconv('utf-8', $encoding, $s);
}
protected static function loadMap($type, $charset, &$map)
{
if (!isset(self::$convert_map[$type . $charset]))
{
if (false === $map = self::getData($type . $charset))
{
if ('to.' === $type && self::loadMap('from.', $charset, $map)) $map = array_flip($map);
else return false;
}
self::$convert_map[$type . $charset] = $map;
}
else $map = self::$convert_map[$type . $charset];
return true;
}
protected static function utf8_to_utf8($str, $IGNORE)
{
$ulen_mask = self::$ulen_mask;
$valid = self::$is_valid_utf8;
$u = $str;
$i = $j = 0;
$len = strlen($str);
while ($i < $len)
{
if ($str[$i] < "\x80") $u[$j++] = $str[$i++];
else
{
$ulen = $str[$i] & "\xF0";
$ulen = isset($ulen_mask[$ulen]) ? $ulen_mask[$ulen] : 1;
$uchr = substr($str, $i, $ulen);
if (1 === $ulen || !($valid || preg_match('/^.$/us', $uchr)))
{
if ($IGNORE)
{
++$i;
continue;
}
user_error(self::ERROR_ILLEGAL_CHARACTER);
return false;
}
else $i += $ulen;
$u[$j++] = $uchr[0];
isset($uchr[1]) && 0 !== ($u[$j++] = $uchr[1])
&& isset($uchr[2]) && 0 !== ($u[$j++] = $uchr[2])
&& isset($uchr[3]) && 0 !== ($u[$j++] = $uchr[3]);
}
}
return substr($u, 0, $j);
}
protected static function map_to_utf8(&$result, $map, $str, $IGNORE)
{
$len = strlen($str);
for ($i = 0; $i < $len; ++$i)
{
if (isset($str[$i+1], $map[$str[$i] . $str[$i+1]])) $result .= $map[$str[$i] . $str[++$i]];
else if (isset($map[$str[$i]])) $result .= $map[$str[$i]];
else if (!$IGNORE)
{
user_error(self::ERROR_ILLEGAL_CHARACTER);
return false;
}
}
return true;
}
protected static function map_from_utf8(&$result, $map, $str, $IGNORE, $TRANSLIT)
{
$ulen_mask = self::$ulen_mask;
$valid = self::$is_valid_utf8;
if ($TRANSLIT) self::$translit_map or self::$translit_map = self::getData('translit');
$i = 0;
$len = strlen($str);
while ($i < $len)
{
if ($str[$i] < "\x80") $uchr = $str[$i++];
else
{
$ulen = $str[$i] & "\xF0";
$ulen = isset($ulen_mask[$ulen]) ? $ulen_mask[$ulen] : 1;
$uchr = substr($str, $i, $ulen);
if ($IGNORE && (1 === $ulen || !($valid || preg_match('/^.$/us', $uchr))))
{
++$i;
continue;
}
else $i += $ulen;
}
if (isset($map[$uchr]))
{
$result .= $map[$uchr];
}
else if ($TRANSLIT)
{
if (isset(self::$translit_map[$uchr]))
{
$uchr = self::$translit_map[$uchr];
}
else if ($uchr >= "\xC3\x80")
{
$uchr = \Normalizer::normalize($uchr, \Normalizer::NFD);
$uchr = preg_split('/(.)/', $uchr, 2, PREG_SPLIT_DELIM_CAPTURE);
if (isset($uchr[2][0])) $uchr = $uchr[1];
else if ($IGNORE) continue;
else return false;
}
$str = $uchr . substr($str, $i);
$len = strlen($str);
$i = 0;
}
else if (!$IGNORE)
{
return false;
}
}
return true;
}
protected static function qp_byte_callback($m)
{
return '=' . strtoupper(dechex(ord($m[0])));
}
protected static function preg_offset($offset)
{
$rx = array();
$offset = (int) $offset;
while ($offset > 65535)
{
$rx[] = '.{65535}';
$offset -= 65535;
}
return implode('', $rx) . '.{' . $offset . '}';
}
protected static function getData($file)
{
$file = __DIR__ . '/charset/' . $file . '.ser';
if (file_exists($file)) return unserialize(file_get_contents($file));
else return false;
}
}

View File

@@ -0,0 +1,139 @@
<?php // vi: set fenc=utf-8 ts=4 sw=4 et:
/*
* Copyright (C) 2013 Nicolas Grekas - p@tchwork.com
*
* This library is free software; you can redistribute it and/or modify it
* under the terms of the (at your option):
* Apache License v2.0 (http://apache.org/licenses/LICENSE-2.0.txt), or
* GNU General Public License v2.0 (http://gnu.org/licenses/gpl-2.0.txt).
*/
namespace Patchwork\PHP\Shim;
/**
* Partial intl implementation in pure PHP.
*
* Implemented:
* - grapheme_extract - Extract a sequence of grapheme clusters from a text buffer, which must be encoded in UTF-8
* - grapheme_stripos - Find position (in grapheme units) of first occurrence of a case-insensitive string
* - grapheme_stristr - Returns part of haystack string from the first occurrence of case-insensitive needle to the end of haystack
* - grapheme_strlen - Get string length in grapheme units
* - grapheme_strpos - Find position (in grapheme units) of first occurrence of a string
* - grapheme_strripos - Find position (in grapheme units) of last occurrence of a case-insensitive string
* - grapheme_strrpos - Find position (in grapheme units) of last occurrence of a string
* - grapheme_strstr - Returns part of haystack string from the first occurrence of needle to the end of haystack
* - grapheme_substr - Return part of a string
*/
class Intl
{
static function grapheme_extract($s, $size, $type = GRAPHEME_EXTR_COUNT, $start = 0, &$next = 0)
{
$s = (string) substr($s, $start);
$size = (int) $size;
$type = (int) $type;
$start = (int) $start;
if ('' === $s || 0 > $size || 0 > $start || 0 > $type || 2 < $type) return false;
if (0 === $size) return '';
$next = $start;
$s = preg_split('/(' . GRAPHEME_CLUSTER_RX . ')/u', "\r\n" . $s, $size + 1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE);
if (!isset($s[1])) return false;
$i = 1;
$ret = '';
do
{
if (GRAPHEME_EXTR_COUNT === $type) --$size;
else if (GRAPHEME_EXTR_MAXBYTES === $type) $size -= strlen($s[$i]);
else $size -= iconv_strlen($s[$i], 'UTF-8//IGNORE');
if ($size >= 0) $ret .= $s[$i];
}
while (isset($s[++$i]) && $size > 0);
$next += strlen($ret);
return $ret;
}
static function grapheme_strlen($s)
{
$s = (string) $s;
preg_replace('/' . GRAPHEME_CLUSTER_RX . '/u', '', $s, -1, $len);
return 0 === $len && '' !== $s ? null : $len;
}
static function grapheme_substr($s, $start, $len = 2147483647)
{
preg_match_all('/' . GRAPHEME_CLUSTER_RX . '/u', $s, $s);
$slen = count($s[0]);
$start = (int) $start;
if (0 > $start) $start += $slen;
if (0 > $start) return false;
if ($start >= $slen) return false;
$rem = $slen - $start;
if (0 > $len) $len += $rem;
if (0 === $len) return '';
if (0 > $len) return false;
if ($len > $rem) $len = $rem;
return implode('', array_slice($s[0], $start, $len));
}
static function grapheme_substr_workaround62759($s, $start, $len)
{
// Intl based http://bugs.php.net/62759 and 55562 workaround
if (2147483647 == $len) return grapheme_substr($s, $start);
$slen = grapheme_strlen($s);
$start = (int) $start;
if (0 > $start) $start += $slen;
if (0 > $start) return false;
if ($start >= $slen) return false;
$rem = $slen - $start;
if (0 > $len) $len += $rem;
if (0 === $len) return '';
if (0 > $len) return false;
if ($len > $rem) $len = $rem;
return grapheme_substr($s, $start, $len);
}
static function grapheme_strpos ($s, $needle, $offset = 0) {return self::grapheme_position($s, $needle, $offset, 0);}
static function grapheme_stripos ($s, $needle, $offset = 0) {return self::grapheme_position($s, $needle, $offset, 1);}
static function grapheme_strrpos ($s, $needle, $offset = 0) {return self::grapheme_position($s, $needle, $offset, 2);}
static function grapheme_strripos($s, $needle, $offset = 0) {return self::grapheme_position($s, $needle, $offset, 3);}
static function grapheme_stristr ($s, $needle, $before_needle = false) {return mb_stristr($s, $needle, $before_needle, 'UTF-8');}
static function grapheme_strstr ($s, $needle, $before_needle = false) {return mb_strstr ($s, $needle, $before_needle, 'UTF-8');}
protected static function grapheme_position($s, $needle, $offset, $mode)
{
if ($offset > 0) $s = (string) self::grapheme_substr($s, $offset);
else if ($offset < 0) $offset = 0;
if ('' === (string) $needle) return false;
if ('' === (string) $s) return false;
switch ($mode)
{
case 0: $needle = iconv_strpos ($s, $needle, 0, 'UTF-8'); break;
case 1: $needle = mb_stripos ($s, $needle, 0, 'UTF-8'); break;
case 2: $needle = iconv_strrpos($s, $needle, 'UTF-8'); break;
default: $needle = mb_strripos ($s, $needle, 0, 'UTF-8'); break;
}
return $needle ? self::grapheme_strlen(iconv_substr($s, 0, $needle, 'UTF-8')) + $offset : $needle;
}
}

View File

@@ -0,0 +1,340 @@
<?php // vi: set fenc=utf-8 ts=4 sw=4 et:
/*
* Copyright (C) 2013 Nicolas Grekas - p@tchwork.com
*
* This library is free software; you can redistribute it and/or modify it
* under the terms of the (at your option):
* Apache License v2.0 (http://apache.org/licenses/LICENSE-2.0.txt), or
* GNU General Public License v2.0 (http://gnu.org/licenses/gpl-2.0.txt).
*/
namespace Patchwork\PHP\Shim;
/**
* Partial mbstring implementation in PHP, iconv based, UTF-8 centric.
*
* Implemented:
* - mb_convert_encoding - Convert character encoding
* - mb_decode_mimeheader - Decode string in MIME header field
* - mb_encode_mimeheader - Encode string for MIME header XXX NATIVE IMPLEMENTATION IS REALLY BUGGED
* - mb_convert_case - Perform case folding on a string
* - mb_internal_encoding - Set/Get internal character encoding
* - mb_list_encodings - Returns an array of all supported encodings
* - mb_strlen - Get string length
* - mb_strpos - Find position of first occurrence of string in a string
* - mb_strrpos - Find position of last occurrence of a string in a string
* - mb_strtolower - Make a string lowercase
* - mb_strtoupper - Make a string uppercase
* - mb_substitute_character - Set/Get substitution character
* - mb_substr - Get part of string
* - mb_stripos - Finds position of first occurrence of a string within another, case insensitive
* - mb_stristr - Finds first occurrence of a string within another, case insensitive
* - mb_strrchr - Finds the last occurrence of a character in a string within another
* - mb_strrichr - Finds the last occurrence of a character in a string within another, case insensitive
* - mb_strripos - Finds position of last occurrence of a string within another, case insensitive
* - mb_strstr - Finds first occurrence of a string within anothers
*
* Not implemented:
* - mb_check_encoding - Check if the string is valid for the specified encoding
* - mb_convert_kana - Convert "kana" one from another ("zen-kaku", "han-kaku" and more)
* - mb_convert_variables - Convert character code in variable(s)
* - mb_decode_numericentity - Decode HTML numeric string reference to character
* - mb_detect_encoding - Detect character encoding
* - mb_detect_order - Set/Get character encoding detection order
* - mb_encode_numericentity - Encode character to HTML numeric string reference
* - mb_ereg* - Regular expression with multibyte support
* - mb_get_info - Get internal settings of mbstring
* - mb_http_input - Detect HTTP input character encoding
* - mb_http_output - Set/Get HTTP output character encoding
* - mb_language - Set/Get current language
* - mb_list_encodings_alias_names - Returns an array of all supported alias encodings
* - mb_list_mime_names - Returns an array or string of all supported mime names
* - mb_output_handler - Callback function converts character encoding in output buffer
* - mb_parse_str - Parse GET/POST/COOKIE data and set global variable
* - mb_preferred_mime_name - Get MIME charset string
* - mb_regex_encoding - Returns current encoding for multibyte regex as string
* - mb_regex_set_options - Set/Get the default options for mbregex functions
* - mb_send_mail - Send encoded mail
* - mb_split - Split multibyte string using regular expression
* - mb_strcut - Get part of string
* - mb_strimwidth - Get truncated string with specified width
* - mb_strwidth - Return width of string
* - mb_substr_count - Count the number of substring occurrences
*/
class Mbstring
{
const MB_CASE_FOLD = PHP_INT_MAX;
protected static
$internal_encoding = 'UTF-8',
$caseFold = array(
array('µ','ſ',"\xCD\x85",'ς',"\xCF\x90","\xCF\x91","\xCF\x95","\xCF\x96","\xCF\xB0","\xCF\xB1","\xCF\xB5","\xE1\xBA\x9B","\xE1\xBE\xBE"),
array('μ','s','ι', 'σ','β', 'θ', 'φ', 'π', 'κ', 'ρ', 'ε', "\xE1\xB9\xA1",'ι' )
);
static function mb_convert_encoding($s, $to_encoding, $from_encoding = INF)
{
INF === $from_encoding && $from_encoding = self::$internal_encoding;
$from_encoding = strtolower($from_encoding);
$to_encoding = strtolower($to_encoding);
if ('base64' === $from_encoding)
{
$s = base64_decode($s);
$from_encoding = $to_encoding;
}
if ('base64' === $to_encoding) return base64_encode($s);
if ('html-entities' === $to_encoding)
{
'html-entities' === $from_encoding && $from_encoding = 'Windows-1252';
'utf-8' === $from_encoding || $s = iconv($from_encoding, 'UTF-8//IGNORE', $s);
return preg_replace_callback('/[\x80-\xFF]+/', array(__CLASS__, 'html_encoding_callback'), $s);
}
if ('html-entities' === $from_encoding)
{
$s = html_entity_decode($s, ENT_COMPAT, 'UTF-8');
$from_encoding = 'UTF-8';
}
return iconv($from_encoding, $to_encoding . '//IGNORE', $s);
}
static function mb_decode_mimeheader($s)
{
return iconv_mime_decode($s, 2, self::$internal_encoding . '//IGNORE');
}
static function mb_encode_mimeheader($s, $charset = INF, $transfer_encoding = INF, $linefeed = INF, $indent = INF)
{
user_error('mb_encode_mimeheader() is bugged. Please use iconv_mime_encode() instead', E_USER_WARNING);
}
static function mb_convert_case($s, $mode, $encoding = INF)
{
if ('' === $s) return '';
INF === $encoding && $encoding = self::$internal_encoding;
if ('UTF-8' === strtoupper($encoding)) $encoding = INF;
else $s = iconv($encoding, 'UTF-8//IGNORE', $s);
if (MB_CASE_UPPER == $mode)
{
static $upper;
isset($upper) || $upper = self::getData('upperCase');
$map = $upper;
}
else
{
if (self::MB_CASE_FOLD === $mode) $s = str_replace(self::$caseFold[0], self::$caseFold[1], $s);
static $lower;
isset($lower) || $lower = self::getData('lowerCase');
$map = $lower;
}
static $ulen_mask = array("\xC0" => 2, "\xD0" => 2, "\xE0" => 3, "\xF0" => 4);
$i = 0;
$len = strlen($s);
while ($i < $len)
{
$ulen = $s[$i] < "\x80" ? 1 : $ulen_mask[$s[$i] & "\xF0"];
$uchr = substr($s, $i, $ulen);
$i += $ulen;
if (isset($map[$uchr]))
{
$uchr = $map[$uchr];
$nlen = strlen($uchr);
if ($nlen == $ulen)
{
$nlen = $i;
do $s[--$nlen] = $uchr[--$ulen];
while ($ulen);
}
else
{
$s = substr_replace($s, $uchr, $i - $ulen, $ulen);
$len += $nlen - $ulen;
$i += $nlen - $ulen;
}
}
}
if (MB_CASE_TITLE == $mode)
{
$s = preg_replace_callback('/\b\p{Ll}/u', array(__CLASS__, 'title_case_callback'), $s);
}
if (INF === $encoding) return $s;
else return iconv('UTF-8', $encoding, $s);
}
static function mb_internal_encoding($encoding = INF)
{
if (INF === $encoding) return self::$internal_encoding;
if ('UTF-8' === strtoupper($encoding) || false !== @iconv($encoding, $encoding, ' '))
{
self::$internal_encoding = $encoding;
return true;
}
return false;
}
static function mb_list_encodings()
{
return array('UTF-8');
}
static function mb_strlen($s, $encoding = INF)
{
INF === $encoding && $encoding = self::$internal_encoding;
return iconv_strlen($s, $encoding . '//IGNORE');
}
static function mb_strpos ($haystack, $needle, $offset = 0, $encoding = INF)
{
INF === $encoding && $encoding = self::$internal_encoding;
if ('' === (string) $needle)
{
user_error(__METHOD__ . ': Empty delimiter', E_USER_WARNING);
return false;
}
else return iconv_strpos($haystack, $needle, $offset, $encoding . '//IGNORE');
}
static function mb_strrpos($haystack, $needle, $offset = 0, $encoding = INF)
{
INF === $encoding && $encoding = self::$internal_encoding;
if ($offset != (int) $offset)
{
$offset = 0;
}
else if ($offset = (int) $offset)
{
$haystack = self::mb_substr($haystack, $offset, 2147483647, $encoding);
}
$pos = iconv_strrpos($haystack, $needle, $encoding . '//IGNORE');
return false !== $pos ? $offset + $pos : false;
}
static function mb_strtolower($s, $encoding = INF)
{
return self::mb_convert_case($s, MB_CASE_LOWER, $encoding);
}
static function mb_strtoupper($s, $encoding = INF)
{
return self::mb_convert_case($s, MB_CASE_UPPER, $encoding);
}
static function mb_substitute_character($c = INF)
{
return INF !== $c ? false : 'none';
}
static function mb_substr($s, $start, $length = 2147483647, $encoding = INF)
{
INF === $encoding && $encoding = self::$internal_encoding;
if ($start < 0)
{
$start = iconv_strlen($s, $encoding . '//IGNORE') + $start;
if ($start < 0) $start = 0;
}
if ($length < 0)
{
$length = iconv_strlen($s, $encoding . '//IGNORE') + $length - $start;
if ($length < 0) return '';
}
return (string) iconv_substr($s, $start, $length, $encoding . '//IGNORE');
}
static function mb_stripos($haystack, $needle, $offset = 0, $encoding = INF)
{
INF === $encoding && $encoding = self::$internal_encoding;
$haystack = self::mb_convert_case($haystack, self::MB_CASE_FOLD, $encoding);
$needle = self::mb_convert_case($needle, self::MB_CASE_FOLD, $encoding);
return self::mb_strpos($haystack, $needle, $offset, $encoding);
}
static function mb_stristr($haystack, $needle, $part = false, $encoding = INF)
{
$pos = self::mb_stripos($haystack, $needle, 0, $encoding);
return self::getSubpart($pos, $part, $haystack, $encoding);
}
static function mb_strrchr($haystack, $needle, $part = false, $encoding = INF)
{
INF === $encoding && $encoding = self::$internal_encoding;
$needle = self::mb_substr($needle, 0, 1, $encoding);
$pos = iconv_strrpos($haystack, $needle, $encoding);
return self::getSubpart($pos, $part, $haystack, $encoding);
}
static function mb_strrichr($haystack, $needle, $part = false, $encoding = INF)
{
$needle = self::mb_substr($needle, 0, 1, $encoding);
$pos = self::mb_strripos($haystack, $needle, $encoding);
return self::getSubpart($pos, $part, $haystack, $encoding);
}
static function mb_strripos($haystack, $needle, $offset = 0, $encoding = INF)
{
INF === $encoding && $encoding = self::$internal_encoding;
$haystack = self::mb_convert_case($haystack, self::MB_CASE_FOLD, $encoding);
$needle = self::mb_convert_case($needle, self::MB_CASE_FOLD, $encoding);
return self::mb_strrpos($haystack, $needle, $offset, $encoding);
}
static function mb_strstr($haystack, $needle, $part = false, $encoding = INF)
{
$pos = strpos($haystack, $needle);
if (false === $pos) return false;
if ($part) return substr($haystack, 0, $pos);
else return substr($haystack, $pos);
}
protected static function getSubpart($pos, $part, $haystack, $encoding)
{
INF === $encoding && $encoding = self::$internal_encoding;
if (false === $pos) return false;
if ($part) return self::mb_substr($haystack, 0, $pos, $encoding);
else return self::mb_substr($haystack, $pos, 2147483647, $encoding);
}
protected static function html_encoding_callback($m)
{
return htmlentities($m[0], ENT_COMPAT, 'UTF-8');
}
protected static function title_case_callback($s)
{
return self::mb_convert_case($s[0], MB_CASE_UPPER, 'UTF-8');
}
protected static function getData($file)
{
$file = __DIR__ . '/unidata/' . $file . '.ser';
if (file_exists($file)) return unserialize(file_get_contents($file));
else return false;
}
}

View File

@@ -0,0 +1,295 @@
<?php // vi: set fenc=utf-8 ts=4 sw=4 et:
/*
* Copyright (C) 2013 Nicolas Grekas - p@tchwork.com
*
* This library is free software; you can redistribute it and/or modify it
* under the terms of the (at your option):
* Apache License v2.0 (http://apache.org/licenses/LICENSE-2.0.txt), or
* GNU General Public License v2.0 (http://gnu.org/licenses/gpl-2.0.txt).
*/
namespace Patchwork\PHP\Shim;
/**
* Normalizer is a PHP fallback implementation of the Normalizer class provided by the intl extension.
*
* It has been validated with Unicode 6.1 Normalization Conformance Test.
* See http://www.unicode.org/reports/tr15/ for detailed info about Unicode normalizations.
*/
class Normalizer
{
const
NONE = 1,
FORM_D = 2, NFD = 2,
FORM_KD = 3, NFKD = 3,
FORM_C = 4, NFC = 4,
FORM_KC = 5, NFKC = 5;
protected static
$C, $D, $KD, $cC,
$ulen_mask = array("\xC0" => 2, "\xD0" => 2, "\xE0" => 3, "\xF0" => 4),
$ASCII = "\x20\x65\x69\x61\x73\x6E\x74\x72\x6F\x6C\x75\x64\x5D\x5B\x63\x6D\x70\x27\x0A\x67\x7C\x68\x76\x2E\x66\x62\x2C\x3A\x3D\x2D\x71\x31\x30\x43\x32\x2A\x79\x78\x29\x28\x4C\x39\x41\x53\x2F\x50\x22\x45\x6A\x4D\x49\x6B\x33\x3E\x35\x54\x3C\x44\x34\x7D\x42\x7B\x38\x46\x77\x52\x36\x37\x55\x47\x4E\x3B\x4A\x7A\x56\x23\x48\x4F\x57\x5F\x26\x21\x4B\x3F\x58\x51\x25\x59\x5C\x09\x5A\x2B\x7E\x5E\x24\x40\x60\x7F\x00\x01\x02\x03\x04\x05\x06\x07\x08\x0B\x0C\x0D\x0E\x0F\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E\x1F";
static function isNormalized($s, $form = self::NFC)
{
if (strspn($s, self::$ASCII) === strlen($s)) return true;
if (self::NFC === $form && preg_match('//u', $s) && !preg_match('/[^\x00-\x{2FF}]/u', $s)) return true;
return false; // Pretend false as quick checks implementented in PHP won't be so quick
}
static function normalize($s, $form = self::NFC)
{
if (!preg_match('//u', $s)) return false;
switch ($form)
{
case self::NONE: return $s;
case self::NFC: $C = true; $K = false; break;
case self::NFD: $C = false; $K = false; break;
case self::NFKC: $C = true; $K = true; break;
case self::NFKD: $C = false; $K = true; break;
default: return false;
}
if (!strlen($s)) return '';
if ($K && empty(self::$KD)) self::$KD = self::getData('compatibilityDecomposition');
if (empty(self::$D))
{
self::$D = self::getData('canonicalDecomposition');
self::$cC = self::getData('combiningClass');
}
if ($C)
{
if (empty(self::$C)) self::$C = self::getData('canonicalComposition');
return self::recompose(self::decompose($s, $K));
}
else return self::decompose($s, $K);
}
protected static function recompose($s)
{
$ASCII = self::$ASCII;
$compMap = self::$C;
$combClass = self::$cC;
$ulen_mask = self::$ulen_mask;
$result = $tail = '';
$i = $s[0] < "\x80" ? 1 : $ulen_mask[$s[0] & "\xF0"];
$len = strlen($s);
$last_uchr = substr($s, 0, $i);
$last_ucls = isset($combClass[$last_uchr]) ? 256 : 0;
while ($i < $len)
{
if ($s[$i] < "\x80")
{
// ASCII chars
if ($tail)
{
$last_uchr .= $tail;
$tail = '';
}
if ($j = strspn($s, $ASCII, $i+1))
{
$last_uchr .= substr($s, $i, $j);
$i += $j;
}
$result .= $last_uchr;
$last_uchr = $s[$i];
++$i;
}
else
{
$ulen = $ulen_mask[$s[$i] & "\xF0"];
$uchr = substr($s, $i, $ulen);
if ($last_uchr < "\xE1\x84\x80" || "\xE1\x84\x92" < $last_uchr
|| $uchr < "\xE1\x85\xA1" || "\xE1\x85\xB5" < $uchr
|| $last_ucls)
{
// Table lookup and combining chars composition
$ucls = isset($combClass[$uchr]) ? $combClass[$uchr] : 0;
if (isset($compMap[$last_uchr . $uchr]) && (!$last_ucls || $last_ucls < $ucls))
{
$last_uchr = $compMap[$last_uchr . $uchr];
}
else if ($last_ucls = $ucls) $tail .= $uchr;
else
{
if ($tail)
{
$last_uchr .= $tail;
$tail = '';
}
$result .= $last_uchr;
$last_uchr = $uchr;
}
}
else
{
// Hangul chars
$L = ord($last_uchr[2]) - 0x80;
$V = ord($uchr[2]) - 0xA1;
$T = 0;
$uchr = substr($s, $i + $ulen, 3);
if ("\xE1\x86\xA7" <= $uchr && $uchr <= "\xE1\x87\x82")
{
$T = ord($uchr[2]) - 0xA7;
0 > $T && $T += 0x40;
$ulen += 3;
}
$L = 0xAC00 + ($L * 21 + $V) * 28 + $T;
$last_uchr = chr(0xE0 | $L>>12) . chr(0x80 | $L>>6 & 0x3F) . chr(0x80 | $L & 0x3F);
}
$i += $ulen;
}
}
return $result . $last_uchr . $tail;
}
protected static function decompose($s, $c)
{
$result = '';
$ASCII = self::$ASCII;
$decompMap = self::$D;
$combClass = self::$cC;
$ulen_mask = self::$ulen_mask;
if ($c) $compatMap = self::$KD;
$c = array();
$i = 0;
$len = strlen($s);
while ($i < $len)
{
if ($s[$i] < "\x80")
{
// ASCII chars
if ($c)
{
ksort($c);
$result .= implode('', $c);
$c = array();
}
$j = 1 + strspn($s, $ASCII, $i+1);
$result .= substr($s, $i, $j);
$i += $j;
}
else
{
$ulen = $ulen_mask[$s[$i] & "\xF0"];
$uchr = substr($s, $i, $ulen);
$i += $ulen;
if (isset($combClass[$uchr]))
{
// Combining chars, for sorting
isset($c[$combClass[$uchr]]) || $c[$combClass[$uchr]] = '';
$c[$combClass[$uchr]] .= isset($compatMap[$uchr]) ? $compatMap[$uchr] : (isset($decompMap[$uchr]) ? $decompMap[$uchr] : $uchr);
}
else
{
if ($c)
{
ksort($c);
$result .= implode('', $c);
$c = array();
}
if ($uchr < "\xEA\xB0\x80" || "\xED\x9E\xA3" < $uchr)
{
// Table lookup
$j = isset($compatMap[$uchr]) ? $compatMap[$uchr] : (isset($decompMap[$uchr]) ? $decompMap[$uchr] : $uchr);
if ($uchr != $j)
{
$uchr = $j;
$j = strlen($uchr);
$ulen = $uchr[0] < "\x80" ? 1 : $ulen_mask[$uchr[0] & "\xF0"];
if ($ulen != $j)
{
// Put trailing chars in $s
$j -= $ulen;
$i -= $j;
if (0 > $i)
{
$s = str_repeat(' ', -$i) . $s;
$len -= $i;
$i = 0;
}
while ($j--) $s[$i+$j] = $uchr[$ulen+$j];
$uchr = substr($uchr, 0, $ulen);
}
}
}
else
{
// Hangul chars
$uchr = unpack('C*', $uchr);
$j = (($uchr[1]-224) << 12) + (($uchr[2]-128) << 6) + $uchr[3] - 0xAC80;
$uchr = "\xE1\x84" . chr(0x80 + (int) ($j / 588))
. "\xE1\x85" . chr(0xA1 + (int) (($j % 588) / 28));
if ($j %= 28)
{
$uchr .= $j < 25
? ("\xE1\x86" . chr(0xA7 + $j))
: ("\xE1\x87" . chr(0x67 + $j));
}
}
$result .= $uchr;
}
}
}
if ($c)
{
ksort($c);
$result .= implode('', $c);
}
return $result;
}
protected static function getData($file)
{
$file = __DIR__ . '/unidata/' . $file . '.ser';
if (file_exists($file)) return unserialize(file_get_contents($file));
else return false;
}
}

View File

@@ -0,0 +1,60 @@
<?php // vi: set fenc=utf-8 ts=4 sw=4 et:
/*
* Copyright (C) 2013 Nicolas Grekas - p@tchwork.com
*
* This library is free software; you can redistribute it and/or modify it
* under the terms of the (at your option):
* Apache License v2.0 (http://apache.org/licenses/LICENSE-2.0.txt), or
* GNU General Public License v2.0 (http://gnu.org/licenses/gpl-2.0.txt).
*/
namespace Patchwork\PHP\Shim;
/**
* utf8_encode/decode
*/
class Xml
{
static function utf8_encode($s)
{
$len = strlen($s);
$e = $s . $s;
for ($i = 0, $j = 0; $i < $len; ++$i, ++$j) switch (true)
{
case $s[$i] < "\x80": $e[$j] = $s[$i]; break;
case $s[$i] < "\xC0": $e[$j] = "\xC2"; $e[++$j] = $s[$i]; break;
default: $e[$j] = "\xC3"; $e[++$j] = chr(ord($s[$i]) - 64); break;
}
return substr($e, 0, $j);
}
static function utf8_decode($s)
{
$len = strlen($s);
for ($i = 0, $j = 0; $i < $len; ++$i, ++$j)
{
switch ($s[$i] & "\xF0")
{
case "\xC0":
case "\xD0":
$c = (ord($s[$i] & "\x1F") << 6) | ord($s[++$i] & "\x3F");
$s[$j] = $c < 256 ? chr($c) : '?';
break;
case "\xF0": ++$i;
case "\xE0":
$s[$j] = '?';
$i += 2;
break;
default:
$s[$j] = $s[$i];
}
}
return substr($s, 0, $j);
}
}

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1 @@
a:149:{s:1:" ";s:1:" ";s:1:"!";s:1:"!";s:1:""";s:1:""";s:1:"#";s:1:"#";s:1:"$";s:1:"$";s:1:"%";s:1:"%";s:1:"&";s:1:"&";s:1:"'";s:3:"";s:1:"(";s:1:"(";s:1:")";s:1:")";s:1:"*";s:1:"*";s:1:"+";s:1:"+";s:1:",";s:1:",";s:1:"-";s:1:"-";s:1:".";s:1:".";s:1:"/";s:1:"/";i:0;s:1:"0";i:1;s:1:"1";i:2;s:1:"2";i:3;s:1:"3";i:4;s:1:"4";i:5;s:1:"5";i:6;s:1:"6";i:7;s:1:"7";i:8;s:1:"8";i:9;s:1:"9";s:1:":";s:1:":";s:1:";";s:1:";";s:1:"<";s:1:"<";s:1:"=";s:1:"=";s:1:">";s:1:">";s:1:"?";s:1:"?";s:1:"@";s:1:"@";s:1:"A";s:1:"A";s:1:"B";s:1:"B";s:1:"C";s:1:"C";s:1:"D";s:1:"D";s:1:"E";s:1:"E";s:1:"F";s:1:"F";s:1:"G";s:1:"G";s:1:"H";s:1:"H";s:1:"I";s:1:"I";s:1:"J";s:1:"J";s:1:"K";s:1:"K";s:1:"L";s:1:"L";s:1:"M";s:1:"M";s:1:"N";s:1:"N";s:1:"O";s:1:"O";s:1:"P";s:1:"P";s:1:"Q";s:1:"Q";s:1:"R";s:1:"R";s:1:"S";s:1:"S";s:1:"T";s:1:"T";s:1:"U";s:1:"U";s:1:"V";s:1:"V";s:1:"W";s:1:"W";s:1:"X";s:1:"X";s:1:"Y";s:1:"Y";s:1:"Z";s:1:"Z";s:1:"[";s:1:"[";s:1:"\";s:1:"\";s:1:"]";s:1:"]";s:1:"^";s:1:"^";s:1:"_";s:1:"_";s:1:"`";s:3:"";s:1:"a";s:1:"a";s:1:"b";s:1:"b";s:1:"c";s:1:"c";s:1:"d";s:1:"d";s:1:"e";s:1:"e";s:1:"f";s:1:"f";s:1:"g";s:1:"g";s:1:"h";s:1:"h";s:1:"i";s:1:"i";s:1:"j";s:1:"j";s:1:"k";s:1:"k";s:1:"l";s:1:"l";s:1:"m";s:1:"m";s:1:"n";s:1:"n";s:1:"o";s:1:"o";s:1:"p";s:1:"p";s:1:"q";s:1:"q";s:1:"r";s:1:"r";s:1:"s";s:1:"s";s:1:"t";s:1:"t";s:1:"u";s:1:"u";s:1:"v";s:1:"v";s:1:"w";s:1:"w";s:1:"x";s:1:"x";s:1:"y";s:1:"y";s:1:"z";s:1:"z";s:1:"{";s:1:"{";s:1:"|";s:1:"|";s:1:"}";s:1:"}";s:1:"~";s:1:"~";s:1:"<22>";s:2:"¡";s:1:"<22>";s:2:"¢";s:1:"<22>";s:2:"£";s:1:"<22>";s:3:"";s:1:"<22>";s:2:"¥";s:1:"<22>";s:2:"ƒ";s:1:"<22>";s:2:"§";s:1:"<22>";s:2:"¤";s:1:"<22>";s:1:"'";s:1:"<22>";s:3:"“";s:1:"<22>";s:2:"«";s:1:"<22>";s:3:"";s:1:"<22>";s:3:"";s:1:"<22>";s:3:"fi";s:1:"<22>";s:3:"fl";s:1:"<22>";s:3:"";s:1:"<22>";s:3:"†";s:1:"<22>";s:3:"‡";s:1:"<22>";s:2:"·";s:1:"<22>";s:2:"¶";s:1:"<22>";s:3:"•";s:1:"<22>";s:3:"";s:1:"<22>";s:3:"„";s:1:"<22>";s:3:"”";s:1:"<22>";s:2:"»";s:1:"<22>";s:3:"…";s:1:"<22>";s:3:"‰";s:1:"<22>";s:2:"¿";s:1:"<22>";s:1:"`";s:1:"<22>";s:2:"´";s:1:"<22>";s:2:"ˆ";s:1:"<22>";s:2:"˜";s:1:"<22>";s:2:"¯";s:1:"<22>";s:2:"˘";s:1:"<22>";s:2:"˙";s:1:"<22>";s:2:"¨";s:1:"<22>";s:2:"˚";s:1:"<22>";s:2:"¸";s:1:"<22>";s:2:"˝";s:1:"<22>";s:2:"˛";s:1:"<22>";s:2:"ˇ";s:1:"<22>";s:3:"—";s:1:"<22>";s:2:"Æ";s:1:"<22>";s:2:"ª";s:1:"<22>";s:2:"Ł";s:1:"<22>";s:2:"Ø";s:1:"<22>";s:2:"Œ";s:1:"<22>";s:2:"º";s:1:"<22>";s:2:"æ";s:1:"<22>";s:2:"ı";s:1:"<22>";s:2:"ł";s:1:"<22>";s:2:"ø";s:1:"<22>";s:2:"œ";s:1:"<22>";s:2:"ß";}

View File

@@ -0,0 +1 @@
a:189:{s:1:" ";s:1:" ";s:1:"!";s:1:"!";s:1:""";s:3:"∀";s:1:"#";s:1:"#";s:1:"$";s:3:"∃";s:1:"%";s:1:"%";s:1:"&";s:1:"&";s:1:"'";s:3:"∋";s:1:"(";s:1:"(";s:1:")";s:1:")";s:1:"*";s:3:"";s:1:"+";s:1:"+";s:1:",";s:1:",";s:1:"-";s:3:"";s:1:".";s:1:".";s:1:"/";s:1:"/";i:0;s:1:"0";i:1;s:1:"1";i:2;s:1:"2";i:3;s:1:"3";i:4;s:1:"4";i:5;s:1:"5";i:6;s:1:"6";i:7;s:1:"7";i:8;s:1:"8";i:9;s:1:"9";s:1:":";s:1:":";s:1:";";s:1:";";s:1:"<";s:1:"<";s:1:"=";s:1:"=";s:1:">";s:1:">";s:1:"?";s:1:"?";s:1:"@";s:3:"≅";s:1:"A";s:2:"Α";s:1:"B";s:2:"Β";s:1:"C";s:2:"Χ";s:1:"D";s:2:"Δ";s:1:"E";s:2:"Ε";s:1:"F";s:2:"Φ";s:1:"G";s:2:"Γ";s:1:"H";s:2:"Η";s:1:"I";s:2:"Ι";s:1:"J";s:2:"ϑ";s:1:"K";s:2:"Κ";s:1:"L";s:2:"Λ";s:1:"M";s:2:"Μ";s:1:"N";s:2:"Ν";s:1:"O";s:2:"Ο";s:1:"P";s:2:"Π";s:1:"Q";s:2:"Θ";s:1:"R";s:2:"Ρ";s:1:"S";s:2:"Σ";s:1:"T";s:2:"Τ";s:1:"U";s:2:"Υ";s:1:"V";s:2:"ς";s:1:"W";s:2:"Ω";s:1:"X";s:2:"Ξ";s:1:"Y";s:2:"Ψ";s:1:"Z";s:2:"Ζ";s:1:"[";s:1:"[";s:1:"\";s:3:"∴";s:1:"]";s:1:"]";s:1:"^";s:3:"⊥";s:1:"_";s:1:"_";s:1:"`";s:3:"";s:1:"a";s:2:"α";s:1:"b";s:2:"β";s:1:"c";s:2:"χ";s:1:"d";s:2:"δ";s:1:"e";s:2:"ε";s:1:"f";s:2:"φ";s:1:"g";s:2:"γ";s:1:"h";s:2:"η";s:1:"i";s:2:"ι";s:1:"j";s:2:"ϕ";s:1:"k";s:2:"κ";s:1:"l";s:2:"λ";s:1:"m";s:2:"µ";s:1:"n";s:2:"ν";s:1:"o";s:2:"ο";s:1:"p";s:2:"π";s:1:"q";s:2:"θ";s:1:"r";s:2:"ρ";s:1:"s";s:2:"σ";s:1:"t";s:2:"τ";s:1:"u";s:2:"υ";s:1:"v";s:2:"ϖ";s:1:"w";s:2:"ω";s:1:"x";s:2:"ξ";s:1:"y";s:2:"ψ";s:1:"z";s:2:"ζ";s:1:"{";s:1:"{";s:1:"|";s:1:"|";s:1:"}";s:1:"}";s:1:"~";s:3:"";s:1:"<22>";s:3:"€";s:1:"<22>";s:2:"ϒ";s:1:"<22>";s:3:"";s:1:"<22>";s:3:"≤";s:1:"<22>";s:3:"";s:1:"<22>";s:3:"∞";s:1:"<22>";s:2:"ƒ";s:1:"<22>";s:3:"♣";s:1:"<22>";s:3:"♦";s:1:"<22>";s:3:"♥";s:1:"<22>";s:3:"♠";s:1:"<22>";s:3:"↔";s:1:"<22>";s:3:"←";s:1:"<22>";s:3:"↑";s:1:"<22>";s:3:"→";s:1:"<22>";s:3:"↓";s:1:"<22>";s:2:"°";s:1:"<22>";s:2:"±";s:1:"<22>";s:3:"″";s:1:"<22>";s:3:"≥";s:1:"<22>";s:2:"×";s:1:"<22>";s:3:"∝";s:1:"<22>";s:3:"∂";s:1:"<22>";s:3:"•";s:1:"<22>";s:2:"÷";s:1:"<22>";s:3:"≠";s:1:"<22>";s:3:"≡";s:1:"<22>";s:3:"≈";s:1:"<22>";s:3:"…";s:1:"<22>";s:3:"";s:1:"<22>";s:3:"";s:1:"<22>";s:3:"↵";s:1:"<22>";s:3:"ℵ";s:1:"<22>";s:3:"";s:1:"<22>";s:3:"";s:1:"<22>";s:3:"℘";s:1:"<22>";s:3:"⊗";s:1:"<22>";s:3:"⊕";s:1:"<22>";s:3:"∅";s:1:"<22>";s:3:"∩";s:1:"<22>";s:3:"";s:1:"<22>";s:3:"⊃";s:1:"<22>";s:3:"⊇";s:1:"<22>";s:3:"⊄";s:1:"<22>";s:3:"⊂";s:1:"<22>";s:3:"⊆";s:1:"<22>";s:3:"∈";s:1:"<22>";s:3:"∉";s:1:"<22>";s:3:"∠";s:1:"<22>";s:3:"∇";s:1:"<22>";s:3:"";s:1:"<22>";s:3:"";s:1:"<22>";s:3:"";s:1:"<22>";s:3:"∏";s:1:"<22>";s:3:"√";s:1:"<22>";s:3:"⋅";s:1:"<22>";s:2:"¬";s:1:"<22>";s:3:"∧";s:1:"<22>";s:3:"";s:1:"<22>";s:3:"⇔";s:1:"<22>";s:3:"⇐";s:1:"<22>";s:3:"⇑";s:1:"<22>";s:3:"⇒";s:1:"<22>";s:3:"⇓";s:1:"<22>";s:3:"◊";s:1:"<22>";s:3:"〈";s:1:"<22>";s:3:"";s:1:"<22>";s:3:"";s:1:"<22>";s:3:"";s:1:"<22>";s:3:"∑";s:1:"<22>";s:3:"";s:1:"<22>";s:3:"";s:1:"<22>";s:3:"";s:1:"<22>";s:3:"";s:1:"<22>";s:3:"";s:1:"<22>";s:3:"";s:1:"<22>";s:3:"";s:1:"<22>";s:3:"";s:1:"<22>";s:3:"";s:1:"<22>";s:3:"";s:1:"<22>";s:3:"〉";s:1:"<22>";s:3:"∫";s:1:"<22>";s:3:"⌠";s:1:"<22>";s:3:"";s:1:"<22>";s:3:"⌡";s:1:"<22>";s:3:"";s:1:"<22>";s:3:"";s:1:"<22>";s:3:"";s:1:"<22>";s:3:"";s:1:"<22>";s:3:"";s:1:"<22>";s:3:"";s:1:"<22>";s:3:"";s:1:"<22>";s:3:"";s:1:"<22>";s:3:"";}

View File

@@ -0,0 +1 @@
a:202:{s:1:" ";s:1:" ";s:1:"!";s:3:"✁";s:1:""";s:3:"✂";s:1:"#";s:3:"✃";s:1:"$";s:3:"✄";s:1:"%";s:3:"☎";s:1:"&";s:3:"✆";s:1:"'";s:3:"✇";s:1:"(";s:3:"✈";s:1:")";s:3:"✉";s:1:"*";s:3:"☛";s:1:"+";s:3:"☞";s:1:",";s:3:"✌";s:1:"-";s:3:"✍";s:1:".";s:3:"✎";s:1:"/";s:3:"✏";i:0;s:3:"✐";i:1;s:3:"✑";i:2;s:3:"✒";i:3;s:3:"✓";i:4;s:3:"✔";i:5;s:3:"✕";i:6;s:3:"✖";i:7;s:3:"✗";i:8;s:3:"✘";i:9;s:3:"✙";s:1:":";s:3:"✚";s:1:";";s:3:"✛";s:1:"<";s:3:"✜";s:1:"=";s:3:"✝";s:1:">";s:3:"✞";s:1:"?";s:3:"✟";s:1:"@";s:3:"✠";s:1:"A";s:3:"✡";s:1:"B";s:3:"✢";s:1:"C";s:3:"✣";s:1:"D";s:3:"✤";s:1:"E";s:3:"✥";s:1:"F";s:3:"✦";s:1:"G";s:3:"✧";s:1:"H";s:3:"★";s:1:"I";s:3:"✩";s:1:"J";s:3:"✪";s:1:"K";s:3:"✫";s:1:"L";s:3:"✬";s:1:"M";s:3:"✭";s:1:"N";s:3:"✮";s:1:"O";s:3:"✯";s:1:"P";s:3:"✰";s:1:"Q";s:3:"✱";s:1:"R";s:3:"✲";s:1:"S";s:3:"✳";s:1:"T";s:3:"✴";s:1:"U";s:3:"✵";s:1:"V";s:3:"✶";s:1:"W";s:3:"✷";s:1:"X";s:3:"✸";s:1:"Y";s:3:"✹";s:1:"Z";s:3:"✺";s:1:"[";s:3:"✻";s:1:"\";s:3:"✼";s:1:"]";s:3:"✽";s:1:"^";s:3:"✾";s:1:"_";s:3:"✿";s:1:"`";s:3:"❀";s:1:"a";s:3:"❁";s:1:"b";s:3:"❂";s:1:"c";s:3:"❃";s:1:"d";s:3:"❄";s:1:"e";s:3:"❅";s:1:"f";s:3:"❆";s:1:"g";s:3:"❇";s:1:"h";s:3:"❈";s:1:"i";s:3:"❉";s:1:"j";s:3:"❊";s:1:"k";s:3:"❋";s:1:"l";s:3:"●";s:1:"m";s:3:"❍";s:1:"n";s:3:"■";s:1:"o";s:3:"❏";s:1:"p";s:3:"❐";s:1:"q";s:3:"❑";s:1:"r";s:3:"❒";s:1:"s";s:3:"▲";s:1:"t";s:3:"▼";s:1:"u";s:3:"◆";s:1:"v";s:3:"❖";s:1:"w";s:3:"◗";s:1:"x";s:3:"❘";s:1:"y";s:3:"❙";s:1:"z";s:3:"❚";s:1:"{";s:3:"❛";s:1:"|";s:3:"❜";s:1:"}";s:3:"❝";s:1:"~";s:3:"❞";s:1:"<22>";s:3:"";s:1:"<22>";s:3:"";s:1:"<22>";s:3:"";s:1:"<22>";s:3:"";s:1:"<22>";s:3:"";s:1:"<22>";s:3:"";s:1:"<22>";s:3:"";s:1:"<22>";s:3:"";s:1:"<22>";s:3:"";s:1:"<22>";s:3:"";s:1:"<22>";s:3:"";s:1:"<22>";s:3:"";s:1:"<22>";s:3:"";s:1:"<22>";s:3:"";s:1:"<22>";s:3:"❡";s:1:"<22>";s:3:"❢";s:1:"<22>";s:3:"❣";s:1:"<22>";s:3:"❤";s:1:"<22>";s:3:"❥";s:1:"<22>";s:3:"❦";s:1:"<22>";s:3:"❧";s:1:"<22>";s:3:"♣";s:1:"<22>";s:3:"♦";s:1:"<22>";s:3:"♥";s:1:"<22>";s:3:"♠";s:1:"<22>";s:3:"①";s:1:"<22>";s:3:"②";s:1:"<22>";s:3:"③";s:1:"<22>";s:3:"④";s:1:"<22>";s:3:"⑤";s:1:"<22>";s:3:"⑥";s:1:"<22>";s:3:"⑦";s:1:"<22>";s:3:"⑧";s:1:"<22>";s:3:"⑨";s:1:"<22>";s:3:"⑩";s:1:"<22>";s:3:"❶";s:1:"<22>";s:3:"❷";s:1:"<22>";s:3:"❸";s:1:"<22>";s:3:"❹";s:1:"<22>";s:3:"❺";s:1:"<22>";s:3:"❻";s:1:"<22>";s:3:"❼";s:1:"<22>";s:3:"❽";s:1:"<22>";s:3:"❾";s:1:"<22>";s:3:"❿";s:1:"<22>";s:3:"➀";s:1:"<22>";s:3:"➁";s:1:"<22>";s:3:"➂";s:1:"<22>";s:3:"➃";s:1:"<22>";s:3:"➄";s:1:"<22>";s:3:"➅";s:1:"<22>";s:3:"➆";s:1:"<22>";s:3:"➇";s:1:"<22>";s:3:"➈";s:1:"<22>";s:3:"➉";s:1:"<22>";s:3:"➊";s:1:"<22>";s:3:"➋";s:1:"<22>";s:3:"➌";s:1:"<22>";s:3:"➍";s:1:"<22>";s:3:"➎";s:1:"<22>";s:3:"➏";s:1:"<22>";s:3:"➐";s:1:"<22>";s:3:"➑";s:1:"<22>";s:3:"➒";s:1:"<22>";s:3:"➓";s:1:"<22>";s:3:"➔";s:1:"<22>";s:3:"→";s:1:"<22>";s:3:"↔";s:1:"<22>";s:3:"↕";s:1:"<22>";s:3:"➘";s:1:"<22>";s:3:"➙";s:1:"<22>";s:3:"➚";s:1:"<22>";s:3:"➛";s:1:"<22>";s:3:"➜";s:1:"<22>";s:3:"➝";s:1:"<22>";s:3:"➞";s:1:"<22>";s:3:"➟";s:1:"<22>";s:3:"➠";s:1:"<22>";s:3:"➡";s:1:"<22>";s:3:"➢";s:1:"<22>";s:3:"➣";s:1:"<22>";s:3:"➤";s:1:"<22>";s:3:"➥";s:1:"<22>";s:3:"➦";s:1:"<22>";s:3:"➧";s:1:"<22>";s:3:"➨";s:1:"<22>";s:3:"➩";s:1:"<22>";s:3:"➪";s:1:"<22>";s:3:"➫";s:1:"<22>";s:3:"➬";s:1:"<22>";s:3:"➭";s:1:"<22>";s:3:"➮";s:1:"<22>";s:3:"➯";s:1:"<22>";s:3:"➱";s:1:"<22>";s:3:"➲";s:1:"<22>";s:3:"➳";s:1:"<22>";s:3:"➴";s:1:"<22>";s:3:"➵";s:1:"<22>";s:3:"➶";s:1:"<22>";s:3:"➷";s:1:"<22>";s:3:"➸";s:1:"<22>";s:3:"➹";s:1:"<22>";s:3:"➺";s:1:"<22>";s:3:"➻";s:1:"<22>";s:3:"➼";s:1:"<22>";s:3:"➽";s:1:"<22>";s:3:"➾";}

View File

@@ -0,0 +1 @@
a:154:{s:2:" ";s:1:" ";s:2:"­";s:1:"-";s:3:"";s:1:"<22>";s:3:"∙";s:1:"<22>";s:2:"ˉ";s:1:"<22>";s:1:" ";s:1:" ";s:1:"!";s:1:"!";s:1:""";s:1:""";s:1:"#";s:1:"#";s:1:"$";s:1:"$";s:1:"%";s:1:"%";s:1:"&";s:1:"&";s:3:"";s:1:"'";s:1:"(";s:1:"(";s:1:")";s:1:")";s:1:"*";s:1:"*";s:1:"+";s:1:"+";s:1:",";s:1:",";s:1:"-";s:1:"-";s:1:".";s:1:".";s:1:"/";s:1:"/";i:0;i:0;i:1;i:1;i:2;i:2;i:3;i:3;i:4;i:4;i:5;i:5;i:6;i:6;i:7;i:7;i:8;i:8;i:9;i:9;s:1:":";s:1:":";s:1:";";s:1:";";s:1:"<";s:1:"<";s:1:"=";s:1:"=";s:1:">";s:1:">";s:1:"?";s:1:"?";s:1:"@";s:1:"@";s:1:"A";s:1:"A";s:1:"B";s:1:"B";s:1:"C";s:1:"C";s:1:"D";s:1:"D";s:1:"E";s:1:"E";s:1:"F";s:1:"F";s:1:"G";s:1:"G";s:1:"H";s:1:"H";s:1:"I";s:1:"I";s:1:"J";s:1:"J";s:1:"K";s:1:"K";s:1:"L";s:1:"L";s:1:"M";s:1:"M";s:1:"N";s:1:"N";s:1:"O";s:1:"O";s:1:"P";s:1:"P";s:1:"Q";s:1:"Q";s:1:"R";s:1:"R";s:1:"S";s:1:"S";s:1:"T";s:1:"T";s:1:"U";s:1:"U";s:1:"V";s:1:"V";s:1:"W";s:1:"W";s:1:"X";s:1:"X";s:1:"Y";s:1:"Y";s:1:"Z";s:1:"Z";s:1:"[";s:1:"[";s:1:"\";s:1:"\";s:1:"]";s:1:"]";s:1:"^";s:1:"^";s:1:"_";s:1:"_";s:3:"";s:1:"`";s:1:"a";s:1:"a";s:1:"b";s:1:"b";s:1:"c";s:1:"c";s:1:"d";s:1:"d";s:1:"e";s:1:"e";s:1:"f";s:1:"f";s:1:"g";s:1:"g";s:1:"h";s:1:"h";s:1:"i";s:1:"i";s:1:"j";s:1:"j";s:1:"k";s:1:"k";s:1:"l";s:1:"l";s:1:"m";s:1:"m";s:1:"n";s:1:"n";s:1:"o";s:1:"o";s:1:"p";s:1:"p";s:1:"q";s:1:"q";s:1:"r";s:1:"r";s:1:"s";s:1:"s";s:1:"t";s:1:"t";s:1:"u";s:1:"u";s:1:"v";s:1:"v";s:1:"w";s:1:"w";s:1:"x";s:1:"x";s:1:"y";s:1:"y";s:1:"z";s:1:"z";s:1:"{";s:1:"{";s:1:"|";s:1:"|";s:1:"}";s:1:"}";s:1:"~";s:1:"~";s:2:"¡";s:1:"<22>";s:2:"¢";s:1:"<22>";s:2:"£";s:1:"<22>";s:3:"";s:1:"<22>";s:2:"¥";s:1:"<22>";s:2:"ƒ";s:1:"<22>";s:2:"§";s:1:"<22>";s:2:"¤";s:1:"<22>";s:1:"'";s:1:"<22>";s:3:"“";s:1:"<22>";s:2:"«";s:1:"<22>";s:3:"";s:1:"<22>";s:3:"";s:1:"<22>";s:3:"fi";s:1:"<22>";s:3:"fl";s:1:"<22>";s:3:"";s:1:"<22>";s:3:"†";s:1:"<22>";s:3:"‡";s:1:"<22>";s:2:"·";s:1:"<22>";s:2:"¶";s:1:"<22>";s:3:"•";s:1:"<22>";s:3:"";s:1:"<22>";s:3:"„";s:1:"<22>";s:3:"”";s:1:"<22>";s:2:"»";s:1:"<22>";s:3:"…";s:1:"<22>";s:3:"‰";s:1:"<22>";s:2:"¿";s:1:"<22>";s:1:"`";s:1:"<22>";s:2:"´";s:1:"<22>";s:2:"ˆ";s:1:"<22>";s:2:"˜";s:1:"<22>";s:2:"¯";s:1:"<22>";s:2:"˘";s:1:"<22>";s:2:"˙";s:1:"<22>";s:2:"¨";s:1:"<22>";s:2:"˚";s:1:"<22>";s:2:"¸";s:1:"<22>";s:2:"˝";s:1:"<22>";s:2:"˛";s:1:"<22>";s:2:"ˇ";s:1:"<22>";s:3:"—";s:1:"<22>";s:2:"Æ";s:1:"<22>";s:2:"ª";s:1:"<22>";s:2:"Ł";s:1:"<22>";s:2:"Ø";s:1:"<22>";s:2:"Œ";s:1:"<22>";s:2:"º";s:1:"<22>";s:2:"æ";s:1:"<22>";s:2:"ı";s:1:"<22>";s:2:"ł";s:1:"<22>";s:2:"ø";s:1:"<22>";s:2:"œ";s:1:"<22>";s:2:"ß";s:1:"<22>";}

View File

@@ -0,0 +1 @@
a:194:{s:2:" ";s:1:" ";s:3:"∆";s:1:"D";s:3:"Ω";s:1:"W";s:2:"μ";s:1:"m";s:3:"";s:1:"<22>";s:1:" ";s:1:" ";s:1:"!";s:1:"!";s:3:"∀";s:1:""";s:1:"#";s:1:"#";s:3:"∃";s:1:"$";s:1:"%";s:1:"%";s:1:"&";s:1:"&";s:3:"∋";s:1:"'";s:1:"(";s:1:"(";s:1:")";s:1:")";s:3:"";s:1:"*";s:1:"+";s:1:"+";s:1:",";s:1:",";s:3:"";s:1:"-";s:1:".";s:1:".";s:1:"/";s:1:"/";i:0;i:0;i:1;i:1;i:2;i:2;i:3;i:3;i:4;i:4;i:5;i:5;i:6;i:6;i:7;i:7;i:8;i:8;i:9;i:9;s:1:":";s:1:":";s:1:";";s:1:";";s:1:"<";s:1:"<";s:1:"=";s:1:"=";s:1:">";s:1:">";s:1:"?";s:1:"?";s:3:"≅";s:1:"@";s:2:"Α";s:1:"A";s:2:"Β";s:1:"B";s:2:"Χ";s:1:"C";s:2:"Δ";s:1:"D";s:2:"Ε";s:1:"E";s:2:"Φ";s:1:"F";s:2:"Γ";s:1:"G";s:2:"Η";s:1:"H";s:2:"Ι";s:1:"I";s:2:"ϑ";s:1:"J";s:2:"Κ";s:1:"K";s:2:"Λ";s:1:"L";s:2:"Μ";s:1:"M";s:2:"Ν";s:1:"N";s:2:"Ο";s:1:"O";s:2:"Π";s:1:"P";s:2:"Θ";s:1:"Q";s:2:"Ρ";s:1:"R";s:2:"Σ";s:1:"S";s:2:"Τ";s:1:"T";s:2:"Υ";s:1:"U";s:2:"ς";s:1:"V";s:2:"Ω";s:1:"W";s:2:"Ξ";s:1:"X";s:2:"Ψ";s:1:"Y";s:2:"Ζ";s:1:"Z";s:1:"[";s:1:"[";s:3:"∴";s:1:"\";s:1:"]";s:1:"]";s:3:"⊥";s:1:"^";s:1:"_";s:1:"_";s:3:"";s:1:"`";s:2:"α";s:1:"a";s:2:"β";s:1:"b";s:2:"χ";s:1:"c";s:2:"δ";s:1:"d";s:2:"ε";s:1:"e";s:2:"φ";s:1:"f";s:2:"γ";s:1:"g";s:2:"η";s:1:"h";s:2:"ι";s:1:"i";s:2:"ϕ";s:1:"j";s:2:"κ";s:1:"k";s:2:"λ";s:1:"l";s:2:"µ";s:1:"m";s:2:"ν";s:1:"n";s:2:"ο";s:1:"o";s:2:"π";s:1:"p";s:2:"θ";s:1:"q";s:2:"ρ";s:1:"r";s:2:"σ";s:1:"s";s:2:"τ";s:1:"t";s:2:"υ";s:1:"u";s:2:"ϖ";s:1:"v";s:2:"ω";s:1:"w";s:2:"ξ";s:1:"x";s:2:"ψ";s:1:"y";s:2:"ζ";s:1:"z";s:1:"{";s:1:"{";s:1:"|";s:1:"|";s:1:"}";s:1:"}";s:3:"";s:1:"~";s:3:"€";s:1:"<22>";s:2:"ϒ";s:1:"<22>";s:3:"";s:1:"<22>";s:3:"≤";s:1:"<22>";s:3:"";s:1:"<22>";s:3:"∞";s:1:"<22>";s:2:"ƒ";s:1:"<22>";s:3:"♣";s:1:"<22>";s:3:"♦";s:1:"<22>";s:3:"♥";s:1:"<22>";s:3:"♠";s:1:"<22>";s:3:"↔";s:1:"<22>";s:3:"←";s:1:"<22>";s:3:"↑";s:1:"<22>";s:3:"→";s:1:"<22>";s:3:"↓";s:1:"<22>";s:2:"°";s:1:"<22>";s:2:"±";s:1:"<22>";s:3:"″";s:1:"<22>";s:3:"≥";s:1:"<22>";s:2:"×";s:1:"<22>";s:3:"∝";s:1:"<22>";s:3:"∂";s:1:"<22>";s:3:"•";s:1:"<22>";s:2:"÷";s:1:"<22>";s:3:"≠";s:1:"<22>";s:3:"≡";s:1:"<22>";s:3:"≈";s:1:"<22>";s:3:"…";s:1:"<22>";s:3:"";s:1:"<22>";s:3:"";s:1:"<22>";s:3:"↵";s:1:"<22>";s:3:"ℵ";s:1:"<22>";s:3:"";s:1:"<22>";s:3:"";s:1:"<22>";s:3:"℘";s:1:"<22>";s:3:"⊗";s:1:"<22>";s:3:"⊕";s:1:"<22>";s:3:"∅";s:1:"<22>";s:3:"∩";s:1:"<22>";s:3:"";s:1:"<22>";s:3:"⊃";s:1:"<22>";s:3:"⊇";s:1:"<22>";s:3:"⊄";s:1:"<22>";s:3:"⊂";s:1:"<22>";s:3:"⊆";s:1:"<22>";s:3:"∈";s:1:"<22>";s:3:"∉";s:1:"<22>";s:3:"∠";s:1:"<22>";s:3:"∇";s:1:"<22>";s:3:"";s:1:"<22>";s:3:"";s:1:"<22>";s:3:"";s:1:"<22>";s:3:"∏";s:1:"<22>";s:3:"√";s:1:"<22>";s:3:"⋅";s:1:"<22>";s:2:"¬";s:1:"<22>";s:3:"∧";s:1:"<22>";s:3:"";s:1:"<22>";s:3:"⇔";s:1:"<22>";s:3:"⇐";s:1:"<22>";s:3:"⇑";s:1:"<22>";s:3:"⇒";s:1:"<22>";s:3:"⇓";s:1:"<22>";s:3:"◊";s:1:"<22>";s:3:"〈";s:1:"<22>";s:3:"";s:1:"<22>";s:3:"";s:1:"<22>";s:3:"";s:1:"<22>";s:3:"∑";s:1:"<22>";s:3:"";s:1:"<22>";s:3:"";s:1:"<22>";s:3:"";s:1:"<22>";s:3:"";s:1:"<22>";s:3:"";s:1:"<22>";s:3:"";s:1:"<22>";s:3:"";s:1:"<22>";s:3:"";s:1:"<22>";s:3:"";s:1:"<22>";s:3:"";s:1:"<22>";s:3:"〉";s:1:"<22>";s:3:"∫";s:1:"<22>";s:3:"⌠";s:1:"<22>";s:3:"";s:1:"<22>";s:3:"⌡";s:1:"<22>";s:3:"";s:1:"<22>";s:3:"";s:1:"<22>";s:3:"";s:1:"<22>";s:3:"";s:1:"<22>";s:3:"";s:1:"<22>";s:3:"";s:1:"<22>";s:3:"";s:1:"<22>";s:3:"";s:1:"<22>";s:3:"";s:1:"<22>";}

View File

@@ -0,0 +1 @@
a:203:{s:2:" ";s:1:" ";s:1:" ";s:1:" ";s:3:"✁";s:1:"!";s:3:"✂";s:1:""";s:3:"✃";s:1:"#";s:3:"✄";s:1:"$";s:3:"☎";s:1:"%";s:3:"✆";s:1:"&";s:3:"✇";s:1:"'";s:3:"✈";s:1:"(";s:3:"✉";s:1:")";s:3:"☛";s:1:"*";s:3:"☞";s:1:"+";s:3:"✌";s:1:",";s:3:"✍";s:1:"-";s:3:"✎";s:1:".";s:3:"✏";s:1:"/";s:3:"✐";i:0;s:3:"✑";i:1;s:3:"✒";i:2;s:3:"✓";i:3;s:3:"✔";i:4;s:3:"✕";i:5;s:3:"✖";i:6;s:3:"✗";i:7;s:3:"✘";i:8;s:3:"✙";i:9;s:3:"✚";s:1:":";s:3:"✛";s:1:";";s:3:"✜";s:1:"<";s:3:"✝";s:1:"=";s:3:"✞";s:1:">";s:3:"✟";s:1:"?";s:3:"✠";s:1:"@";s:3:"✡";s:1:"A";s:3:"✢";s:1:"B";s:3:"✣";s:1:"C";s:3:"✤";s:1:"D";s:3:"✥";s:1:"E";s:3:"✦";s:1:"F";s:3:"✧";s:1:"G";s:3:"★";s:1:"H";s:3:"✩";s:1:"I";s:3:"✪";s:1:"J";s:3:"✫";s:1:"K";s:3:"✬";s:1:"L";s:3:"✭";s:1:"M";s:3:"✮";s:1:"N";s:3:"✯";s:1:"O";s:3:"✰";s:1:"P";s:3:"✱";s:1:"Q";s:3:"✲";s:1:"R";s:3:"✳";s:1:"S";s:3:"✴";s:1:"T";s:3:"✵";s:1:"U";s:3:"✶";s:1:"V";s:3:"✷";s:1:"W";s:3:"✸";s:1:"X";s:3:"✹";s:1:"Y";s:3:"✺";s:1:"Z";s:3:"✻";s:1:"[";s:3:"✼";s:1:"\";s:3:"✽";s:1:"]";s:3:"✾";s:1:"^";s:3:"✿";s:1:"_";s:3:"❀";s:1:"`";s:3:"❁";s:1:"a";s:3:"❂";s:1:"b";s:3:"❃";s:1:"c";s:3:"❄";s:1:"d";s:3:"❅";s:1:"e";s:3:"❆";s:1:"f";s:3:"❇";s:1:"g";s:3:"❈";s:1:"h";s:3:"❉";s:1:"i";s:3:"❊";s:1:"j";s:3:"❋";s:1:"k";s:3:"●";s:1:"l";s:3:"❍";s:1:"m";s:3:"■";s:1:"n";s:3:"❏";s:1:"o";s:3:"❐";s:1:"p";s:3:"❑";s:1:"q";s:3:"❒";s:1:"r";s:3:"▲";s:1:"s";s:3:"▼";s:1:"t";s:3:"◆";s:1:"u";s:3:"❖";s:1:"v";s:3:"◗";s:1:"w";s:3:"❘";s:1:"x";s:3:"❙";s:1:"y";s:3:"❚";s:1:"z";s:3:"❛";s:1:"{";s:3:"❜";s:1:"|";s:3:"❝";s:1:"}";s:3:"❞";s:1:"~";s:3:"";s:1:"<22>";s:3:"";s:1:"<22>";s:3:"";s:1:"<22>";s:3:"";s:1:"<22>";s:3:"";s:1:"<22>";s:3:"";s:1:"<22>";s:3:"";s:1:"<22>";s:3:"";s:1:"<22>";s:3:"";s:1:"<22>";s:3:"";s:1:"<22>";s:3:"";s:1:"<22>";s:3:"";s:1:"<22>";s:3:"";s:1:"<22>";s:3:"";s:1:"<22>";s:3:"❡";s:1:"<22>";s:3:"❢";s:1:"<22>";s:3:"❣";s:1:"<22>";s:3:"❤";s:1:"<22>";s:3:"❥";s:1:"<22>";s:3:"❦";s:1:"<22>";s:3:"❧";s:1:"<22>";s:3:"♣";s:1:"<22>";s:3:"♦";s:1:"<22>";s:3:"♥";s:1:"<22>";s:3:"♠";s:1:"<22>";s:3:"①";s:1:"<22>";s:3:"②";s:1:"<22>";s:3:"③";s:1:"<22>";s:3:"④";s:1:"<22>";s:3:"⑤";s:1:"<22>";s:3:"⑥";s:1:"<22>";s:3:"⑦";s:1:"<22>";s:3:"⑧";s:1:"<22>";s:3:"⑨";s:1:"<22>";s:3:"⑩";s:1:"<22>";s:3:"❶";s:1:"<22>";s:3:"❷";s:1:"<22>";s:3:"❸";s:1:"<22>";s:3:"❹";s:1:"<22>";s:3:"❺";s:1:"<22>";s:3:"❻";s:1:"<22>";s:3:"❼";s:1:"<22>";s:3:"❽";s:1:"<22>";s:3:"❾";s:1:"<22>";s:3:"❿";s:1:"<22>";s:3:"➀";s:1:"<22>";s:3:"➁";s:1:"<22>";s:3:"➂";s:1:"<22>";s:3:"➃";s:1:"<22>";s:3:"➄";s:1:"<22>";s:3:"➅";s:1:"<22>";s:3:"➆";s:1:"<22>";s:3:"➇";s:1:"<22>";s:3:"➈";s:1:"<22>";s:3:"➉";s:1:"<22>";s:3:"➊";s:1:"<22>";s:3:"➋";s:1:"<22>";s:3:"➌";s:1:"<22>";s:3:"➍";s:1:"<22>";s:3:"➎";s:1:"<22>";s:3:"➏";s:1:"<22>";s:3:"➐";s:1:"<22>";s:3:"➑";s:1:"<22>";s:3:"➒";s:1:"<22>";s:3:"➓";s:1:"<22>";s:3:"➔";s:1:"<22>";s:3:"→";s:1:"<22>";s:3:"↔";s:1:"<22>";s:3:"↕";s:1:"<22>";s:3:"➘";s:1:"<22>";s:3:"➙";s:1:"<22>";s:3:"➚";s:1:"<22>";s:3:"➛";s:1:"<22>";s:3:"➜";s:1:"<22>";s:3:"➝";s:1:"<22>";s:3:"➞";s:1:"<22>";s:3:"➟";s:1:"<22>";s:3:"➠";s:1:"<22>";s:3:"➡";s:1:"<22>";s:3:"➢";s:1:"<22>";s:3:"➣";s:1:"<22>";s:3:"➤";s:1:"<22>";s:3:"➥";s:1:"<22>";s:3:"➦";s:1:"<22>";s:3:"➧";s:1:"<22>";s:3:"➨";s:1:"<22>";s:3:"➩";s:1:"<22>";s:3:"➪";s:1:"<22>";s:3:"➫";s:1:"<22>";s:3:"➬";s:1:"<22>";s:3:"➭";s:1:"<22>";s:3:"➮";s:1:"<22>";s:3:"➯";s:1:"<22>";s:3:"➱";s:1:"<22>";s:3:"➲";s:1:"<22>";s:3:"➳";s:1:"<22>";s:3:"➴";s:1:"<22>";s:3:"➵";s:1:"<22>";s:3:"➶";s:1:"<22>";s:3:"➷";s:1:"<22>";s:3:"➸";s:1:"<22>";s:3:"➹";s:1:"<22>";s:3:"➺";s:1:"<22>";s:3:"➻";s:1:"<22>";s:3:"➼";s:1:"<22>";s:3:"➽";s:1:"<22>";s:3:"➾";s:1:"<22>";}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long