diff --git a/phpBB/includes/ucp/ucp_activate.php b/phpBB/includes/ucp/ucp_activate.php
new file mode 100644
index 0000000000..b2a2c91127
--- /dev/null
+++ b/phpBB/includes/ucp/ucp_activate.php
@@ -0,0 +1,95 @@
+sql_query($sql);
+
+ if ($row = $db->sql_fetchrow($result))
+ {
+ if ($row['user_active'] && $row['user_actkey'] == '')
+ {
+ meta_refresh(3, "index.$phpEx$SID");
+ trigger_error($user->lang['Already_activated']);
+ }
+ else if ($row['user_actkey'] == $_GET['k'])
+ {
+ $sql_update_pass = ($row['user_newpasswd'] != '') ? ", user_password = '" . $db->sql_escape($row['user_newpasswd']) . "', user_newpasswd = ''" : '';
+
+ $sql = "UPDATE " . USERS_TABLE . "
+ SET user_active = 1, user_actkey = ''" . $sql_update_pass . "
+ WHERE user_id = " . $row['user_id'];
+ $result = $db->sql_query($sql);
+
+ if ($config['require_activation'] == USER_ACTIVATION_ADMIN && $sql_update_pass == '')
+ {
+ $this->include_file('includes/emailer');
+ $emailer = new emailer($config['smtp_delivery']);
+
+ $emailer->use_template('admin_welcome_activated', $row['user_lang']);
+ $emailer->to($row['user_email']);
+
+ $emailer->assign_vars(array(
+ 'SITENAME' => $config['sitename'],
+ 'USERNAME' => $row['username'],
+ 'PASSWORD' => $password_confirm,
+ 'EMAIL_SIG' => str_replace('
', "\n", "-- \n" . $config['board_email_sig']))
+ );
+ $emailer->send();
+ $emailer->reset();
+
+ meta_refresh(3, "index.$phpEx$SID");
+ trigger_error($user->lang['Account_active_admin']);
+ }
+ else
+ {
+ meta_refresh(3, "index.$phpEx$SID");
+ $message = ($sql_update_pass == '') ? $user->lang['Account_active'] : $user->lang['Password_activated'];
+ trigger_error($message);
+ }
+
+ set_config('newest_user_id', $row['user_id']);
+ set_config('newest_username', $row['username']);
+ set_config('num_users', $config['num_users'] + 1, TRUE);
+ }
+ else
+ {
+ trigger_error($user->lang['Wrong_activation']);
+ }
+ }
+ else
+ {
+ trigger_error($user->lang['No_such_user']);
+ }
+ $db->sql_freeresult($result);
+ }
+}
+
+?>
\ No newline at end of file
diff --git a/phpBB/includes/ucp/ucp_confirm.php b/phpBB/includes/ucp/ucp_confirm.php
new file mode 100644
index 0000000000..fc51555c9b
--- /dev/null
+++ b/phpBB/includes/ucp/ucp_confirm.php
@@ -0,0 +1,432 @@
+data['session_id'] . "'
+ AND confirm_id = '$confirm_id'";
+ $result = $db->sql_query($sql);
+
+ // If we have a row then grab data else create a new id
+ if ($row = $db->sql_fetchrow($result))
+ {
+ $db->sql_freeresult($result);
+ $code = $row['code'];
+ }
+ else
+ {
+ exit;
+ }
+
+ // If we can we will generate a single filtered png else we will have to simply
+ // output six seperate original pngs ... first way is preferable!
+ if (@extension_loaded('zlib'))
+ {
+ $_png = $this->define_filtered_pngs();
+
+ $total_width = 320;
+ $total_height = 50;
+ $img_height = 40;
+ $img_width = 0;
+ $l = 0;
+
+ list($usec, $sec) = explode(' ', microtime());
+ mt_srand($sec * $usec);
+
+ $char_widths = array();
+ for ($i = 0; $i < strlen($code); $i++)
+ {
+ $char = $code{$i};
+
+ $width = mt_rand(0, 4);
+ $char_widths[] = $width;
+ $img_width += $_png[$char]['width'] - $width;
+ }
+
+ $offset_x = mt_rand(0, $total_width - $img_width);
+ $offset_y = mt_rand(0, $total_height - $img_height);
+
+ $image = '';
+ $hold_chars = array();
+ for ($i = 0; $i < $total_height; $i++)
+ {
+ $image .= chr(0);
+
+ if ($i > $offset_y && $i < $offset_y + $img_height)
+ {
+ $j = 0;
+
+ for ($k = 0; $k < $offset_x; $k++)
+ {
+ $image .= chr(mt_rand(140, 255));
+ }
+
+ for ($k = 0; $k < strlen($code); $k++)
+ {
+ $char = $code{$k};
+
+ if (empty($hold_chars[$char]))
+ {
+ $hold_chars[$char] = explode("\n", chunk_split(base64_decode($_png[$char]['data']), $_png[$char]['width'] + 1, "\n"));
+ }
+ $image .= $this->randomise(substr($hold_chars[$char][$l], 1), $char_widths[$j]);
+ $j++;
+ }
+
+ for ($k = $offset_x + $img_width; $k < $total_width; $k++)
+ {
+ $image .= chr(mt_rand(140, 255));
+ }
+
+ $l++;
+ }
+ else
+ {
+ for ($k = 0; $k < $total_width; $k++)
+ {
+ $image .= chr(mt_rand(140, 255));
+ }
+ }
+
+ }
+ unset($hold);
+
+ $image = $this->create_png(gzcompress($image), $total_width, $total_height);
+
+ // Output image
+ header('Content-Type: image/png');
+ header('Cache-control: no-cache, no-store');
+ echo $image;
+
+ unset($image);
+ unset($_png);
+ exit;
+
+ }
+ else
+ {
+ if (!empty($_GET['c']))
+ {
+ $_png = $this->define_raw_pngs();
+
+ $char = substr($code, intval($HTTP_GET_VARS['c']) - 1, 1);
+ header('Content-Type: image/png');
+ header('Cache-control: no-cache, no-store');
+ echo base64_decode($_png[$char]);
+
+ unset($_png);
+ exit;
+ }
+ }
+
+ exit;
+ }
+
+ // This is designed to randomise the pixels of the image data within
+ // certain limits so as to keep it readable. It also varies the image
+ // width a little
+ function randomise($scanline, $width)
+ {
+ $new_line = '';
+ $start = floor($width/2);
+ $end = strlen($scanline) - ceil($width/2);
+
+ for ($i = $start; $i < $end; $i++)
+ {
+ $pixel = ord($scanline{$i});
+
+ if ($pixel < 190)
+ {
+ $new_line .= chr(mt_rand(0, 205));
+ }
+ else if ($pixel > 190)
+ {
+ $new_line .= chr(mt_rand(145, 255));
+ }
+ else
+ {
+ $new_line .= $scanline{$i};
+ }
+ }
+
+ return $new_line;
+ }
+
+ // This creates a chunk of the given type, with the given data
+ // of the given length adding the relevant crc
+ function png_chunk($length, $type, $data)
+ {
+ $raw = $type;
+ $raw .= $data;
+ $crc = crc32($raw);
+ $raw .= pack('C4', $crc >> 24, $crc >> 16, $crc >> 8, $crc);
+
+ return pack('C4', $length >> 24, $length >> 16, $length >> 8, $length) . $raw;
+ }
+
+ // Creates greyscale 8bit png - The PNG spec can be found at
+ // http://www.libpng.org/pub/png/spec/PNG-Contents.html we use
+ // png because it's a fully recognised open standard and supported
+ // by practically all modern browsers and OSs
+ function create_png($gzimage, $width, $height)
+ {
+ // SIG
+ $image = pack('C8', 137, 80, 78, 71, 13, 10, 26, 10);
+ // IHDR
+ $raw = pack('C4', $width >> 24, $width >> 16, $width >> 8, $width);
+ $raw .= pack('C4', $height >> 24, $height >> 16, $height >> 8, $height);
+ $raw .= pack('C5', 8, 0, 0, 0, 0);
+ $image .= $this->png_chunk(13, 'IHDR', $raw);
+ // IDAT
+ $image .= $this->png_chunk(strlen($gzimage), 'IDAT', $gzimage);
+ // IEND
+ $image .= $this->png_chunk(0, 'IEND', '');
+
+ return $image;
+ }
+
+ // Each 'data' element is base64_encoded uncompressed IDAT
+ // png image data
+ function define_filtered_pngs()
+ {
+ $_png = array(
+ '0' => array(
+ 'data' => 'AP////////////////////////////////////////////////////8A/////////////////////////////////////////////////////wD/////////////////////////////////////////////////////AP////////////////////////////////////////////////////8A/////////////////////////////////////////////////////wD/////////////////////////////////////////////////////AP////////////////////////////////////////////////////8A///////////////////olFAkBAAAGDyA4P///M31/////////////wD////////////////0dAgAAAAAAAAAAAAEcPipFGHn////////////AP//////////////6DAAAAAAAAAAAAAAAAAALSEAN+T///////////8A//////////////xAAAAAAAAAAAAAAAAAAAAAACPA/////////////wD/////////////oAAAAAAAAAAAAAAAAAAAAAAAev//////////////AP////////////8oAAAAAAAAPNj/zDAAAAAAAABD//////////////8A////////////1AAAAAAAABjw////5BAAAAAAAADo/////////////wD///////////+QAAAAAAAAbP//////QgAAAAAAAKj/////////////AP///////////1wAAAAAAACs/////8AXAAAAAAAAcP////////////8A////////////OAAAAAAAAND////dNwAAAAAAAABI/////////////wD///////////8gAAAAAAAA4P//7koACwAAAAAAACT/////////////AP///////////wgAAAAAAAD///VqAwaPAAAAAAAAEP////////////8A////////////AAAAAAAAAP/8kQYDavUAAAAAAAAA/////////////wD///////////8AAAAAAAAA/6kNAEru/wAAAAAAAAD/////////////AP///////////wAAAAAAAADAIwA33f//AAAAAAAAAP////////////8A////////////FAAAAAAAADYAI8D///8AAAAAAAAQ/////////////wD///////////8kAAAAAAAAAA2p////5AAAAAAAACD/////////////AP///////////0gAAAAAAAAFkfz////UAAAAAAAAQP////////////8A////////////cAAAAAAAAET1/////7AAAAAAAABo/////////////wD///////////+oAAAAAAAAXfX/////sAAAAAAAAGj/////////////AAAAALgAAAAAAAAwAAAAAAAAAAAAAAD////////////oAAAAAAAACOT////oEAAAAAAAAOD/////////////AP////////////8+AAAAAAAAKMz/zDQAAAAAAAA0//////////////8A////////////7jgAAAAAAAAAAAAAAAAAAAAAAKT//////////////wD///////////VqAwIAAAAAAAAAAAAAAAAAAAA8////////////////AP//////////rQcDaVEAAAAAAAAAAAAAAAAAKOj///////////////8A///////////nblnu/IAIAAAAAAAAAAAAAFzw/////////////////wD////////////79////+iITCAAAAAgSITg////////////////////AP////////////////////////////////////////////////////8A/////////////////////////////////////////////////////wD/////////////////////////////////////////////////////AP////////////////////////////////////////////////////8A/////////////////////////////////////////////////////w==',
+ 'width' => 40
+ ),
+ '1' => array(
+ 'data' => 'AP////////////////////////////////////////////////////8A/////////////////////////////////////////////////////wD/////////////////////////8BAAAAAAAP//////////////////AP////////////////////////9sAAAAAAAA//////////////////8A////////////////////////pAAAAAAAAAD//////////////////wD//////////////////////6wEAAAAAAAAAP//////////////////AP////////////////////h4AAAAAAAAAAAA//////////////////8A//////////////////ygJAAAAAAAAAAAAAD//////////////////wD//////////////9x8HAAAAAAAAAAAAAAAAP//////////////////AP//////////////AAAAAAAAAAAAAAAAAAAA//////////////////8A//////////////8AAAAAAAAAAAAAAAAAAAD//////////////////wD//////////////wAAAAAAAAR4AAAAAAAAAP//////////////////AP//////////////AAAAAAA4zP8AAAAAAAAA//////////////////8A//////////////8AAAA4sP///wAAAAAAAAD//////////////////wD//////////////yR80P//////AAAAAAAAAP//////////////////AP////////////////////////8AAAAAAAAA//////////////////8A/////////////////////////wAAAAAAAAD//////////////////wD/////////////////////////AAAAAAAAAP//////////////////AP////////////////////////8AAAAAAAAA//////////////////8A/////////////////////////wAAAAAAAAD//////////////////wD/////////////////////////AAAAAAAAAP//////////////////AP////////////////////////8AAAAAAAAA//////////////////8A/////////////////////////wAAAAAAAAD//////////////////wD/////////////////////////AAAAAAAAAP//////////////////AP////////////////////////8AAAAAAAAA//////////////////8A/////////////////////////wAAAAAAAAD//////////////////wD/////////////////////////AAAAAAAAAP//////////////////AP////////////////////////8AAAAAAAAA//////////////////8A/////////////////////////wAAAAAAAAD//////////////////wD/////////////////////////////////////////////////////AP////////////////////////////////////////////////////8A/////////////////////////////////////////////////////wD/////////////////////////////////////////////////////AP////////////////////////////////////////////////////8A/////////////////////////////////////////////////////wD/////////////////////////////////////////////////////AP////////////////////////////////////////////////////8A/////////////////////////////////////////////////////wD/////////////////////////////////////////////////////AP////////////////////////////////////////////////////8=',
+ 'width' => 40
+ ),
+ '2' => array(
+ 'data' => 'AP////////////////////////////////////////////////////8A/////////////////////////////////////////////////////wD/////////////////////////////////////////////////////AP////////////////////////////////////////////////////8A/////////////////////////////////////////////////////wD/////////////////////////////////////////////////////AP////////////////////////////////////////////////////8A/////////////////////////////////////////////////////wD/////////////////////////////////////////////////////AP////////////////////////////////////////////////////8A/////////////////////////////////////////////////////wD/////////////////////////////////////////////////////AP/////////////////okFAkCAAABCBIfNT///////////////////8A///////////////8hAgAAAAAAAAAAAAAAFTo/////////////////wD//////////////1QAAAAAAAAAAAAAAAAAACjo////////////////AP////////////+MAAAAAAAAAAAAAAAAAAAAADj///////////////8A////////////9BAAAAAAAAAAAAAAAAAAAAAAALD//////////////wD///////////+gAAAAAAAAAHjs+KwMAAAAAAAAVP//////////////AP///////////1gAAAAAAABM/////6QAAAAAAAAU//////////////8A////////////KAAAAAAAALj/////+AAAAAAAAAD//////////////wD///////////+MfGBMOCAI8P/////wAAAAAAAACP//////////////AP///////////////////////////5wAAAAAAAAw//////////////8A///////////////////////////oFAAAAAAAAHz//////////////wD/////////////////////////6CgAAAAAAAAE3P//////////////AP///////////////////////9ggAAAAAAAAAHT///////////////8A//////////////////////+0DAAAAAAAAAA8+P///////////////wD/////////////////////gAAAAAAAAAAAKOj/////////////////AP//////////////////9FAAAAAAAAAAADzw//////////////////8A/////////////////+g4AAAAAAAAAABk/P///////////////////wD////////////////oKAAAAAAAAAAMqP//////////////////////AP//////////////6CgAAAAAAAAAMNz///////////////////////8A//////////////g4AAAAAAAAAFT0/////////////////////////wD/////////////bAAAAAAAAABU/P//////////////////////////AP///////////8wAAAAAAAAAAAAAAAAAAAAAAAAA//////////////8A////////////SAAAAAAAAAAAAAAAAAAAAAAAAAD//////////////wD//////////9wAAAAAAAAAAAAAAAAAAAAAAAAAAP//////////////AP//////////hAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////////8A//////////9AAAAAAAAAAAAAAAAAAAAAAAAAAAD//////////////wD//////////xAAAAAAAAAAAAAAAAAAAAAAAAAAAP//////////////AP////////////////////////////////////////////////////8=',
+ 'width' => 40
+ ),
+ '3' => array(
+ 'data' => 'AP////////////////////////////////////////////////////8A/////////////////////////////////////////////////////wD/////////////////////////////////////////////////////AP////////////////////////////////////////////////////8A/////////////////////////////////////////////////////wD/////////////////////////////////////////////////////AP////////////////////////////////////////////////////8A/////////////////////////////////////////////////////wD////////////////8sGg0FAAAACA4cLz8////////////////////AP//////////////rBgAAAAAAAAAAAAAACTA//////////////////8A/////////////3QAAAAAAAAAAAAAAAAAAASs/////////////////wD///////////+YAAAAAAAAAAAAAAAAAAAAAAjc////////////////AP//////////6AwAAAAAAAAAAAAAAAAAAAAAAGT///////////////8A//////////94AAAAAAAABJDw/8g4AAAAAAAAHP///////////////wD//////////yAAAAAAAACE/////9gAAAAAAAAA////////////////AP///////////NSwiGQ4FOT//////AAAAAAAABD///////////////8A//////////////////////////+YAAAAAAAAVP///////////////wD//////////////////////P/ggAQAAAAAAATM////////////////AP////////////////////9gAAAAAAAAAAAElP////////////////8A/////////////////////0AAAAAAAAAAHLj//////////////////wD/////////////////////OAAAAAAAAAAwkPj/////////////////AP////////////////////8gAAAAAAAAAAAAINj///////////////8A/////////////////////xAAAAAAAAAAAAAAIPD//////////////wD/////////////////////uOz/4HgEAAAAAAAAhP//////////////AP///////////////////////////3wAAAAAAAAw//////////////8A////////////////////////////6AAAAAAAAAj//////////////wD/////////////////////////////AAAAAAAAAP//////////////AP//////////tJh8YEQoDNz//////+AAAAAAAAAY//////////////8A//////////88AAAAAAAAaP//////dAAAAAAAAEz//////////////wD//////////6QAAAAAAAAAdOD/5HQAAAAAAAAApP//////////////AP///////////CgAAAAAAAAAAAAAAAAAAAAAACD4//////////////8A////////////yAQAAAAAAAAAAAAAAAAAAAAEuP///////////////wD/////////////rAQAAAAAAAAAAAAAAAAABJD/////////////////AP//////////////zDQAAAAAAAAAAAAAACTA//////////////////8A/////////////////8BwOCAAAAAUNGi0/P///////////////////wD/////////////////////////////////////////////////////AP////////////////////////////////////////////////////8A/////////////////////////////////////////////////////wD/////////////////////////////////////////////////////AP////////////////////////////////////////////////////8=',
+ 'width' => 40
+ ),
+ '4' => array(
+ 'data' => 'AP////////////////////////////////////////////////////8A/////////////////////////////////////////////////////wD/////////////////////////////////////////////////////AP//////////////////////////nAAAAAAAAAD///////////////8A/////////////////////////8AEAAAAAAAAAP///////////////wD////////////////////////gGAAAAAAAAAAA////////////////AP//////////////////////9DAAAAAAAAAAAAD///////////////8A//////////////////////9UAAAAAAAAAAAAAP///////////////wD/////////////////////hAAAAAAAAAAAAAAA////////////////AP///////////////////7QAAAAAAAAAAAAAAAD///////////////8A///////////////////UDAAAAAAUAAAAAAAAAP///////////////wD/////////////////7CQAAAAABMAAAAAAAAAA////////////////AP////////////////xEAAAAAACU/wAAAAAAAAD///////////////8A////////////////cAAAAAAAZP//AAAAAAAAAP///////////////wD//////////////6AAAAAAADz8//8AAAAAAAAA////////////////AP/////////////IBAAAAAAc6P///wAAAAAAAAD///////////////8A////////////5BgAAAAADMz/////AAAAAAAAAP///////////////wD///////////g0AAAAAACk//////8AAAAAAAAA////////////////AP//////////XAAAAAAAfP///////wAAAAAAAAD///////////////8A//////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////////wD//////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////AP//////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////8A//////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////////wD//////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////AP//////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////8A////////////////////////////AAAAAAAAAP///////////////wD///////////////////////////8AAAAAAAAA////////////////AP///////////////////////////wAAAAAAAAD///////////////8A////////////////////////////AAAAAAAAAP///////////////wD///////////////////////////8AAAAAAAAA////////////////AP////////////////////////////////////////////////////8A/////////////////////////////////////////////////////wD/////////////////////////////////////////////////////AP////////////////////////////////////////////////////8A/////////////////////////////////////////////////////wD/////////////////////////////////////////////////////AP////////////////////////////////////////////////////8A/////////////////////////////////////////////////////wD/////////////////////////////////////////////////////AP////////////////////////////////////////////////////8=',
+ 'width' => 40
+ ),
+ '5' => array(
+ 'data' => 'AP////////////////////////////////////////////////////8A/////////////////////////////////////////////////////wD/////////////////////////////////////////////////////AP////////////////////////////////////////////////////8A/////////////////////////////////////////////////////wD/////////////////////////////////////////////////////AP////////////////////////////////////////////////////8A/////////////////////////////////////////////////////wD/////////////////////////////////////////////////////AP//////////////8AAAAAAAAAAAAAAAAAAAAAAA//////////////8A///////////////MAAAAAAAAAAAAAAAAAAAAAAD//////////////wD//////////////6wAAAAAAAAAAAAAAAAAAAAAAP//////////////AP//////////////iAAAAAAAAAAAAAAAAAAAAAAA//////////////8A//////////////9kAAAAAAAAAAAAAAAAAAAAAAD//////////////wD//////////////0QAAAAAAAAAAAAAAAAAAAAAAP//////////////AP//////////////IAAAAAAAYP////////////////////////////8A//////////////wAAAAAAAB8/////////////////////////////wD/////////////3AAAAAAAAIj/////////////////////////////AP////////////+4AAAAAAAAoLRYHAAEKGTE//////////////////8A/////////////5QAAAAAAAAQAAAAAAAAAABY9P///////////////wD/////////////dAAAAAAAAAAAAAAAAAAAAAA89P//////////////AP////////////9QAAAAAAAAAAAAAAAAAAAAAABg//////////////8A/////////////zAAAAAAAAAAAAAAAAAAAAAAAADQ/////////////wD/////////////IAAAAAAAAGjY/+h4BAAAAAAAAGz/////////////AP//////////////9NS0lHSc//////90AAAAAAAALP////////////8A/////////////////////////////9QAAAAAAAAE/////////////wD//////////////////////////////wAAAAAAAAD/////////////AP/////////////////////////////8AAAAAAAAEP////////////8A////////////pIRwWEAgDOD//////8wAAAAAAAA8/////////////wD///////////9EAAAAAAAAaP//////ZAAAAAAAAHz/////////////AP///////////6QAAAAAAAAAaOD/4GQAAAAAAAAE4P////////////8A/////////////CQAAAAAAAAAAAAAAAAAAAAAAGD//////////////wD/////////////yAQAAAAAAAAAAAAAAAAAAAAc7P//////////////AP//////////////rAwAAAAAAAAAAAAAAAAAGNj///////////////8A////////////////0EAAAAAAAAAAAAAAAFTo/////////////////wD//////////////////8h4QCAAAAAcQHzU////////////////////AP////////////////////////////////////////////////////8A/////////////////////////////////////////////////////wD/////////////////////////////////////////////////////AP////////////////////////////////////////////////////8=',
+ 'width' => 40
+ ),
+ '6' => array(
+ 'data' => 'AP////////////////////////////////////////////////////8A/////////////////////////////////////////////////////wD///////////////////+0ZCwMAAAUNGjI////////////////////AP/////////////////EMAAAAAAAAAAAAABM6P////////////////8A////////////////lAQAAAAAAAAAAAAAAAAo6P///////////////wD//////////////6wAAAAAAAAAAAAAAAAAAABI////////////////AP/////////////oEAAAAAAAAAAAAAAAAAAAAACw//////////////8A/////////////3AAAAAAAAAoxP/YPAAAAAAAAEj//////////////wD////////////4EAAAAAAACOD////YDCBAVGiAoP//////////////AP///////////7gAAAAAAABY//////////////////////////////8A////////////eAAAAAAAAJT//////////////////////////////wD///////////9MAAAAAAAAvP/IXBgABCx03P//////////////////AP///////////ygAAAAAAADcdAAAAAAAAAAEiP////////////////8A////////////FAAAAAAAAFAAAAAAAAAAAAAAcP///////////////wD///////////8AAAAAAAAAAAAAAAAAAAAAAAAAlP//////////////AP///////////wAAAAAAAAAAAAAAAAAAAAAAAAAQ8P////////////8A////////////AAAAAAAAAABAyP/kZAAAAAAAAACQ/////////////wD///////////8MAAAAAAAALPj/////WAAAAAAAAET/////////////AP///////////yQAAAAAAACY///////MAAAAAAAAFP////////////8A////////////SAAAAAAAAMD///////wAAAAAAAAA/////////////wD///////////9wAAAAAAAAvP///////wAAAAAAAAD/////////////AP///////////7QAAAAAAACI///////UAAAAAAAAJP////////////8A////////////+AwAAAAAACDw/////2wAAAAAAABY/////////////wD/////////////cAAAAAAAADC8/Ox4AAAAAAAAAKj/////////////AP/////////////oEAAAAAAAAAAAAAAAAAAAAAAk/P////////////8A//////////////+oAAAAAAAAAAAAAAAAAAAABLj//////////////wD///////////////+QAAAAAAAAAAAAAAAAAACQ////////////////AP////////////////+0JAAAAAAAAAAAAAAkuP////////////////8A///////////////////8sGg0FAAADCxgqPz//////////////////wD/////////////////////////////////////////////////////AP////////////////////////////////////////////////////8A/////////////////////////////////////////////////////wD/////////////////////////////////////////////////////AP////////////////////////////////////////////////////8A/////////////////////////////////////////////////////wD/////////////////////////////////////////////////////AP////////////////////////////////////////////////////8A/////////////////////////////////////////////////////wD/////////////////////////////////////////////////////AP////////////////////////////////////////////////////8=',
+ 'width' => 40
+ ),
+ '7' => array(
+ 'data' => 'AP////////////////////////////////////////////////////8A/////////////////////////////////////////////////////wD/////////////////////////////////////////////////////AP////////////////////////////////////////////////////8A/////////////////////////////////////////////////////wD/////////////////////////////////////////////////////AP////////////////////////////////////////////////////8A/////////////////////////////////////////////////////wD/////////////////////////////////////////////////////AP////////////////////////////////////////////////////8A/////////////////////////////////////////////////////wD///////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////AP///////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////8A////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAA/////////////wD///////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////AP///////////wAAAAAAAAAAAAAAAAAAAAAAAAAABP////////////8A////////////AAAAAAAAAAAAAAAAAAAAAAAAAAy4/////////////wD//////////////////////////+QUAAAAAAAEuP//////////////AP/////////////////////////8QAAAAAAAAKT///////////////8A/////////////////////////4wAAAAAAAB0/////////////////wD////////////////////////cCAAAAAAANPz/////////////////AP///////////////////////0QAAAAAAATY//////////////////8A//////////////////////+0AAAAAAAAeP///////////////////wD//////////////////////CQAAAAAABTw////////////////////AP////////////////////+gAAAAAAAAkP////////////////////8A/////////////////////ywAAAAAABDw/////////////////////wD///////////////////+4AAAAAAAAbP//////////////////////AP///////////////////1wAAAAAAADQ//////////////////////8A///////////////////4DAAAAAAAMP///////////////////////wD//////////////////7QAAAAAAAB8////////////////////////AP//////////////////aAAAAAAAAMj///////////////////////8A//////////////////8oAAAAAAAM/P///////////////////////wD/////////////////8AAAAAAAAET/////////////////////////AP////////////////+0AAAAAAAAcP////////////////////////8A/////////////////4wAAAAAAACY/////////////////////////wD/////////////////WAAAAAAAAMD/////////////////////////AP////////////////80AAAAAAAA4P////////////////////////8A/////////////////xAAAAAAAAD4/////////////////////////wD/////////////////////////////////////////////////////AP////////////////////////////////////////////////////8=',
+ 'width' => 40
+ ),
+ '8' => array(
+ 'data' => 'AP////////////////////////////////////////////////////8A/////////////////////////////////////////////////////wD/////////////////////////////////////////////////////AP////////////////////////////////////////////////////8A/////////////////////////////////////////////////////wD////////////////////IdDQUAAAEIEiA1P//////////////////AP/////////////////gRAAAAAAAAAAAAAAAROD///////////////8A////////////////0BgAAAAAAAAAAAAAAAAAEMj//////////////wD///////////////AcAAAAAAAAAAAAAAAAAAAAHPD/////////////AP//////////////hAAAAAAAAAAAAAAAAAAAAAAAhP////////////8A//////////////8sAAAAAAAAKMz/zCgAAAAAAAAs/////////////wD//////////////wAAAAAAAADM////zAAAAAAAAAD/////////////AP//////////////BAAAAAAAAP//////AAAAAAAABP////////////8A//////////////8sAAAAAAAAzP///9QAAAAAAAAw/////////////wD//////////////3wAAAAAAAAoyP/YNAAAAAAAAIT/////////////AP//////////////7BgAAAAAAAAAAAAAAAAAAAAc8P////////////8A////////////////xBgAAAAAAAAAAAAAAAAAGNj//////////////wD/////////////////tAQAAAAAAAAAAAAAAACo////////////////AP///////////////HAAAAAAAAAAAAAAAAAAAAB8//////////////8A//////////////9gAAAAAAAAAAAAAAAAAAAAAAB8/////////////wD/////////////wAAAAAAAAABk4P/UWAAAAAAAAATQ////////////AP////////////9UAAAAAAAAaP//////XAAAAAAAAGT///////////8A/////////////xgAAAAAAADg///////cAAAAAAAAJP///////////wD/////////////AAAAAAAAAP////////8AAAAAAAAA////////////AP////////////8AAAAAAAAA4P//////3AAAAAAAAAT///////////8A/////////////ygAAAAAAABg//////9cAAAAAAAALP///////////wD/////////////ZAAAAAAAAABY1P/cXAAAAAAAAABw////////////AP/////////////QAAAAAAAAAAAAAAAAAAAAAAAABNz///////////8A//////////////9gAAAAAAAAAAAAAAAAAAAAAAB0/////////////wD///////////////Q8AAAAAAAAAAAAAAAAAAAAUPz/////////////AP////////////////x4CAAAAAAAAAAAAAAAEIT8//////////////8A///////////////////smFQwGAAAABg0ZKT0/////////////////wD/////////////////////////////////////////////////////AP////////////////////////////////////////////////////8A/////////////////////////////////////////////////////wD/////////////////////////////////////////////////////AP////////////////////////////////////////////////////8A/////////////////////////////////////////////////////wD/////////////////////////////////////////////////////AP////////////////////////////////////////////////////8=',
+ 'width' => 40
+ ),
+ '9' => array(
+ 'data' => 'AP////////////////////////////////////////////////////8A/////////////////////////////////////////////////////wD///////////////////ysYCwMAAAUNGiw/P//////////////////AP////////////////+4JAAAAAAAAAAAAAAkuP////////////////8A////////////////lAQAAAAAAAAAAAAAAAAAkP///////////////wD//////////////8AEAAAAAAAAAAAAAAAAAAAAqP//////////////AP/////////////8JAAAAAAAAAAAAAAAAAAAAAAQ7P////////////8A/////////////6wAAAAAAAAAfOz8vCwAAAAAAABw/////////////wD/////////////WAAAAAAAAHD/////7BgAAAAAAAz4////////////AP////////////8kAAAAAAAA1P//////hAAAAAAAALT///////////8A/////////////wAAAAAAAAD///////+4AAAAAAAAcP///////////wD/////////////AAAAAAAAAPz//////8AAAAAAAABI////////////AP////////////8UAAAAAAAAzP//////lAAAAAAAACT///////////8A/////////////0QAAAAAAABY//////gsAAAAAAAADP///////////wD/////////////kAAAAAAAAABw5P/IPAAAAAAAAAAA////////////AP/////////////wEAAAAAAAAAAAAAAAAAAAAAAAAAD///////////8A//////////////+UAAAAAAAAAAAAAAAAAAAAAAAAAP///////////wD///////////////9wAAAAAAAAAAAAAFAAAAAAAAAU////////////AP////////////////+IBAAAAAAAAABw3AAAAAAAACj///////////8A///////////////////cdCwEABhcxP+8AAAAAAAATP///////////wD//////////////////////////////5AAAAAAAAB4////////////AP//////////////////////////////UAAAAAAAALj///////////8A//////////////+kgGxUQCAM2P///+AIAAAAAAAQ+P///////////wD//////////////0gAAAAAAAA42P/EKAAAAAAAAHD/////////////AP//////////////sAAAAAAAAAAAAAAAAAAAAAAQ6P////////////8A////////////////TAAAAAAAAAAAAAAAAAAAAKz//////////////wD////////////////oKAAAAAAAAAAAAAAAAASU////////////////AP/////////////////sUAAAAAAAAAAAAAAwxP////////////////8A////////////////////yHA0FAAADCxktP///////////////////wD/////////////////////////////////////////////////////AP////////////////////////////////////////////////////8A/////////////////////////////////////////////////////wD/////////////////////////////////////////////////////AP////////////////////////////////////////////////////8A/////////////////////////////////////////////////////wD/////////////////////////////////////////////////////AP////////////////////////////////////////////////////8A/////////////////////////////////////////////////////wD/////////////////////////////////////////////////////AP////////////////////////////////////////////////////8=',
+ 'width' => 40
+ ),
+ 'A' => array(
+ 'data' => 'AP////////////////////////////////////////////////////8A/////////////////////////////////////////////////////wD/////////////////////////////////////////////////////AP////////////////////////////////////////////////////8A/////////////////////////////////////////////////////wD/////////////////////////////////////////////////////AP////////////////////////////////////////////////////8A/////////////////////////////////////////////////////wD//////////////////+QAAAAAAAAAAAAAAOT/////////////////AP//////////////////kAAAAAAAAAAAAAAAkP////////////////8A//////////////////88AAAAAAAAAAAAAAA8/////////////////wD/////////////////5AAAAAAAAAAAAAAAAADk////////////////AP////////////////+QAAAAAAAAAAAAAAAAAJD///////////////8A/////////////////zwAAAAAAAAAAAAAAAAAPP///////////////wD////////////////kAAAAAAAAAAgAAAAAAAAA5P//////////////AP///////////////5AAAAAAAAAAgAAAAAAAAACQ//////////////8A////////////////PAAAAAAAAAz8HAAAAAAAADz//////////////wD//////////////+QAAAAAAAAAWP9kAAAAAAAAANz/////////////AP//////////////kAAAAAAAAACk/7wAAAAAAAAAhP////////////8A//////////////88AAAAAAAABOz//BQAAAAAAAAw/////////////wD/////////////4AAAAAAAAAA8////ZAAAAAAAAADc////////////AP////////////+EAAAAAAAAAIj///+8AAAAAAAAAIT///////////8A/////////////zAAAAAAAAAA2P////wQAAAAAAAAMP///////////wD////////////cAAAAAAAAACT//////1wAAAAAAAAA3P//////////AP///////////4QAAAAAAAAAAAAAAAAAAAAAAAAAAACE//////////8A////////////MAAAAAAAAAAAAAAAAAAAAAAAAAAAADD//////////wD//////////9wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANz/////////AP//////////hAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAhP////////8A//////////8wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAw/////////wD/////////3AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADc////////AP////////+EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIT///////8A/////////zAAAAAAAAAAhP///////////2QAAAAAAAAAMP///////wD////////cAAAAAAAAAADM////////////vAAAAAAAAAAA3P//////AP///////4QAAAAAAAAAHP/////////////4DAAAAAAAAACE//////8A////////MAAAAAAAAABk//////////////9cAAAAAAAAADD//////wD/////////////////////////////////////////////////////AP////////////////////////////////////////////////////8A/////////////////////////////////////////////////////wD/////////////////////////////////////////////////////AP////////////////////////////////////////////////////8=',
+ 'width' => 40
+ ),
+ 'B' => array(
+ 'data' => 'AP////////////////////////////////////////////////////8A/////////////////////////////////////////////////////wD/////////////////////////////////////////////////////AP////////////////////////////////////////////////////8A//////////8AAAAAAAAAAAAAAAAAAAAAEDh83P///////////////wD//////////wAAAAAAAAAAAAAAAAAAAAAAAAAEhP//////////////AP//////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAeP////////////8A//////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAxP///////////wD//////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAABY////////////AP//////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAABT///////////8A//////////8AAAAAAAAAAP/////4zEwAAAAAAAAAAP///////////wD//////////wAAAAAAAAAA////////7AAAAAAAAAAQ////////////AP//////////AAAAAAAAAAD////////sAAAAAAAAAEj///////////8A//////////8AAAAAAAAAAP/////4zEQAAAAAAAAAtP///////////wD//////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAFz/////////////AP//////////AAAAAAAAAAAAAAAAAAAAAAAAAAiA/P////////////8A//////////8AAAAAAAAAAAAAAAAAAAAAAAAIjPj//////////////wD//////////wAAAAAAAAAAAAAAAAAAAAAAAAAAGKz/////////////AP//////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAJT///////////8A//////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAABNz//////////wD//////////wAAAAAAAAAA///////sqCAAAAAAAAAAbP//////////AP//////////AAAAAAAAAAD/////////yAAAAAAAAAAs//////////8A//////////8AAAAAAAAAAP//////////AAAAAAAAAAT//////////wD//////////wAAAAAAAAAA/////////7wAAAAAAAAAAP//////////AP//////////AAAAAAAAAAD//////+ikGAAAAAAAAAAY//////////8A//////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFT//////////wD//////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsP//////////AP//////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAADj///////////8A//////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAc6P///////////wD//////////wAAAAAAAAAAAAAAAAAAAAAAAAAATOj/////////////AP//////////AAAAAAAAAAAAAAAAAAAEIEBkkNj///////////////8A/////////////////////////////////////////////////////wD/////////////////////////////////////////////////////AP////////////////////////////////////////////////////8A/////////////////////////////////////////////////////wD/////////////////////////////////////////////////////AP////////////////////////////////////////////////////8A/////////////////////////////////////////////////////wD/////////////////////////////////////////////////////AP////////////////////////////////////////////////////8=',
+ 'width' => 40
+ ),
+ 'C' => array(
+ 'data' => 'AP////////////////////////////////////////////////////8A/////////////////////////////////////////////////////wD/////////////////////////////////////////////////////AP////////////////////////////////////////////////////8A/////////////////////////////////////////////////////wD/////////////////////////////////////////////////////AP////////////////////////////////////////////////////8A/////////////////////////////////////////////////////wD/////////////////////////////////////////////////////AP////////////////////////////////////////////////////8A/////////////////////////////////////////////////////wD/////////////////////////////////////////////////////AP//////////////////5JRULBAAAAgkTIDQ//////////////////8A////////////////1FAAAAAAAAAAAAAAAABAyP///////////////wD//////////////4gEAAAAAAAAAAAAAAAAAAAElP//////////////AP////////////9wAAAAAAAAAAAAAAAAAAAAAAAAlP////////////8A////////////kAAAAAAAAAAAAAAAAAAAAAAAAAAEyP///////////wD//////////9wIAAAAAAAAAAAAAAAAAAAAAAAAAAAw////////////AP//////////WAAAAAAAAAAAWMz/8JwQAAAAAAAAAACw//////////8A/////////+wEAAAAAAAAAID//////9QMAAAAAAAAAET//////////wD/////////nAAAAAAAAAAo/P///////3wAAAAABDBspP//////////AP////////9gAAAAAAAAAIz/////////3BxQjMT0//////////////8A/////////zQAAAAAAAAAzP///////////////////////////////wD/////////GAAAAAAAAADo////////////////////////////////AP////////8AAAAAAAAAAP////////////////////////////////8A/////////wAAAAAAAAAA/////////////////////////////////wD/////////AAAAAAAAAAD/////////////////////////////////AP////////8cAAAAAAAAAOj///////////////////////////////8A/////////zgAAAAAAAAA0P/////////kIGio7P///////////////wD/////////bAAAAAAAAACg/////////5wAAAAAMHS49P//////////AP////////+oAAAAAAAAAEz/////////PAAAAAAAAAAc//////////8A//////////QIAAAAAAAAALz//////6QAAAAAAAAAAGT//////////wD//////////3AAAAAAAAAADIzo/+SEBAAAAAAAAAAAyP//////////AP//////////7BAAAAAAAAAAAAAAAAAAAAAAAAAAAED///////////8A////////////rAAAAAAAAAAAAAAAAAAAAAAAAAAE0P///////////wD/////////////fAAAAAAAAAAAAAAAAAAAAAAAAJz/////////////AP//////////////iAQAAAAAAAAAAAAAAAAAAASY//////////////8A////////////////yEAAAAAAAAAAAAAAAAA8yP///////////////wD//////////////////9yIUCwQAAAAIEB4yP//////////////////AP////////////////////////////////////////////////////8=',
+ 'width' => 40
+ ),
+ 'D' => array(
+ 'data' => 'AP////////////////////////////////////////////////////8A/////////////////////////////////////////////////////wD/////////////////////////////////////////////////////AP////////////////////////////////////////////////////8A/////////////////////////////////////////////////////wD///////////8AAAAAAAAAAAAAAAAADChQkOT/////////////////AP///////////wAAAAAAAAAAAAAAAAAAAAAABGjw//////////////8A////////////AAAAAAAAAAAAAAAAAAAAAAAAACDY/////////////wD///////////8AAAAAAAAAAAAAAAAAAAAAAAAAABjk////////////AP///////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAED///////////8A////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAKj//////////wD///////////8AAAAAAAAAAP///+isSAAAAAAAAAAANP//////////AP///////////wAAAAAAAAAA////////hAAAAAAAAAAA2P////////8A////////////AAAAAAAAAAD/////////MAAAAAAAAACQ/////////wD///////////8AAAAAAAAAAP////////+MAAAAAAAAAFj/////////AP///////////wAAAAAAAAAA/////////8gAAAAAAAAAMP////////8A////////////AAAAAAAAAAD/////////5AAAAAAAAAAY/////////wD///////////8AAAAAAAAAAP//////////AAAAAAAAAAD/////////AP///////////wAAAAAAAAAA//////////8AAAAAAAAAAP////////8A////////////AAAAAAAAAAD//////////wAAAAAAAAAA/////////wD///////////8AAAAAAAAAAP/////////wAAAAAAAAABD/////////AP///////////wAAAAAAAAAA/////////9QAAAAAAAAAJP////////8A////////////AAAAAAAAAAD/////////qAAAAAAAAABI/////////wD///////////8AAAAAAAAAAP////////9QAAAAAAAAAHj/////////AP///////////wAAAAAAAAAA////////uAAAAAAAAAAAvP////////8A////////////AAAAAAAAAAD////w0HwEAAAAAAAAACT8/////////wD///////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAoP//////////AP///////////wAAAAAAAAAAAAAAAAAAAAAAAAAAADz8//////////8A////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAY6P///////////wD///////////8AAAAAAAAAAAAAAAAAAAAAAAAAKNz/////////////AP///////////wAAAAAAAAAAAAAAAAAAAAAACHT0//////////////8A////////////AAAAAAAAAAAAAAAAABg4bKj0/////////////////wD/////////////////////////////////////////////////////AP////////////////////////////////////////////////////8A/////////////////////////////////////////////////////wD/////////////////////////////////////////////////////AP////////////////////////////////////////////////////8A/////////////////////////////////////////////////////wD/////////////////////////////////////////////////////AP////////////////////////////////////////////////////8=',
+ 'width' => 40
+ ),
+ 'E' => array(
+ 'data' => 'AP////////////////////////////////////////////////////8A/////////////////////////////////////////////////////wD/////////////////////////////////////////////////////AP////////////////////////////////////////////////////8A/////////////////////////////////////////////////////wD/////////////////////////////////////////////////////AP////////////////////////////////////////////////////8A/////////////////////////////////////////////////////wD/////////////////////////////////////////////////////AP////////////////////////////////////////////////////8A/////////////////////////////////////////////////////wD/////////////////////////////////////////////////////AP//////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////8A//////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////////////wD//////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////AP//////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////8A//////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////////////wD//////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////AP//////////AAAAAAAAAAD///////////////////////////////8A//////////8AAAAAAAAAAP///////////////////////////////wD//////////wAAAAAAAAAA////////////////////////////////AP//////////AAAAAAAAAAD///////////////////////////////8A//////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAD//////////////wD//////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAP//////////////AP//////////AAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////////8A//////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAD//////////////wD//////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAP//////////////AP//////////AAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////////8A//////////8AAAAAAAAAAP///////////////////////////////wD//////////wAAAAAAAAAA////////////////////////////////AP//////////AAAAAAAAAAD///////////////////////////////8A//////////8AAAAAAAAAAP///////////////////////////////wD//////////wAAAAAAAAAA////////////////////////////////AP//////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////8A//////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////////////wD//////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////AP//////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////8A//////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////////////wD//////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////AP////////////////////////////////////////////////////8=',
+ 'width' => 40
+ ),
+ 'F' => array(
+ 'data' => 'AP////////////////////////////////////////////////////8A/////////////////////////////////////////////////////wD/////////////////////////////////////////////////////AP////////////////////////////////////////////////////8A/////////////////////////////////////////////////////wD/////////////////////////////////////////////////////AP////////////////////////////////////////////////////8A/////////////wAAAAAAAAAAAAAAAAAAAAAAAAAA/////////////wD/////////////AAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////AP////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAP////////////8A/////////////wAAAAAAAAAAAAAAAAAAAAAAAAAA/////////////wD/////////////AAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////AP////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAP////////////8A/////////////wAAAAAAAAAA/////////////////////////////wD/////////////AAAAAAAAAAD/////////////////////////////AP////////////8AAAAAAAAAAP////////////////////////////8A/////////////wAAAAAAAAAA/////////////////////////////wD/////////////AAAAAAAAAAAAAAAAAAAAAAAA////////////////AP////////////8AAAAAAAAAAAAAAAAAAAAAAAD///////////////8A/////////////wAAAAAAAAAAAAAAAAAAAAAAAP///////////////wD/////////////AAAAAAAAAAAAAAAAAAAAAAAA////////////////AP////////////8AAAAAAAAAAAAAAAAAAAAAAAD///////////////8A/////////////wAAAAAAAAAAAAAAAAAAAAAAAP///////////////wD/////////////AAAAAAAAAAD/////////////////////////////AP////////////8AAAAAAAAAAP////////////////////////////8A/////////////wAAAAAAAAAA/////////////////////////////wD/////////////AAAAAAAAAAD/////////////////////////////AP////////////8AAAAAAAAAAP////////////////////////////8A/////////////wAAAAAAAAAA/////////////////////////////wD/////////////AAAAAAAAAAD/////////////////////////////AP////////////8AAAAAAAAAAP////////////////////////////8A/////////////wAAAAAAAAAA/////////////////////////////wD/////////////AAAAAAAAAAD/////////////////////////////AP////////////8AAAAAAAAAAP////////////////////////////8A/////////////////////////////////////////////////////wD/////////////////////////////////////////////////////AP////////////////////////////////////////////////////8A/////////////////////////////////////////////////////wD/////////////////////////////////////////////////////AP////////////////////////////////////////////////////8=',
+ 'width' => 40
+ ),
+ 'G' => array(
+ 'data' => 'AP////////////////////////////////////////////////////8A/////////////////////////////////////////////////////wD/////////////////////////////////////////////////////AP////////////////////////////////////////////////////8A/////////////////////////////////////////////////////wD/////////////////////////////////////////////////////AP////////////////////////////////////////////////////8A/////////////////////////////////////////////////////wD//////////////////MB8TCgQAAAACCA4YJzs////////////////AP///////////////JQcAAAAAAAAAAAAAAAAAAhw8P////////////8A/////////////9gwAAAAAAAAAAAAAAAAAAAAAAAk2P///////////wD////////////EDAAAAAAAAAAAAAAAAAAAAAAAAAAc7P//////////AP//////////2AwAAAAAAAAAAAAAAAAAAAAAAAAAAABY//////////8A//////////wwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQ/////////wD/////////kAAAAAAAAAAAEHzQ/P/gmCAAAAAAAAAAAFz/////////AP////////wcAAAAAAAAACjg////////8CwAAAAAAAAgWP////////8A////////vAAAAAAAAAAI2P//////////yBRAcJjI8P///////////wD///////94AAAAAAAAAGD/////////////////////////////////AP///////0AAAAAAAAAAsP////////////////////////////////8A////////IAAAAAAAAADc/////////////////////////////////wD///////8AAAAAAAAAAP///////wAAAAAAAAAAAAAAAAD/////////AP///////wAAAAAAAAAA////////AAAAAAAAAAAAAAAAAP////////8A////////AAAAAAAAAAD///////8AAAAAAAAAAAAAAAAA/////////wD///////8gAAAAAAAAAOD//////wAAAAAAAAAAAAAAAAD/////////AP///////0AAAAAAAAAAtP//////AAAAAAAAAAAAAAAAAP////////8A////////cAAAAAAAAABw//////8AAAAAAAAAAAAAAAAA/////////wD///////+8AAAAAAAAABDs////////////AAAAAAAAAAD/////////AP////////wYAAAAAAAAADz0//////////AAAAAAAAAAAP////////8A/////////5AAAAAAAAAAACCY4P//3KhcCAAAAAAAAAAA/////////wD/////////+CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////AP//////////xAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIP////////8A////////////rAQAAAAAAAAAAAAAAAAAAAAAAAAAAGTw/////////wD/////////////vBQAAAAAAAAAAAAAAAAAAAAAADjI////////////AP//////////////8HAQAAAAAAAAAAAAAAAAAEiw//////////////8A//////////////////iwcEAgBAAABCA4aKDk/////////////////wD/////////////////////////////////////////////////////AP////////////////////////////////////////////////////8A/////////////////////////////////////////////////////wD/////////////////////////////////////////////////////AP////////////////////////////////////////////////////8=',
+ 'width' => 40
+ ),
+ 'H' => array(
+ 'data' => 'AP////////////////////////////////////////////////////8A/////////////////////////////////////////////////////wD/////////////////////////////////////////////////////AP////////////////////////////////////////////////////8A/////////////////////////////////////////////////////wD/////////////////////////////////////////////////////AP////////////////////////////////////////////////////8A/////////////////////////////////////////////////////wD/////////////////////////////////////////////////////AP////////8AAAAAAAAAAP///////////wAAAAAAAAAA//////////8A/////////wAAAAAAAAAA////////////AAAAAAAAAAD//////////wD/////////AAAAAAAAAAD///////////8AAAAAAAAAAP//////////AP////////8AAAAAAAAAAP///////////wAAAAAAAAAA//////////8A/////////wAAAAAAAAAA////////////AAAAAAAAAAD//////////wD/////////AAAAAAAAAAD///////////8AAAAAAAAAAP//////////AP////////8AAAAAAAAAAP///////////wAAAAAAAAAA//////////8A/////////wAAAAAAAAAA////////////AAAAAAAAAAD//////////wD/////////AAAAAAAAAAD///////////8AAAAAAAAAAP//////////AP////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////8A/////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//////////wD/////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//////////AP////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////8A/////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//////////wD/////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//////////AP////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////8A/////////wAAAAAAAAAA////////////AAAAAAAAAAD//////////wD/////////AAAAAAAAAAD///////////8AAAAAAAAAAP//////////AP////////8AAAAAAAAAAP///////////wAAAAAAAAAA//////////8A/////////wAAAAAAAAAA////////////AAAAAAAAAAD//////////wD/////////AAAAAAAAAAD///////////8AAAAAAAAAAP//////////AP////////8AAAAAAAAAAP///////////wAAAAAAAAAA//////////8A/////////wAAAAAAAAAA////////////AAAAAAAAAAD//////////wD/////////AAAAAAAAAAD///////////8AAAAAAAAAAP//////////AP////////8AAAAAAAAAAP///////////wAAAAAAAAAA//////////8A/////////wAAAAAAAAAA////////////AAAAAAAAAAD//////////wD/////////AAAAAAAAAAD///////////8AAAAAAAAAAP//////////AP////////////////////////////////////////////////////8A/////////////////////////////////////////////////////wD/////////////////////////////////////////////////////AP////////////////////////////////////////////////////8=',
+ 'width' => 40
+ ),
+ 'I' => array(
+ 'data' => 'AP////////////////////////////////////////////////////8A/////////////////////////////////////////////////////wD/////////////////////////////////////////////////////AP////////////////////////////////////////////////////8A/////////////////////////////////////////////////////wD/////////////AAAAAAAAAAAAAAAAAAAAAAAA////////////////AP////////////8AAAAAAAAAAAAAAAAAAAAAAAD///////////////8A/////////////wAAAAAAAAAAAAAAAAAAAAAAAP///////////////wD/////////////AAAAAAAAAAAAAAAAAAAAAAAA////////////////AP////////////8AAAAAAAAAAAAAAAAAAAAAAAD///////////////8A/////////////wAAAAAAAAAAAAAAAAAAAAAAAP///////////////wD/////////////AAAAAAAAAAAAAAAAAAAAAAAA////////////////AP///////////////////wAAAAAAAAAA//////////////////////8A////////////////////AAAAAAAAAAD//////////////////////wD///////////////////8AAAAAAAAAAP//////////////////////AP///////////////////wAAAAAAAAAA//////////////////////8A////////////////////AAAAAAAAAAD//////////////////////wD///////////////////8AAAAAAAAAAP//////////////////////AP///////////////////wAAAAAAAAAA//////////////////////8A////////////////////AAAAAAAAAAD//////////////////////wD///////////////////8AAAAAAAAAAP//////////////////////AP///////////////////wAAAAAAAAAA//////////////////////8A////////////////////AAAAAAAAAAD//////////////////////wD///////////////////8AAAAAAAAAAP//////////////////////AP///////////////////wAAAAAAAAAA//////////////////////8A////////////////////AAAAAAAAAAD//////////////////////wD///////////////////8AAAAAAAAAAP//////////////////////AP////////////8AAAAAAAAAAAAAAAAAAAAAAAD///////////////8A/////////////wAAAAAAAAAAAAAAAAAAAAAAAP///////////////wD/////////////AAAAAAAAAAAAAAAAAAAAAAAA////////////////AP////////////8AAAAAAAAAAAAAAAAAAAAAAAD///////////////8A/////////////wAAAAAAAAAAAAAAAAAAAAAAAP///////////////wD/////////////AAAAAAAAAAAAAAAAAAAAAAAA////////////////AP////////////8AAAAAAAAAAAAAAAAAAAAAAAD///////////////8A/////////////////////////////////////////////////////wD/////////////////////////////////////////////////////AP////////////////////////////////////////////////////8A/////////////////////////////////////////////////////wD/////////////////////////////////////////////////////AP////////////////////////////////////////////////////8=',
+ 'width' => 40
+ ),
+ 'J' => array(
+ 'data' => 'AP////////////////////////////////////////////////////8A/////////////////////////////////////////////////////wD/////////////////////////////////////////////////////AP///////////////////////////wAAAAAAAAAA//////////////8A////////////////////////////AAAAAAAAAAD//////////////wD///////////////////////////8AAAAAAAAAAP//////////////AP///////////////////////////wAAAAAAAAAA//////////////8A////////////////////////////AAAAAAAAAAD//////////////wD///////////////////////////8AAAAAAAAAAP//////////////AP///////////////////////////wAAAAAAAAAA//////////////8A////////////////////////////AAAAAAAAAAD//////////////wD///////////////////////////8AAAAAAAAAAP//////////////AP///////////////////////////wAAAAAAAAAA//////////////8A////////////////////////////AAAAAAAAAAD//////////////wD///////////////////////////8AAAAAAAAAAP//////////////AP///////////////////////////wAAAAAAAAAA//////////////8A////////////////////////////AAAAAAAAAAD//////////////wD///////////////////////////8AAAAAAAAAAP//////////////AP///////////////////////////wAAAAAAAAAA//////////////8A////////////////////////////AAAAAAAAAAj//////////////wD//////////+zMrIxwUDAQ//////wAAAAAAAAAIP//////////////AP//////////DAAAAAAAAADo////2AAAAAAAAAA0//////////////8A//////////8wAAAAAAAAAKj///+YAAAAAAAAAFj//////////////wD//////////2gAAAAAAAAAIND/yBgAAAAAAAAAkP//////////////AP//////////vAAAAAAAAAAAAAAAAAAAAAAAAADc//////////////8A////////////MAAAAAAAAAAAAAAAAAAAAAAAUP///////////////wD////////////EBAAAAAAAAAAAAAAAAAAAABjk////////////////AP////////////+sBAAAAAAAAAAAAAAAAAAY2P////////////////8A///////////////EMAAAAAAAAAAAAAAAVOj//////////////////wD/////////////////vHBAIAAAABg8fNT/////////////////////AP////////////////////////////////////////////////////8A/////////////////////////////////////////////////////wD/////////////////////////////////////////////////////AP////////////////////////////////////////////////////8A/////////////////////////////////////////////////////wD/////////////////////////////////////////////////////AP////////////////////////////////////////////////////8A/////////////////////////////////////////////////////wD/////////////////////////////////////////////////////AP////////////////////////////////////////////////////8=',
+ 'width' => 40
+ ),
+ 'K' => array(
+ 'data' => 'AP////////////////////////////////////////////////////8A/////////////////////////////////////////////////////wD/////////////////////////////////////////////////////AP////////////////////////////////////////////////////8A/////////////////////////////////////////////////////wD/////////////////////////////////////////////////////AP////////////////////////////////////////////////////8A/////////////////////////////////////////////////////wD/////////////////////////////////////////////////////AP////////////////////////////////////////////////////8A/////////////////////////////////////////////////////wD///////8AAAAAAAAAAP//////////wAQAAAAAAAAAAABw////////AP///////wAAAAAAAAAA/////////9AMAAAAAAAAAAAAcP////////8A////////AAAAAAAAAAD////////cGAAAAAAAAAAAAHD//////////wD///////8AAAAAAAAAAP//////6CgAAAAAAAAAAABs////////////AP///////wAAAAAAAAAA//////Q0AAAAAAAAAAAAVPz///////////8A////////AAAAAAAAAAD////8RAAAAAAAAAAAAFT8/////////////wD///////8AAAAAAAAAAP///1gAAAAAAAAAAABU/P//////////////AP///////wAAAAAAAAAA//9wAAAAAAAAAAAASPz///////////////8A////////AAAAAAAAAAD/jAAAAAAAAAAAADz0/////////////////wD///////8AAAAAAAAAAKQAAAAAAAAAAAA89P//////////////////AP///////wAAAAAAAAAABAAAAAAAAAAAFPT///////////////////8A////////AAAAAAAAAAAAAAAAAAAAAAAApP///////////////////wD///////8AAAAAAAAAAAAAAAAAAAAAAAAU8P//////////////////AP///////wAAAAAAAAAAAAAAAAAAAAAAAABk//////////////////8A////////AAAAAAAAAAAAAAAAAAAAAAAAAADE/////////////////wD///////8AAAAAAAAAAAAAAAAoEAAAAAAAACz8////////////////AP///////wAAAAAAAAAAAAAAGNiAAAAAAAAAAIj///////////////8A////////AAAAAAAAAAAAABjY//gYAAAAAAAACOD//////////////wD///////8AAAAAAAAAAAAY2P///5wAAAAAAAAASP//////////////AP///////wAAAAAAAAAAGNj//////CgAAAAAAAAAqP////////////8A////////AAAAAAAAAADI////////sAAAAAAAAAAc8P///////////wD///////8AAAAAAAAAAP//////////QAAAAAAAAABs////////////AP///////wAAAAAAAAAA///////////IAAAAAAAAAATI//////////8A////////AAAAAAAAAAD///////////9YAAAAAAAAADD8/////////wD///////8AAAAAAAAAAP///////////9wEAAAAAAAAAJD/////////AP///////wAAAAAAAAAA/////////////3AAAAAAAAAADOT///////8A////////AAAAAAAAAAD/////////////7BAAAAAAAAAAUP///////wD/////////////////////////////////////////////////////AP////////////////////////////////////////////////////8=',
+ 'width' => 40
+ ),
+ 'L' => array(
+ 'data' => 'AP////////////////////////////////////////////////////8A/////////////////////////////////////////////////////wD/////////////////////////////////////////////////////AP////////////////////////////////////////////////////8A/////////////////////////////////////////////////////wD/////////////////////////////////////////////////////AP////////////8AAAAAAAAAAP////////////////////////////8A/////////////wAAAAAAAAAA/////////////////////////////wD/////////////AAAAAAAAAAD/////////////////////////////AP////////////8AAAAAAAAAAP////////////////////////////8A/////////////wAAAAAAAAAA/////////////////////////////wD/////////////AAAAAAAAAAD/////////////////////////////AP////////////8AAAAAAAAAAP////////////////////////////8A/////////////wAAAAAAAAAA/////////////////////////////wD/////////////AAAAAAAAAAD/////////////////////////////AP////////////8AAAAAAAAAAP////////////////////////////8A/////////////wAAAAAAAAAA/////////////////////////////wD/////////////AAAAAAAAAAD/////////////////////////////AP////////////8AAAAAAAAAAP////////////////////////////8A/////////////wAAAAAAAAAA/////////////////////////////wD/////////////AAAAAAAAAAD/////////////////////////////AP////////////8AAAAAAAAAAP////////////////////////////8A/////////////wAAAAAAAAAA/////////////////////////////wD/////////////AAAAAAAAAAD/////////////////////////////AP////////////8AAAAAAAAAAP////////////////////////////8A/////////////wAAAAAAAAAA/////////////////////////////wD/////////////AAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////AP////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAP////////////8A/////////////wAAAAAAAAAAAAAAAAAAAAAAAAAA/////////////wD/////////////AAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////AP////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAP////////////8A/////////////wAAAAAAAAAAAAAAAAAAAAAAAAAA/////////////wD/////////////AAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////AP////////////////////////////////////////////////////8A/////////////////////////////////////////////////////wD/////////////////////////////////////////////////////AP////////////////////////////////////////////////////8A/////////////////////////////////////////////////////wD/////////////////////////////////////////////////////AP////////////////////////////////////////////////////8=',
+ 'width' => 40
+ ),
+ 'M' => array(
+ 'data' => 'AP////////////////////////////////////////////////////8A/////////////////////////////////////////////////////wD/////////////////////////////////////////////////////AP////////////////////////////////////////////////////8A//////8AAAAAAAAAAAAAAHz//////3wAAAAAAAAAAAAAAP///////wD//////wAAAAAAAAAAAAAATP//////UAAAAAAAAAAAAAAA////////AP//////AAAAAAAAAAAAAAAc//////8cAAAAAAAAAAAAAAD///////8A//////8AAAAAAAAAAAAAAADw////8AAAAAAAAAAAAAAAAP///////wD//////wAAAAAAAAAAAAAAALz////AAAAAAAAAAAAAAAAA////////AP//////AAAAAAAAAAAAAAAAkP///5AAAAAAAAAAAAAAAAD///////8A//////8AAAAAAAAAAAAAAABc////ZAAAAAAAAAAAAAAAAP///////wD//////wAAAAAAAAAoAAAAADD///8wAAAAACQAAAAAAAAA////////AP//////AAAAAAAAAFwAAAAABPz//AgAAAAAXAAAAAAAAAD///////8A//////8AAAAAAAAAkAAAAAAA0P/UAAAAAACQAAAAAAAAAP///////wD//////wAAAAAAAADMAAAAAACg/6gAAAAAAMQAAAAAAAAA////////AP//////AAAAAAAAAPgEAAAAAHD/dAAAAAAE+AAAAAAAAAD///////8A//////8AAAAAAAAA/zQAAAAAQP9IAAAAADD/AAAAAAAAAP///////wD//////wAAAAAAAAD/bAAAAAAQ/xQAAAAAaP8AAAAAAAAA////////AP//////AAAAAAAAAP+gAAAAAADQAAAAAACc/wAAAAAAAAD///////8A//////8AAAAAAAAA/9QAAAAAAGgAAAAAAND/AAAAAAAAAP///////wD//////wAAAAAAAAD//wwAAAAAFAAAAAAM/P8AAAAAAAAA////////AP//////AAAAAAAAAP//RAAAAAAAAAAAADz//wAAAAAAAAD///////8A//////8AAAAAAAAA//94AAAAAAAAAAAAcP//AAAAAAAAAP///////wD//////wAAAAAAAAD//7AAAAAAAAAAAACo//8AAAAAAAAA////////AP//////AAAAAAAAAP//5AAAAAAAAAAAANz//wAAAAAAAAD///////8A//////8AAAAAAAAA////HAAAAAAAAAAQ////AAAAAAAAAP///////wD//////wAAAAAAAAD///9QAAAAAAAAAEz///8AAAAAAAAA////////AP//////AAAAAAAAAP///4gAAAAAAAAAfP///wAAAAAAAAD///////8A//////8AAAAAAAAA////vAAAAAAAAACw////AAAAAAAAAP///////wD//////wAAAAAAAAD////wAAAAAAAAAOz///8AAAAAAAAA////////AP//////AAAAAAAAAP////8sAAAAAAAc/////wAAAAAAAAD///////8A/////////////////////////////////////////////////////wD/////////////////////////////////////////////////////AP////////////////////////////////////////////////////8A/////////////////////////////////////////////////////wD/////////////////////////////////////////////////////AP////////////////////////////////////////////////////8A/////////////////////////////////////////////////////wD/////////////////////////////////////////////////////AP////////////////////////////////////////////////////8=',
+ 'width' => 40
+ ),
+ 'N' => array(
+ 'data' => 'AP////////////////////////////////////////////////////8A/////////////////////////////////////////////////////wD/////////////////////////////////////////////////////AP////////////////////////////////////////////////////8A/////////////////////////////////////////////////////wD/////////////////////////////////////////////////////AP////////////////////////////////////////////////////8A/////////////////////////////////////////////////////wD/////////AAAAAAAAALD/////////////AAAAAAAAAP//////////AP////////8AAAAAAAAAFOj///////////8AAAAAAAAA//////////8A/////////wAAAAAAAAAASP///////////wAAAAAAAAD//////////wD/////////AAAAAAAAAAAAkP//////////AAAAAAAAAP//////////AP////////8AAAAAAAAAAAAI1P////////8AAAAAAAAA//////////8A/////////wAAAAAAAAAAAAAw+P///////wAAAAAAAAD//////////wD/////////AAAAAAAAAAAAAABw////////AAAAAAAAAP//////////AP////////8AAAAAAAAAAAAAAAC8//////8AAAAAAAAA//////////8A/////////wAAAAAAAAAAAAAAABzs/////wAAAAAAAAD//////////wD/////////AAAAAAAAAAAAAAAAAFD/////AAAAAAAAAP//////////AP////////8AAAAAAAAAAAAAAAAAAJz///8AAAAAAAAA//////////8A/////////wAAAAAAAAAUAAAAAAAADNz//wAAAAAAAAD//////////wD/////////AAAAAAAAALQAAAAAAAAANPz/AAAAAAAAAP//////////AP////////8AAAAAAAAA/2wAAAAAAAAAfP8AAAAAAAAA//////////8A/////////wAAAAAAAAD/+CwAAAAAAAAExAAAAAAAAAD//////////wD/////////AAAAAAAAAP//0AQAAAAAAAAgAAAAAAAAAP//////////AP////////8AAAAAAAAA////jAAAAAAAAAAAAAAAAAAA//////////8A/////////wAAAAAAAAD/////RAAAAAAAAAAAAAAAAAD//////////wD/////////AAAAAAAAAP/////kFAAAAAAAAAAAAAAAAP//////////AP////////8AAAAAAAAA//////+sAAAAAAAAAAAAAAAA//////////8A/////////wAAAAAAAAD///////9kAAAAAAAAAAAAAAD//////////wD/////////AAAAAAAAAP////////QkAAAAAAAAAAAAAP//////////AP////////8AAAAAAAAA/////////8wEAAAAAAAAAAAA//////////8A/////////wAAAAAAAAD//////////4QAAAAAAAAAAAD//////////wD/////////AAAAAAAAAP///////////DwAAAAAAAAAAP//////////AP////////8AAAAAAAAA////////////4BAAAAAAAAAA//////////8A/////////wAAAAAAAAD/////////////qAAAAAAAAAD//////////wD/////////////////////////////////////////////////////AP////////////////////////////////////////////////////8A/////////////////////////////////////////////////////wD/////////////////////////////////////////////////////AP////////////////////////////////////////////////////8=',
+ 'width' => 40
+ ),
+ 'O' => array(
+ 'data' => 'AP////////////////////////////////////////////////////8A/////////////////////////////////////////////////////wD/////////////////////////////////////////////////////AP////////////////////////////////////////////////////8A/////////////////////////////////////////////////////wD/////////////////////////////////////////////////////AP////////////////////////////////////////////////////8A///////////////////0qGw4HAAAABw4aKT0/////////////////wD////////////////wcAwAAAAAAAAAAAAAAAho6P//////////////AP//////////////uBQAAAAAAAAAAAAAAAAAAAAMoP////////////8A/////////////6AEAAAAAAAAAAAAAAAAAAAAAAAAkP///////////wD///////////+4BAAAAAAAAAAAAAAAAAAAAAAAAAAAoP//////////AP//////////8BQAAAAAAAAAAAAAAAAAAAAAAAAAAAAM5P////////8A//////////9wAAAAAAAAAAAsrPD/7KQsAAAAAAAAAABg/////////wD/////////+BAAAAAAAAAAUPj///////hQAAAAAAAAAAjs////////AP////////+sAAAAAAAAABDw//////////AYAAAAAAAAAKD///////8A/////////2wAAAAAAAAAdP///////////3wAAAAAAAAAYP///////wD/////////OAAAAAAAAAC4////////////xAAAAAAAAAAw////////AP////////8cAAAAAAAAAOD////////////oAAAAAAAAABT///////8A/////////wAAAAAAAAAA//////////////8AAAAAAAAAAP///////wD/////////AAAAAAAAAAD//////////////wAAAAAAAAAA////////AP////////8AAAAAAAAAAP/////////////8AAAAAAAAAAD///////8A/////////xwAAAAAAAAA5P///////////+AAAAAAAAAAHP///////wD/////////NAAAAAAAAAC8////////////uAAAAAAAAAA4////////AP////////9oAAAAAAAAAHj///////////98AAAAAAAAAGT///////8A/////////6gAAAAAAAAAGPD/////////+BgAAAAAAAAApP///////wD/////////9AwAAAAAAAAAUPz///////xcAAAAAAAAAAjs////////AP//////////cAAAAAAAAAAALKjs//CwOAAAAAAAAAAAYP////////8A///////////wFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAzk/////////wD///////////+4BAAAAAAAAAAAAAAAAAAAAAAAAAAAoP//////////AP////////////+QAAAAAAAAAAAAAAAAAAAAAAAAAJD///////////8A//////////////+sEAAAAAAAAAAAAAAAAAAAAAyg/////////////wD////////////////oZAgAAAAAAAAAAAAAAARg4P//////////////AP//////////////////9KhsOCAAAAAUMFyc7P////////////////8A/////////////////////////////////////////////////////wD/////////////////////////////////////////////////////AP////////////////////////////////////////////////////8A/////////////////////////////////////////////////////wD/////////////////////////////////////////////////////AP////////////////////////////////////////////////////8=',
+ 'width' => 40
+ ),
+ 'P' => array(
+ 'data' => 'AP////////////////////////////////////////////////////8A/////////////////////////////////////////////////////wD/////////////////////////////////////////////////////AP///////////wAAAAAAAAAAAAAAAAAACCxguP////////////////8A////////////AAAAAAAAAAAAAAAAAAAAAAAAOOD//////////////wD///////////8AAAAAAAAAAAAAAAAAAAAAAAAAGOD/////////////AP///////////wAAAAAAAAAAAAAAAAAAAAAAAAAARP////////////8A////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAxP///////////wD///////////8AAAAAAAAAAAAAAAAAAAAAAAAAAABo////////////AP///////////wAAAAAAAAAA////6JwMAAAAAAAAADD///////////8A////////////AAAAAAAAAAD//////6AAAAAAAAAADP///////////wD///////////8AAAAAAAAAAP//////9AAAAAAAAAAA////////////AP///////////wAAAAAAAAAA///////0AAAAAAAAAAD///////////8A////////////AAAAAAAAAAD//////5gAAAAAAAAAHP///////////wD///////////8AAAAAAAAAAP///9iICAAAAAAAAABI////////////AP///////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAJD///////////8A////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAI6P///////////wD///////////8AAAAAAAAAAAAAAAAAAAAAAAAAAIT/////////////AP///////////wAAAAAAAAAAAAAAAAAAAAAAAABU/P////////////8A////////////AAAAAAAAAAAAAAAAAAAAAAAIhPz//////////////wD///////////8AAAAAAAAAAAAAAAAABCRMkOz/////////////////AP///////////wAAAAAAAAAA//////////////////////////////8A////////////AAAAAAAAAAD//////////////////////////////wD///////////8AAAAAAAAAAP//////////////////////////////AP///////////wAAAAAAAAAA//////////////////////////////8A////////////AAAAAAAAAAD//////////////////////////////wD///////////8AAAAAAAAAAP//////////////////////////////AP///////////wAAAAAAAAAA//////////////////////////////8A////////////AAAAAAAAAAD//////////////////////////////wD///////////8AAAAAAAAAAP//////////////////////////////AP////////////////////////////////////////////////////8A/////////////////////////////////////////////////////wD/////////////////////////////////////////////////////AP////////////////////////////////////////////////////8A/////////////////////////////////////////////////////wD/////////////////////////////////////////////////////AP////////////////////////////////////////////////////8A/////////////////////////////////////////////////////wD/////////////////////////////////////////////////////AP////////////////////////////////////////////////////8=',
+ 'width' => 40
+ ),
+ 'Q' => array(
+ 'data' => 'AP////////////////////////////////////////////////////8A/////////////////////////////////////////////////////wD/////////////////////////////////////////////////////AP////////////////////////////////////////////////////8A/////////////////////////////////////////////////////wD/////////////////////////////////////////////////////AP////////////////SoaDQcAAAAHDhoqPT///////////////////8A//////////////BwDAAAAAAAAAAAAAAACHDo/////////////////wD///////////+4FAAAAAAAAAAAAAAAAAAAABCo////////////////AP//////////nAQAAAAAAAAAAAAAAAAAAAAAAACQ//////////////8A/////////7gEAAAAAAAAAAAAAAAAAAAAAAAAAACg/////////////wD////////wFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAzo////////////AP///////3AAAAAAAAAAACyo8P/sqCwAAAAAAAAAAGT///////////8A///////4EAAAAAAAAABM+P///////FQAAAAAAAAACPT//////////wD//////7AAAAAAAAAAFPD/////////9BgAAAAAAAAApP//////////AP//////bAAAAAAAAAB4////////////fAAAAAAAAABk//////////8A//////84AAAAAAAAALz///////////+8AAAAAAAAADT//////////wD//////xwAAAAAAAAA6P///////////+QAAAAAAAAAHP//////////AP//////AAAAAAAAAAD//////////////wAAAAAAAAAA//////////8A//////8AAAAAAAAAAP//////////////AAAAAAAAAAD//////////wD//////wAAAAAAAAAA/P////////////8AAAAAAAAAAP//////////AP//////GAAAAAAAAADg////////////4AAAAAAAAAAc//////////8A//////84AAAAAAAAALT////MJHTo//+8AAAAAAAAADT//////////wD//////2wAAAAAAAAAdP///2AAABCg/3wAAAAAAAAAZP//////////AP//////rAAAAAAAAAAY9P/sCAAAAABMGAAAAAAAAACk//////////8A///////4EAAAAAAAAABU/P+0OAAAAAAAAAAAAAAACPT//////////wD///////94AAAAAAAAAAA4sPD/gAAAAAAAAAAAAABk////////////AP////////AcAAAAAAAAAAAAAAAAAAAAAAAAAAAADOT///////////8A/////////7wEAAAAAAAAAAAAAAAAAAAAAAAAAACQ/////////////wD//////////6wEAAAAAAAAAAAAAAAAAAAAAAAAABSs////////////AP///////////7gUAAAAAAAAAAAAAAAAAAAAAAAAAABAwP////////8A//////////////BwDAAAAAAAAAAAAAAABAgAAAAAAAA8/////////wD////////////////0qGg0GAAAABgwXJjkxBgAAAAAALD/////////AP//////////////////////////////////5DQAAAAk/P////////8A////////////////////////////////////+GwAAJD//////////wD//////////////////////////////////////8A49P//////////AP////////////////////////////////////////////////////8A/////////////////////////////////////////////////////wD/////////////////////////////////////////////////////AP////////////////////////////////////////////////////8=',
+ 'width' => 40
+ ),
+ 'R' => array(
+ 'data' => 'AP////////////////////////////////////////////////////8A/////////////////////////////////////////////////////wD/////////////////////////////////////////////////////AP////////////////////////////////////////////////////8A/////////wAAAAAAAAAAAAAAAAAAAAQgOGSk+P///////////////wD/////////AAAAAAAAAAAAAAAAAAAAAAAAAAAcuP//////////////AP////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAEsP////////////8A/////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQ6P///////////wD/////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8////////////AP////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAADD///////////8A/////////wAAAAAAAAAA///////svDgAAAAAAAAACP///////////wD/////////AAAAAAAAAAD/////////7AAAAAAAAAAA////////////AP////////8AAAAAAAAAAP/////////cAAAAAAAAABD///////////8A/////////wAAAAAAAAAA//////DQoCQAAAAAAAAAQP///////////wD/////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAACU////////////AP////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAIPj///////////8A/////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAzU/////////////wD/////////AAAAAAAAAAAAAAAAAAAAAAAAAAA02P//////////////AP////////8AAAAAAAAAAAAAAAAAAAAAAAxctPz///////////////8A/////////wAAAAAAAAAAAAAAAAAAAAAAAEDY/////////////////wD/////////AAAAAAAAAAD/9LAsAAAAAAAAAAzc////////////////AP////////8AAAAAAAAAAP///+wkAAAAAAAAADD8//////////////8A/////////wAAAAAAAAAA/////8QAAAAAAAAAAJD//////////////wD/////////AAAAAAAAAAD//////1QAAAAAAAAAFPD/////////////AP////////8AAAAAAAAAAP//////3AQAAAAAAAAAgP////////////8A/////////wAAAAAAAAAA////////aAAAAAAAAAAM6P///////////wD/////////AAAAAAAAAAD////////oCAAAAAAAAABs////////////AP////////8AAAAAAAAAAP////////+AAAAAAAAAAATc//////////8A/////////wAAAAAAAAAA//////////AUAAAAAAAAAFj//////////wD/////////AAAAAAAAAAD//////////5AAAAAAAAAAAND/////////AP////////8AAAAAAAAAAP//////////+CQAAAAAAAAAQP////////8A/////////////////////////////////////////////////////wD/////////////////////////////////////////////////////AP////////////////////////////////////////////////////8A/////////////////////////////////////////////////////wD/////////////////////////////////////////////////////AP////////////////////////////////////////////////////8A/////////////////////////////////////////////////////wD/////////////////////////////////////////////////////AP////////////////////////////////////////////////////8=',
+ 'width' => 40
+ ),
+ 'S' => array(
+ 'data' => 'AP////////////////////////////////////////////////////8A/////////////////////////////////////////////////////wD/////////////////////////////////////////////////////AP////////////////////////////////////////////////////8A/////////////////////////////////////////////////////wD/////////////////////////////////////////////////////AP////////////////////////////////////////////////////8A/////////////////////////////////////////////////////wD/////////////////////////////////////////////////////AP/////////////////8vHBEIAgAAAQgQHC8/P////////////////8A////////////////pCQAAAAAAAAAAAAAAAAcoP///////////////wD//////////////FwAAAAAAAAAAAAAAAAAAAAAXP//////////////AP////////////9oAAAAAAAAAAAAAAAAAAAAAAAAhP////////////8A////////////zAAAAAAAAAAAAAAAAAAAAAAAAAAI6P///////////wD///////////9cAAAAAAAAAAAAAAAAAAAAAAAAAACA////////////AP///////////xgAAAAAAAAAUOD/8KwkAAAAAAAAADj///////////8A////////////AAAAAAAAAAD0/////8wABCAgICxASP///////////wD///////////8MAAAAAAAAAMz/////////////////////////////AP///////////0AAAAAAAAAACFiQxPT///////////////////////8A////////////oAAAAAAAAAAAAAAAADBwtPT//////////////////wD////////////8QAAAAAAAAAAAAAAAAAAACFTA////////////////AP/////////////oOAAAAAAAAAAAAAAAAAAAAABM6P////////////8A///////////////4fAgAAAAAAAAAAAAAAAAAAAAY2P///////////wD/////////////////7IwwAAAAAAAAAAAAAAAAAAAo+P//////////AP/////////////////////koGw0BAAAAAAAAAAAAACU//////////8A///////////////////////////4uFgAAAAAAAAAADz//////////wD//////////2BgSEA0IBwA6P///////5QAAAAAAAAADP//////////AP//////////JAAAAAAAAACc/////////AAAAAAAAAAA//////////8A//////////9YAAAAAAAAACDo///////AAAAAAAAAABT//////////wD//////////6QAAAAAAAAAACCk7P/snBQAAAAAAAAAUP//////////AP//////////+BAAAAAAAAAAAAAAAAAAAAAAAAAAAACs//////////8A////////////kAAAAAAAAAAAAAAAAAAAAAAAAAAAOP///////////wD////////////8RAAAAAAAAAAAAAAAAAAAAAAAABjc////////////AP/////////////0PAAAAAAAAAAAAAAAAAAAAAAg2P////////////8A///////////////8hBQAAAAAAAAAAAAAAAAMdPT//////////////wD/////////////////+LRwSCAMAAAAHDhoqPT/////////////////AP////////////////////////////////////////////////////8A/////////////////////////////////////////////////////wD/////////////////////////////////////////////////////AP////////////////////////////////////////////////////8=',
+ 'width' => 40
+ ),
+ 'T' => array(
+ 'data' => 'AP////////////////////////////////////////////////////8A/////////////////////////////////////////////////////wD/////////////////////////////////////////////////////AP////////////////////////////////////////////////////8A/////////////////////////////////////////////////////wD/////////////////////////////////////////////////////AP////////////////////////////////////////////////////8A/////////////////////////////////////////////////////wD/////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////AP////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////8A/////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////////wD/////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////AP////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////8A/////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////////wD///////////////////8AAAAAAAAAAP//////////////////////AP///////////////////wAAAAAAAAAA//////////////////////8A////////////////////AAAAAAAAAAD//////////////////////wD///////////////////8AAAAAAAAAAP//////////////////////AP///////////////////wAAAAAAAAAA//////////////////////8A////////////////////AAAAAAAAAAD//////////////////////wD///////////////////8AAAAAAAAAAP//////////////////////AP///////////////////wAAAAAAAAAA//////////////////////8A////////////////////AAAAAAAAAAD//////////////////////wD///////////////////8AAAAAAAAAAP//////////////////////AP///////////////////wAAAAAAAAAA//////////////////////8A////////////////////AAAAAAAAAAD//////////////////////wD///////////////////8AAAAAAAAAAP//////////////////////AP///////////////////wAAAAAAAAAA//////////////////////8A////////////////////AAAAAAAAAAD//////////////////////wD///////////////////8AAAAAAAAAAP//////////////////////AP///////////////////wAAAAAAAAAA//////////////////////8A////////////////////AAAAAAAAAAD//////////////////////wD///////////////////8AAAAAAAAAAP//////////////////////AP///////////////////wAAAAAAAAAA//////////////////////8A////////////////////AAAAAAAAAAD//////////////////////wD/////////////////////////////////////////////////////AP////////////////////////////////////////////////////8A/////////////////////////////////////////////////////wD/////////////////////////////////////////////////////AP////////////////////////////////////////////////////8=',
+ 'width' => 40
+ ),
+ 'U' => array(
+ 'data' => 'AP////////////////////////////////////////////////////8A/////////////////////////////////////////////////////wD/////////////////////////////////////////////////////AP////////8AAAAAAAAAAP///////////wAAAAAAAAAA//////////8A/////////wAAAAAAAAAA////////////AAAAAAAAAAD//////////wD/////////AAAAAAAAAAD///////////8AAAAAAAAAAP//////////AP////////8AAAAAAAAAAP///////////wAAAAAAAAAA//////////8A/////////wAAAAAAAAAA////////////AAAAAAAAAAD//////////wD/////////AAAAAAAAAAD///////////8AAAAAAAAAAP//////////AP////////8AAAAAAAAAAP///////////wAAAAAAAAAA//////////8A/////////wAAAAAAAAAA////////////AAAAAAAAAAD//////////wD/////////AAAAAAAAAAD///////////8AAAAAAAAAAP//////////AP////////8AAAAAAAAAAP///////////wAAAAAAAAAA//////////8A/////////wAAAAAAAAAA////////////AAAAAAAAAAD//////////wD/////////AAAAAAAAAAD///////////8AAAAAAAAAAP//////////AP////////8AAAAAAAAAAP///////////wAAAAAAAAAA//////////8A/////////wAAAAAAAAAA////////////AAAAAAAAAAD//////////wD/////////AAAAAAAAAAD///////////8AAAAAAAAAAP//////////AP////////8AAAAAAAAAAP///////////wAAAAAAAAAA//////////8A/////////wAAAAAAAAAA////////////AAAAAAAAAAD//////////wD/////////JAAAAAAAAADk/////////+gAAAAAAAAAHP//////////AP////////9MAAAAAAAAAJz/////////nAAAAAAAAABE//////////8A/////////4gAAAAAAAAAHOj//////+ggAAAAAAAAAHz//////////wD/////////0AAAAAAAAAAAIJzs/+ykIAAAAAAAAAAA0P//////////AP//////////QAAAAAAAAAAAAAAAAAAAAAAAAAAAAED///////////8A///////////IBAAAAAAAAAAAAAAAAAAAAAAAAAAE0P///////////wD///////////+YAAAAAAAAAAAAAAAAAAAAAAAAAJj/////////////AP////////////+UBAAAAAAAAAAAAAAAAAAAAASU//////////////8A///////////////IPAAAAAAAAAAAAAAAAAAwyP///////////////wD/////////////////0IxYOCAIAAAEIEiAyP//////////////////AP////////////////////////////////////////////////////8A/////////////////////////////////////////////////////wD/////////////////////////////////////////////////////AP////////////////////////////////////////////////////8A/////////////////////////////////////////////////////wD/////////////////////////////////////////////////////AP////////////////////////////////////////////////////8A/////////////////////////////////////////////////////wD/////////////////////////////////////////////////////AP////////////////////////////////////////////////////8=',
+ 'width' => 40
+ ),
+ 'V' => array(
+ 'data' => 'AP////////////////////////////////////////////////////8A/////////////////////////////////////////////////////wD/////////////////////////////////////////////////////AP////////////////////////////////////////////////////8A/////////////////////////////////////////////////////wD/////////////////////////////////////////////////////AP////////////////////////////////////////////////////8A/////////////////////////////////////////////////////wD/////////////////////////////////////////////////////AP////////////////////////////////////////////////////8A/////////////////////////////////////////////////////wD//////zAAAAAAAAAAYP//////////////ZAAAAAAAAAAw////////AP//////kAAAAAAAAAAU/P////////////8UAAAAAAAAAJD///////8A///////oBAAAAAAAAADE////////////xAAAAAAAAAAE7P///////wD///////9MAAAAAAAAAHD///////////94AAAAAAAAAEz/////////AP///////6gAAAAAAAAAJP///////////yQAAAAAAAAArP////////8A////////+BAAAAAAAAAA1P/////////YAAAAAAAAABT4/////////wD/////////aAAAAAAAAACE/////////4QAAAAAAAAAbP//////////AP/////////EAAAAAAAAADT/////////OAAAAAAAAADM//////////8A//////////8kAAAAAAAAAOT//////+QAAAAAAAAAKP///////////wD//////////4QAAAAAAAAAmP//////nAAAAAAAAACI////////////AP//////////5AAAAAAAAABE//////9EAAAAAAAABOT///////////8A////////////QAAAAAAAAAT0////9AgAAAAAAABI/////////////wD///////////+gAAAAAAAAAKT///+kAAAAAAAAAKj/////////////AP////////////QIAAAAAAAAXP///1wAAAAAAAAM+P////////////8A/////////////1wAAAAAAAAM+P/8DAAAAAAAAGT//////////////wD/////////////vAAAAAAAAAC8/7wAAAAAAAAAxP//////////////AP//////////////HAAAAAAAAGj/aAAAAAAAACT///////////////8A//////////////94AAAAAAAAHP8cAAAAAAAAhP///////////////wD//////////////9gAAAAAAAAAkAAAAAAAAADk////////////////AP///////////////zgAAAAAAAAQAAAAAAAAQP////////////////8A////////////////lAAAAAAAAAAAAAAAAACg/////////////////wD////////////////sCAAAAAAAAAAAAAAADPT/////////////////AP////////////////9QAAAAAAAAAAAAAABg//////////////////8A/////////////////7AAAAAAAAAAAAAAAMD//////////////////wD//////////////////BQAAAAAAAAAAAAc////////////////////AP//////////////////cAAAAAAAAAAAAHz///////////////////8A///////////////////MAAAAAAAAAAAA3P///////////////////wD/////////////////////////////////////////////////////AP////////////////////////////////////////////////////8=',
+ 'width' => 40
+ ),
+ 'W' => array(
+ 'data' => 'AP////////////////////////////////////////////////////8A/////////////////////////////////////////////////////wD/////////////////////////////////////////////////////AP////////////////////////////////////////////////////8A/////////////////////////////////////////////////////wD/////////////////////////////////////////////////////AP////////////////////////////////////////////////////8A/////////////////////////////////////////////////////wD/////////////////////////////////////////////////////AP////////////////////////////////////////////////////8A//8cAAAAAAAAALz/////4AAAAAAAAAAA6P////+8AAAAAAAAABz//wD//1QAAAAAAAAAjP////+gAAAAAAAAAACo/////4wAAAAAAAAAUP//AP//jAAAAAAAAABU/////2AAAAAAAAAAAGj/////VAAAAAAAAACM//8A///EAAAAAAAAACT/////IAAAAAAAAAAAKP////8kAAAAAAAAAMT//wD///gEAAAAAAAAAPD//+AAAAAAAAAAAAAA6P//8AAAAAAAAAAE9P//AP///zAAAAAAAAAAvP//oAAAAAAAAAAAAACo//+8AAAAAAAAADD///8A////bAAAAAAAAACM//9gAAAAAAAAAAAAAGT//4wAAAAAAAAAaP///wD///+kAAAAAAAAAFT//yAAAAAAAAAAAAAAIP//VAAAAAAAAACc////AP///9gAAAAAAAAAJP/gAAAAAAAAAAAAAAAA4P8kAAAAAAAAANT///8A/////xAAAAAAAAAA8KAAAAAAAAAAAAAAAACg8AAAAAAAAAAQ/////wD/////TAAAAAAAAAC8YAAAAAAAAAAAAAAAAGC8AAAAAAAAAET/////AP////+AAAAAAAAAAIwgAAAAAAAAAAAAAAAAIIwAAAAAAAAAfP////8A/////7gAAAAAAAAANAAAAAAAACwwAAAAAAAANAAAAAAAAACw/////wD/////8AAAAAAAAAAAAAAAAAAAdHgAAAAAAAAAAAAAAAAAAOz/////AP//////KAAAAAAAAAAAAAAAAAC4vAAAAAAAAAAAAAAAAAAg//////8A//////9gAAAAAAAAAAAAAAAACPj4CAAAAAAAAAAAAAAAAFj//////wD//////5QAAAAAAAAAAAAAAABE//9IAAAAAAAAAAAAAAAAkP//////AP//////0AAAAAAAAAAAAAAAAIj//4wAAAAAAAAAAAAAAADI//////8A///////8DAAAAAAAAAAAAAAAzP//1AAAAAAAAAAAAAAABPj//////wD///////88AAAAAAAAAAAAABT/////GAAAAAAAAAAAAAA0////////AP///////3QAAAAAAAAAAAAAWP////9gAAAAAAAAAAAAAHD///////8A////////sAAAAAAAAAAAAACg/////6QAAAAAAAAAAAAApP///////wD////////kAAAAAAAAAAAAAOT/////6AAAAAAAAAAAAADc////////AP////////8cAAAAAAAAAAAo////////MAAAAAAAAAAAEP////////8A/////////1QAAAAAAAAAAHD///////94AAAAAAAAAABM/////////wD/////////jAAAAAAAAAAAtP///////7wAAAAAAAAAAID/////////AP/////////EAAAAAAAAAAT0////////+AgAAAAAAAAAuP////////8A/////////////////////////////////////////////////////wD/////////////////////////////////////////////////////AP////////////////////////////////////////////////////8=',
+ 'width' => 40
+ ),
+ 'X' => array(
+ 'data' => 'AP////////////////////////////////////////////////////8A/////////////////////////////////////////////////////wD/////////////////////////////////////////////////////AP////////////////////////////////////////////////////8A/////////////////////////////////////////////////////wD/////////////////////////////////////////////////////AP////////////////////////////////////////////////////8A/////////////////////////////////////////////////////wD///////9UAAAAAAAAAKz///////////+sAAAAAAAAAFD/////////AP///////+QQAAAAAAAAFOT/////////8BwAAAAAAAAM5P////////8A/////////5gAAAAAAAAATP////////9kAAAAAAAAAJD//////////wD//////////0AAAAAAAAAAoP//////wAAAAAAAAAA0/P//////////AP//////////2AgAAAAAAAAQ4P////gkAAAAAAAABMz///////////8A////////////iAAAAAAAAABA////dAAAAAAAAABw/////////////wD////////////8MAAAAAAAAACU/9AEAAAAAAAAHPD/////////////AP/////////////IBAAAAAAAAAzYMAAAAAAAAACs//////////////8A//////////////90AAAAAAAAABAAAAAAAAAATP///////////////wD///////////////QgAAAAAAAAAAAAAAAAAAzg////////////////AP///////////////7wAAAAAAAAAAAAAAAAAjP////////////////8A/////////////////2AAAAAAAAAAAAAAADD8/////////////////wD/////////////////7BQAAAAAAAAAAAAEyP//////////////////AP/////////////////gDAAAAAAAAAAAAAjY//////////////////8A/////////////////0AAAAAAAAAAAAAAADj8/////////////////wD///////////////+UAAAAAAAAAAAAAAAAAJD/////////////////AP//////////////4AwAAAAAAAAAAAAAAAAADOD///////////////8A//////////////9AAAAAAAAAAAAAAAAAAAAAQP///////////////wD/////////////nAAAAAAAAAAAWAAAAAAAAAAAlP//////////////AP///////////+QQAAAAAAAAAGD/YAAAAAAAAAAM4P////////////8A////////////TAAAAAAAAAAs9P/0LAAAAAAAAABM/////////////wD//////////6AAAAAAAAAADNT////UDAAAAAAAAACg////////////AP/////////kEAAAAAAAAACg//////+gAAAAAAAAABDk//////////8A/////////0wAAAAAAAAAYP////////9gAAAAAAAAAEz//////////wD///////+oAAAAAAAAACz0//////////QsAAAAAAAAAKT/////////AP//////7BQAAAAAAAAM1P///////////9QMAAAAAAAAFOz///////8A//////9UAAAAAAAAAKD//////////////6AAAAAAAAAAVP///////wD/////////////////////////////////////////////////////AP////////////////////////////////////////////////////8A/////////////////////////////////////////////////////wD/////////////////////////////////////////////////////AP////////////////////////////////////////////////////8=',
+ 'width' => 40
+ ),
+ 'Y' => array(
+ 'data' => 'AP////////////////////////////////////////////////////8A/////////////////////////////////////////////////////wD/////////////////////////////////////////////////////AP////////////////////////////////////////////////////8A/////////////////////////////////////////////////////wD/////////////////////////////////////////////////////AP///////1QAAAAAAAAAAGj//////////2gAAAAAAAAAAFT///////8A////////5BAAAAAAAAAAAMT////////EAAAAAAAAAAAQ5P///////wD/////////mAAAAAAAAAAAKPj/////+CgAAAAAAAAAAJj/////////AP//////////PAAAAAAAAAAAgP////+AAAAAAAAAAAA8//////////8A///////////YCAAAAAAAAAAE2P//2AQAAAAAAAAACNj//////////wD///////////+AAAAAAAAAAAA4//84AAAAAAAAAACA////////////AP////////////woAAAAAAAAAACUlAAAAAAAAAAAKPz///////////8A/////////////8gAAAAAAAAAABAQAAAAAAAAAADI/////////////wD//////////////2wAAAAAAAAAAAAAAAAAAAAAbP//////////////AP//////////////8BwAAAAAAAAAAAAAAAAAABzw//////////////8A////////////////tAAAAAAAAAAAAAAAAAAAtP///////////////wD/////////////////VAAAAAAAAAAAAAAAAFT/////////////////AP/////////////////oEAAAAAAAAAAAAAAQ6P////////////////8A//////////////////+cAAAAAAAAAAAAAJz//////////////////wD///////////////////9AAAAAAAAAAABA////////////////////AP///////////////////9gAAAAAAAAAANj///////////////////8A/////////////////////wAAAAAAAAAA/////////////////////wD/////////////////////AAAAAAAAAAD/////////////////////AP////////////////////8AAAAAAAAAAP////////////////////8A/////////////////////wAAAAAAAAAA/////////////////////wD/////////////////////AAAAAAAAAAD/////////////////////AP////////////////////8AAAAAAAAAAP////////////////////8A/////////////////////wAAAAAAAAAA/////////////////////wD/////////////////////AAAAAAAAAAD/////////////////////AP////////////////////8AAAAAAAAAAP////////////////////8A/////////////////////wAAAAAAAAAA/////////////////////wD/////////////////////AAAAAAAAAAD/////////////////////AP////////////////////////////////////////////////////8A/////////////////////////////////////////////////////wD/////////////////////////////////////////////////////AP////////////////////////////////////////////////////8A/////////////////////////////////////////////////////wD/////////////////////////////////////////////////////AP////////////////////////////////////////////////////8=',
+ 'width' => 40
+ ),
+ 'Z' => array(
+ 'data' => 'AP////////////////////////////////////////////////////8A/////////////////////////////////////////////////////wD/////////////////////////////////////////////////////AP////////////////////////////////////////////////////8A/////////////////////////////////////////////////////wD/////////////////////////////////////////////////////AP////////////////////////////////////////////////////8A//////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAD//////////////wD//////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAP//////////////AP//////////AAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////////8A//////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAD//////////////wD//////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAP//////////////AP//////////AAAAAAAAAAAAAAAAAAAAAAAAAAAQ//////////////8A/////////////////////////1AAAAAAAAAABLz//////////////wD///////////////////////98AAAAAAAAAACY////////////////AP//////////////////////pAAAAAAAAAAAaP////////////////8A/////////////////////8QIAAAAAAAAAET8/////////////////wD////////////////////gGAAAAAAAAAAo9P//////////////////AP//////////////////9CwAAAAAAAAAFNz///////////////////8A//////////////////xMAAAAAAAAAATA/////////////////////wD/////////////////eAAAAAAAAAAAnP//////////////////////AP///////////////5wAAAAAAAAAAHT///////////////////////8A///////////////ABAAAAAAAAABM/P///////////////////////wD/////////////3BQAAAAAAAAALPT/////////////////////////AP////////////QoAAAAAAAAABjg//////////////////////////8A///////////8SAAAAAAAAAAExP///////////////////////////wD//////////2wAAAAAAAAAAKD/////////////////////////////AP////////+YAAAAAAAAAAB8//////////////////////////////8A/////////wQAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////////////wD/////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////AP////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////8A/////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////////////wD/////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////AP////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////8A/////////////////////////////////////////////////////wD/////////////////////////////////////////////////////AP////////////////////////////////////////////////////8A/////////////////////////////////////////////////////wD/////////////////////////////////////////////////////AP////////////////////////////////////////////////////8=',
+ 'width' => 40
+ ),
+ );
+
+ return $_png;
+ }
+
+ // These define base64_encoded raw png image data used
+ // when we cannot generate our own single png image
+ function define_raw_pngs()
+ {
+ $_png = array(
+ '0' => 'iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAAAAACpleexAAAAFXRFWHRDcmVhdGlvbiBUaW1lAAfTBQ4QKCNGXKO6AAAAB3RJTUUH0wUOEDQ6EUG1VwAAAAlwSFlzAAALEgAACxIB0t1+/AAAAXNJREFUeNpj/M9AHGAiUt2wVvhyaqAqKyOjpG3jQwaGv+e+IUn9RwJfSjjg4iwFP1aKJD6HyyErfGGAYrquIoP5E2wK/zigu0v5wH9sChdgeKDqP1aFGhBZmxv/z0Dd4IxV4RWIpMQHIPuJAITzAqEQETx7IFQIP5CQNoJwDmALxzMQCuyjg1chnBPYwtECwr8AZN41h0p6YHOjAkTuwf//77wYuCEcFWwKOWA2fM1iZuuHcASwKYQ55c9ENuasrxgRjKlwJS+D17v/hBUeUGYwv/sfn0IRiJQZJIbxuFEFagjvSlDUQNgK2GIGqpC1JRhIfoAqxBYz0DRhn8IMJO+giKEqhMaMJBeI3AHhIKdkRPqG8DlAifqFADyasKRHO6h1Z/6fMYEwTbCmx3cWGCl8CTaFwBhGz+M2/7EpXMvOnBmIok7jBVaFz/Mi3/1pQORrhpgPyOr+M8IL0j9/gKpeLjhy5QEwoDVsYuRR3cE4IktcAJNx8cJaZBeQAAAAAElFTkSuQmCC',
+ '1' => 'iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAAAAACpleexAAAAFXRFWHRDcmVhdGlvbiBUaW1lAAfTBQ4QMi//xxVKAAAAB3RJTUUH0wUOEDYLcqnX7wAAAAlwSFlzAAALEgAACxIB0t1+/AAAAHpJREFUeNpj/M9AHGAiUh1WhR8FGUGAsMKaD9iM/I8BlmCVwVS4hoUohT8qcNiFyv2zQIWBCIV3amRwu54RKcDRAgQ1KigIcJYK7CqR3QsCFmf+Y8qgeQakbANMAz6FKjUXECbj8zWa76nm61GFw1UhI10KqVGFNFQIADdK9Zj7PsV9AAAAAElFTkSuQmCC',
+ '2' => 'iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAAAAACpleexAAAAFXRFWHRDcmVhdGlvbiBUaW1lAAfTBQ4QMwPUBEjoAAAAB3RJTUUH0wUOEDUqFe2UcgAAAAlwSFlzAAALEgAACxIB0t1+/AAAAQxJREFUeNpj/M9AHGAiUt2owkGrkAWF93LFgStPfjCwyGiYRGijqfyPAH9aOJAkQl78RwbICkNQjdB4gUNhD7qzLLAr/CKA4YENSAoRvl7zAUJXvPmxhgfCXILVMxEQvg+IDVUhgtVqDYjkDhD7B2aQIMIx5cOTN29evLAAsaEKObBajQzmQOQMcIQjHLwQgSisIaDwBdS5LHfwK7yhAHVVyX+8CrdAA5HB5gdehQ3Yoxpd4ZcAmDqbD//xKISEIjhU//zHoxDmXQaeFRhOZ8CmzuDOf3wKf8DsDfnyH6/CHJi6P//xKjyDJethVehBpMI7DPgVwrPCCgb8AK5wDwGFcNMF8EkCASOx1QcAGUxu1untnFIAAAAASUVORK5CYII=',
+ '3' => 'iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAAAAACpleexAAAAFXRFWHRDcmVhdGlvbiBUaW1lAAfTBQ4QMxBQugk2AAAAB3RJTUUH0wUOEDU3duv4qwAAAAlwSFlzAAALEgAACxIB0t1+/AAAATdJREFUeNpj/M9AHGAiUt0IVciCzPm7ZceZB28YGBQkLHwcmNFU/keANRJI4ioH/qMAJIUlaHatwaFwBrqrOO5gVfiCB8P9KVgVVkAtnPDh/wkLCFsGq0IFiGQLiH0D06P/GWHJ7O+NOzfuXLlzQRrEhgSawHscwYPurxAcwQMBf/4/aIAYyHIGr8IEeDhO+Y9XoQNUncwOVHGMRPEDSovc+IkzrpGDCQgUbuC1WgBhhsIHfAp3vPn/oIIFKfRxKQSDGohCA4IKX0DTD7YoRAWMUJ9iyQpbn4DBBWUQ5yFEDDnFw622gXAzwBxoYvfB5sYlUI0lD/4/gWWKJdgU/tHAcKjCD6y+PsGCpo4FJbaRgmcNqkqWCThTzxkTJHXo+Ro1HA9uOPHiATDlKJj4eKCVFIzDqWgGAK7GW/haPS+zAAAAAElFTkSuQmCC',
+ '4' => 'iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAAAAACpleexAAAAFXRFWHRDcmVhdGlvbiBUaW1lAAfTBQ4QMyqWttCEAAAAB3RJTUUH0wUOEDUxn4hdngAAAAlwSFlzAAALEgAACxIB0t1+/AAAAKBJREFUeNpj/M9AHGAiUh2FCucyQgCK4H9McIAFixwWhQ8kGIhS+MWAgTiFIQzEKWxhIE7hFgbiFF7hASkQIajwjQpInuUAIYV/XMDyU/4TUlgAlk75T0jhArCszR9CCk+AY07mxX8CCp+AY47nzH8CCn+YgOWW/CekMAYsVfMfl0JGmCBq4kNEDp2zAn0UMmItABjRvDykPTO43DgyFQIANP6pTFLWAdoAAAAASUVORK5CYII=',
+ '5' => 'iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAAAAACpleexAAAAFXRFWHRDcmVhdGlvbiBUaW1lAAfTBQ4QMzPy3XhEAAAAB3RJTUUH0wUOEDUk8lW5dQAAAAlwSFlzAAALEgAACxIB0t1+/AAAAQpJREFUeNpj/M9AHGAiUt2oQuIVfmREBzgU3iHWxAfEKiTaRFpZnfAfAbAr/AsxUYagiVCbeQgqhPpFYmukLCOrZupRNJUIB02BCAjAZCK+/Ed2LoJZgm6bzRfsCgMw3JWAXaEBpg8uIGSRPPMBQmXc+P+iggXCnoOQZUQK1K8PgEAjGcQs7QGL6FzG5mtkcAUiyYIQYcRRUkDTLEIWR1b4ixamQMPhrKUP3rx48eDNFXmwdyFiOthixgXqaTAnBcKpwRaOS6A6Mx78fwBVx/IAm8I/KsTGzAkWNHUyb7Ar/L8GNSlK3MCRev7/v+CApC7kBUoUoAX4yQ0nHjwAWqpiE6GNFgNDoAwHAKC2Q2lMNcCmAAAAAElFTkSuQmCC',
+ '6' => 'iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAAAAACpleexAAAAFXRFWHRDcmVhdGlvbiBUaW1lAAfTBQ4QNAObRd4vAAAAB3RJTUUH0wUOEDUc2lcB6wAAAAlwSFlzAAALEgAACxIB0t1+/AAAATtJREFUeNpj/M9AHGAiUh2Gwq2puryMjKKmmSfRVf5HBkcMEBI+L1CkUBROYUE2QuMFLoVr0CzzwKHwhQC6szZgV1gAtfHI/xs2mEYywsPxp8QHEMVxQ56B4aaJiIKIiIRCPDZf74DwI/5jB4hwPAChbAgG+BWoExlOxkoysuqW3sUV4BoQ/p0SqARLB44AF4HIByDMKMCuEIu7phCrUOADNl/DgMOJ/09SIMwPC7B5hgfC1/kB4kRAOC7YrFaByM0Ac85AOCLYrFaBhSMIQNPlG2wBDg3HP2CSGU/MuEAoiKVXUWxB9cwPiG8UwEGSg5FCMNOjwZ4/byqgpqwgMoWr/MGeZ1agqWPZgSNz/Z+AqnDCf1wK/29B8qbKDhQpRtTE8HfLjjMP3jDwKJh4hKCGJSPNC6lRhTRWCABWpdoxd/bZ4QAAAABJRU5ErkJggg==',
+ '7' => 'iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAAAAACpleexAAAAFXRFWHRDcmVhdGlvbiBUaW1lAAfTBQ4QNA18/fMoAAAAB3RJTUUH0wUOEDUVo4u5TwAAAAlwSFlzAAALEgAACxIB0t1+/AAAAM9JREFUeNpj/M9AHGAiUt2oQnorZIGzGLFJIyJ40HqGhUiFPFuQ/YUFPBGBmLcDSQybwj8OEDOW/CegsAeiruQ/AYV3OMDqTP4QUugCceCN/wQUQn1a8Z+Awj8qYHUiHwgpXAAxcMJ/Qgp1wOoEPhBSuANiYM5/QgpjIAovEFL4gweszgAz0NASxZ4vYMqHYDKDBiIWhWhWa0CS1x9CVn+8AaYsmAlZfQRC6RDMChADGTQIKjxDrMI7EEoBi0JGlMJe8AOY+sFOSCEeQHQBAABCZ7xyT9fJhwAAAABJRU5ErkJggg==',
+ '8' => 'iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAAAAACpleexAAAAFXRFWHRDcmVhdGlvbiBUaW1lAAfTBQ4QNBeBnwpSAAAAB3RJTUUH0wUOEDUOKe5wowAAAAlwSFlzAAALEgAACxIB0t1+/AAAATVJREFUeNpj/M9AHGAiUt1AKmRB459cc+DBGwYWGQ2LEG1Umf/I4IELkozLA2QpFIUXJFDMEDiBQ+EHGTR3yHzArrAFwwct2BXqQGQ1zvw/owFh6mBXCDXmDJB5BsOrjEhxzfoHIgkiGCGB9xtrgEPtOwvEV6FWY4+ZAAgVc5LhZgKEGYI9wN+gBiPu4Pl/BFWlxA1cMfN/C0rUr8AVhX8K0KyuwaEwASNmarAqPACVTXnw/0oENBFewKYQGhYZYE4MVBM2hVAvQ1LhHQhHBVsUMjIgYhCdhy3PPASTd6GOxBYz0KhOQHajDjY3pkC1Rlz5fweqjqEAm8ILGK5gYLlDZICXYI+ZLzZo6gL+4EgUfyo4kJQJtCCpQ8kKQPB2zZ47L14AU5iMgUMAN7IM43AqHwdQIQAhMPz6Gz5V/wAAAABJRU5ErkJggg==',
+ '9' => 'iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAAAAACpleexAAAAFXRFWHRDcmVhdGlvbiBUaW1lAAfTBQ4QNCQ+T2tEAAAAB3RJTUUH0wUOEDUHUDLIBwAAAAlwSFlzAAALEgAACxIB0t1+/AAAAUZJREFUeNpj/M9AHGAiUh26wr9rE3V5GRlFTTM3/kVT+R8Z7FBBSKjsQJFCUTiFBcWMCbgUHmBBs20FdoV/VNDUMQi8wapwDVS65s2fPToQZgFWhRFIkm8kwGyeH9gUQm2+Aua0QDhb4LJI4XgHQmmDSRMIZw+emIEENAeEcwObQhEIdQHiABRbUGPGBSIQAWL/gHqbB5tnJkC1Fjz5f8IGwxwkhR8EsCQarFE4hViF/wsQCgKgHsSu8H8HLFkUQL2rgUPh/zslOiwMEjFH/kND2geXQvQgqMAWhSjgAIRygAswIuXCpXfevHjz4M0ZdQaGhxo/wAnyBTuWmPnvARGxuPH/iAa+9Ph/A7r9Ai+wK/zvg6ZwzX8cCl9oICtjmfIfl8L/bwIQ6gyO/Met8P//EwUmwHTJo5OyBU2CkdaF1KhCWisEAM/sJxmZkdWnAAAAAElFTkSuQmCC',
+ 'A' => 'iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAAAAACpleexAAAAFXRFWHRDcmVhdGlvbiBUaW1lAAfTBQ4QFwy1U7TfAAAAB3RJTUUH0wUOEC0ZKCZtPQAAAAlwSFlzAAALEgAACxIB0t1+/AAAAO1JREFUeNrt1LERwiAUBuAHZ2GRwsIypQMwQEZwgBQpM4QDZBSLFI7gCA5gQWGRdA5gkTuMSh48eMTUnq96wH98B+QiDCwruTD3D76qF676ueAp0Y9lSBXeSkFWaLAje3T+kkzK4SgpBzZw8pqxJWcdOJuRsyGPbWDk0tS20zw9SXsobdfytJVXdzNsP61i6Zt3K7Ht0UeUgbPdjsrOXMd+2IS2C2qb271HVWi7YANcNXFQsUEVBTXwNdl46jYRxPl52dnwRUZbhkLSDmS8DnxFRWiULxg8UxvobefuRR8ZQYDKtffVVcQWv/RrfgJC4bd0upw4MQAAAABJRU5ErkJggg==',
+ 'B' => 'iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAAAAACpleexAAAAFXRFWHRDcmVhdGlvbiBUaW1lAAfTBQ4QGAusrz2zAAAAB3RJTUUH0wUOEC01Gv4B3gAAAAlwSFlzAAALEgAACxIB0t1+/AAAANJJREFUeNpj/M9AHGAiUh0tFTKiAUHL2rsoKv9DARZDWFr+IwA+hQwMFcQqZDhCrMIIYhWK4FYIYv8444PuV+wK//9/A+UJwBUSCHAL3OEIsdoFyttCpGdiiAtHjoY/RCnk6PlBbBRKrCE6CqcQq5DlDs5whIT3CgUI788EvOEIBCegXB2YPCNMBSNMISqf5TeUjysK90LpP/itfrFEAhZCMHkWdKMYUbk2MAah7BqD02pUYEFkgMu8IE6hD0IdpmegwSejoKLjoY7syaFU7A0HhQA2e4cJytImvAAAAABJRU5ErkJggg==',
+ 'C' => 'iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAAAAACpleexAAAAFXRFWHRDcmVhdGlvbiBUaW1lAAfTBQ4QGBbPqVFqAAAAB3RJTUUH0wUOEC4BEGemqAAAAAlwSFlzAAALEgAACxIB0t1+/AAAASlJREFUeNpj/M9AHGAiUt2owkGrkAWV+3TDgRtPPjBwyGiYBOijSv1HAlcCkGUcTiDLISvsQDOeZQp2hQWYDpuCTeEEbD44ganwDgc2vxpgKoyAyUWc+f9hjgCMtwFd4RuYRxog/ueBcl3QFc6BSmj8gfBrwE40yFmCrjABqrAH5mSZgJ4jX7AEjwlU4Zn/OAAsrp9AaRlccc0IzdeMsBilOPWQrBDmtpfEKnwBpZ8qZq58i6IS6vscKHcBcgQYlOz4gh6OK6AKfaB8G5hN6Aq/wBLPHjB3CczCFIzUA0u2PD0v/j9pgaf1ExgK3wgwYAEOWFL4GizqWC5gyzM1mArnEJkLZ2DPhf//n3BAVmeDkq8ZUZPL3TUn7gBLCgYFBYsAcxQZRmKrDwABNsv9SJSDwwAAAABJRU5ErkJggg==',
+ 'D' => 'iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAAAAACpleexAAAAFXRFWHRDcmVhdGlvbiBUaW1lAAfTBQ4QGC1+orhOAAAAB3RJTUUH0wUOEC4yr7fHvgAAAAlwSFlzAAALEgAACxIB0t1+/AAAAM9JREFUeNpj/M9AHGAiUt1AKmSBsxiRhXlkNBxCpFFU/ocBTDMyPvxHADwKGRgUbhCpkEHiCZEKGRyIVciwArdCIPPFGg8YzwSvQiBogXFvEFD43wDKnQDl44yZGCh9glAU2sCsJqRQBkq/gMUw3G2wuP6PnU/H9PgRSgsQUvgESosQUngFSqsQUrgCSsNiCFcU7oBx9+CL6w8XamB5SeUPkelxAZEJ1+YPcQolXhCXFTTuEJULOUq+IOVrFgasQELBxMaHG1mEcTiVjwOoEADAIkCnGpmJKgAAAABJRU5ErkJggg==',
+ 'E' => 'iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAAAAACpleexAAAAFXRFWHRDcmVhdGlvbiBUaW1lAAfTBQ4QGDeDwEE0AAAAB3RJTUUH0wUOEC8CkHXGUwAAAAlwSFlzAAALEgAACxIB0t1+/AAAAD5JREFUeNpj/M9AHGAiUt2owkGrkAXGYMQqjUgJQ8EzpPsa05+D140oMYTk4KEQ4MMqZqgUhcM1czESW30AABfqB1XDnLzcAAAAAElFTkSuQmCC',
+ 'F' => 'iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAAAAACpleexAAAAFXRFWHRDcmVhdGlvbiBUaW1lAAfTBQ4QGQe8AkDZAAAAB3RJTUUH0wUOEC8JB6cf2wAAAAlwSFlzAAALEgAACxIB0t1+/AAAADlJREFUeNpj/M9AHGAiUt3wUsiCYDJikUYE3lDwDDm+xvTp4HUjIoaQXTsUAnxYxcyoQryAcUSWuAAW/gZTg/yEMAAAAABJRU5ErkJggg==',
+ 'G' => 'iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAAAAACpleexAAAAFXRFWHRDcmVhdGlvbiBUaW1lAAfTBQ4QGRFI1vWIAAAAB3RJTUUH0wUOEC8QY8y3GwAAAAlwSFlzAAALEgAACxIB0t1+/AAAASZJREFUeNpj/M9AHGAiUt0IVciCwvt7ZM+FOy8+MDBwSEho2AQII8v9R4A/U2RQtHEUfEBIIim8YYBhn8oNLAqP8GBxmcwbDIU3sKljYIhAV/jHgAE7uICmcAJMQqDmwp//D2YowPgxqAr/wPyr8QAi8EEHwleIQFW4BxYicG+eEHEomHECET5QhRVQhQn/cQFoFJ6AKgwgFNcPoFwdnAoZIXmGERahKDwkIdqlR1j4PiRW4RVCCmExvQenQrSYEXiDiAoUBfC4loAK23yBSnzArhCRehRmAJPFnRUxHDgU/lDA7zZECj/Cgl2dAkaeWYNVZcoHDIX/94hgKLM4gS27/v9QIICizGMDkiQjSon7c8eBCw+e/GFgkZEwsHCRRpZiHE5FMwCa2YE+WcAOUwAAAABJRU5ErkJggg==',
+ 'H' => 'iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAAAAACpleexAAAAFXRFWHRDcmVhdGlvbiBUaW1lAAfTBQ4QGRw2Z4k1AAAAB3RJTUUH0wUOEC8agxleBQAAAAlwSFlzAAALEgAACxIB0t1+/AAAAD1JREFUeNpj/M9AHGAiUt2oQvyABUozQml4+KMLDAXPDAWFLGh8RlwKh4JnaB88GOlxELhxVCFewDgEynAAN2sFVHAvevkAAAAASUVORK5CYII=',
+ 'I' => 'iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAAAAACpleexAAAAFXRFWHRDcmVhdGlvbiBUaW1lAAfTBQ4QGSlg1E0WAAAAB3RJTUUH0wUOEC86uHd+zQAAAAlwSFlzAAALEgAACxIB0t1+/AAAAD5JREFUeNpj/M9AHGAiUt1AKmRBMBkxJJE9OhQ8Q32FjGhxDQsjjCQwFDwzqnCwKkRKZqO5EBMwDqcSl2iFAMMeB0s/kLo2AAAAAElFTkSuQmCC',
+ 'J' => 'iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAAAAACpleexAAAAFXRFWHRDcmVhdGlvbiBUaW1lAAfTBQ4QGywiiNsbAAAAB3RJTUUH0wUOEDAFw0tdbgAAAAlwSFlzAAALEgAACxIB0t1+/AAAAKdJREFUeNpj/M9AHGAiUh3xClmwijJCaSR3Ud/qUYWjCklTyIHEhifctw8ePHgCxO+B7L9QMQlsChW+QOiX4gwMd6BiItisVoHSB6AYWQwM/kNBBszkC/9PwKyc8B8B4Ar3YPHMHWwK/xtgqAv4j1XhEfScK/EEu8L/a1BVStz4j0Ph/yPItoe8QFH3nxGlkNq75cKDB0DDVBwitNEcwjhwpdmoQrwAAN6ioiFapgUdAAAAAElFTkSuQmCC',
+ 'K' => 'iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAAAAACpleexAAAAFXRFWHRDcmVhdGlvbiBUaW1lAAfTBQ4QHAEoFhGpAAAAB3RJTUUH0wUOEDANzZDVXAAAAAlwSFlzAAALEgAACxIB0t1+/AAAAPZJREFUeNpj/M9AHGAiUt2owgFSyAgFMOGDrDARxkKo0H8wYEDh/b/AAzepACqEVeEdCQx1WBW+0ICry/mPR+EXE7i6kD94FP5xwaYOi8IIrOowFRbA1Xkgq8NQ2ANXZ/PlPx6FS3CpQ1fIAmOIoKn7jxbXf2CMNxvQIxvVRAQQ+YDXaiSQQqxChiOEFGoIQGidP/gVStxogLI68CqUuPH/BzSVcTzAoxCo7v//ObBIxK0QrO7/H1iCXIFT4QkIFxbaMh9wKYQJO0D5OYQUnoDF/QkCCuHJ1+APAYV3YOloAgGF8JTO84SAwjfQiGQIgPAZqV4rAACnKSarzdlc4gAAAABJRU5ErkJggg==',
+ 'L' => 'iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAAAAACpleexAAAAFXRFWHRDcmVhdGlvbiBUaW1lAAfTBQ4QHA64qQw4AAAAB3RJTUUH0wUOEDAXMPIsJgAAAAlwSFlzAAALEgAACxIB0t1+/AAAADlJREFUeNpj/M9AHGAiUt2QUMiCYDJCaezhMBQ8M6pwVCEdFLJgCjEisRH5Zyh4hvoKGUdkQUq0QgARaARRV9jUFQAAAABJRU5ErkJggg==',
+ 'M' => 'iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAAAAACpleexAAAAFXRFWHRDcmVhdGlvbiBUaW1lAAfTBQ4QHBhMfblpAAAAB3RJTUUH0wUOEDAqaJpgNwAAAAlwSFlzAAALEgAACxIB0t1+/AAAAPNJREFUeNrdlK0OgzAUhS8bCQYxMYmcmEAgEAgejQfZQyG2pAIxOYlATkAu691o2tvSYia2iv7lyzn3NG0jhG1tt5H7Aggom7ZuaKPhBFqKV+pFWDGjjcxStEAYXuvBkrKtoVX+gdRiK9i6sxjgeVGUMJzWwZLACaZOTqoAOAronmrlBuvPkQsIgHn8BqnE2AMmhaaYJ57jqTRFMwsDyW249XaJLhAujizm7UFM5XCUXTqiTvBLQYWRc7H3WWt+3NmlyGbOGh9q/45mjQxUb+CA6A2jSqu5MweX0ooQWLJxLYx6fz0GwmBOsww5GP3At/dX4Ayb7qpFI9y5ygAAAABJRU5ErkJggg==',
+ 'N' => 'iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAAAAACpleexAAAAFXRFWHRDcmVhdGlvbiBUaW1lAAfTBQ4QHC6DxyzwAAAAB3RJTUUH0wUOEDAye/b4YQAAAAlwSFlzAAALEgAACxIB0t1+/AAAALRJREFUeNpj/M9AHGAiUt0IV8gIARsRMlAROP8/BEB5Ii/+/0cVgXNRhRk8iFXIMIFYhRxXiFTIYPCDSIUMBcQqZNhDrEKZN0QqZAggViHDHIIKRSAUzx1CCrdAaZM/BBT+z4Eyaggp/KEDYbAcIaDw/wUWCEuBkML/PagBgFvhfxdiFT4RIVLh/zXEKvyfQqzCLypEKvx/hoVIhf9biFX4x4ZIhf8fCBCp8P8KNBHG4VQ0AwDEOyeZhO5p1AAAAABJRU5ErkJggg==',
+ 'O' => 'iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAAAAACpleexAAAAFXRFWHRDcmVhdGlvbiBUaW1lAAfTBQ4QHQExDSDoAAAAB3RJTUUH0wUOEDA4myMRfwAAAAlwSFlzAAALEgAACxIB0t1+/AAAATtJREFUeNpj/M9AHGAiUt3wUsiCyv265ciZJ08YGGRkDGwCuFGk/iOBDwU8SDIcGS+Q5JAV7hBBs45nAVaFC1gwXTYBi8IdWNQxMCzAUPhBBJs6Bp4n6AoLYFI6az78f7NEB8ZNQFP4QwAqEfADwg+A+f0NqsI1UHGBDzCnSKC6EhYzB6B0Cj+UwZ+CKgNTeAZKu8C94QGlL6DGjAyU+wAeXC+gIiIQLiM0KzDC9CFCBlWICsnsL3aFMDc+hcs8QZWBKYSF2g24whvYFZpA6T1whUegNCwyoYGxAmYyLGZ+wOxYghqFX2BpO+APmP8nBspHj2uk1LPizf8PGyxgXPTUQ3x6JDqF//8/AYs6bHkGmCYF0O3FnguBCSaFA0kZS8IDJDlG1IIUVFK8eABMWzI6DgHCyDKMI7LEBQCD5YgI9wbKGgAAAABJRU5ErkJggg==',
+ 'P' => 'iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAAAAACpleexAAAAFXRFWHRDcmVhdGlvbiBUaW1lAAfTBQ4QHQvR2Mn2AAAAB3RJTUUH0wUOEDEDMzPJGgAAAAlwSFlzAAALEgAACxIB0t1+/AAAAKVJREFUeNpj/M9AHGAiUh05ChlRAKdu4k5Ulf9hANMQiwf/EQCfQgaJB0QqZHAhViHDEbg0AV8vwRM8QN0v5vBAOSfw+BrMWQDl8MClGeEKGGEKQcRXHmQemTGD1RMy+N14o4MDyvGAS7NgGMaIzPHAYyIy4HhBZMy0EBmFIX+IUsjRgqQOi2fAgEVBwyVGGEUEQw2O3EbLzDWSFDIOhtJsVCEWAAC/Yt2X+2PYcgAAAABJRU5ErkJggg==',
+ 'Q' => 'iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAAAAACpleexAAAAFXRFWHRDcmVhdGlvbiBUaW1lAAfTBQ4QHRxSC0wxAAAAB3RJTUUH0wUOEDEKSu9xvgAAAAlwSFlzAAALEgAACxIB0t1+/AAAAW1JREFUeNpj/M9AHGAiUt2QUMiCzPm65cCZF08YGGRkDBx8uNFU/oeDDwU8SOIcBS/+IwOEwh0iaEYIrMCqcA4LprsmYFG4A4s6BoYFGAo/iGBTx8DzAl1hAUxKZ8WH/29W6MC4KWgKfwhAJXx+gPl/QmB+/4KqcANUXOQDVPiLBFRkCUwhJGb2wGzihzK4U6CMA6hReAbKc4F7wwFKX0CNGRkoB+HJJ1ARGZgAIziFM8J0IUIGXYjMZPaXkEJYYDyBiz+EuRFVoQKUdwWIz6qWvmRguAMVkUBVaIIUalPu9GgshIefAWrwrIHp//L/DQc4KjFiBi2uQ/7832KB5AX0uP5fAZOx2PDhfwNCIXrq+f9BhgEb4HmCkcL3YE3hSHkBnmfWYFMpsoaYXAgGDgcwFKLlaxYOCG2DqRCYrldkmIACUMIgZsaTI5Cg3IBNISp4AoovlT+EFf7/kYPkb3wK//8/YAGPGcYhUIYDAHBC9Yak1w7iAAAAAElFTkSuQmCC',
+ 'R' => 'iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAAAAACpleexAAAAFXRFWHRDcmVhdGlvbiBUaW1lAAfTBQ4QHSkEuIgSAAAAB3RJTUUH0wUOEDEUsOBM3QAAAAlwSFlzAAALEgAACxIB0t1+/AAAAOZJREFUeNpj/M9AHGAiUh0NFLJAaUY0YRkJHYcQdmSh/xCAzRCZHf8RAJ9CBpYNRCpkEHgBV4jfMx+mEOVGIDDAaTWY82aPBZTLgV8hUCkaH6cbP8B8gxHgyODjgwstMDfiVIgWQyFE+lrhB3EBznOFuJgxuUFMXPPEbPmDpA53FH55osKMIoAe4F826MDMvPMfj9WgWFGBBeIf/Ar/H4FxJhBQ+B8WzCIfCCi8A4uvBgIK/2fA/POCgMIXHFBuDqH02ABLM3cIKPwgAuVHEFD4fwJM4AIBhT9goe4AFWAcAsXesFIIAEvJyZHTCSiTAAAAAElFTkSuQmCC',
+ 'S' => 'iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAAAAACpleexAAAAFXRFWHRDcmVhdGlvbiBUaW1lAAfTBQ4QHTRnvuTLAAAAB3RJTUUH0wUOEDEbIF9RTAAAAAlwSFlzAAALEgAACxIB0t1+/AAAAVZJREFUeNpj/M9AHGAiUt2oQvyABYX398CWK3de/GBgkVEw8HFgRpH7jwSWqCDLyCxAlkNS+CcG3boY7AozMB3Wgk3hGSw+4HgBl0b4egIWhT9mYPGMBFQg4MH/D2tgvrKASzPC0yMjlP7CDSTOmrDIMDDwiHBsxzSRBypw5j9WgFDoAPNAxIQjX/ApXIDsC4OCLV9wKfzjwIACOEIO4IiZFxbooePzAqvC/z9qONBUStzAqvD//zc9BqgqNX5gVwgETxbkmCClvSk4FYLdsCMCptAGI2YSGV78+PLmz5MX4mDu1ByIMM9n9JiBxe4caGChy8MZMMsUIEFyAMoVwVC4BGaEwpI3/9/MEYGlJQyFPwQYsIE1mL7GlnCR0iNSXLtgqpO4gy1mvtigq1NAxCBKgP9pEUFWxlOCnNIYUYrmn3v23Ljx5gsw88sYOPhwI0sxDoEyHAABtSc836a1EQAAAABJRU5ErkJggg==',
+ 'T' => 'iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAAAAACpleexAAAAFXRFWHRDcmVhdGlvbiBUaW1lAAfTBQ4QHgUdTbcyAAAAB3RJTUUH0wUOEDEgkVS4aAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADdJREFUeNpj/M9AHGAiUt0IVcgCpRlxyMODeSh4hmiFjGipB+Z7jEQ1FDwzqnBU4WBSyDicimYAb/AFTaJpyH8AAAAASUVORK5CYII=',
+ 'U' => 'iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAAAAACpleexAAAAFXRFWHRDcmVhdGlvbiBUaW1lAAfTBQ4QHhEHl2NPAAAAB3RJTUUH0wUOEDEon48wWgAAAAlwSFlzAAALEgAACxIB0t1+/AAAAKlJREFUeNpj/M9AHGAiUh3xClmgNCOUhrsEXYD6Vo8qHFVIuUIVKP0USr+E0jLoCjWg9A4ovQVNHJjUIaADZsILMPeFApRfA5X/D1N4AaZRYc6b/2+WwNQxXEBX+N8Bqxcc/mMoPMGCRR3LBUyF/2dgUTjjPxaF/6egm8ky5T9Whf9P2KCoMziBJPefEaWQurjnzIMXL34wsMhoWHiYo2hjHLjSbFQhXgAAKzejCLAOcVMAAAAASUVORK5CYII=',
+ 'V' => 'iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAAAAACpleexAAAAFXRFWHRDcmVhdGlvbiBUaW1lAAfTBQ4QHh/gL05IAAAAB3RJTUUH0wUOEDEuduyVbwAAAAlwSFlzAAALEgAACxIB0t1+/AAAAVNJREFUeNpj/M9AHGAiUt2owoFRaMgIAYlIMqlQMUMo/z8ITIByRP78hwMRqNgECBei8AULVPQIXN0RqAjLGwgfYrW4B1R4DdzmLVDaQxjZ6v8roDwVuIkqMK3/ka3+/0MAKn4FKn4D5uof/5GtZmCPgEpsQHNDBDsDitVwt5tA+RZQ/pn/qFYj3PQEzHsC5WnA3QyPmQQU3+5AE0VYDTfDBcxzgQbik/8YVv93gMp9AbK/cEAD8T+m1TBb/oD8veEHhs0IE2GmxADZMRAmz4//WKxGkv3DA2Gm/MeqcA/Ujj1w1hHsCv/LQKQz/megRzyawgqIvAxMRwsuhbCEAEvGT3AphEUwNCU5IEv9R8lcUH9/wAxE5HAEgjccSBI8X3CbKOyBxAnhxm3i/w1IEgdQZFA98/+PCFydDKo6VKsZmGPQ0wgOq/+fgYvfQTORkeq1AgCIAvD7+THsDgAAAABJRU5ErkJggg==',
+ 'W' => 'iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAAAAACpleexAAAAFXRFWHRDcmVhdGlvbiBUaW1lAAfTBQ4QFhZRKnzkAAAAB3RJTUUH0wUOEDIR66frkQAAAAlwSFlzAAALEgAACxIB0t1+/AAAAXNJREFUeNrtlK1ywkAUhZdMZsJMKyIqKhAIBAKBiEBEVCDyCJV9iIo+Do9QGRERgUBEVCAqKhAIREVERURnTvfn3t27xSA6g+kOQ/ZkP/aec5NlBHXZSC7k/sE/AhUwoVkDPQ58/2RUQ2IC6B1XpN7MV8tg62/pUdjSDO7OwR2J0pbekpqZYlMG50bNSGwBDQ4pyV5YtCZ7mqZf1mO2IN2Jynba0XRx49pThjQCbEKWFfVRpIlBzlK4PuLdpxEWlTr4LHvYMEDOaTYS3HCW3DAJt8mmaSXYchZbOfEzkyYGZRbrEbX8qe7GMpLqFeyxV9F4fon1pwcxjxbqJpJTBPBJLoyHYSz1I3xq78aOMssepHZZHFjKhbX9/AZd6e9bsdABeyHTQXiE2PLO6PugCwiP/r1QVLYSlpXwKE1Wno7b7jY+hoWj0aegPyA9+jPrzgqwZJ0j8hhMVtElmDoD19FFPAvamc+sOXBm+KdYEzC63p/9D7Tr72kj/8qjAAAAAElFTkSuQmCC',
+ 'X' => 'iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAAAAACpleexAAAAFXRFWHRDcmVhdGlvbiBUaW1lAAfTBQ4QHi/G9n7kAAAAB3RJTUUH0wUOEDIXAsROpAAAAAlwSFlzAAALEgAACxIB0t1+/AAAAT9JREFUeNpj/M9AHGAiUt3IVhjKCAFr4RJroSKBMIH/YPBEAMITeQLh//8gAxHggQlAFf6fAdXnA+WnQPkT/qMp/O8AlVkA5h2A8kz+YCi8wQGREngA5PxQgXBYzvzHUPi/A2qIA5BdAmUX/Mei8I8BVHbK/wssEJbMB2wK/5+ASvPcgGlZ8x+rQriFAmghgKHwiwJKXPA8wKXw/x4UhT3/cSr8n4CkzuAPHoVvRODqWE6gyPxHTT1ffiAUCjCgAhRtDkgSFnisnoJixAScCh/wEBk8DmiucsChcA5MQQSMMQWrQlgiZ0iAByey5QiFPlBZnS//v+hgxjZc4QKYKVeAnCswby3AUAi3eAGKNoEn6Ap94A5EjXUfNIUrEA6EALgzl6AohCUGsAMhAOZMkTfICkMw3I5wZgiEyzicimYAFRFkVwgDfJ0AAAAASUVORK5CYII=',
+ 'Y' => 'iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAAAAACpleexAAAAFXRFWHRDcmVhdGlvbiBUaW1lAAfTBQ4QHjkyIsu1AAAAB3RJTUUH0wUOEDIkvRQvsgAAAAlwSFlzAAALEgAACxIB0t1+/AAAANJJREFUeNrt1L0NgzAQBWAcUVB6AAZgBAoKhmAICoZgCAoKxmAECkbwABSUlBRILwF8duwYhFJEihJ37+6T5T9g8K6N20X3FdDDNjKKOeTIqZLtWcKBU73bCx1lPhgQNTWieY1zRLmGCZFQp1xTSSmBDUUgW754BF+GQLxAPUkMxMb0FlzUsqpKLXhxQPRqo+oIerggCvuMC7jhFJounA4gWhO2OIL6Jp/uzglHrh0fTyAaDRucQaTkUpxDQVBYDWZ/hYze6bsv/A8/DNlP/kgvwzuer4kCMGPZDgAAAABJRU5ErkJggg==',
+ 'Z' => 'iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAAAAACpleexAAAAFXRFWHRDcmVhdGlvbiBUaW1lAAfTBQ4QHwfqWOdfAAAAB3RJTUUH0wUOEDIrLasyIwAAAAlwSFlzAAALEgAACxIB0t1+/AAAAL5JREFUeNrl1C0OwkAQBWCWQIJEVPQIFT0GAlHBMRBIBKIHqahAIDlERY9R0UOs3ORh5qVLunmp5GfUZvczbzKzDqtltV7ofgtueHCp16h33xBGwn0KYqoTO/J868Csaj418e0cPujOkLDfmTsECcfcXOGhoC/NZQMUDBUDd5DwxiAtJGzprpCw48xVQcIhM1d6KOgLc/kIBcORgXtIeGGQOyRs6Oq0g7P92YbkRE7bRZhcwhh+6nLF5f7yx30B8Z7FgxzMWtEAAAAASUVORK5CYII=',
+ );
+
+ return $_png;
+ }
+}
+
+?>
\ No newline at end of file
diff --git a/phpBB/includes/ucp/ucp_main.php b/phpBB/includes/ucp/ucp_main.php
new file mode 100644
index 0000000000..a084740601
--- /dev/null
+++ b/phpBB/includes/ucp/ucp_main.php
@@ -0,0 +1,430 @@
+subsection($submodules, $submode);
+ unset($submodules);
+
+ switch ($submode)
+ {
+ case 'front':
+
+ if ($config['load_db_lastread'])
+ {
+ $sql = 'SELECT mark_time
+ FROM ' . FORUMS_TRACK_TABLE . '
+ WHERE forum_id = 0
+ AND user_id = ' . $user->data['user_id'];
+ $result = $db->sql_query($sql);
+
+ $track_data = $db->sql_fetchrow($result);
+ $db->sql_freeresult($result);
+ }
+ else
+ {
+ $tracking_topics = (isset($_COOKIE[$config['cookie_name'] . '_t'])) ? unserialize($_COOKIE[$config['cookie_name'] . '_t']) : array();
+ $tracking_forums = (isset($_COOKIE[$config['cookie_name'] . '_f'])) ? unserialize($_COOKIE[$config['cookie_name'] . '_f']) : array();
+ }
+
+ $i = 0;
+ $topic_type = $user->lang['VIEW_TOPIC_ANNOUNCEMENT'];
+ $folder = 'folder_announce';
+ $folder_new = $folder . '_new';
+
+ $sql_tracking = (($config['load_db_lastread'] || $config['load_db_track']) && $user->data['user_id'] != ANONYMOUS) ? 'LEFT JOIN ' . TOPICS_TRACK_TABLE . ' tt ON (tt.topic_id = t.topic_id AND tt.user_id = ' . $user->data['user_id'] . ')' : '';
+ $sql_select = (($config['load_db_lastread'] || $config['load_db_track']) && $user->data['user_id'] != ANONYMOUS) ? ', tt.mark_type, tt.mark_time' : '';
+ $sql = "SELECT t.* $sql_select
+ FROM (" . TOPICS_TABLE . " t
+ $sql_tracking)
+ WHERE t.forum_id = 0
+ AND t.topic_type = " . POST_ANNOUNCE . '
+ ORDER BY t.topic_last_post_time DESC';
+ $result = $db->sql_query_limit($sql, $config['topics_per_page']);
+
+ while ($row = $db->sql_fetchrow($result))
+ {
+ $forum_id = $row['forum_id'];
+ $topic_id = $row['topic_id'];
+
+ if ($row['topic_status'] == ITEM_LOCKED)
+ {
+ $topic_type = $user->lang['VIEW_TOPIC_LOCKED'];
+ $folder = 'folder_locked';
+ $folder_new = 'folder_locked_new';
+ }
+
+ $unread_topic = ($user->data['user_id'] != ANONYMOUS) ? true : false;
+ if ($user->data['user_id'] != ANONYMOUS)
+ {
+ $topic_check = (!$config['load_db_lastread']) ? $tracking_topics[$topic_id] : $row['mark_time'];
+ $forum_check = (!$config['load_db_lastread']) ? $tracking_forums[$forum_id] : $track_data['mark_time'];
+
+ if ($topic_check > $row['topic_last_post_time'] || $forum_check > $row['topic_last_post_time'])
+ {
+ $unread_topic = false;
+ }
+ }
+
+ $newest_post_img = ($unread_topic) ? "" . $user->img('icon_post_newest', 'VIEW_NEWEST_POST') . ' ' : '';
+ $folder_img = ($unread_topic) ? $folder_new : $folder;
+ $folder_alt = ($unread_topic) ? 'NEW_POSTS' : (($row['topic_status'] == ITEM_LOCKED) ? 'TOPIC_LOCKED' : 'NO_NEW_POSTS');
+
+ // Posted image?
+ if (!empty($row['mark_type']))
+ {
+ $folder_img .= '_posted';
+ }
+
+ $view_topic_url = "viewtopic.$phpEx$SID&f=$forum_id&t=$topic_id";
+
+ $last_post_img = "' . $user->img('icon_post_latest', 'VIEW_LATEST_POST') . '';
+
+ $last_post_author = ($row['topic_last_poster_id'] == ANONYMOUS) ? (($row['topic_last_poster_name'] != '') ? $row['topic_last_poster_name'] . ' ' : $user->lang['GUEST'] . ' ') : "' . $row['topic_last_poster_name'] . '';
+
+ $template->assign_block_vars('topicrow', array(
+ 'FORUM_ID' => $forum_id,
+ 'TOPIC_ID' => $topic_id,
+ 'LAST_POST_TIME' => $user->format_date($row['topic_last_post_time']),
+ 'LAST_POST_AUTHOR' => $last_post_author,
+ 'TOPIC_TITLE' => (!empty($censors)) ? preg_replace($censors['match'], $censors['replace'], $row['topic_title']) : $row['topic_title'],
+ 'TOPIC_TYPE' => $topic_type,
+
+ 'LAST_POST_IMG' => $last_post_img,
+ 'NEWEST_POST_IMG' => $newest_post_img,
+ 'TOPIC_FOLDER_IMG' => $user->img($folder_img, $folder_alt),
+ 'ATTACH_ICON_IMG' => ($auth->acl_get('f_download', $forum_id) && $row['topic_attachment']) ? $user->img('icon_attach', '') : '',
+
+ 'S_ROW_COUNT' => $i,
+ 'S_USER_POSTED' => (!empty($row['mark_type'])) ? true : false,
+
+ 'U_VIEW_TOPIC' => $view_topic_url)
+ );
+
+ $i++;
+ }
+ $db->sql_freeresult($result);
+
+ //TODO
+/*
+ $sql_and = '';
+ $sql = 'SELECT COUNT(post_id) AS total_posts
+ FROM ' . POSTS_TABLE . '
+ WHERE post_time > ' . $user->data['user_lastvisit'] . "
+ $sql_and";
+ $result = $db->sql_query($sql);
+
+ $row = $db->sql_fetchrow($result);
+ $db->sql_freeresult($result);
+*/
+
+ break;
+
+ case 'watched':
+
+ if ($_POST['unwatch'])
+ {
+ $forums = (isset($_POST['f'])) ? implode(', ', array_map('intval', array_keys($_POST['f']))) : false;
+ $topics = (isset($_POST['t'])) ? implode(', ', array_map('intval', array_keys($_POST['t']))) : false;
+
+ if ($forums || $topics)
+ {
+ $l_unwatch = '';
+ if ($forums)
+ {
+ $sql = 'DELETE FROM ' . FORUMS_WATCH_TABLE . "
+ WHERE forum_id IN ($forums)
+ AND user_id = " .$user->data['user_id'];
+ $db->sql_query($sql);
+
+ $l_unwatch .= '_FORUMS';
+ }
+
+ if ($topics)
+ {
+ $sql = 'DELETE FROM ' . TOPICS_WATCH_TABLE . "
+ WHERE topic_id IN ($topics)
+ AND user_id = " .$user->data['user_id'];
+ $db->sql_query($sql);
+
+ $l_unwatch .= '_TOPICS';
+ }
+
+ $message = $user->lang['UNWATCHED' . $l_unwatch] . '
' . sprintf($user->lang['RETURN_UCP'], "", '');
+
+ meta_refresh(3, "ucp.$phpEx$SID&i=$id&mode=watched");
+ trigger_error($message);
+ }
+ }
+
+ if ($config['load_db_lastread'])
+ {
+ switch (SQL_LAYER)
+ {
+ case 'oracle':
+ break;
+
+ default:
+ $sql_lastread = 'LEFT JOIN ' . FORUMS_TRACK_TABLE . ' ft ON (ft.user_id = ' . $user->data['user_id'] . ' AND ft.forum_id = f.forum_id)';
+ break;
+ }
+ $lastread_select = ', ft.mark_time ';
+ }
+ else
+ {
+ $sql_lastread = $lastread_select = '';
+
+ $tracking_topics = (isset($_COOKIE[$config['cookie_name'] . '_t'])) ? unserialize($_COOKIE[$config['cookie_name'] . '_t']) : array();
+ $tracking_forums = (isset($_COOKIE[$config['cookie_name'] . '_f'])) ? unserialize($_COOKIE[$config['cookie_name'] . '_f']) : array();
+ }
+
+ $sql = "SELECT f.*$lastread_select
+ FROM (" . FORUMS_TABLE . " f
+ $sql_lastread), " . FORUMS_WATCH_TABLE . ' fw
+ WHERE fw.user_id = ' . $user->data['user_id'] . '
+ AND f.forum_id = fw.forum_id
+ ORDER BY left_id';
+ $result = $db->sql_query($sql);
+
+ $i = 0;
+ while ($row = $db->sql_fetchrow($result))
+ {
+ $forum_id = $row['forum_id'];
+
+ $unread_forum = false;
+ $forum_check = (!$config['load_db_lastread']) ? $tracking_forums[$forum_id] : $row['mark_time'];
+
+ if ($forum_check < $row['forum_last_post_time'])
+ {
+ $unread_forum = true;
+ }
+
+ // Which folder should we display?
+ if ($row['forum_status'] == ITEM_LOCKED)
+ {
+ $folder_image = ($unread_forum) ? 'folder_locked_new' : 'folder_locked';
+ $folder_alt = 'FORUM_LOCKED';
+ }
+ else
+ {
+ $folder_image = ($unread_forum) ? 'folder_new' : 'folder';
+ $folder_alt = ($unread_forum) ? 'NEW_POSTS' : 'NO_NEW_POSTS';
+ }
+
+ // Create last post link information, if appropriate
+ if ($row['forum_last_post_id'])
+ {
+ $last_post_time = $user->format_date($row['forum_last_post_time']);
+
+ $last_poster = ($row['forum_last_poster_name'] != '') ? $row['forum_last_poster_name'] : $user->lang['GUEST'];
+ $last_poster_url = ($row['forum_last_poster_id'] == ANONYMOUS) ? '' : "memberlist.$phpEx$SID&mode=viewprofile&u=" . $row['forum_last_poster_id'];
+
+ $last_post_url = "viewtopic.$phpEx$SID&f=$forum_id&p=" . $row['forum_last_post_id'] . '#' . $row['forum_last_post_id'];
+ }
+ else
+ {
+ $last_post_time = $last_poster = $last_poster_url = $last_post_url = '';
+ }
+
+ $template->assign_block_vars('forumrow', array(
+ 'FORUM_ID' => $forum_id,
+ 'FORUM_FOLDER_IMG' => $user->img($folder_image, $folder_alt),
+ 'FORUM_NAME' => $row['forum_name'],
+ 'LAST_POST_IMG' => $user->img('icon_post_latest', 'VIEW_LATEST_POST'),
+ 'LAST_POST_TIME' => $last_post_time,
+ 'LAST_POST_AUTHOR' => $last_poster,
+
+ 'U_LAST_POST_AUTHOR'=> $last_poster_url,
+ 'U_LAST_POST' => $last_post_url,
+ 'U_VIEWFORUM' => "viewforum.$phpEx$SID&f=" . $row['forum_id'],
+
+ 'S_ROW_COUNT' => $i++)
+ );
+ }
+ $db->sql_freeresult($result);
+
+
+ // Subscribed Topics
+ $sql_t_tracking = ($config['load_db_lastread'] || $config['load_db_track']) ? 'LEFT JOIN ' . TOPICS_TRACK_TABLE . ' tt ON (tt.topic_id = t.topic_id AND tt.user_id = ' . $user->data['user_id'] . ')' : '';
+ $sql_f_tracking = ($config['load_db_lastread']) ? 'LEFT JOIN ' . FORUMS_TRACK_TABLE . ' ft ON (ft.forum_id = t.forum_id AND ft.user_id = ' . $user->data['user_id'] . ')' : '';
+
+ $sql_t_select = ($config['load_db_lastread'] || $config['load_db_track']) ? ', tt.mark_type, tt.mark_time' : '';
+ $sql_f_select = ($config['load_db_lastread']) ? ', ft.mark_time AS forum_mark_time' : '';
+
+ $sql = "SELECT t.* $sql_f_select $sql_t_select
+ FROM ((" . TOPICS_TABLE . " t
+ $sql_f_tracking) $sql_t_tracking), " . TOPICS_WATCH_TABLE . ' tw
+ WHERE tw.user_id = ' . $user->data['user_id'] . '
+ AND t.topic_id = tw.topic_id
+ ORDER BY t.topic_last_post_time DESC';
+ $result = $db->sql_query_limit($sql, $config['topics_per_page']);
+
+ $i = 0;
+ while ($row = $db->sql_fetchrow($result))
+ {
+ $forum_id = $row['forum_id'];
+ $topic_id = $row['topic_id'];
+
+ // Goto message generation
+ $replies = ($auth->acl_get('m_approve')) ? $row['topic_replies_real'] : $row['topic_replies'];
+
+ $topic_type = '';
+ switch ($row['topic_type'])
+ {
+ case POST_ANNOUNCE:
+ $topic_type = $user->lang['VIEW_TOPIC_ANNOUNCEMENT'];
+ $folder = 'folder_announce';
+ $folder_new = 'folder_announce_new';
+ break;
+
+ case POST_STICKY:
+ $topic_type = $user->lang['VIEW_TOPIC_STICKY'];
+ $folder = 'folder_sticky';
+ $folder_new = 'folder_sticky_new';
+ break;
+
+ default:
+ if ($replies >= intval($config['hot_threshold']))
+ {
+ $folder = 'folder_hot';
+ $folder_new = 'folder_hot_new';
+ }
+ else
+ {
+ $folder = 'folder';
+ $folder_new = 'folder_new';
+ }
+ break;
+ }
+
+ if ($row['topic_status'] == ITEM_LOCKED)
+ {
+ $topic_type = $user->lang['VIEW_TOPIC_LOCKED'];
+ $folder = 'folder_locked';
+ $folder_new = 'folder_locked_new';
+ }
+
+ $unread_topic = ($user->data['user_id'] != ANONYMOUS) ? true : false;
+ if ($user->data['user_id'] != ANONYMOUS)
+ {
+ $topic_check = (!$config['load_db_lastread']) ? $tracking_topics[$topic_id] : $row['mark_time'];
+ $forum_check = (!$config['load_db_lastread']) ? $tracking_forums[$forum_id] : $row['forum_mark_time'];
+
+ if ($topic_check > $row['topic_last_post_time'] || $forum_check > $row['topic_last_post_time'])
+ {
+ $unread_topic = false;
+ }
+ }
+
+ $newest_post_img = ($unread_topic) ? "" . $user->img('icon_post_newest', 'VIEW_NEWEST_POST') . ' ' : '';
+ $folder_img = ($unread_topic) ? $folder_new : $folder;
+ $folder_alt = ($unread_topic) ? 'NEW_POSTS' : (($row['topic_status'] == ITEM_LOCKED) ? 'TOPIC_LOCKED' : 'NO_NEW_POSTS');
+
+ // Posted image?
+ if (!empty($row['mark_type']))
+ {
+ $folder_img .= '_posted';
+ }
+
+ if (($replies + 1) > intval($config['posts_per_page']))
+ {
+ $total_pages = ceil(($replies + 1) / intval($config['posts_per_page']));
+ $goto_page = ' [ ' . $user->img('icon_post', 'GOTO_PAGE') . $user->lang['GOTO_PAGE'] . ': ';
+
+ $times = 1;
+ for($j = 0; $j < $replies + 1; $j += intval($config['posts_per_page']))
+ {
+ $goto_page .= "$times";
+ if ($times == 1 && $total_pages > 4)
+ {
+ $goto_page .= ' ... ';
+ $times = $total_pages - 3;
+ $j += ($total_pages - 4) * intval($config['posts_per_page']);
+ }
+ else if ($times < $total_pages)
+ {
+ $goto_page .= ', ';
+ }
+ $times++;
+ }
+ $goto_page .= ' ] ';
+ }
+ else
+ {
+ $goto_page = '';
+ }
+
+ $view_topic_url = "viewtopic.$phpEx$SID&f=$forum_id&t=$topic_id";
+
+ $last_post_img = "' . $user->img('icon_post_latest', 'VIEW_LATEST_POST') . '';
+
+ $last_post_author = ($row['topic_last_poster_id'] == ANONYMOUS) ? (($row['topic_last_poster_name'] != '') ? $row['topic_last_poster_name'] . ' ' : $user->lang['GUEST'] . ' ') : "' . $row['topic_last_poster_name'] . '';
+
+ $template->assign_block_vars('topicrow', array(
+ 'FORUM_ID' => $forum_id,
+ 'TOPIC_ID' => $topic_id,
+ 'LAST_POST_TIME' => $user->format_date($row['topic_last_post_time']),
+ 'LAST_POST_AUTHOR' => $last_post_author,
+ 'GOTO_PAGE' => $goto_page,
+ 'TOPIC_TITLE' => (!empty($censors)) ? preg_replace($censors['match'], $censors['replace'], $row['topic_title']) : $row['topic_title'],
+ 'TOPIC_TYPE' => $topic_type,
+
+ 'LAST_POST_IMG' => $last_post_img,
+ 'NEWEST_POST_IMG' => $newest_post_img,
+ 'TOPIC_FOLDER_IMG' => $user->img($folder_img, $folder_alt),
+ 'ATTACH_ICON_IMG' => ($auth->acl_get('f_download', $forum_id) && $row['topic_attachment']) ? $user->img('icon_attach', '') : '',
+
+ 'S_ROW_COUNT' => $i++,
+ 'S_USER_POSTED' => (!empty($row['mark_type'])) ? true : false,
+
+ 'U_VIEW_TOPIC' => $view_topic_url)
+ );
+ }
+ $db->sql_freeresult($result);
+
+ break;
+ }
+
+
+ $template->assign_vars(array(
+ 'L_TITLE' => $user->lang['UCP_' . strtoupper($submode)],
+
+ 'S_DISPLAY_MARK_ALL' => ($submode == 'watched') ? true : false,
+ 'S_DISPLAY_' . strtoupper($submode) => true,
+ 'S_HIDDEN_FIELDS' => $s_hidden_fields,
+ 'S_UCP_ACTION' => "ucp.$phpEx$SID&i=$id&mode=$submode")
+ );
+
+ $this->display($user->lang['UCP_MAIN'], 'ucp_main.html');
+ }
+}
+
+?>
\ No newline at end of file
diff --git a/phpBB/includes/ucp/ucp_pm.php b/phpBB/includes/ucp/ucp_pm.php
new file mode 100644
index 0000000000..6716147d6c
--- /dev/null
+++ b/phpBB/includes/ucp/ucp_pm.php
@@ -0,0 +1,1899 @@
+lang['PM_disabled']);
+ }
+
+ $html_entities_match = array('#', '#<#', '#>#');
+ $html_entities_replace = array('&', '<', '>');
+
+ // Parameters
+ $submit = (isset($_POST['post'])) ? TRUE : 0;
+ $submit_search = (isset($_POST['usersubmit'])) ? TRUE : 0;
+ $submit_msgdays = (isset($_POST['submit_msgdays'])) ? TRUE : 0;
+ $cancel = (isset($_POST['cancel'])) ? TRUE : 0;
+ $preview = (isset($_POST['preview'])) ? TRUE : 0;
+ $confirm = (isset($_POST['confirm'])) ? TRUE : 0;
+ $delete = (isset($_POST['delete'])) ? TRUE : 0;
+ $delete_all = (isset($_POST['deleteall'])) ? TRUE : 0;
+
+ $refresh = $preview || $submit_search;
+
+ $mark_list = (!empty($_POST['mark'])) ? $_POST['mark'] : 0;
+
+ if (isset($_POST['folder']) || isset($_GET['folder']))
+ {
+ $folder = (isset($_POST['folder'])) ? $_POST['folder'] : $_GET['folder'];
+
+ if ($folder != 'inbox' && $folder != 'outbox' && $folder != 'sentbox' && $folder != 'savebox')
+ {
+ $folder = 'inbox';
+ }
+ }
+ else
+ {
+ $folder = 'inbox';
+ }
+
+ // Cancel
+ if ($cancel)
+ {
+ redirect("privmsg.$phpEx$SIDfolder=$folder");
+ }
+
+
+ // Var definitions
+ if (!empty($_POST['mode']) || !empty($_GET['mode']))
+ {
+ $mode = (!empty($_POST['mode'])) ? $_POST['mode'] : $_GET['mode'];
+ }
+ else
+ {
+ $mode = '';
+ }
+
+ $start = (!empty($_GET['start'])) ? intval($_GET['start']) : 0;
+
+ if (isset($_POST['p']) || isset($_GET['p']))
+ {
+ $privmsg_id = (isset($_POST['p'])) ? intval($_POST['p']) : intval($_GET['p']);
+ }
+ else
+ {
+ $privmsg_id = '';
+ }
+
+ $error = FALSE;
+
+ //
+ // Define the box image links
+ //
+ $inbox_img = ($folder != 'inbox' || $mode != '') ? '
' : '
';
+ $inbox_url = ($folder != 'inbox' || $mode != '') ? '' . $lang['Inbox'] . '' : $lang['Inbox'];
+
+ $outbox_img = ($folder != 'outbox' || $mode != '') ? '
' : '
';
+ $outbox_url = ($folder != 'outbox' || $mode != '') ? '' . $lang['Outbox'] . '' : $lang['Outbox'];
+
+ $sentbox_img = ($folder != 'sentbox' || $mode != '') ? '
' : '
';
+ $sentbox_url = ($folder != 'sentbox' || $mode != '') ? '' . $lang['Sentbox'] . '' : $lang['Sentbox'];
+
+ $savebox_img = ($folder != 'savebox' || $mode != '') ? '
' : '
';
+ $savebox_url = ($folder != 'savebox' || $mode != '') ? '' . $lang['Savebox'] . '' : $lang['Savebox'];
+
+ // ----------
+ // Start main
+ //
+ if ($mode == 'newpm')
+ {
+ $gen_simple_header = TRUE;
+
+ $page_title = $lang['Private_Messaging'];
+ include($phpbb_root_path . 'includes/page_header.'.$phpEx);
+
+ $template->set_filenames(array(
+ 'body' => 'privmsgs_popup.tpl')
+ );
+
+ if ($userdata['user_id'])
+ {
+ if ($userdata['user_new_privmsg'])
+ {
+ $l_new_message = ($userdata['user_new_privmsg'] == 1) ? $lang['You_new_pm'] : $lang['You_new_pms'];
+ }
+ else
+ {
+ $l_new_message = $lang['You_no_new_pm'];
+ }
+
+ $l_new_message .= '
' . sprintf($lang['Click_view_privmsg'], '', '');
+ }
+ else
+ {
+ $l_new_message = $lang['Login_check_pm'];
+ }
+
+ $template->assign_vars(array(
+ 'L_CLOSE_WINDOW' => $lang['Close_window'],
+ 'L_MESSAGE' => $l_new_message)
+ );
+
+ $template->pparse('body');
+
+ include($phpbb_root_path . 'includes/page_tail.'.$phpEx);
+
+ }
+ else if ($mode == 'read')
+ {
+ if (!empty($_GET['p']))
+ {
+ $privmsgs_id = intval($_GET['p']);
+ }
+ else
+ {
+ message_die(MESSAGE, $lang['No_post_id']);
+ }
+
+ if (!$userdata['user_id'])
+ {
+ $header_location = (@preg_match('/Microsoft|WebSTAR|Xitami/', getenv('SERVER_SOFTWARE'))) ? 'Refresh: 0; URL=' : 'Location: ';
+ header($header_location . append_sid("login.$phpEx?redirect=privmsg.$phpEx&folder=$folder&mode=$mode&" . POST_POST_URL . "=$privmsgs_id", true));
+ }
+
+ //
+ // SQL to pull appropriate message, prevents nosey people
+ // reading other peoples messages ... hopefully!
+ //
+ switch($folder)
+ {
+ case 'inbox':
+ $l_box_name = $lang['Inbox'];
+ $pm_sql_user = "AND pm.privmsgs_to_userid = " . $userdata['user_id'] . "
+ AND (pm.privmsgs_type = " . PRIVMSGS_READ_MAIL . "
+ OR pm.privmsgs_type = " . PRIVMSGS_NEW_MAIL . "
+ OR pm.privmsgs_type = " . PRIVMSGS_UNREAD_MAIL . ")";
+ break;
+ case 'outbox':
+ $l_box_name = $lang['Outbox'];
+ $pm_sql_user = "AND pm.privmsgs_from_userid = " . $userdata['user_id'] . "
+ AND (pm.privmsgs_type = " . PRIVMSGS_NEW_MAIL . "
+ OR pm.privmsgs_type = " . PRIVMSGS_UNREAD_MAIL . ") ";
+ break;
+ case 'sentbox':
+ $l_box_name = $lang['Sentbox'];
+ $pm_sql_user = "AND pm.privmsgs_from_userid = " . $userdata['user_id'] . "
+ AND pm.privmsgs_type = " . PRIVMSGS_SENT_MAIL;
+ break;
+ case 'savebox':
+ $l_box_name = $lang['Savebox'];
+ $pm_sql_user .= "AND ((pm.privmsgs_to_userid = " . $userdata['user_id'] . "
+ AND pm.privmsgs_type = " . PRIVMSGS_SAVED_IN_MAIL . ")
+ OR (pm.privmsgs_from_userid = " . $userdata['user_id'] . "
+ AND pm.privmsgs_type = " . PRIVMSGS_SAVED_OUT_MAIL . ")
+ )";
+ break;
+ default:
+ message_die(MESSAGE, $lang['No_such_folder']);
+ break;
+ }
+
+ //
+ // Major query obtains the message ...
+ //
+ $sql = "SELECT u.username AS username_1, u.user_id AS user_id_1, u2.username AS username_2, u2.user_id AS user_id_2, u.user_sig_bbcode_uid, u.user_posts, u.user_from, u.user_website, u.user_email, u.user_icq, u.user_aim, u.user_yim, u.user_regdate, u.user_msnm, u.user_viewemail, u.user_rank, u.user_sig, u.user_avatar, pm.*, pmt.privmsgs_bbcode_uid, pmt.privmsgs_text
+ FROM " . PRIVMSGS_TABLE . " pm, " . PRIVMSGS_TEXT_TABLE . " pmt, " . USERS_TABLE . " u, " . USERS_TABLE . " u2
+ WHERE pm.privmsgs_id = $privmsgs_id
+ AND pmt.privmsgs_text_id = pm.privmsgs_id
+ $pm_sql_user
+ AND u.user_id = pm.privmsgs_from_userid
+ AND u2.user_id = pm.privmsgs_to_userid";
+ $result = $db->sql_query($sql);
+
+ //
+ // Did the query return any data?
+ //
+ if (!($privmsg = $db->sql_fetchrow($result)))
+ {
+ $header_location = (@preg_match('/Microsoft|WebSTAR|Xitami/', getenv('SERVER_SOFTWARE'))) ? 'Refresh: 0; URL=' : 'Location: ';
+ header($header_location . append_sid("privmsg.$phpEx?folder=$folder", true));
+ }
+
+ $privmsg_id = $privmsg['privmsgs_id'];
+
+ //
+ // Is this a new message in the inbox? If it is then save
+ // a copy in the posters sent box
+ //
+ if (($privmsg['privmsgs_type'] == PRIVMSGS_NEW_MAIL || $privmsg['privmsgs_type'] == PRIVMSGS_UNREAD_MAIL) && $folder == 'inbox')
+ {
+ $sql = "UPDATE " . PRIVMSGS_TABLE . "
+ SET privmsgs_type = " . PRIVMSGS_READ_MAIL . "
+ WHERE privmsgs_id = " . $privmsg['privmsgs_id'];
+ $db->sql_query($sql);
+
+ $sql = "UPDATE " . USERS_TABLE . "
+ SET user_unread_privmsg = user_unread_privmsg - 1
+ WHERE user_id = " . $userdata['user_id'];
+ $db->sql_query($sql);
+
+ //
+ // Check to see if the poster has a 'full' sent box
+ //
+ $sql = "SELECT COUNT(privmsgs_id) AS sent_items, MIN(privmsgs_date) AS oldest_post_time
+ FROM " . PRIVMSGS_TABLE . "
+ WHERE privmsgs_type = " . PRIVMSGS_SENT_MAIL . "
+ AND privmsgs_from_userid = " . $privmsg['privmsgs_from_userid'];
+ $result = $db->sql_query($sql);
+
+ $sql_priority = (SQL_LAYER == 'mysql') ? 'LOW_PRIORITY' : '';
+
+ if ($sent_info = $db->sql_fetchrow($result))
+ {
+ if ($sent_info['sent_items'] >= $config['max_sentbox_privmsgs'])
+ {
+ $sql = "DELETE $sql_priority FROM " . PRIVMSGS_TABLE . "
+ WHERE privmsgs_type = " . PRIVMSGS_SENT_MAIL . "
+ AND privmsgs_date = " . $sent_info['oldest_post_time'] . "
+ AND privmsgs_from_userid = " . $privmsg['privmsgs_from_userid'];
+ $db->sql_query($sql);
+ }
+ }
+
+ //
+ // This makes a copy of the post and stores it as a SENT message from the sendee. Perhaps
+ // not the most DB friendly way but a lot easier to manage, besides the admin will be able to
+ // set limits on numbers of storable posts for users ... hopefully!
+ //
+ $sql = "INSERT $sql_priority INTO " . PRIVMSGS_TABLE . " (privmsgs_type, privmsgs_subject, privmsgs_from_userid, privmsgs_to_userid, privmsgs_date, privmsgs_ip, privmsgs_enable_html, privmsgs_enable_bbcode, privmsgs_enable_smilies, privmsgs_attach_sig)
+ VALUES (" . PRIVMSGS_SENT_MAIL . ", '" . str_replace("\'", "''", addslashes($privmsg['privmsgs_subject'])) . "', " . $privmsg['privmsgs_from_userid'] . ", " . $privmsg['privmsgs_to_userid'] . ", " . $privmsg['privmsgs_date'] . ", '" . $privmsg['privmsgs_ip'] . "', " . $privmsg['privmsgs_enable_html'] . ", " . $privmsg['privmsgs_enable_bbcode'] . ", " . $privmsg['privmsgs_enable_smilies'] . ", " . $privmsg['privmsgs_attach_sig'] . ")";
+ $db->sql_query($sql);
+
+ $privmsg_sent_id = $db->sql_nextid();
+
+ $sql = "INSERT $sql_priority INTO " . PRIVMSGS_TEXT_TABLE . " (privmsgs_text_id, privmsgs_bbcode_uid, privmsgs_text)
+ VALUES ($privmsg_sent_id, '" . $privmsg['privmsgs_bbcode_uid'] . "', '" . str_replace("\'", "''", addslashes($privmsg['privmsgs_text'])) . "')";
+ $db->sql_query($sql);
+ }
+
+ //
+ // Pick a folder, any folder, so long as it's one below ...
+ //
+ $post_urls = array(
+ 'post' => append_sid("privmsg.$phpEx?mode=post"),
+ 'reply' => append_sid("privmsg.$phpEx?mode=reply&" . POST_POST_URL . "=$privmsg_id"),
+ 'quote' => append_sid("privmsg.$phpEx?mode=quote&" . POST_POST_URL . "=$privmsg_id"),
+ 'edit' => append_sid("privmsg.$phpEx?mode=edit&" . POST_POST_URL . "=$privmsg_id")
+ );
+ $post_icons = array(
+ 'post_img' => '
',
+ 'post' => '' . $lang['Post_new_pm'] . '',
+ 'reply_img' => '
',
+ 'reply' => '' . $lang['Post_reply_pm'] . '',
+ 'quote_img' => '
',
+ 'quote' => '' . $lang['Post_quote_pm'] . '',
+ 'edit_img' => '
',
+ 'edit' => '' . $lang['Edit_pm'] . ''
+ );
+
+ if ($folder == 'inbox')
+ {
+ $post_img = $post_icons['post_img'];
+ $reply_img = $post_icons['reply_img'];
+ $quote_img = $post_icons['quote_img'];
+ $edit_img = '';
+ $post = $post_icons['post'];
+ $reply = $post_icons['reply'];
+ $quote = $post_icons['quote'];
+ $edit = '';
+ $l_box_name = $lang['Inbox'];
+ }
+ else if ($folder == 'outbox')
+ {
+ $post_img = $post_icons['post_img'];
+ $reply_img = '';
+ $quote_img = '';
+ $edit_img = $post_icons['edit_img'];
+ $post = $post_icons['post'];
+ $reply = '';
+ $quote = '';
+ $edit = $post_icons['edit'];
+ $l_box_name = $lang['Outbox'];
+ }
+ else if ($folder == 'savebox')
+ {
+ if ($privmsg['privmsgs_type'] == PRIVMSGS_SAVED_IN_MAIL)
+ {
+ $post_img = $post_icons['post_img'];
+ $reply_img = $post_icons['reply_img'];
+ $quote_img = $post_icons['quote_img'];
+ $edit_img = '';
+ $post = $post_icons['post'];
+ $reply = $post_icons['reply'];
+ $quote = $post_icons['quote'];
+ $edit = '';
+ }
+ else
+ {
+ $post_img = $post_icons['post_img'];
+ $reply_img = '';
+ $quote_img = '';
+ $edit_img = '';
+ $post = $post_icons['post'];
+ $reply = '';
+ $quote = '';
+ $edit = '';
+ }
+ $l_box_name = $lang['Saved'];
+ }
+ else if ($folder == 'sentbox')
+ {
+ $post_img = $post_icons['post_img'];
+ $reply_img = '';
+ $quote_img = '';
+ $edit_img = '';
+ $post = $post_icons['post'];
+ $reply = '';
+ $quote = '';
+ $edit = '';
+ $l_box_name = $lang['Sent'];
+ }
+
+ $s_hidden_fields = '';
+
+ $page_title = $lang['Read_private_message'];
+ include($phpbb_root_path . 'includes/page_header.'.$phpEx);
+
+ //
+ // Load templates
+ //
+ $template->set_filenames(array(
+ 'body' => 'privmsgs_read_body.tpl')
+ );
+ make_jumpbox('viewforum.'.$phpEx);
+
+ $template->assign_vars(array(
+ 'INBOX_IMG' => $inbox_img,
+ 'SENTBOX_IMG' => $sentbox_img,
+ 'OUTBOX_IMG' => $outbox_img,
+ 'SAVEBOX_IMG' => $savebox_img,
+ 'INBOX' => $inbox_url,
+
+ 'POST_PM_IMG' => $post_img,
+ 'REPLY_PM_IMG' => $reply_img,
+ 'EDIT_PM_IMG' => $edit_img,
+ 'QUOTE_PM_IMG' => $quote_img,
+ 'POST_PM' => $post,
+ 'REPLY_PM' => $reply,
+ 'EDIT_PM' => $edit,
+ 'QUOTE_PM' => $quote,
+
+ 'SENTBOX' => $sentbox_url,
+ 'OUTBOX' => $outbox_url,
+ 'SAVEBOX' => $savebox_url,
+
+ 'BOX_NAME' => $l_box_name,
+
+ 'L_INBOX' => $lang['Inbox'],
+ 'L_OUTBOX' => $lang['Outbox'],
+ 'L_SENTBOX' => $lang['Sent'],
+ 'L_SAVEBOX' => $lang['Saved'],
+ 'L_FLAG' => $lang['Flag'],
+ 'L_SUBJECT' => $lang['Subject'],
+ 'L_POSTED' => $lang['Posted'],
+ 'L_DATE' => $lang['Date'],
+ 'L_FROM' => $lang['From'],
+ 'L_TO' => $lang['To'],
+ 'L_SAVE_MSG' => $lang['Save_message'],
+ 'L_DELETE_MSG' => $lang['Delete_message'],
+
+ 'S_PRIVMSGS_ACTION' => append_sid("privmsg.$phpEx?folder=$folder"),
+ 'S_HIDDEN_FIELDS' => $s_hidden_fields)
+ );
+
+ $username_from = $privmsg['username_1'];
+ $user_id_from = $privmsg['user_id_1'];
+ $username_to = $privmsg['username_2'];
+ $user_id_to = $privmsg['user_id_2'];
+
+ $post_date = $user->format_date($privmsg['privmsgs_date']);
+
+ $temp_url = append_sid("ucp.$phpEx?mode=viewprofile&u=$user_id_from");
+ $profile_img = '
';
+ $profile = '' . $lang['Read_profile'] . '';
+
+ $temp_url = append_sid("privmsg.$phpEx?mode=post&u=$poster_id");
+ $pm_img = '
';
+ $pm = '' . $lang['Send_private_message'] . '';
+
+ if (!empty($privmsg['user_viewemail']) || $auth->acl_get('a_'))
+ {
+ $email_uri = ($config['board_email_form']) ? append_sid("ucp.$phpEx?mode=email&u$user_id_from") : 'mailto:' . $privmsg['user_email'];
+
+ $email_img = '
';
+ $email = '' . $lang['Send_email'] . '';
+ }
+ else
+ {
+ $email_img = '';
+ $email = '';
+ }
+
+ $www_img = ($privmsg['user_website']) ? '
' : '';
+ $www = ($privmsg['user_website']) ? '' . $lang['Visit_website'] . '' : '';
+
+ if (!empty($privmsg['user_icq']))
+ {
+ $icq_status_img = '
';
+ $icq_img = '
';
+ $icq = '' . $lang['ICQ'] . '';
+ }
+ else
+ {
+ $icq_status_img = '';
+ $icq_img = '';
+ $icq = '';
+ }
+
+ $aim_img = ($privmsg['user_aim']) ? '
' : '';
+ $aim = ($privmsg['user_aim']) ? '' . $lang['AIM'] . '' : '';
+
+ $temp_url = append_sid("ucp.$phpEx?mode=viewprofile&u=$poster_id");
+ $msn_img = ($privmsg['user_msnm']) ? '
' : '';
+ $msn = ($privmsg['user_msnm']) ? '' . $lang['MSNM'] . '' : '';
+
+ $yim_img = ($privmsg['user_yim']) ? '
' : '';
+ $yim = ($privmsg['user_yim']) ? '' . $lang['YIM'] . '' : '';
+
+ $temp_url = append_sid("search.$phpEx?search_author=" . urlencode($username_from) . "&showresults=posts");
+ $search_img = '
';
+ $search = '' . $lang['Search_user_posts'] . '';
+
+ //
+ // Processing of post
+ //
+ $post_subject = $privmsg['privmsgs_subject'];
+
+ $private_message = $privmsg['privmsgs_text'];
+ $bbcode_uid = $privmsg['privmsgs_bbcode_uid'];
+
+ if ($config['allow_sig'])
+ {
+ $user_sig = ($privmsg['privmsgs_from_userid'] == $userdata['user_id']) ? $userdata['user_sig'] : $privmsg['user_sig'];
+ }
+ else
+ {
+ $user_sig = '';
+ }
+
+ $user_sig_bbcode_uid = ($privmsg['privmsgs_from_userid'] == $userdata['user_id']) ? $userdata['user_sig_bbcode_uid'] : $privmsg['user_sig_bbcode_uid'];
+
+ //
+ // If the board has HTML off but the post has HTML
+ // on then we process it, else leave it alone
+ //
+ if (!$config['allow_html'])
+ {
+ if ($user_sig != '' && $privmsg['privmsgs_enable_sig'] && $userdata['user_allowhtml'])
+ {
+ $user_sig = preg_replace('#(<)([\/]?.*?)(>)#is', "<\\2>", $user_sig);
+ }
+
+ if ($privmsg['privmsgs_enable_html'])
+ {
+ $private_message = preg_replace('#(<)([\/]?.*?)(>)#is', "<\\2>", $private_message);
+ }
+ }
+
+ if ($user_sig != '' && $privmsg['privmsgs_attach_sig'] && $user_sig_bbcode_uid != '')
+ {
+ $user_sig = ($config['allow_bbcode']) ? bbencode_second_pass($user_sig, $user_sig_bbcode_uid) : preg_replace('/\:[0-9a-z\:]+\]/si', ']', $user_sig);
+ }
+
+ if ($bbcode_uid != '')
+ {
+ $private_message = ($config['allow_bbcode']) ? bbencode_second_pass($private_message, $bbcode_uid) : preg_replace('/\:[0-9a-z\:]+\]/si', ']', $private_message);
+ }
+
+ $private_message = make_clickable($private_message);
+
+ if ($privmsg['privmsgs_attach_sig'] && $user_sig != '')
+ {
+ $private_message .= '
_________________
' . make_clickable($user_sig);
+ }
+
+ if (count($censors['match']))
+ {
+ $post_subject = preg_replace($censors['match'], $censors['replace'], $post_subject);
+ $private_message = preg_replace($censors['match'], $censors['replace'], $private_message);
+ }
+
+ if ($config['allow_smilies'] && $privmsg['privmsgs_enable_smilies'])
+ {
+ $private_message = smilies_pass($private_message);
+ }
+
+ $private_message = nl2br($private_message);
+
+ //
+ // Dump it to the templating engine
+ //
+ $template->assign_vars(array(
+ 'MESSAGE_TO' => $username_to,
+ 'MESSAGE_FROM' => $username_from,
+ 'RANK_IMAGE' => $rank_image,
+ 'POSTER_JOINED' => $poster_joined,
+ 'POSTER_POSTS' => $poster_posts,
+ 'POSTER_FROM' => $poster_from,
+ 'POSTER_AVATAR' => $poster_avatar,
+ 'POST_SUBJECT' => $post_subject,
+ 'POST_DATE' => $post_date,
+ 'MESSAGE' => $private_message,
+
+ 'PROFILE_IMG' => $profile_img,
+ 'PROFILE' => $profile,
+ 'SEARCH_IMG' => $search_img,
+ 'SEARCH' => $search,
+ 'EMAIL_IMG' => $email_img,
+ 'EMAIL' => $email,
+ 'WWW_IMG' => $www_img,
+ 'WWW' => $www,
+ 'ICQ_STATUS_IMG' => $icq_status_img,
+ 'ICQ_IMG' => $icq_img,
+ 'ICQ' => $icq,
+ 'AIM_IMG' => $aim_img,
+ 'AIM' => $aim,
+ 'MSN_IMG' => $msn_img,
+ 'MSN' => $msn,
+ 'YIM_IMG' => $yim_img,
+ 'YIM' => $yim)
+ );
+
+ $template->pparse('body');
+
+ include($phpbb_root_path . 'includes/page_tail.'.$phpEx);
+
+ }
+ else if (($delete && $mark_list) || $delete_all)
+ {
+ if (!$userdata['user_id'])
+ {
+ $header_location = (@preg_match('/Microsoft|WebSTAR|Xitami/', getenv('SERVER_SOFTWARE'))) ? 'Refresh: 0; URL=' : 'Location: ';
+ header($header_location . append_sid("login.$phpEx?redirect=privmsg.$phpEx&folder=inbox", true));
+ }
+ if (isset($mark_list) && !is_array($mark_list))
+ {
+ // Set to empty array instead of '0' if nothing is selected.
+ $mark_list = array();
+ }
+
+ if (!$confirm)
+ {
+ $s_hidden_fields = '';
+ $s_hidden_fields .= (isset($_POST['delete'])) ? '' : '';
+
+ for($i = 0; $i < count($mark_list); $i++)
+ {
+ $s_hidden_fields .= '';
+ }
+
+ //
+ // Output confirmation page
+ //
+ include($phpbb_root_path . 'includes/page_header.'.$phpEx);
+
+ $template->set_filenames(array(
+ 'confirm_body' => 'confirm_body.tpl')
+ );
+ $template->assign_vars(array(
+ 'MESSAGE_TITLE' => $lang['Information'],
+ 'MESSAGE_TEXT' => (count($mark_list) == 1) ? $lang['Confirm_delete_pm'] : $lang['Confirm_delete_pms'],
+
+ 'L_YES' => $lang['Yes'],
+ 'L_NO' => $lang['No'],
+
+ 'S_CONFIRM_ACTION' => append_sid("privmsg.$phpEx?folder=$folder"),
+ 'S_HIDDEN_FIELDS' => $s_hidden_fields)
+ );
+
+ $template->pparse('confirm_body');
+
+ include($phpbb_root_path . 'includes/page_tail.'.$phpEx);
+
+ }
+ else if ($confirm)
+ {
+ if ($delete_all)
+ {
+ switch($folder)
+ {
+ case 'inbox':
+ $delete_type = "privmsgs_to_userid = " . $userdata['user_id'] . " AND (
+ privmsgs_type = " . PRIVMSGS_READ_MAIL . " OR privmsgs_type = " . PRIVMSGS_NEW_MAIL . " OR privmsgs_type = " . PRIVMSGS_UNREAD_MAIL . ")";
+ break;
+
+ case 'outbox':
+ $delete_type = "privmsgs_from_userid = " . $userdata['user_id'] . " AND (privmsgs_type = " . PRIVMSGS_NEW_MAIL . " OR privmsgs_type = " . PRIVMSGS_UNREAD_MAIL . ")";
+ break;
+
+ case 'sentbox':
+ $delete_type = "privmsgs_from_userid = " . $userdata['user_id'] . " AND privmsgs_type = " . PRIVMSGS_SENT_MAIL;
+ break;
+
+ case 'savebox':
+ $delete_type = "((privmsgs_from_userid = " . $userdata['user_id'] . "
+ AND privmsgs_type = " . PRIVMSGS_SAVED_OUT_MAIL . ")
+ OR (privmsgs_to_userid = " . $userdata['user_id'] . "
+ AND privmsgs_type = " . PRIVMSGS_SAVED_IN_MAIL . "))";
+ break;
+ }
+
+ $sql = "SELECT privmsgs_id
+ FROM " . PRIVMSGS_TABLE . "
+ WHERE $delete_type";
+ $result = $db->sql_query($sql);
+
+ while ($row = $db->sql_fetchrow($result))
+ {
+ $mark_list[] = $row['privmsgs_id'];
+ }
+
+ unset($delete_type);
+ }
+
+ if (count($mark_list))
+ {
+ $delete_sql_id = implode(', ', $mark_list);
+
+ // Need to decrement the new message counter of recipient
+ // problem is this doesn't affect the unread counter even
+ // though it may be the one that needs changing ... hhmmm
+ if ($folder == 'outbox')
+ {
+ $sql = "SELECT privmsgs_to_userid
+ FROM " . PRIVMSGS_TABLE . "
+ WHERE privmsgs_id IN ($delete_sql_id)
+ AND privmsgs_from_userid = " . $userdata['user_id'] . "
+ AND privmsgs_type = " . PRIVMSGS_NEW_MAIL;
+ $result = $db->sql_query($sql);
+
+ $update_pm_sql = '';
+ while($row = $db->sql_fetchrow($result))
+ {
+ $update_pm_sql .= (($update_pm_sql != '') ? ', ' : '') . $row['privmsgs_to_userid'];
+ }
+
+ if ($update_pm_sql != '')
+ {
+ $sql = "UPDATE " . USERS_TABLE . "
+ SET user_new_privmsg = user_new_privmsg - 1
+ WHERE user_id IN ($update_pm_sql)";
+ $db->sql_query($sql);
+ }
+
+ $sql = "SELECT privmsgs_to_userid
+ FROM " . PRIVMSGS_TABLE . "
+ WHERE privmsgs_id IN ($delete_sql_id)
+ AND privmsgs_from_userid = " . $userdata['user_id'] . "
+ AND privmsgs_type = " . PRIVMSGS_UNREAD_MAIL;
+ $result = $db->sql_query($sql);
+
+ $update_pm_sql = '';
+ while($row = $db->sql_fetchrow($result))
+ {
+ $update_pm_sql .= (($update_pm_sql != '') ? ', ' : '') . $row['privmsgs_to_userid'];
+ }
+
+ if ($update_pm_sql != '')
+ {
+ $sql = "UPDATE " . USERS_TABLE . "
+ SET user_unread_privmsg = user_unread_privmsg - 1
+ WHERE user_id IN ($update_pm_sql)";
+ $db->sql_query($sql);
+ }
+ }
+
+ $delete_text_sql = "DELETE FROM " . PRIVMSGS_TEXT_TABLE . "
+ WHERE privmsgs_text_id IN ($delete_sql_id)";
+ $delete_sql = "DELETE FROM " . PRIVMSGS_TABLE . "
+ WHERE privmsgs_id IN ($delete_sql_id)
+ AND ";
+
+ switch($folder)
+ {
+ case 'inbox':
+ $delete_sql .= "privmsgs_to_userid = " . $userdata['user_id'] . " AND (
+ privmsgs_type = " . PRIVMSGS_READ_MAIL . " OR privmsgs_type = " . PRIVMSGS_NEW_MAIL . " OR privmsgs_type = " . PRIVMSGS_UNREAD_MAIL . ")";
+ break;
+
+ case 'outbox':
+ $delete_sql .= "privmsgs_from_userid = " . $userdata['user_id'] . " AND (
+ privmsgs_type = " . PRIVMSGS_NEW_MAIL . " OR privmsgs_type = " . PRIVMSGS_UNREAD_MAIL . ")";
+ break;
+
+ case 'sentbox':
+ $delete_sql .= "privmsgs_from_userid = " . $userdata['user_id'] . " AND privmsgs_type = " . PRIVMSGS_SENT_MAIL;
+ break;
+
+ case 'savebox':
+ $delete_sql .= "((privmsgs_from_userid = " . $userdata['user_id'] . "
+ AND privmsgs_type = " . PRIVMSGS_SAVED_OUT_MAIL . ")
+ OR (privmsgs_to_userid = " . $userdata['user_id'] . "
+ AND privmsgs_type = " . PRIVMSGS_SAVED_IN_MAIL . "))";
+ break;
+ }
+
+ $db->sql_query($delete_sql);
+ $db->sql_query($delete_text_sql);
+ }
+ }
+ }
+ else if ($save && $mark_list && $folder != 'savebox' && $folder != 'outbox')
+ {
+ if (!$userdata['user_id'])
+ {
+ $header_location = (@preg_match('/Microsoft|WebSTAR|Xitami/', getenv('SERVER_SOFTWARE'))) ? 'Refresh: 0; URL=' : 'Location: ';
+ header($header_location . append_sid("login.$phpEx?redirect=privmsg.$phpEx&folder=inbox", true));
+ }
+
+ //
+ // See if recipient is at their savebox limit
+ //
+ $sql = "SELECT COUNT(privmsgs_id) AS savebox_items, MIN(privmsgs_date) AS oldest_post_time
+ FROM " . PRIVMSGS_TABLE . "
+ WHERE ((privmsgs_to_userid = " . $userdata['user_id'] . "
+ AND privmsgs_type = " . PRIVMSGS_SAVED_IN_MAIL . ")
+ OR (privmsgs_from_userid = " . $userdata['user_id'] . "
+ AND privmsgs_type = " . PRIVMSGS_SAVED_OUT_MAIL . "))";
+ $result = $db->sql_query($sql);
+
+ $sql_priority = (SQL_LAYER == 'mysql') ? 'LOW_PRIORITY' : '';
+
+ if ($saved_info = $db->sql_fetchrow($result))
+ {
+ if ($saved_info['savebox_items'] >= $config['max_savebox_privmsgs'])
+ {
+ $sql = "DELETE $sql_priority FROM " . PRIVMSGS_TABLE . "
+ WHERE ((privmsgs_to_userid = " . $userdata['user_id'] . "
+ AND privmsgs_type = " . PRIVMSGS_SAVED_IN_MAIL . ")
+ OR (privmsgs_from_userid = " . $userdata['user_id'] . "
+ AND privmsgs_type = " . PRIVMSGS_SAVED_OUT_MAIL . "))
+ AND privmsgs_date = " . $saved_info['oldest_post_time'];
+ $db->sql_query($sql);
+ }
+ }
+
+ //
+ // Process request
+ //
+ $saved_sql = "UPDATE " . PRIVMSGS_TABLE;
+
+ switch($folder)
+ {
+ case 'inbox':
+ $saved_sql .= " SET privmsgs_type = " . PRIVMSGS_SAVED_IN_MAIL . "
+ WHERE privmsgs_to_userid = " . $userdata['user_id'] . "
+ AND (privmsgs_type = " . PRIVMSGS_READ_MAIL . "
+ OR privmsgs_type = " . PRIVMSGS_NEW_MAIL . "
+ OR privmsgs_type = " . PRIVMSGS_UNREAD_MAIL . ")";
+ break;
+
+ case 'outbox':
+ $saved_sql .= " SET privmsgs_type = " . PRIVMSGS_SAVED_OUT_MAIL . "
+ WHERE privmsgs_from_userid = " . $userdata['user_id'] . "
+ AND (privmsgs_type = " . PRIVMSGS_NEW_MAIL . "
+ OR privmsgs_type = " . PRIVMSGS_UNERAD_MAIL . ") ";
+ break;
+
+ case 'sentbox':
+ $saved_sql .= " SET privmsgs_type = " . PRIVMSGS_SAVED_OUT_MAIL . "
+ WHERE privmsgs_from_userid = " . $userdata['user_id'] . "
+ AND privmsgs_type = " . PRIVMSGS_SENT_MAIL;
+ break;
+ }
+
+ if (count($mark_list))
+ {
+ $saved_sql_id = '';
+ for($i = 0; $i < count($mark_list); $i++)
+ {
+ $saved_sql_id .= (($saved_sql_id != '') ? ', ' : '') . $mark_list[$i];
+ }
+
+ $saved_sql .= " AND privmsgs_id IN ($saved_sql_id)";
+
+ $db->sql_query($saved_sql);
+ }
+
+ }
+ else if ($submit || $refresh || $mode != '')
+ {
+
+ if (!$userdata['user_id'])
+ {
+ $user_id = (isset($_GET['u'])) ? '&u=' . intval($_GET['u']) : '';
+ $header_location = (@preg_match('/Microsoft|WebSTAR|Xitami/', getenv('SERVER_SOFTWARE'))) ? 'Refresh: 0; URL=' : 'Location: ';
+ header($header_location . append_sid("login.$phpEx?redirect=privmsg.$phpEx&folder=$folder&mode=$mode" . $user_id, true));
+ }
+
+ //
+ // Toggles
+ //
+ if (!$config['allow_html'])
+ {
+ $html_on = 0;
+ }
+ else
+ {
+ $html_on = ($submit || $refresh) ? ((!empty($_POST['disable_html'])) ? 0 : TRUE) : $userdata['user_allowhtml'];
+ }
+
+ if (!$config['allow_bbcode'])
+ {
+ $bbcode_on = 0;
+ }
+ else
+ {
+ $bbcode_on = ($submit || $refresh) ? ((!empty($_POST['disable_bbcode'])) ? 0 : TRUE) : $userdata['user_allowbbcode'];
+ }
+
+ if (!$config['allow_smilies'])
+ {
+ $smilies_on = 0;
+ }
+ else
+ {
+ $smilies_on = ($submit || $refresh) ? ((!empty($_POST['disable_smilies'])) ? 0 : TRUE) : $userdata['user_allowsmile'];
+ }
+
+ $attach_sig = ($submit || $refresh) ? ((!empty($_POST['attach_sig'])) ? TRUE : 0) : $userdata['user_attachsig'];
+ $user_sig = ($userdata['user_sig'] != '' && $config['allow_sig']) ? $userdata['user_sig'] : "";
+
+ if ($submit && $mode != 'edit')
+ {
+ // Flood control
+ $sql = "SELECT MAX(privmsgs_date) AS last_post_time
+ FROM " . PRIVMSGS_TABLE . "
+ WHERE privmsgs_from_userid = " . $userdata['user_id'];
+ $result = $db->sql_query($sql);
+
+ $db_row = $db->sql_fetchrow($result);
+
+ $last_post_time = $db_row['last_post_time'];
+ $current_time = time();
+
+ if (($current_time - $last_post_time) < $config['flood_interval'])
+ {
+ message_die(MESSAGE, $lang['Flood_Error']);
+ }
+ // End Flood control
+ }
+
+ if ($submit)
+ {
+ if (!empty($_POST['username']))
+ {
+ $to_username = $_POST['username'];
+
+ $sql = "SELECT user_id, user_notify_pm, user_email, user_lang, user_active
+ FROM " . USERS_TABLE . "
+ WHERE username = '" . str_replace("\'", "''", $to_username) . "'
+ AND user_id <> " . ANONYMOUS;
+ if (!($result = $db->sql_query($sql)))
+ {
+ $error = TRUE;
+ $error_msg = $lang['No_such_user'];
+ }
+
+ $to_userdata = $db->sql_fetchrow($result);
+ }
+ else
+ {
+ $error = TRUE;
+ $error_msg .= ((!empty($error_msg)) ? '
' : '') . $lang['No_to_user'];
+ }
+
+ $privmsg_subject = trim(strip_tags($_POST['subject']));
+ if (empty($privmsg_subject))
+ {
+ $error = TRUE;
+ $error_msg .= ((!empty($error_msg)) ? '
' : '') . $lang['Empty_subject'];
+ }
+
+ if (!empty($_POST['message']))
+ {
+ if (!$error)
+ {
+ if ($bbcode_on)
+ {
+ $bbcode_uid = make_bbcode_uid();
+ }
+
+ $privmsg_message = prepare_message($_POST['message'], $html_on, $bbcode_on, $smilies_on, $bbcode_uid);
+
+ }
+ }
+ else
+ {
+ $error = TRUE;
+ $error_msg .= ((!empty($error_msg)) ? '
' : '') . $lang['Empty_message'];
+ }
+ }
+
+ if ($submit && !$error)
+ {
+ //
+ // Has admin prevented user from sending PM's?
+ //
+ if (!$userdata['user_allow_pm'])
+ {
+ $message = $lang['Cannot_send_privmsg'];
+ message_die(MESSAGE, $message);
+ }
+
+ $msg_time = time();
+
+ if ($mode != 'edit')
+ {
+ //
+ // See if recipient is at their inbox limit
+ //
+ $sql = "SELECT COUNT(privmsgs_id) AS inbox_items, MIN(privmsgs_date) AS oldest_post_time
+ FROM " . PRIVMSGS_TABLE . "
+ WHERE (privmsgs_type = " . PRIVMSGS_NEW_MAIL . "
+ OR privmsgs_type = " . PRIVMSGS_READ_MAIL . "
+ OR privmsgs_type = " . PRIVMSGS_UNREAD_MAIL . ")
+ AND privmsgs_to_userid = " . $to_userdata['user_id'];
+ $result = $db->sql_query($sql);
+
+ $sql_priority = (SQL_LAYER == 'mysql') ? 'LOW_PRIORITY' : '';
+
+ if ($inbox_info = $db->sql_fetchrow($result))
+ {
+ if ($inbox_info['inbox_items'] >= $config['max_inbox_privmsgs'])
+ {
+ $sql = "DELETE $sql_priority FROM " . PRIVMSGS_TABLE . "
+ WHERE (privmsgs_type = " . PRIVMSGS_NEW_MAIL . "
+ OR privmsgs_type = " . PRIVMSGS_READ_MAIL . "
+ OR privmsgs_type = " . PRIVMSGS_UNREAD_MAIL . " )
+ AND privmsgs_date = " . $inbox_info['oldest_post_time'] . "
+ AND privmsgs_to_userid = " . $to_userdata['user_id'];
+ $db->sql_query($sql);
+ }
+ }
+
+ $sql_info = "INSERT INTO " . PRIVMSGS_TABLE . " (privmsgs_type, privmsgs_subject, privmsgs_from_userid, privmsgs_to_userid, privmsgs_date, privmsgs_ip, privmsgs_enable_html, privmsgs_enable_bbcode, privmsgs_enable_smilies, privmsgs_attach_sig)
+ VALUES (" . PRIVMSGS_NEW_MAIL . ", '" . str_replace("\'", "''", $privmsg_subject) . "', " . $userdata['user_id'] . ", " . $to_userdata['user_id'] . ", $msg_time, '$user_ip', $html_on, $bbcode_on, $smilies_on, $attach_sig)";
+ }
+ else
+ {
+ $sql_info = "UPDATE " . PRIVMSGS_TABLE . "
+ SET privmsgs_type = " . PRIVMSGS_NEW_MAIL . ", privmsgs_subject = '" . str_replace("\'", "''", $privmsg_subject) . "', privmsgs_from_userid = " . $userdata['user_id'] . ", privmsgs_to_userid = " . $to_userdata['user_id'] . ", privmsgs_date = $msg_time, privmsgs_ip = '$user_ip', privmsgs_enable_html = $html_on, privmsgs_enable_bbcode = $bbcode_on, privmsgs_enable_smilies = $smilies_on, privmsgs_attach_sig = $attach_sig
+ WHERE privmsgs_id = $privmsg_id";
+ }
+
+ $db->sql_query($sql_info);
+
+ if ($mode != 'edit')
+ {
+ $privmsg_sent_id = $db->sql_nextid();
+
+ $sql = "INSERT INTO " . PRIVMSGS_TEXT_TABLE . " (privmsgs_text_id, privmsgs_bbcode_uid, privmsgs_text)
+ VALUES ($privmsg_sent_id, '" . $bbcode_uid . "', '" . str_replace("\'", "''", $privmsg_message) . "')";
+ }
+ else
+ {
+ $sql = "UPDATE " . PRIVMSGS_TEXT_TABLE . "
+ SET privmsgs_text = '" . str_replace("\'", "''", $privmsg_message) . "', privmsgs_bbcode_uid = '$bbcode_uid'
+ WHERE privmsgs_text_id = $privmsg_id";
+ }
+
+ $db->sql_query($sql);
+
+ if ($mode != 'edit')
+ {
+ //
+ // Add to the users new pm counter
+ //
+ $sql = "UPDATE " . USERS_TABLE . "
+ SET user_new_privmsg = user_new_privmsg + 1, user_last_privmsg = " . time() . "
+ WHERE user_id = " . $to_userdata['user_id'];
+ if (!$status = $db->sql_query($sql))
+ {
+ message_die(GENERAL_ERROR, 'Could not update private message new/read status for user', '', __LINE__, __FILE__, $sql);
+ }
+
+ if ($to_userdata['user_notify_pm'] && !empty($to_userdata['user_email']) && $to_userdata['user_active'])
+ {
+ $email_headers = 'From: ' . $config['board_email'] . "\nReturn-Path: " . $config['board_email'] . "\r\n";
+
+ $script_name = preg_replace('/^\/?(.*?)\/?$/', "\\1", trim($config['script_path']));
+ $script_name = ($script_name != '') ? $script_name . '/privmsg.'.$phpEx : 'privmsg.'.$phpEx;
+ $server_name = trim($config['server_name']);
+ $server_protocol = ($config['cookie_secure']) ? 'https://' : 'http://';
+ $server_port = ($config['server_port'] <> 80) ? ':' . trim($config['server_port']) . '/' : '/';
+
+ include($phpbb_root_path . 'includes/emailer.'.$phpEx);
+ $emailer = new emailer($config['smtp_delivery']);
+
+ $emailer->use_template('privmsg_notify', $to_userdata['user_lang']);
+ $emailer->extra_headers($email_headers);
+ $emailer->email_address($to_userdata['user_email']);
+ $emailer->set_subject(); //$lang['Notification_subject']
+
+ $emailer->assign_vars(array(
+ 'USERNAME' => $to_username,
+ 'SITENAME' => $config['sitename'],
+ 'EMAIL_SIG' => str_replace('
', "\n", "-- \n" . $config['board_email_sig']),
+
+ 'U_INBOX' => $server_protocol . $server_name . $server_port . $script_name . '?folder=inbox')
+ );
+
+ $emailer->send();
+ $emailer->reset();
+ }
+ }
+
+ $template->assign_vars(array(
+ 'META' => '')
+ );
+
+ $msg = $lang['Message_sent'] . '
' . sprintf($lang['Click_return_inbox'], '', ' ') . '
' . sprintf($lang['Click_return_index'], '', '');
+
+ message_die(GMESSAGE, $msg);
+ }
+ else if ($preview || $refresh || $error)
+ {
+
+ //
+ // If we're previewing or refreshing then obtain the data
+ // passed to the script, process it a little, do some checks
+ // where neccessary, etc.
+ //
+ $to_username = (isset($_POST['username'])) ? trim(strip_tags(stripslashes($_POST['username']))) : '';
+ $privmsg_subject = (isset($_POST['subject'])) ? trim(strip_tags(stripslashes($_POST['subject']))) : '';
+ $privmsg_message = (isset($_POST['message'])) ? trim($_POST['message']) : '';
+ $privmsg_message = preg_replace('##si', '</textarea>', $privmsg_message);
+
+ $user_sig = ( $config['allow_sig']) ? $privmsg['user_sig'] : '';
+
+ $to_username = $privmsg['username'];
+ $to_userid = $privmsg['user_id'];
+
+ }
+ else if ($mode == 'reply' || $mode == 'quote')
+ {
+
+ $sql = "SELECT pm.privmsgs_subject, pm.privmsgs_date, pmt.privmsgs_bbcode_uid, pmt.privmsgs_text, u.username, u.user_id
+ FROM " . PRIVMSGS_TABLE . " pm, " . PRIVMSGS_TEXT_TABLE . " pmt, " . USERS_TABLE . " u
+ WHERE pm.privmsgs_id = $privmsg_id
+ AND pmt.privmsgs_text_id = pm.privmsgs_id
+ AND pm.privmsgs_to_userid = " . $userdata['user_id'] . "
+ AND u.user_id = pm.privmsgs_from_userid";
+ $result = $db->sql_query($sql);
+
+ if (!($privmsg = $db->sql_fetchrow($result)))
+ {
+ $header_location = (@preg_match('/Microsoft|WebSTAR|Xitami/', getenv('SERVER_SOFTWARE'))) ? 'Refresh: 0; URL=' : 'Location: ';
+ header($header_location . append_sid("privmsg.$phpEx?folder=$folder", true));
+ }
+
+ $privmsg_subject = ((!preg_match('/^Re:/', $privmsg['privmsgs_subject'])) ? 'Re: ' : '') . $privmsg['privmsgs_subject'];
+
+ $to_username = $privmsg['username'];
+ $to_userid = $privmsg['user_id'];
+
+ if ($mode == 'quote')
+ {
+ $privmsg_message = $privmsg['privmsgs_text'];
+ $privmsg_bbcode_uid = $privmsg['privmsgs_bbcode_uid'];
+
+ $privmsg_message = preg_replace("/\:(([a-z0-9]:)?)$privmsg_bbcode_uid/si", '', $privmsg_message);
+ $privmsg_message = str_replace('
', "\n", $privmsg_message);
+ $privmsg_message = preg_replace('##si', '</textarea>', $privmsg_message);
+
+ $msg_date = $user->format_date($privmsg['privmsgs_date']);
+
+ $privmsg_message = '[quote="' . $to_username . '"]' . $privmsg_message . '[/quote]';
+
+ $mode = 'reply';
+ }
+ }
+ }
+
+ //
+ // Has admin prevented user from sending PM's?
+ //
+ if (!$userdata['user_allow_pm'] && $mode != 'edit')
+ {
+ $message = $lang['Cannot_send_privmsg'];
+ message_die(MESSAGE, $message);
+ }
+
+ //
+ // Start output, first preview, then errors then post form
+ //
+ $page_title = $lang['Send_private_message'];
+ include($phpbb_root_path . 'includes/page_header.'.$phpEx);
+
+ if ($preview && !$error)
+ {
+ $censors = array();
+ obtain_word_list($censors);
+
+ if ($bbcode_on)
+ {
+ $bbcode_uid = make_bbcode_uid();
+ }
+
+ $preview_message = stripslashes(prepare_message($privmsg_message, $html_on, $bbcode_on, $smilies_on, $bbcode_uid));
+ $privmsg_message = stripslashes(preg_replace($html_entities_match, $html_entities_replace, $privmsg_message));
+
+ //
+ // Finalise processing as per viewtopic
+ //
+ if (!$html_on)
+ {
+ if ($user_sig != '' || !$userdata['user_allowhtml'])
+ {
+ $user_sig = preg_replace('#(<)([\/]?.*?)(>)#is', "<\\2>", $user_sig);
+ }
+ }
+
+ if ($attach_sig && $user_sig != '' && $userdata['user_sig_bbcode_uid'])
+ {
+ $user_sig = bbencode_second_pass($user_sig, $userdata['user_sig_bbcode_uid']);
+ }
+
+ if ($bbcode_on)
+ {
+ $preview_message = bbencode_second_pass($preview_message, $bbcode_uid);
+ }
+
+ if ($attach_sig && $user_sig != '')
+ {
+ $preview_message = $preview_message . '
_________________
' . $user_sig;
+ }
+
+ if (count($censors['match']))
+ {
+ $preview_subject = preg_replace($censors['match'], $censors['replace'], $privmsg_subject);
+ $preview_message = preg_replace($censors['match'], $censors['replace'], $preview_message);
+ }
+ else
+ {
+ $preview_subject = $privmsg_subject;
+ }
+
+ if ($smilies_on)
+ {
+ $preview_message = smilies_pass($preview_message);
+ }
+
+ $preview_message = make_clickable($preview_message);
+ $preview_message = nl2br($preview_message);
+
+ $s_hidden_fields = '';
+ $s_hidden_fields .= '';
+
+ if (isset($privmsg_id))
+ {
+ $s_hidden_fields .= '';
+ }
+
+ $template->set_filenames(array(
+ "preview" => 'privmsgs_preview.tpl')
+ );
+
+ $template->assign_vars(array(
+ 'TOPIC_TITLE' => $preview_subject,
+ 'POST_SUBJECT' => $preview_subject,
+ 'MESSAGE_TO' => $to_username,
+ 'MESSAGE_FROM' => $userdata['username'],
+ 'POST_DATE' => $user->date_format(time()),
+ 'MESSAGE' => $preview_message,
+
+ 'S_HIDDEN_FIELDS' => $s_hidden_fields,
+
+ 'L_SUBJECT' => $lang['Subject'],
+ 'L_DATE' => $lang['Date'],
+ 'L_FROM' => $lang['From'],
+ 'L_TO' => $lang['To'],
+ 'L_PREVIEW' => $lang['Preview'],
+ 'L_POSTED' => $lang['Posted'])
+ );
+
+ $template->assign_var_from_handle('POST_PREVIEW_BOX', 'preview');
+ }
+
+ //
+ // Start error handling
+ //
+ if ($error)
+ {
+ $template->set_filenames(array(
+ 'reg_header' => 'error_body.tpl')
+ );
+ $template->assign_vars(array(
+ 'ERROR_MESSAGE' => $error_msg)
+ );
+ $template->assign_var_from_handle('ERROR_BOX', 'reg_header');
+ }
+
+ //
+ // Load templates
+ //
+ $template->set_filenames(array(
+ 'body' => 'posting_body.tpl')
+ );
+ make_jumpbox('viewforum.'.$phpEx);
+
+ //
+ // Enable extensions in posting_body
+ //
+ $template->assign_block_vars('switch_privmsg', array());
+
+ //
+ // HTML toggle selection
+ //
+ if ($config['allow_html'])
+ {
+ $html_status = $lang['HTML_is_ON'];
+ $template->assign_block_vars('switch_html_checkbox', array());
+ }
+ else
+ {
+ $html_status = $lang['HTML_is_OFF'];
+ }
+
+ //
+ // BBCode toggle selection
+ //
+ if ($config['allow_bbcode'])
+ {
+ $bbcode_status = $lang['BBCode_is_ON'];
+ $template->assign_block_vars('switch_bbcode_checkbox', array());
+ }
+ else
+ {
+ $bbcode_status = $lang['BBCode_is_OFF'];
+ }
+
+ //
+ // Smilies toggle selection
+ //
+ if ($config['allow_smilies'])
+ {
+ $smilies_status = $lang['Smilies_are_ON'];
+ $template->assign_block_vars('switch_smilies_checkbox', array());
+ }
+ else
+ {
+ $smilies_status = $lang['Smilies_are_OFF'];
+ }
+
+ //
+ // Signature toggle selection - only show if
+ // the user has a signature
+ //
+ if ($user_sig != '')
+ {
+ $template->assign_block_vars('switch_signature_checkbox', array());
+ }
+
+ if ($mode == 'post')
+ {
+ $post_a = $lang['Send_a_new_message'];
+ }
+ else if ($mode == 'reply')
+ {
+ $post_a = $lang['Send_a_reply'];
+ $mode = 'post';
+ }
+ else if ($mode == 'edit')
+ {
+ $post_a = $lang['Edit_message'];
+ }
+
+ $s_hidden_fields = '';
+ $s_hidden_fields .= '';
+ if ($mode == 'edit')
+ {
+ $s_hidden_fields .= '';
+ }
+
+ //
+ // Send smilies to template
+ //
+ generate_smilies('inline', PAGE_PRIVMSGS);
+
+ $template->assign_vars(array(
+ 'SUBJECT' => preg_replace($html_entities_match, $html_entities_replace, $privmsg_subject),
+ 'USERNAME' => preg_replace($html_entities_match, $html_entities_replace, $to_username),
+ 'MESSAGE' => $privmsg_message,
+ 'HTML_STATUS' => $html_status,
+ 'SMILIES_STATUS' => $smilies_status,
+ 'BBCODE_STATUS' => sprintf($bbcode_status, '', ''),
+ 'FORUM_NAME' => $lang['Private_message'],
+
+ 'BOX_NAME' => $l_box_name,
+ 'INBOX_IMG' => $inbox_img,
+ 'SENTBOX_IMG' => $sentbox_img,
+ 'OUTBOX_IMG' => $outbox_img,
+ 'SAVEBOX_IMG' => $savebox_img,
+ 'INBOX' => $inbox_url,
+ 'SENTBOX' => $sentbox_url,
+ 'OUTBOX' => $outbox_url,
+ 'SAVEBOX' => $savebox_url,
+
+ 'L_SUBJECT' => $lang['Subject'],
+ 'L_MESSAGE_BODY' => $lang['Message_body'],
+ 'L_OPTIONS' => $lang['Options'],
+ 'L_SPELLCHECK' => $lang['Spellcheck'],
+ 'L_PREVIEW' => $lang['Preview'],
+ 'L_SUBMIT' => $lang['Submit'],
+ 'L_CANCEL' => $lang['Cancel'],
+ 'L_POST_A' => $post_a,
+ 'L_FIND_USERNAME' => $lang['Find_username'],
+ 'L_FIND' => $lang['Find'],
+ 'L_DISABLE_HTML' => $lang['Disable_HTML_pm'],
+ 'L_DISABLE_BBCODE' => $lang['Disable_BBCode_pm'],
+ 'L_DISABLE_SMILIES' => $lang['Disable_Smilies_pm'],
+ 'L_ATTACH_SIGNATURE' => $lang['Attach_signature'],
+
+ 'L_BBCODE_B_HELP' => $lang['bbcode_b_help'],
+ 'L_BBCODE_I_HELP' => $lang['bbcode_i_help'],
+ 'L_BBCODE_U_HELP' => $lang['bbcode_u_help'],
+ 'L_BBCODE_Q_HELP' => $lang['bbcode_q_help'],
+ 'L_BBCODE_C_HELP' => $lang['bbcode_c_help'],
+ 'L_BBCODE_L_HELP' => $lang['bbcode_l_help'],
+ 'L_BBCODE_O_HELP' => $lang['bbcode_o_help'],
+ 'L_BBCODE_P_HELP' => $lang['bbcode_p_help'],
+ 'L_BBCODE_W_HELP' => $lang['bbcode_w_help'],
+ 'L_BBCODE_A_HELP' => $lang['bbcode_a_help'],
+ 'L_BBCODE_S_HELP' => $lang['bbcode_s_help'],
+ 'L_BBCODE_F_HELP' => $lang['bbcode_f_help'],
+ 'L_EMPTY_MESSAGE' => $lang['Empty_message'],
+
+ 'L_FONT_SIZE' => $lang['Font_size'],
+ 'L_FONT_TINY' => $lang['font_tiny'],
+ 'L_FONT_SMALL' => $lang['font_small'],
+ 'L_FONT_NORMAL' => $lang['font_normal'],
+ 'L_FONT_LARGE' => $lang['font_large'],
+ 'L_FONT_HUGE' => $lang['font_huge'],
+
+ 'L_BBCODE_CLOSE_TAGS' => $lang['Close_Tags'],
+ 'L_STYLES_TIP' => $lang['Styles_tip'],
+
+ 'S_HTML_CHECKED' => (!$html_on) ? ' checked="checked"' : '',
+ 'S_BBCODE_CHECKED' => (!$bbcode_on) ? ' checked="checked"' : '',
+ 'S_SMILIES_CHECKED' => (!$smilies_on) ? ' checked="checked"' : '',
+ 'S_SIGNATURE_CHECKED' => ($attach_sig) ? ' checked="checked"' : '',
+ 'S_NAMES_SELECT' => $user_names_select,
+ 'S_HIDDEN_FORM_FIELDS' => $s_hidden_fields,
+ 'S_POST_ACTION' => append_sid("privmsg.$phpEx"),
+
+ 'U_SEARCH_USER' => append_sid("search.$phpEx?mode=searchuser"),
+ 'U_VIEW_FORUM' => append_sid("privmsg.$phpEx"))
+ );
+
+ $template->display('body');
+
+ include($phpbb_root_path . 'includes/page_tail.'.$phpEx);
+ }
+
+ //
+ // Default page
+ //
+ if (!$userdata['user_id'])
+ {
+ $header_location = (@preg_match('/Microsoft|WebSTAR|Xitami/', getenv('SERVER_SOFTWARE'))) ? 'Refresh: 0; URL=' : 'Location: ';
+ header($header_location . append_sid("login.$phpEx?redirect=privmsg.$phpEx&folder=inbox", true));
+ }
+
+ // Update unread status
+ $sql = "UPDATE " . USERS_TABLE . "
+ SET user_unread_privmsg = user_unread_privmsg + user_new_privmsg, user_new_privmsg = 0, user_last_privmsg = " . $userdata['session_start'] . "
+ WHERE user_id = " . $userdata['user_id'];
+ $db->sql_query($sql);
+
+ $sql = "UPDATE " . PRIVMSGS_TABLE . "
+ SET privmsgs_type = " . PRIVMSGS_UNREAD_MAIL . "
+ WHERE privmsgs_type = " . PRIVMSGS_NEW_MAIL . "
+ AND privmsgs_to_userid = " . $userdata['user_id'];
+ $db->sql_query($sql);
+
+ // Reset PM counters
+ $userdata['user_new_privmsg'] = 0;
+ $userdata['user_unread_privmsg'] = ($userdata['user_new_privmsg'] + $userdata['user_unread_privmsg']);
+
+ // Generate page
+ $page_title = $lang['Private_Messaging'];
+ include($phpbb_root_path . 'includes/page_header.'.$phpEx);
+
+ // Load templates
+ $template->set_filenames(array(
+ 'body' => 'privmsgs_body.tpl')
+ );
+ make_jumpbox('viewforum.'.$phpEx);
+
+ //
+ // New message
+ //
+ $post_new_mesg_url = '
';
+
+ //
+ // General SQL to obtain messages
+ //
+ $sql_tot = "SELECT COUNT(privmsgs_id) AS total
+ FROM " . PRIVMSGS_TABLE . " ";
+ $sql = "SELECT pm.privmsgs_type, pm.privmsgs_id, pm.privmsgs_date, pm.privmsgs_subject, u.user_id, u.username
+ FROM " . PRIVMSGS_TABLE . " pm, " . USERS_TABLE . " u ";
+ switch($folder)
+ {
+ case 'inbox':
+ $sql_tot .= "WHERE privmsgs_to_userid = " . $userdata['user_id'] . "
+ AND (privmsgs_type = " . PRIVMSGS_NEW_MAIL . "
+ OR privmsgs_type = " . PRIVMSGS_READ_MAIL . "
+ OR privmsgs_type = " . PRIVMSGS_UNREAD_MAIL . ")";
+
+ $sql .= "WHERE pm.privmsgs_to_userid = " . $userdata['user_id'] . "
+ AND u.user_id = pm.privmsgs_from_userid
+ AND (pm.privmsgs_type = " . PRIVMSGS_NEW_MAIL . "
+ OR pm.privmsgs_type = " . PRIVMSGS_READ_MAIL . "
+ OR privmsgs_type = " . PRIVMSGS_UNREAD_MAIL . ")";
+ break;
+
+ case 'outbox':
+ $sql_tot .= "WHERE privmsgs_from_userid = " . $userdata['user_id'] . "
+ AND (privmsgs_type = " . PRIVMSGS_NEW_MAIL . "
+ OR privmsgs_type = " . PRIVMSGS_UNREAD_MAIL . ")";
+
+ $sql .= "WHERE pm.privmsgs_from_userid = " . $userdata['user_id'] . "
+ AND u.user_id = pm.privmsgs_to_userid
+ AND (pm.privmsgs_type = " . PRIVMSGS_NEW_MAIL . "
+ OR privmsgs_type = " . PRIVMSGS_UNREAD_MAIL . ")";
+ break;
+
+ case 'sentbox':
+ $sql_tot .= "WHERE privmsgs_from_userid = " . $userdata['user_id'] . "
+ AND privmsgs_type = " . PRIVMSGS_SENT_MAIL;
+
+ $sql .= "WHERE pm.privmsgs_from_userid = " . $userdata['user_id'] . "
+ AND u.user_id = pm.privmsgs_to_userid
+ AND pm.privmsgs_type = " . PRIVMSGS_SENT_MAIL;
+ break;
+
+ case 'savebox':
+ $sql_tot .= "WHERE ((privmsgs_to_userid = " . $userdata['user_id'] . "
+ AND privmsgs_type = " . PRIVMSGS_SAVED_IN_MAIL . ")
+ OR (privmsgs_from_userid = " . $userdata['user_id'] . "
+ AND privmsgs_type = " . PRIVMSGS_SAVED_OUT_MAIL . "))";
+
+ $sql .= "WHERE ((pm.privmsgs_to_userid = " . $userdata['user_id'] . "
+ AND pm.privmsgs_type = " . PRIVMSGS_SAVED_IN_MAIL . "
+ AND u.user_id = pm.privmsgs_from_userid)
+ OR (pm.privmsgs_from_userid = " . $userdata['user_id'] . "
+ AND pm.privmsgs_type = " . PRIVMSGS_SAVED_OUT_MAIL . "
+ AND u.user_id = pm.privmsgs_from_userid))";
+ break;
+
+ default:
+ message_die(MESSAGE, $lang['No_such_folder']);
+ break;
+ }
+
+ //
+ // Show messages over previous x days/months
+ //
+ if ($submit_msgdays && (!empty($_POST['msgdays']) || !empty($_GET['msgdays'])))
+ {
+ $msg_days = (!empty($_POST['msgdays'])) ? intval($_POST['msgdays']) : intval($_GET['msgdays']);
+ $min_msg_time = time() - ($msg_days * 86400);
+
+ $limit_msg_time_total = " AND privmsgs_date > $min_msg_time";
+ $limit_msg_time = " AND pm.privmsgs_date > $min_msg_time ";
+
+ if (!empty($_POST['msgdays']))
+ {
+ $start = 0;
+ }
+ }
+ else
+ {
+ $limit_msg_time = '';
+ $post_days = 0;
+ }
+
+ $sql .= $limit_msg_time . " ORDER BY pm.privmsgs_date DESC LIMIT $start, " . $config['topics_per_page'];
+ $sql_all_tot = $sql_tot;
+ $sql_tot .= $limit_msg_time_total;
+
+ //
+ // Get messages
+ //
+ $result = $db->sql_query($sql_tot);
+ $pm_total = ($row = $db->sql_fetchrow($result)) ? $row['total'] : 0;
+
+ $result = $db->sql_query($sql_all_tot);
+ $pm_all_total = ($row = $db->sql_fetchrow($result)) ? $row['total'] : 0;
+
+ //
+ // Build select box
+ //
+ $previous_days = array(0, 1, 7, 14, 30, 90, 180, 364);
+ $previous_days_text = array($lang['All_Posts'], $lang['1_Day'], $lang['7_Days'], $lang['2_Weeks'], $lang['1_Month'], $lang['3_Months'], $lang['6_Months'], $lang['1_Year']);
+
+ $select_msg_days = '';
+ for($i = 0; $i < count($previous_days); $i++)
+ {
+ $selected = ($msg_days == $previous_days[$i]) ? ' selected="selected"' : '';
+ $select_msg_days .= '';
+ }
+
+ //
+ // Define correct icons
+ //
+ if ($folder == 'inbox')
+ {
+ $post_pm_img = '
';
+ $reply_pm_img = '
';
+ $quote_pm_img = '
';
+ $edit_pm_img = '';
+
+ $l_box_name = $lang['Inbox'];
+ }
+ else if ($folder == 'outbox')
+ {
+ $post_pm_img = '
';
+ $reply_pm_img = '';
+ $quote_pm_img = '';
+ $edit_pm_img = '
';
+
+ $l_box_name = $lang['Outbox'];
+ }
+ else if ($folder == 'savebox')
+ {
+ $post_pm_img = '
';
+ $reply_pm_img = '
';
+ $quote_pm_img = '
';
+ $edit_pm_img = '';
+
+ $l_box_name = $lang['Savedbox'];
+ }
+ else if ($folder == 'sentbox')
+ {
+ $post_pm_img = '
';
+ $reply_pm_img = '';
+ $quote_pm_img = '
';
+ $edit_pm_img = '';
+
+ $l_box_name = $lang['Sentbox'];
+ }
+
+ //
+ // Output data for inbox status
+ //
+ if ($folder != 'outbox')
+ {
+ if ($config['max_' . $folder . '_privmsgs'] > 0)
+ {
+ $inbox_limit_pct = round(($pm_all_total / $config['max_' . $folder . '_privmsgs']) * 100);
+ }
+ else
+ {
+ $inbox_limit_pct = 100;
+ }
+ if ($config['max_' . $folder . '_privmsgs'] > 0)
+ {
+ $inbox_limit_img_length = round(($pm_all_total / $config['max_' . $folder . '_privmsgs']) * $config['privmsg_graphic_length']);
+ }
+ else
+ {
+ $inbox_limit_img_length = $config['privmsg_graphic_length'];
+ }
+ if ($config['max_' . $folder . '_privmsgs'] > 0)
+ {
+ $inbox_limit_remain = $config['max_' . $folder . '_privmsgs'] - $pm_all_total;
+ }
+ else
+ {
+ $inbox_limit_remain = 0;
+ }
+
+ $template->assign_block_vars('switch_box_size_notice', array());
+
+ switch($folder)
+ {
+ case 'inbox':
+ $l_box_size_status = sprintf($lang['Inbox_size'], $inbox_limit_pct);
+ break;
+ case 'sentbox':
+ $l_box_size_status = sprintf($lang['Sentbox_size'], $inbox_limit_pct);
+ break;
+ case 'savebox':
+ $l_box_size_status = sprintf($lang['Savebox_size'], $inbox_limit_pct);
+ break;
+ default:
+ $l_box_size_status = '';
+ break;
+ }
+ }
+
+ //
+ // Dump vars to template
+ //
+ $template->assign_vars(array(
+ 'BOX_NAME' => $l_box_name,
+ 'INBOX_IMG' => $inbox_img,
+ 'SENTBOX_IMG' => $sentbox_img,
+ 'OUTBOX_IMG' => $outbox_img,
+ 'SAVEBOX_IMG' => $savebox_img,
+ 'INBOX' => $inbox_url,
+ 'SENTBOX' => $sentbox_url,
+ 'OUTBOX' => $outbox_url,
+ 'SAVEBOX' => $savebox_url,
+
+ 'POST_PM_IMG' => $post_pm_img,
+
+ 'INBOX_LIMIT_IMG_WIDTH' => $inbox_limit_img_length,
+ 'INBOX_LIMIT_PERCENT' => $inbox_limit_pct,
+
+ 'BOX_SIZE_STATUS' => $l_box_size_status,
+
+ 'L_INBOX' => $lang['Inbox'],
+ 'L_OUTBOX' => $lang['Outbox'],
+ 'L_SENTBOX' => $lang['Sent'],
+ 'L_SAVEBOX' => $lang['Saved'],
+ 'L_MARK' => $lang['Mark'],
+ 'L_FLAG' => $lang['Flag'],
+ 'L_SUBJECT' => $lang['Subject'],
+ 'L_DATE' => $lang['Date'],
+ 'L_DISPLAY_MESSAGES' => $lang['Display_messages'],
+ 'L_FROM_OR_TO' => ($folder == 'inbox' || $folder == 'savebox') ? $lang['From'] : $lang['To'],
+ 'L_MARK_ALL' => $lang['Mark_all'],
+ 'L_UNMARK_ALL' => $lang['Unmark_all'],
+ 'L_DELETE_MARKED' => $lang['Delete_marked'],
+ 'L_DELETE_ALL' => $lang['Delete_all'],
+ 'L_SAVE_MARKED' => $lang['Save_marked'],
+
+ 'S_PRIVMSGS_ACTION' => append_sid("privmsg.$phpEx?folder=$folder"),
+ 'S_HIDDEN_FIELDS' => '',
+ 'S_POST_NEW_MSG' => $post_new_mesg_url,
+ 'S_SELECT_MSG_DAYS' => $select_msg_days,
+
+ 'U_POST_NEW_TOPIC' => $post_new_topic_url)
+ );
+
+ // Okay, let's build the correct folder
+ $result = $db->sql_query($sql);
+
+ if ($row = $db->sql_fetchrow($result))
+ {
+ do
+ {
+ $privmsg_id = $row['privmsgs_id'];
+
+ $flag = $row['privmsgs_type'];
+
+ $icon_flag = ($flag == PRIVMSGS_NEW_MAIL || $flag == PRIVMSGS_UNREAD_MAIL) ? $images['pm_unreadmsg'] : $images['pm_readmsg'];
+ $icon_flag_alt = ($flag == PRIVMSGS_NEW_MAIL || $flag == PRIVMSGS_UNREAD_MAIL) ? $lang['Unread_message'] : $lang['Read_message'];
+
+ $msg_userid = $row['user_id'];
+ $msg_username = $row['username'];
+
+ $u_from_user_profile = append_sid("ucp.$phpEx?mode=viewprofile&u=$msg_userid");
+
+ $msg_subject = $row['privmsgs_subject'];
+
+ if (count($censors['match']))
+ {
+ $msg_subject = preg_replace($censors['match'], $censors['replace'], $msg_subject);
+ }
+
+ $u_subject = append_sid("privmsg.$phpEx?folder=$folder&mode=read&p=$privmsg_id");
+
+ $msg_date = $user_format_date($row['privmsgs_date']);
+
+ if ($flag == PRIVMSGS_NEW_MAIL && $folder == 'inbox')
+ {
+ $msg_subject = '' . $msg_subject . '';
+ $msg_date = '' . $msg_date . '';
+ $msg_username = '' . $msg_username . '';
+ }
+
+ $row_color = (!($i % 2)) ? $theme['td_color1'] : $theme['td_color2'];
+ $row_class = (!($i % 2)) ? $theme['td_class1'] : $theme['td_class2'];
+
+ $template->assign_block_vars('listrow', array(
+ 'ROW_COLOR' => '#' . $row_color,
+ 'ROW_CLASS' => $row_class,
+ 'FROM' => $msg_username,
+ 'SUBJECT' => $msg_subject,
+ 'DATE' => $msg_date,
+ 'PRIVMSG_FOLDER_IMG' => $icon_flag,
+
+ 'L_PRIVMSG_FOLDER_ALT' => $icon_flag_alt,
+
+ 'S_MARK_ID' => $privmsg_id,
+
+ 'U_READ' => $u_subject,
+ 'U_FROM_USER_PROFILE' => $u_from_user_profile)
+ );
+ }
+ while($row = $db->sql_fetchrow($result));
+
+ $template->assign_vars(array(
+ 'PAGINATION' => generate_pagination("privmsg.$phpEx?folder=$folder", $pm_total, $config['topics_per_page'], $start),
+ 'PAGE_NUMBER' => sprintf($lang['Page_of'], (floor($start / $config['topics_per_page']) + 1), ceil($pm_total / $config['topics_per_page'])),
+
+ 'L_GOTO_PAGE' => $lang['Goto_page'])
+ );
+
+ }
+ else
+ {
+ $template->assign_vars(array(
+ 'L_NO_MESSAGES' => $lang['No_messages_folder'])
+ );
+
+ $template->assign_block_vars("switch_no_messages", array());
+ }
+
+ $template->pparse('body');
+
+ include($phpbb_root_path . 'includes/page_tail.'.$phpEx);
+
+
+
+ }
+}
+
+?>
\ No newline at end of file
diff --git a/phpBB/includes/ucp/ucp_prefs.php b/phpBB/includes/ucp/ucp_prefs.php
new file mode 100644
index 0000000000..2c963381f1
--- /dev/null
+++ b/phpBB/includes/ucp/ucp_prefs.php
@@ -0,0 +1,153 @@
+subsection($submodules, $submode);
+ unset($submodules);
+
+ switch($submode)
+ {
+ case 'personal':
+
+ if (isset($_POST['submit']))
+ {
+ $data = array();
+ $normalise = array(
+ 'string' => array(
+ 'dateformat'=> '3,15',
+ 'lang' => '2,5',
+ ),
+ 'int' => array('viewemail', 'hideonline', 'notifypm', 'popuppm', 'dst', 'style'),
+ 'float' => array('tz')
+ );
+ $data = $this->normalise_data($_POST, $normalise);
+
+ $validate = array(
+ 'reqd' => array('lang', 'tz', 'dateformat', 'style'),
+ 'match' => array(
+ 'lang' => ($data['lang']) ? '#^[a-z_]+$#i' : '',
+ ),
+ );
+ $this->validate_data($data, $validate);
+
+ if (!sizeof($this->error))
+ {
+ $sql_ary = array(
+ 'user_viewemail' => $data['viewemail'],
+ 'user_allow_viewonline' => !$data['hideonline'],
+ 'user_notify_pm' => $data['notifypm'],
+ 'user_popup_pm' => $data['popuppm'],
+ 'user_dst' => $data['dst'],
+ 'user_dateformat' => $data['dateformat'],
+ 'user_lang' => $data['lang'],
+ 'user_timezone' => $data['tz'],
+ 'user_style' => $data['style'],
+ );
+
+ $sql = 'UPDATE ' . USERS_TABLE . '
+ SET ' . $db->sql_build_array('UPDATE', $sql_ary) . '
+ WHERE user_id = ' . $user->data['user_id'];
+ $db->sql_query($sql);
+
+ meta_refresh(3, "ucp.$phpEx$SID&i=$id&mode=$submode");
+ trigger_error('');
+ }
+
+ //
+ extract($data);
+ unset($data);
+ }
+
+ $view_email = (isset($viewemail)) ? $viewemail : $user->data['user_viewemail'];
+ $view_email_yes = ($viewemail) ? ' checked="checked"' : '';
+ $view_email_no = (!$viewemail) ? ' checked="checked"' : '';
+ $hideonline = (isset($hideonline)) ? $hideonline : !$user->data['user_allow_viewonline'];
+ $hide_online_yes = ($hideonline) ? ' checked="checked"' : '';
+ $hide_online_no = (!$hideonline) ? ' checked="checked"' : '';
+ $notifypm = (isset($notifypm)) ? $notifypm : $user->data['user_notify_pm'];
+ $notify_pm_yes = ($notifypm) ? ' checked="checked"' : '';
+ $notify_pm_no = (!$notifypm) ? ' checked="checked"' : '';
+ $popuppm = (isset($popuppm)) ? $popuppm : $user->data['user_popup_pm'];
+ $popup_pm_yes = ($popuppm) ? ' checked="checked"' : '';
+ $popup_pm_no = (!$popuppm) ? ' checked="checked"' : '';
+ $dst = (isset($dst)) ? $dst : $user->data['user_dst'];
+ $dst_yes = ($dst) ? ' checked="checked"' : '';
+ $dst_no = (!$dst) ? ' checked="checked"' : '';
+ $dateformat = (isset($dateformat)) ? $dateformat : $user->data['user_dateformat'];
+
+ $lang = (isset($lang)) ? $lang : $user->data['user_lang'];
+ $style = (isset($style)) ? $style : $user->data['user_style'];
+ $tz = (isset($tz)) ? $tz : $user->data['user_timezone'];
+
+ $template->assign_vars(array(
+ 'ERROR' => (sizeof($this->error)) ? implode('
', $this->error) : '',
+
+ 'VIEW_EMAIL_YES' => $view_email_yes,
+ 'VIEW_EMAIL_NO' => $view_email_no,
+ 'HIDE_ONLINE_YES' => $hide_online_yes,
+ 'HIDE_ONLINE_NO' => $hide_online_no,
+ 'NOTIFY_PM_YES' => $notify_pm_yes,
+ 'NOTIFY_PM_NO' => $notify_pm_no,
+ 'POPUP_PM_YES' => $popup_pm_yes,
+ 'POPUP_PM_NO' => $popup_pm_no,
+ 'DST_YES' => $dst_yes,
+ 'DST_NO' => $dst_no,
+
+ 'DATE_FORMAT' => $dateformat,
+
+ 'S_LANG_OPTIONS' => language_select($lang),
+ 'S_STYLE_OPTIONS' => style_select($style),
+ 'S_TZ_OPTIONS' => tz_select($tz))
+ );
+ break;
+
+ case 'view':
+ break;
+
+ case 'post':
+ break;
+ }
+
+ $template->assign_vars(array(
+ 'L_TITLE' => $user->lang['UCP_' . strtoupper($submode)],
+
+ 'S_DISPLAY_' . strtoupper($submode) => true,
+ 'S_HIDDEN_FIELDS' => $s_hidden_fields,
+ 'S_UCP_ACTION' => "ucp.$phpEx$SID&i=$id&mode=$submode")
+ );
+
+ $this->display($user->lang['UCP_PROFILE'], 'ucp_prefs.html');
+ }
+}
+
+?>
\ No newline at end of file
diff --git a/phpBB/includes/ucp/ucp_profile.php b/phpBB/includes/ucp/ucp_profile.php
new file mode 100644
index 0000000000..6a846b93e1
--- /dev/null
+++ b/phpBB/includes/ucp/ucp_profile.php
@@ -0,0 +1,354 @@
+subsection($submodules, $submode);
+ unset($submodules);
+
+ switch ($submode)
+ {
+ case 'reg_details':
+
+ if (isset($_POST['submit']))
+ {
+ $data = array();
+ $normalise = array(
+ 'string' => array(
+ 'username' => '2,30',
+ 'email' => '7,60',
+ 'password_confirm' => '6,255',
+ 'new_password' => '6,255',
+ 'cur_password' => '6,255',
+ )
+ );
+ $data = $this->normalise_data($_POST, $normalise);
+
+ $validate = array(
+ 'reqd' => array('username', 'email'),
+ 'compare' => array(
+ 'password_confirm' => ($data['new_password']) ? $data['new_password'] : '',
+ 'cur_password' => ($data['new_password'] || $data['email'] != $user->data['user_email']) ? $user->data['user_password'] : '',
+ ),
+ 'function' => array(
+ 'username' => ($data['username'] != $user->data['username']) ? 'validate_username' : '',
+ 'email' => ($data['email'] != $user->data['user_email']) ? 'validate_email' : '',
+ ),
+ );
+ $this->validate_data($data, $validate);
+
+ if (!sizeof($this->error))
+ {
+ $sql_ary = array(
+ 'username' => ($auth->acl_get('u_chgname') & $config['allow_namechange']) ? $data['username'] : $user->data['username'],
+ 'user_email' => ($auth->acl_get('u_chgemail')) ? $data['email'] : $user->data['user_email'],
+ 'user_password' => (!empty($data['user_password'])) ? md5($data['username']) : $user->data['user_password']
+ );
+
+ $sql = 'UPDATE ' . USERS_TABLE . '
+ SET ' . $db->sql_build_array('UPDATE', $sql_ary) . '
+ WHERE user_id = ' . $user->data['user_id'];
+ $db->sql_query($sql);
+
+ meta_refresh(3, "ucp.$phpEx$SID&i=$id&mode=$submode");
+ trigger_error('');
+ }
+
+ //
+ extract($data);
+ unset($data);
+ }
+
+ $template->assign_vars(array(
+ 'ERROR' => (sizeof($this->error)) ? implode('
', $this->error) : '',
+
+ 'USERNAME' => (isset($username)) ? $username : $user->data['username'],
+ 'EMAIL' => (isset($email)) ? $email : $user->data['user_email'],
+ 'NEW_PASSWORD' => (isset($new_password)) ? $new_password : '',
+ 'CUR_PASSWORD' => '',
+ 'PASSWORD_CONFIRM' => (isset($password_confirm)) ? $password_confirm : '',
+
+ 'S_CHANGE_USERNAME' => $config['allow_namechange'] & $auth->acl_get('u_chgname'),
+ 'S_CHANGE_EMAIL' => $auth->acl_get('u_chgemail'),
+ 'S_CHANGE_PASSWORD' => $auth->acl_get('u_chgpass'), )
+ );
+
+ break;
+
+ case 'profile_info':
+
+ if (isset($_POST['submit']))
+ {
+ $data = array();
+ $normalise = array(
+ 'string' => array(
+ 'icq' => '3,15',
+ 'aim' => '5,255',
+ 'msn' => '5,255',
+ 'yim' => '5,255',
+ 'jabber' => '5,255',
+ 'website' => '12,255',
+ 'location' => '2,100',
+ 'occupation'=> '2,500',
+ 'interests' => '2,500',
+ ),
+ 'int' => array('bday_day', 'bday_month', 'bday_year')
+ );
+ $data = $this->normalise_data($_POST, $normalise);
+
+ $validate = array(
+ 'match' => array(
+ 'icq' => ($data['icq']) ? '#^[0-9]+$#i' : '',
+ 'website' => ($data['website']) ? '#^http[s]?://(.*?\.)*?([a-z0-9\-]+\.)?[a-z]+#i' : '',
+ ),
+ );
+ $this->validate_data($data, $validate);
+
+ if (!sizeof($this->error))
+ {
+ $sql_ary = array(
+ 'user_icq' => $data['icq'],
+ 'user_aim' => $data['aim'],
+ 'user_msnm' => $data['msn'],
+ 'user_yim' => $data['yim'],
+ 'user_jabber' => $data['jabber'],
+ 'user_website' => $data['website'],
+ 'user_from' => $data['location'],
+ 'user_occ' => $data['occupation'],
+ 'user_interests'=> $data['interests'],
+ 'user_birthday' => implode('-', array($data['bday_day'], $data['bday_month'], $data['bday_year'])),
+ );
+
+ $sql = 'UPDATE ' . USERS_TABLE . '
+ SET ' . $db->sql_build_array('UPDATE', $sql_ary) . '
+ WHERE user_id = ' . $user->data['user_id'];
+ $db->sql_query($sql);
+
+ meta_refresh(3, "ucp.$phpEx$SID&i=$id&mode=$submode");
+ trigger_error('');
+ }
+
+ //
+ extract($data);
+ unset($data);
+ }
+
+ if (!isset($bday_day))
+ {
+ list($bday_day, $bday_month, $bday_year) = explode('-', $user->data['user_birthday']);
+ }
+
+ $s_birthday_day_options = '';
+ for ($i = 1; $i < 32; $i++)
+ {
+ $selected = ($i == $bday_day) ? ' selected="selected"' : '';
+ $s_birthday_day_options .= "";
+ }
+
+ $s_birthday_month_options = '';
+ for ($i = 1; $i < 13; $i++)
+ {
+ $selected = ($i == $bday_month) ? ' selected="selected"' : '';
+ $s_birthday_month_options .= "";
+ }
+ $s_birthday_year_options = '';
+
+ $now = getdate();
+ for ($i = $now['year'] - 100; $i < $now['year']; $i++)
+ {
+ $selected = ($i == $bday_year) ? ' selected="selected"' : '';
+ $s_birthday_year_options .= "";
+ }
+ unset($now);
+
+ $template->assign_vars(array(
+ 'ERROR' => (sizeof($this->error)) ? implode('
', $this->error) : '',
+
+ 'ICQ' => (isset($icq)) ? $icq : $user->data['user_icq'],
+ 'YIM' => (isset($yim)) ? $yim : $user->data['user_yim'],
+ 'AIM' => (isset($aim)) ? $aim : $user->data['user_aim'],
+ 'MSNM' => (isset($msnm)) ? $msnm : $user->data['user_msnm'],
+ 'JABBER' => (isset($jabber)) ? $jabber : $user->data['user_jabber'],
+ 'WEBSITE' => (isset($website)) ? $website : $user->data['user_website'],
+ 'LOCATION' => (isset($location)) ? $location : $user->data['user_from'],
+ 'OCCUPATION'=> (isset($occupation)) ? $occupation : $user->data['user_occ'],
+ 'INTERESTS' => (isset($interests)) ? $interests : $user->data['user_interests'],
+
+ 'S_BIRTHDAY_DAY_OPTIONS' => $s_birthday_day_options,
+ 'S_BIRTHDAY_MONTH_OPTIONS' => $s_birthday_month_options,
+ 'S_BIRTHDAY_YEAR_OPTIONS' => $s_birthday_year_options,)
+ );
+ break;
+
+ case 'signature':
+
+ include($phpbb_root_path . 'includes/functions_posting.'.$phpEx);
+
+ $html_status = ($config['allow_html']) ? true : false;
+ $bbcode_status = ($config['allow_bbcode']) ? true : false;
+ $smilies_status = ($config['allow_smilies']) ? true : false;
+ $img_status = ($config['allow_img']) ? true : false;
+ $flash_status = ($config['allow_flash']) ? true : false;
+
+ $enable_html = (isset($_POST['disable_html'])) ? !$_POST['disable_html'] : $config['allow_html'];
+ $enable_bbcode = (isset($_POST['disable_bbcode'])) ? !$_POST['disable_bbcode'] : $config['allow_bbcode'];
+ $enable_smilies = (isset($_POST['disable_smilies'])) ? !$_POST['disable_smilies'] : $config['allow_smilies'];
+ $enable_urls = (isset($_POST['disable_magic_url'])) ? !$_POST['disable_magic_url'] : 1;
+
+ decode_text($user->data['user_sig'], $user->data['user_sig_bbcode_uid']);
+ $signature = (!empty($_POST['signature'])) ? htmlspecialchars($_POST['signature']) : $user->data['user_sig'];
+
+ $error = array();
+ if ($_POST['submit'])
+ {
+ if (strlen($signature) > $config['max_sig_chars'])
+ {
+ $error[] = $user->lang['SIGNATURE_TOO_LONG'];
+ }
+
+ if (!sizeof($error))
+ {
+ include($phpbb_root_path . 'includes/message_parser.'.$phpEx);
+
+ $message_parser = new parse_message();
+ $message_parser->message = trim(stripslashes($signature));
+ $message_parser->parse($enable_html, $enable_bbcode, $enable_urls, $enable_smilies);
+ $signature = $message_parser->message;
+
+ $sql_ary = array(
+ 'user_sig' => $signature,
+ 'user_sig_bbcode_uid' => $message_parser->bbcode_uid,
+ 'user_sig_bbcode_bitfield' => $message_parser->bbcode_bitfield
+ );
+
+ $sql = 'UPDATE ' . USERS_TABLE . '
+ SET ' . $db->sql_build_array('UPDATE', $sql_ary) . '
+ WHERE user_id = ' . $user->data['user_id'];
+ $db->sql_query($sql);
+
+ meta_refresh(3, "ucp.$phpEx$SID&i=$id&mode=$submode");
+ trigger_error('');
+ }
+ }
+
+ $signature_preview = '';
+ if ($_POST['preview'])
+ {
+ // Fudge-o-rama ...
+ include($phpbb_root_path . 'includes/message_parser.'.$phpEx);
+
+ $signature_preview = $signature;
+
+ $message_parser = new parse_message();
+ $message_parser->message = trim(stripslashes($signature_preview));
+ $message_parser->parse($enable_html, $enable_bbcode, $enable_urls, $enable_smilies);
+ $signature_preview = $message_parser->message;
+
+ if ($enable_bbcode)
+ {
+ include($phpbb_root_path . 'includes/bbcode.'.$phpEx);
+ $bbcode = new bbcode($message_parser->bbcode_bitfield);
+
+ // Second parse bbcode here
+ $signature_preview = $bbcode->bbcode_second_pass($signature_preview, $message_parser->bbcode_uid);
+ }
+
+ // If we allow users to disable display of emoticons
+ // we'll need an appropriate check and preg_replace here
+ $signature_preview = (empty($enable_smilies) || empty($config['allow_smilies'])) ? preg_replace('#
(((?>([^><]+|(?R)))*)\<))#se', "preg_replace(\$censors['match'], \$censors['replace'], '\\0')", '>' . $signature_preview . '<'), 1, -1));
+ }
+
+ $signature_preview = str_replace("\n", '
', $signature_preview);
+ }
+
+ $template->assign_vars(array(
+ 'ERROR' => (sizeof($error)) ? implode('
', $error) : '',
+ 'SIGNATURE' => $signature,
+ 'SIGNATURE_PREVIEW' => $signature_preview,
+
+ 'S_SIGNATURE_PREVIEW' => ($signature_preview) ? true : false,
+
+ 'S_HTML_CHECKED' => (!$enable_html) ? 'checked="checked"' : '',
+ 'S_BBCODE_CHECKED' => (!$enable_bbcode) ? 'checked="checked"' : '',
+ 'S_SMILIES_CHECKED' => (!$enable_smilies) ? 'checked="checked"' : '',
+ 'S_MAGIC_URL_CHECKED' => (!$enable_urls) ? 'checked="checked"' : '',
+
+ 'HTML_STATUS' => ($html_status) ? $user->lang['HTML_IS_ON'] : $user->lang['HTML_IS_OFF'],
+ 'BBCODE_STATUS' => ($bbcode_status) ? sprintf($user->lang['BBCODE_IS_ON'], '', '') : sprintf($user->lang['BBCODE_IS_OFF'], '', ''),
+ 'SMILIES_STATUS'=> ($smilies_status) ? $user->lang['SMILIES_ARE_ON'] : $user->lang['SMILIES_ARE_OFF'],
+ 'IMG_STATUS' => ($img_status) ? $user->lang['IMAGES_ARE_ON'] : $user->lang['IMAGES_ARE_OFF'],
+ 'FLASH_STATUS' => ($flash_status) ? $user->lang['FLASH_IS_ON'] : $user->lang['FLASH_IS_OFF'],
+
+ 'L_SIGNATURE_EXPLAIN' => sprintf($user->lang['SIGNATURE_EXPLAIN'], $config['max_sig_chars']),
+
+ 'S_HTML_ALLOWED' => $config['allow_html'],
+ 'S_BBCODE_ALLOWED' => $config['allow_bbcode'],
+ 'S_SMILIES_ALLOWED' => $config['allow_smilies'],)
+ );
+ break;
+
+ case 'avatar':
+
+ $template->assign_vars(array(
+ 'AVATAR' => '
',
+
+ 'S_UPLOAD_AVATAR_FILE' => true,
+ 'S_UPLOAD_AVATAR_URL' => true,
+ 'S_LINK_AVATAR' => true,
+ 'S_GALLERY_AVATAR' => true,)
+ );
+
+ break;
+
+ default:
+ break;
+ }
+
+ $template->assign_vars(array(
+ 'L_TITLE' => $user->lang['UCP_' . strtoupper($submode)],
+
+ 'S_DISPLAY_' . strtoupper($submode) => true,
+ 'S_HIDDEN_FIELDS' => $s_hidden_fields,
+ 'S_UCP_ACTION' => "ucp.$phpEx$SID&i=$id&mode=$submode")
+ );
+
+ $this->display($user->lang['UCP_PROFILE'], 'ucp_profile.html');
+ }
+}
+
+?>
\ No newline at end of file
diff --git a/phpBB/includes/ucp/ucp_register.php b/phpBB/includes/ucp/ucp_register.php
new file mode 100644
index 0000000000..28ce085d0a
--- /dev/null
+++ b/phpBB/includes/ucp/ucp_register.php
@@ -0,0 +1,371 @@
+lang['UCP_REGISTER_DISABLE']);
+ }
+
+ $coppa = (isset($_REQUEST['coppa'])) ? ((!empty($_REQUEST['coppa'])) ? 1 : 0) : false;
+ $agreed = (!empty($_POST['agreed'])) ? 1 : 0;
+
+ //
+ if (!$agreed)
+ {
+ if ($coppa === false && $config['coppa_enable'])
+ {
+ $now = getdate();
+ $coppa_birthday = $user->format_date(mktime($now['hours'] + $user->data['user_dst'], $now['minutes'], $now['seconds'], $now['mon'], $now['mday'] - 1, $now['year'] - 13), $user->lang['DATE_FORMAT']);
+ unset($now);
+
+ $template->assign_vars(array(
+ 'L_COPPA_NO' => sprintf($user->lang['UCP_COPPA_BEFORE'], $coppa_birthday),
+ 'L_COPPA_YES' => sprintf($user->lang['UCP_COPPA_ON_AFTER'], $coppa_birthday),
+
+ 'U_COPPA_NO' => "ucp.$phpEx$SID&mode=register&coppa=0",
+ 'U_COPPA_YES' => "ucp.$phpEx$SID&mode=register&coppa=1",
+
+ 'S_SHOW_COPPA' => true,
+ 'S_REGISTER_ACTION' => "ucp.$phpEx$SID&mode=register")
+ );
+ }
+ else
+ {
+ $template->assign_vars(array(
+ 'L_AGREEMENT' => $user->lang['UCP_AGREEMENT'],
+
+ 'S_SHOW_COPPA' => false,
+ 'S_REGISTER_ACTION' => "ucp.$phpEx$SID&mode=register")
+ );
+ }
+
+ $this->display($user->lang['REGISTER'], 'ucp_agreement.html');
+ }
+
+ // Check and initialize some variables if needed
+ $error = $data = array();
+ if (isset($_POST['submit']))
+ {
+ $normalise = array(
+ 'string' => array(
+ 'username' => '2,30',
+ 'email' => '7,60',
+ 'email_confirm' => '7,60',
+ 'new_password' => '6,255',
+ 'password_confirm' => '6,255',
+ 'lang' => '1,50',
+ 'confirm_code' => '6,6'
+ ),
+ 'int' => array('tz')
+ );
+ $data = $this->normalise_data($_POST, $normalise);
+
+ $validate = array(
+ 'reqd' => array('username', 'email', 'email_confirm', 'new_password', 'password_confirm', 'lang', 'confirm_code', 'tz'),
+ 'compare' => array(
+ 'password_confirm' => $data['new_password'],
+ 'email_confirm' => $data['email'],
+ ),
+ 'function' => array(
+ 'username' => 'validate_username',
+ 'email' => 'validate_email',
+ ),
+ );
+ $this->validate_data($data, $validate);
+
+ // Visual Confirmation handling
+ if ($config['enable_confirm'])
+ {
+ if (empty($_POST['confirm_id']))
+ {
+ $this->error[] = $user->lang['CONFIRM_CODE_WRONG'];
+ }
+ else
+ {
+ $sql = 'SELECT code
+ FROM ' . CONFIRM_TABLE . "
+ WHERE confirm_id = '" . $_POST['confirm_id'] . "'
+ AND session_id = '" . $user->data['session_id'] . "'";
+ $result = $db->sql_query($sql);
+
+ if ($row = $db->sql_fetchrow($result))
+ {
+ if ($row['code'] != $data['confirm_code'])
+ {
+ $this->error[] = $user->lang['CONFIRM_CODE_WRONG'];
+ }
+ else
+ {
+ $sql = 'DELETE FROM ' . CONFIRM_TABLE . "
+ WHERE confirm_id = '" . $_POST['confirm_id'] . "'
+ AND session_id = '" . $user->data['session_id'] . "'";
+ $db->sql_query($sql);
+ }
+ }
+ else
+ {
+ $this->error[] = $user->lang['CONFIRM_CODE_WRONG'];
+ }
+ $db->sql_freeresult($result);
+ }
+ }
+
+ if (!sizeof($this->error))
+ {
+ $server_url = generate_board_url();
+
+ if ($coppa && ($config['require_activation'] == USER_ACTIVATION_SELF ||
+ $config['require_activation'] == USER_ACTIVATION_ADMIN))
+ {
+ $user_actkey = $this->gen_rand_string(10);
+ $key_len = 54 - (strlen($server_url));
+ $key_len = ($key_len > 6) ? $key_len : 6;
+ $user_actkey = substr($user_actkey, 0, $key_len);
+ $user_active = 0;
+ }
+ else
+ {
+ $user_active = 1;
+ $user_actkey = '';
+ }
+
+ // Begin transaction ... should this screw up we can rollback
+ $db->sql_transaction();
+
+ $sql_ary = array(
+ 'user_ip' => $user->ip,
+ 'user_regdate' => time(),
+ 'username' => $data['username'],
+ 'user_password' => $data['new_password'],
+ 'user_email' => $data['email'],
+ 'user_allow_pm' => 1,
+ 'user_timezone' => (float) $data['tz'],
+ 'user_lang' => $data['lang'],
+ 'user_active' => $user_active,
+ 'user_actkey' => $user_actkey
+ );
+
+ $sql = 'INSERT INTO ' . USERS_TABLE . ' ' . $db->sql_build_array('INSERT', $sql_ary);
+ $db->sql_query($sql);
+
+ $user_id = $db->sql_nextid();
+
+ // Place into appropriate group, either REGISTERED or INACTIVE depending on config
+ $group_name = ($config['require_activation'] == USER_ACTIVATION_NONE) ? 'REGISTERED' : 'INACTIVE';
+ $sql = "INSERT INTO " . USER_GROUP_TABLE . " (user_id, group_id, user_pending)
+ SELECT $user_id, group_id, 0
+ FROM " . GROUPS_TABLE . "
+ WHERE group_name = '$group_name'
+ AND group_type = " . GROUP_SPECIAL;
+ $result = $db->sql_query($sql);
+
+ $db->sql_transaction('commit');
+
+ if ($coppa)
+ {
+ $message = $user->lang['ACCOUNT_COPPA'];
+ $email_template = 'coppa_welcome_inactive';
+ }
+ else if ($config['require_activation'] == USER_ACTIVATION_SELF)
+ {
+ $message = $user->lang['ACCOUNT_INACTIVE'];
+ $email_template = 'user_welcome_inactive';
+ }
+ else if ($config['require_activation'] == USER_ACTIVATION_ADMIN)
+ {
+ $message = $user->lang['ACCOUNT_INACTIVE_ADMIN'];
+ $email_template = 'admin_welcome_inactive';
+ }
+ else
+ {
+ $message = $user->lang['ACCOUNT_ADDED'];
+ $email_template = 'user_welcome';
+ }
+
+ if ($config['email_enable'])
+ {
+ include($phpbb_root_path . 'includes/emailer.'.$phpEx);
+ $emailer = new emailer($config['smtp_delivery']);
+
+ $emailer->use_template($email_template, $user->data['user_lang']);
+ $emailer->replyto($config['board_contact']);
+ $emailer->to($data['user_email'], $data['username']);
+
+ $emailer->assign_vars(array(
+ 'SITENAME' => $config['sitename'],
+ 'WELCOME_MSG' => sprintf($user->lang['Welcome_subject'], $config['sitename']),
+ 'USERNAME' => $username,
+ 'PASSWORD' => $password_confirm,
+ 'EMAIL_SIG' => str_replace('
', "\n", "-- \n" . $config['board_email_sig']),
+
+ 'U_ACTIVATE' => "$server_url/ucp.$phpEx?mode=activate&k=$user_actkey")
+ );
+
+ if ($coppa)
+ {
+ $emailer->assign_vars(array(
+ 'FAX_INFO' => $config['coppa_fax'],
+ 'MAIL_INFO' => $config['coppa_mail'],
+ 'EMAIL_ADDRESS' => $email,
+ 'SITENAME' => $config['sitename'])
+ );
+ }
+
+ $emailer->send();
+ $emailer->reset();
+
+ if ($config['require_activation'] == USER_ACTIVATION_ADMIN)
+ {
+ $emailer->use_template('admin_activate', $config['default_lang']);
+ $emailer->replyto($config['board_contact']);
+ $emailer->to($config['board_contact']);
+
+ $emailer->assign_vars(array(
+ 'USERNAME' => $username,
+ 'EMAIL_SIG' => str_replace('
', "\n", "-- \n" . $config['board_email_sig']),
+
+ 'U_ACTIVATE' => generate_board_url() . "/ucp.$phpEx?mode=activate&k=$user_actkey")
+ );
+
+ $emailer->send();
+ $emailer->reset();
+ }
+ }
+
+ if ($config['require_activation'] == USER_ACTIVATION_NONE)
+ {
+ set_config('newest_user_id', $user_id);
+ set_config('newest_username', $data['username']);
+ set_config('num_users', $config['num_users'] + 1, TRUE);
+ }
+ unset($data);
+
+ $message = $message . '
' . sprintf($user->lang['RETURN_INDEX'], "", '');
+ trigger_error($message);
+ }
+ }
+
+ // If an error occured we need to stripslashes on returned data
+ $username = (isset($_POST['username'])) ? stripslashes(htmlspecialchars($_POST['username'])) : '';
+ $password = (isset($_POST['new_password'])) ? stripslashes(htmlspecialchars($_POST['new_password'])) : '';
+ $password_confirm = (isset($_POST['password_confirm'])) ? stripslashes(htmlspecialchars($_POST['password_confirm'])) : '';
+ $email = (isset($_POST['email'])) ? stripslashes(htmlspecialchars($_POST['email'])) : '';
+ $email_confirm = (isset($_POST['email_confirm'])) ? stripslashes(htmlspecialchars($_POST['email_confirm'])) : '';
+ $lang = (isset($_POST['lang'])) ? htmlspecialchars($_POST['lang']) : '';
+ $tz = (isset($_POST['tz'])) ? intval($_POST['tz']) : $config['board_timezone'];
+
+ $s_hidden_fields = '';
+
+ // Visual Confirmation - Show images
+ $confirm_image = '';
+ if (!empty($config['enable_confirm']))
+ {
+ $sql = "SELECT session_id
+ FROM " . SESSIONS_TABLE;
+ $result = $db->sql_query($sql);
+
+ if ($row = $db->sql_fetchrow($result))
+ {
+ $confirm_sql = '';
+ do
+ {
+ $confirm_sql .= (($confirm_sql != '') ? ', ' : '') . "'" . $row['session_id'] . "'";
+ }
+ while ($row = $db->sql_fetchrow($result));
+
+ $sql = 'DELETE FROM ' . CONFIRM_TABLE . "
+ WHERE session_id NOT IN ($confirm_sql)";
+ $db->sql_query($sql);
+ }
+ $db->sql_freeresult($result);
+
+ $sql = 'SELECT COUNT(session_id) AS attempts
+ FROM ' . CONFIRM_TABLE . "
+ WHERE session_id = '$user->session_id'";
+ $result = $db->sql_query($sql);
+
+ if ($row = $db->sql_fetchrow($result))
+ {
+ if ($row['attempts'] > 5)
+ {
+ trigger_error($user->lang['TOO_MANY_REGISTERS']);
+ }
+ }
+ $db->sql_freeresult($result);
+
+ $code = $this->gen_rand_string(6);
+ $confirm_id = md5(uniqid($user_ip));
+
+ $sql = 'INSERT INTO ' . CONFIRM_TABLE . " (confirm_id, session_id, code)
+ VALUES ('$confirm_id', '$user->session_id', '$code')";
+ $db->sql_query($sql);
+
+ $confirm_image = (@extension_loaded('zlib')) ? "
" : '




';
+ $s_hidden_fields .= '';
+ }
+
+ //
+ $l_reg_cond = '';
+ switch ($config['require_activation'])
+ {
+ case USER_ACTIVATION_SELF:
+ $l_reg_cond = $user->lang['UCP_EMAIL_ACTIVATE'];
+ break;
+
+ case USER_ACTIVATION_ADMIN:
+ $l_reg_cond = $user->lang['UCP_ADMIN_ACTIVATE'];
+ break;
+ }
+
+ //
+ $template->assign_vars(array(
+ 'USERNAME' => $username,
+ 'PASSWORD' => $password,
+ 'PASSWORD_CONFIRM' => $password_confirm,
+ 'EMAIL' => $email,
+ 'EMAIL_CONFIRM' => $email_confirm,
+ 'CONFIRM_IMG' => $confirm_image,
+ 'ERROR' => (sizeof($this->error)) ? implode('
', $this->error) : '',
+
+ 'L_CONFIRM_EXPLAIN' => sprintf($user->lang['CONFIRM_EXPLAIN'], '', ''),
+ 'L_ITEMS_REQUIRED' => $l_reg_cond,
+
+ 'S_LANG_OPTIONS' => language_select($lang),
+ 'S_TZ_OPTIONS' => tz_select($tz),
+ 'S_CONFIRM_CODE' => ($config['enable_confirm']) ? true : false,
+ 'S_COPPA' => $coppa,
+ 'S_HIDDEN_FIELDS' => $s_hidden_fields,
+ 'S_UCP_ACTION' => "ucp.$phpEx$SID&mode=register")
+ );
+
+ //
+ $this->display($user->lang['REGISTER'], 'ucp_register.html');
+ }
+}
+
+?>
\ No newline at end of file
diff --git a/phpBB/includes/ucp/ucp_remind.php b/phpBB/includes/ucp/ucp_remind.php
new file mode 100644
index 0000000000..25ee678b07
--- /dev/null
+++ b/phpBB/includes/ucp/ucp_remind.php
@@ -0,0 +1,106 @@
+sql_escape($email) . "'
+ AND username = '" . . $db->sql_escape($username) . "'";
+ if ($result = $db->sql_query($sql))
+ {
+ if ($row = $db->sql_fetchrow($result))
+ {
+ if (!$row['user_active'])
+ {
+ trigger_error($lang['ACCOUNT_INACTIVE']);
+ }
+
+ $server_url = generate_board_url();
+ $username = $row['username'];
+
+ $user_actkey = $this->gen_rand_string(10);
+ $key_len = 54 - strlen($server_url);
+ $key_len = ($str_len > 6) ? $key_len : 6;
+ $user_actkey = substr($user_actkey, 0, $key_len);
+ $user_password = $this->gen_rand_string(false);
+
+ $sql = 'UPDATE ' . USERS_TABLE . "
+ SET user_newpasswd = '" . md5($user_password) . "', user_actkey = '$user_actkey'
+ WHERE user_id = " . $row['user_id'];
+ $db->sql_query($sql);
+
+ include($phpbb_root_path . 'includes/emailer.'.$phpEx);
+ $emailer = new emailer($config['smtp_delivery']);
+
+ $emailer->use_template('user_activate_passwd', $row['user_lang']);
+ $emailer->to($row['user_email']);
+
+ $emailer->assign_vars(array(
+ 'SITENAME' => $config['sitename'],
+ 'USERNAME' => $username,
+ 'PASSWORD' => $user_password,
+ 'EMAIL_SIG' => str_replace('
', "\n", "-- \n" . $config['board_email_sig']),
+
+ 'U_ACTIVATE' => $server_url . "/ucp.$phpEx?mode=activate&k=$user_actkey")
+ );
+ $emailer->send();
+ $emailer->reset();
+
+ meta_refresh(3, "index.$phpEx$SID");
+
+ $message = $lang['PASSWORD_UPDATED'] . '
' . sprintf($lang['RETURN_INDEX'], '', '');
+
+ trigger_error($message);
+ }
+ else
+ {
+ trigger_error($lang['NO_EMAIL']);
+ }
+ }
+ else
+ {
+ trigger_error('Could not obtain user information for sendpassword', E_USER_ERROR);
+ }
+ }
+ else
+ {
+ $username = '';
+ $email = '';
+ }
+
+ $template->assign_vars(array(
+ 'USERNAME' => $username,
+ 'EMAIL' => $email)
+ );
+ }
+}
+
+?>
\ No newline at end of file
diff --git a/phpBB/includes/ucp/ucp_zebra.php b/phpBB/includes/ucp/ucp_zebra.php
new file mode 100644
index 0000000000..b5a4051390
--- /dev/null
+++ b/phpBB/includes/ucp/ucp_zebra.php
@@ -0,0 +1,33 @@
+
\ No newline at end of file