From 03f66078e117cc76ea276a59455c2f4716bb461e Mon Sep 17 00:00:00 2001 From: flashwave Date: Sun, 24 May 2015 22:06:53 +0000 Subject: [PATCH] the bread of the future --- _developer_data/structure.sql | 624 ++++++++++++---------- _sakura/changelog.json | 44 +- _sakura/components/Main.php | 14 + _sakura/components/Users.php | 56 +- _sakura/sakura.php | 8 +- _sakura/templates/changeLog.tpl | 2 +- _sakura/templates/errorPage.tpl | 2 +- _sakura/templates/yuuno/global/footer.tpl | 12 +- _sakura/templates/yuuno/global/header.tpl | 7 +- api/favicon.ico | Bin 0 -> 1150 bytes content/data/broomcloset/css/manage.css | 9 + content/data/yuuno/css/yuuno.css | 18 +- content/data/yuuno/images/add-friend.png | Bin 2225 -> 0 bytes content/data/yuuno/images/arrow.png | Bin 1655 -> 0 bytes content/data/yuuno/js/yuuno.js | 69 ++- content/favicon.ico | Bin 370070 -> 1150 bytes main/favicon.ico | Bin 370070 -> 1150 bytes 17 files changed, 516 insertions(+), 349 deletions(-) create mode 100644 api/favicon.ico delete mode 100644 content/data/yuuno/images/add-friend.png delete mode 100644 content/data/yuuno/images/arrow.png diff --git a/_developer_data/structure.sql b/_developer_data/structure.sql index 9ceab1d..c92b2da 100644 --- a/_developer_data/structure.sql +++ b/_developer_data/structure.sql @@ -5,332 +5,364 @@ SET time_zone = '+00:00'; SET foreign_key_checks = 0; SET sql_mode = 'NO_AUTO_VALUE_ON_ZERO'; -USE `flashiidev`; -DROP TABLE IF EXISTS `fii_actioncodes`; -CREATE TABLE `fii_actioncodes` ( - `id` bigint(255) NOT NULL AUTO_INCREMENT COMMENT 'Automatically generated ID by MySQL for management.', - `action` varchar(255) COLLATE utf8_bin NOT NULL COMMENT 'Action identifier so the backend knows what to do.', - `userid` bigint(255) NOT NULL COMMENT 'ID of the user that would be affected by this action', - `actkey` varchar(255) COLLATE utf8_bin NOT NULL COMMENT 'The URL key for using this code.', - `instruction` varchar(255) COLLATE utf8_bin NOT NULL COMMENT 'Things the backend should do upon using this code', - PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COLLATE=utf8_bin; +DROP DATABASE IF EXISTS `sakura-development`; +CREATE DATABASE `sakura-development` /*!40100 DEFAULT CHARACTER SET utf8 COLLATE utf8_bin */; +USE `sakura-development`; -DROP TABLE IF EXISTS `fii_apikeys`; -CREATE TABLE `fii_apikeys` ( - `id` bigint(128) unsigned NOT NULL AUTO_INCREMENT COMMENT 'Automatically generated ID by MySQL for management.', - `owner` bigint(128) unsigned NOT NULL COMMENT 'ID of user that owns this API key.', - `apikey` varchar(32) COLLATE utf8_bin NOT NULL COMMENT 'The API key.', - PRIMARY KEY (`id`) +DROP TABLE IF EXISTS `sakura_actioncodes`; +CREATE TABLE `sakura_actioncodes` ( + `id` bigint(255) NOT NULL AUTO_INCREMENT COMMENT 'Automatically generated ID by MySQL for management.', + `action` varchar(255) COLLATE utf8_bin NOT NULL COMMENT 'Action identifier so the backend knows what to do.', + `userid` bigint(255) NOT NULL COMMENT 'ID of the user that would be affected by this action', + `actkey` varchar(255) COLLATE utf8_bin NOT NULL COMMENT 'The URL key for using this code.', + `instruction` varchar(255) COLLATE utf8_bin NOT NULL COMMENT 'Things the backend should do upon using this code', + PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin; -DROP TABLE IF EXISTS `fii_bans`; -CREATE TABLE `fii_bans` ( - `id` bigint(128) unsigned NOT NULL AUTO_INCREMENT COMMENT 'Automatically generated ID by MySQL for management.', - `uid` bigint(128) unsigned NOT NULL COMMENT 'ID of user that was banned, 0 for just an IP ban.', - `ip` varchar(255) COLLATE utf8_bin NOT NULL COMMENT 'IP to disallow access to the site.', - `type` tinyint(1) unsigned NOT NULL COMMENT 'The type of ban that should be enforced.', - `timestamp` int(64) unsigned NOT NULL COMMENT 'Timestamp when the user was banned.', - `bannedtill` int(64) unsigned NOT NULL COMMENT 'Timestamp when the user should regain access to the site.', - `modid` bigint(128) unsigned NOT NULL COMMENT 'ID of moderator that banned this user,', - `modip` varchar(255) COLLATE utf8_bin NOT NULL COMMENT 'IP of moderator that banned this user.', - `reason` varchar(255) COLLATE utf8_bin DEFAULT NULL COMMENT 'Reason given for the ban.', - PRIMARY KEY (`id`) +DROP TABLE IF EXISTS `sakura_apikeys`; +CREATE TABLE `sakura_apikeys` ( + `id` bigint(128) unsigned NOT NULL AUTO_INCREMENT COMMENT 'Automatically generated ID by MySQL for management.', + `owner` bigint(128) unsigned NOT NULL COMMENT 'ID of user that owns this API key.', + `apikey` varchar(32) COLLATE utf8_bin NOT NULL COMMENT 'The API key.', + PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin; -DROP TABLE IF EXISTS `fii_config`; -CREATE TABLE `fii_config` ( - `config_name` varchar(255) COLLATE utf8_bin NOT NULL COMMENT 'Array key for configuration value', - `config_value` varchar(255) COLLATE utf8_bin NOT NULL COMMENT 'The value, obviously.' +DROP TABLE IF EXISTS `sakura_bans`; +CREATE TABLE `sakura_bans` ( + `id` bigint(128) unsigned NOT NULL AUTO_INCREMENT COMMENT 'Automatically generated ID by MySQL for management.', + `uid` bigint(128) unsigned NOT NULL COMMENT 'ID of user that was banned, 0 for just an IP ban.', + `ip` varchar(255) COLLATE utf8_bin NOT NULL COMMENT 'IP to disallow access to the site.', + `type` tinyint(1) unsigned NOT NULL COMMENT 'The type of ban that should be enforced.', + `timestamp` int(64) unsigned NOT NULL COMMENT 'Timestamp when the user was banned.', + `bannedtill` int(64) unsigned NOT NULL COMMENT 'Timestamp when the user should regain access to the site.', + `modid` bigint(128) unsigned NOT NULL COMMENT 'ID of moderator that banned this user,', + `modip` varchar(255) COLLATE utf8_bin NOT NULL COMMENT 'IP of moderator that banned this user.', + `reason` varchar(255) COLLATE utf8_bin DEFAULT NULL COMMENT 'Reason given for the ban.', + PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin; -TRUNCATE `fii_config`; -INSERT INTO `fii_config` (`config_name`, `config_value`) VALUES -('recaptcha_public', ''), -('recaptcha_private', ''), -('charset', 'utf-8'), -('cookie_prefix', 'sakura_'), -('cookie_domain', 'yourdomain.com'), -('cookie_path', '/'), -('site_style', 'yuuno'), -('manage_style', 'broomcloset'), -('allow_registration', '0'), -('smtp_server', ''), -('smtp_auth', '1'), -('smtp_secure', ''), -('smtp_port', ''), -('smtp_username', ''), -('smtp_password', ''), -('smtp_replyto_mail', ''), -('smtp_replyto_name', ''), -('smtp_from_email', ''), -('smtp_from_name', ''), -('sitename', 'Sakura'), -('recaptcha', '0'), -('require_activation', '1'), + +DROP TABLE IF EXISTS `sakura_config`; +CREATE TABLE `sakura_config` ( + `config_name` varchar(255) COLLATE utf8_bin NOT NULL COMMENT 'Array key for configuration value', + `config_value` varchar(255) COLLATE utf8_bin NOT NULL COMMENT 'The value, obviously.' +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin; + +INSERT INTO `sakura_config` (`config_name`, `config_value`) VALUES +('recaptcha_public', ''), +('recaptcha_private', ''), +('charset', 'utf-8'), +('cookie_prefix', 'sakura_'), +('cookie_domain', 'yourdomain.com'), +('cookie_path', '/'), +('site_style', 'yuuno'), +('manage_style', 'broomcloset'), +('allow_registration', '0'), +('smtp_server', ''), +('smtp_auth', '0'), +('smtp_secure', ''), +('smtp_port', '25'), +('smtp_username', ''), +('smtp_password', ''), +('smtp_replyto_mail', ''), +('smtp_replyto_name', ''), +('smtp_from_email', ''), +('smtp_from_name', 'Sakura No Reply'), +('sitename', 'Sakura'), +('recaptcha', '1'), +('require_activation', '1'), ('require_registration_code', '0'), -('disable_registration', '0'), -('max_reg_keys', '5'), -('mail_signature', 'Team Flashii'), -('lock_authentication', '0'), -('min_entropy', '96'); - -DROP TABLE IF EXISTS `fii_faq`; -CREATE TABLE `fii_faq` ( - `id` bigint(128) unsigned NOT NULL AUTO_INCREMENT COMMENT 'MySQL Generated ID used for sorting.', - `short` varchar(255) COLLATE utf8_bin NOT NULL COMMENT 'Used for linking directly to a question.', - `question` varchar(255) COLLATE utf8_bin NOT NULL COMMENT 'The question.', - `answer` text COLLATE utf8_bin NOT NULL COMMENT 'The answer.', - PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COLLATE=utf8_bin; +('disable_registration', '0'), +('max_reg_keys', '5'), +('mail_signature', 'Circlestorm'), +('lock_authentication', '0'), +('min_entropy', '96'), +('sitedesc', 'Live development environment for the script that powers Flashii.net called Sakura.'), +('sitetags', '[\"Flashii\",\"Media\",\"Flashwave\",\"Circle\",\"Zeniea\",\"MalwareUp\",\"Cybernetics\",\"Saibateku\",\"Community\",\"osu!\",\"osu\"]'); -DROP TABLE IF EXISTS `fii_forums`; -CREATE TABLE `fii_forums` ( - `forum_id` bigint(255) unsigned NOT NULL AUTO_INCREMENT COMMENT 'MySQL Generated ID used for sorting.', - `forum_name` varchar(255) COLLATE utf8_bin NOT NULL COMMENT 'Display name of the forum.', - `forum_desc` text COLLATE utf8_bin NOT NULL COMMENT 'Description of the forum.', - `forum_link` varchar(255) COLLATE utf8_bin NOT NULL COMMENT 'If set forum will display as a link.', - `forum_category` bigint(255) unsigned NOT NULL DEFAULT '0' COMMENT 'ID of the category this forum falls under.', - `forum_type` tinyint(4) unsigned NOT NULL DEFAULT '0' COMMENT 'Forum type, 0 for regular board, 1 for category and 2 for link.', - `forum_posts` bigint(128) unsigned NOT NULL DEFAULT '0' COMMENT 'Post count of the forum', - `forum_topics` bigint(255) unsigned NOT NULL DEFAULT '0' COMMENT 'Topic count of the forum.', - `forum_last_post_id` bigint(255) unsigned NOT NULL DEFAULT '0' COMMENT 'ID of last post in forum.', - `forum_last_poster_id` bigint(255) unsigned NOT NULL DEFAULT '0' COMMENT 'ID of last poster in forum.', - `forum_icon` varchar(255) COLLATE utf8_bin NOT NULL COMMENT 'Display icon for the forum.', - PRIMARY KEY (`forum_id`) -) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8 COLLATE=utf8_bin; - - -DROP TABLE IF EXISTS `fii_infopages`; -CREATE TABLE `fii_infopages` ( - `shorthand` varchar(255) COLLATE utf8_bin NOT NULL COMMENT 'Name used for calling this page up in the /r/URL', - `pagetitle` varchar(255) COLLATE utf8_bin NOT NULL COMMENT 'Title displayed on the top of the page', - `content` text COLLATE utf8_bin NOT NULL COMMENT 'Content of the page' +DROP TABLE IF EXISTS `sakura_faq`; +CREATE TABLE `sakura_faq` ( + `id` bigint(128) unsigned NOT NULL AUTO_INCREMENT COMMENT 'MySQL Generated ID used for sorting.', + `short` varchar(255) COLLATE utf8_bin NOT NULL COMMENT 'Used for linking directly to a question.', + `question` varchar(255) COLLATE utf8_bin NOT NULL COMMENT 'The question.', + `answer` text COLLATE utf8_bin NOT NULL COMMENT 'The answer.', + PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin; -DROP TABLE IF EXISTS `fii_messages`; -CREATE TABLE `fii_messages` ( - `id` bigint(128) unsigned NOT NULL AUTO_INCREMENT COMMENT 'Automatically generated ID by MySQL for management.', - `fromUser` bigint(128) unsigned NOT NULL COMMENT 'ID of the user that sent this message.', - `toUsers` varchar(255) COLLATE utf8_bin NOT NULL COMMENT 'IDs of users that should "receive" this message.', - `readBy` varchar(255) COLLATE utf8_bin NOT NULL COMMENT 'IDs of users who read this message.', - `deletedBy` varchar(255) COLLATE utf8_bin NOT NULL COMMENT 'IDs of users who deleted this message, if all are set to true delete database entry.', - `date` int(64) unsigned NOT NULL COMMENT 'Timestamp of the time this message was sent', - `title` varchar(255) COLLATE utf8_bin NOT NULL COMMENT 'Title of the message', - `content` text COLLATE utf8_bin NOT NULL COMMENT 'Contents of the message.', - PRIMARY KEY (`id`) +DROP TABLE IF EXISTS `sakura_forums`; +CREATE TABLE `sakura_forums` ( + `forum_id` bigint(255) unsigned NOT NULL AUTO_INCREMENT COMMENT 'MySQL Generated ID used for sorting.', + `forum_name` varchar(255) COLLATE utf8_bin NOT NULL COMMENT 'Display name of the forum.', + `forum_desc` text COLLATE utf8_bin NOT NULL COMMENT 'Description of the forum.', + `forum_link` varchar(255) COLLATE utf8_bin NOT NULL COMMENT 'If set forum will display as a link.', + `forum_category` bigint(255) unsigned NOT NULL DEFAULT '0' COMMENT 'ID of the category this forum falls under.', + `forum_type` tinyint(4) unsigned NOT NULL DEFAULT '0' COMMENT 'Forum type, 0 for regular board, 1 for category and 2 for link.', + `forum_posts` bigint(128) unsigned NOT NULL DEFAULT '0' COMMENT 'Post count of the forum', + `forum_topics` bigint(255) unsigned NOT NULL DEFAULT '0' COMMENT 'Topic count of the forum.', + `forum_last_post_id` bigint(255) unsigned NOT NULL DEFAULT '0' COMMENT 'ID of last post in forum.', + `forum_last_poster_id` bigint(255) unsigned NOT NULL DEFAULT '0' COMMENT 'ID of last poster in forum.', + `forum_icon` varchar(255) COLLATE utf8_bin NOT NULL COMMENT 'Display icon for the forum.', + PRIMARY KEY (`forum_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin; -DROP TABLE IF EXISTS `fii_news`; -CREATE TABLE `fii_news` ( - `id` bigint(128) unsigned NOT NULL AUTO_INCREMENT COMMENT 'Automatically generated ID by MySQL for management.', - `uid` bigint(128) unsigned NOT NULL COMMENT 'ID of user who posted this news message.', - `date` int(64) unsigned NOT NULL COMMENT 'News post timestamp.', - `title` varchar(255) COLLATE utf8_bin NOT NULL COMMENT 'Title of the post.', - `content` text COLLATE utf8_bin NOT NULL COMMENT 'Contents of the post', - PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=32 DEFAULT CHARSET=utf8 COLLATE=utf8_bin; - - -DROP TABLE IF EXISTS `fii_notifications`; -CREATE TABLE `fii_notifications` ( - `id` bigint(255) unsigned NOT NULL AUTO_INCREMENT COMMENT 'Automatically generated ID by MySQL for management.', - `uid` bigint(255) unsigned NOT NULL DEFAULT '0' COMMENT 'User ID this notification is intended for.', - `timestamp` int(11) unsigned NOT NULL DEFAULT '0' COMMENT 'Timestamp when this notification was created.', - `notif_read` tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT 'Toggle for unread and read.', - `notif_sound` tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT 'Toggle if a sound should be played upon receiving the notification.', - `notif_title` varchar(255) COLLATE utf8_bin NOT NULL COMMENT 'Title displayed on the notification.', - `notif_text` varchar(255) COLLATE utf8_bin NOT NULL COMMENT 'Text displayed.', - `notif_link` varchar(255) COLLATE utf8_bin DEFAULT NULL COMMENT 'Link (empty for no link).', - `notif_img` varchar(255) COLLATE utf8_bin NOT NULL COMMENT 'Image path, prefix with font: to use a font class instead of an image.', - `notif_timeout` int(16) unsigned NOT NULL DEFAULT '0' COMMENT 'How long the notification should stay on screen in milliseconds, 0 for forever.', - PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 COLLATE=utf8_bin; - - -DROP TABLE IF EXISTS `fii_posts`; -CREATE TABLE `fii_posts` ( - `post_id` bigint(255) unsigned NOT NULL AUTO_INCREMENT COMMENT 'MySQL Generated ID used for sorting.', - `topic_id` bigint(255) unsigned NOT NULL DEFAULT '0' COMMENT 'ID of topic this post is a part of.', - `forum_id` bigint(255) unsigned NOT NULL DEFAULT '0' COMMENT 'ID of forum this was posted in.', - `poster_id` bigint(255) unsigned NOT NULL DEFAULT '0' COMMENT 'ID of poster of this post.', - `poster_ip` varchar(40) COLLATE utf8_bin NOT NULL COMMENT 'IP of poster.', - `post_time` int(11) unsigned NOT NULL DEFAULT '0' COMMENT 'Time this post was made.', - `enable_markdown` tinyint(1) unsigned NOT NULL DEFAULT '1' COMMENT 'Toggle if markdown should be enabled.', - `enable_sig` tinyint(1) unsigned NOT NULL DEFAULT '1' COMMENT 'Toggle if signature should be shown.', - `post_subject` varchar(255) COLLATE utf8_bin NOT NULL COMMENT 'Subject of the post.', - `post_text` text COLLATE utf8_bin NOT NULL COMMENT 'Contents of the post.', - `post_edit_time` int(11) unsigned NOT NULL DEFAULT '0' COMMENT 'Time this post was last edited.', - `post_edit_reason` varchar(255) COLLATE utf8_bin NOT NULL COMMENT 'Reason this was edited.', - `post_edit_user` int(255) unsigned NOT NULL DEFAULT '0' COMMENT 'ID of user that edited.', - PRIMARY KEY (`post_id`) +DROP TABLE IF EXISTS `sakura_friends`; +CREATE TABLE `sakura_friends` ( + `uid` bigint(255) unsigned NOT NULL COMMENT 'ID of the user that added the friend.', + `fid` bigint(255) unsigned NOT NULL COMMENT 'ID of the user that was added as a friend.', + `timestamp` int(11) unsigned NOT NULL COMMENT 'Timestamp of action.' ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin; -DROP TABLE IF EXISTS `fii_profilefields`; -CREATE TABLE `fii_profilefields` ( - `id` int(64) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID used for ordering on the userpage.', - `name` varchar(255) COLLATE utf8_bin NOT NULL COMMENT 'Name of the field.', - `formtype` varchar(255) COLLATE utf8_bin NOT NULL COMMENT 'Type attribute in the input element.', - `islink` tinyint(1) unsigned NOT NULL COMMENT 'Set if this value should be put in a href.', - `linkformat` varchar(255) COLLATE utf8_bin NOT NULL COMMENT 'If the form is a link how should it be formatted? {{ VAL }} gets replace with the value.', - `description` varchar(255) COLLATE utf8_bin NOT NULL COMMENT 'Description of the field displayed in the control panel.', - `additional` varchar(255) COLLATE utf8_bin NOT NULL COMMENT 'Undocumented JSON array containing special options if needed (probably only going to be used for the YouTube field).', - PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8 COLLATE=utf8_bin; - - -DROP TABLE IF EXISTS `fii_ranks`; -CREATE TABLE `fii_ranks` ( - `id` bigint(128) unsigned NOT NULL AUTO_INCREMENT COMMENT 'Automatically generated ID by MySQL for management.', - `name` varchar(255) COLLATE utf8_bin NOT NULL COMMENT 'Display name of the rank.', - `multi` tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT 'Can the rank name have an s at the end?', - `colour` varchar(255) COLLATE utf8_bin NOT NULL COMMENT 'Colour used for the username of a member of this rank.', - `description` text COLLATE utf8_bin NOT NULL COMMENT 'A description of what a user of this rank can do/is supposed to do.', - `title` varchar(255) COLLATE utf8_bin NOT NULL COMMENT 'Default user title if user has none set.', - `is_premium` tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT 'Flag to set if the user group is a premium group.', - PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8 COLLATE=utf8_bin; - -TRUNCATE `fii_ranks`; -INSERT INTO `fii_ranks` (`id`, `name`, `multi`, `colour`, `description`, `title`, `is_premium`) VALUES -(1, 'Deactivated', 0, '#555', 'Users that are yet to be activated or that deactivated their own account.', 'Deactivated', 0), -(2, 'Regular user', 1, 'inherit', 'Regular users with regular permissions.', 'Regular user', 0), -(3, 'Site moderator', 1, '#0A0', 'Users with special permissions like being able to ban and modify users if needed.', 'Staff', 1), -(4, 'Administrator', 1, '#C00', 'Users that manage the server and everything around that.', 'Administrator', 1), -(5, 'Developer', 1, '#824CA0', 'Users that either create or test new features of the site.', 'Staff', 1), -(6, 'Bot', 1, '#9E8DA7', 'Reserved user accounts for services.', 'Bot', 0), -(7, 'Chat moderator', 1, '#09F', 'Moderators of the chat room.', 'Staff', 1), -(8, 'Tenshi', 0, '#EE9400', 'Users that donated $5.00 or more in order to keep the site and it\'s services alive!', 'Tenshi', 1), -(9, 'Alumnii', 0, '#FF69B4', 'People who have contributed to the community but have moved on or resigned.', 'Alumnii', 1); - -DROP TABLE IF EXISTS `fii_regcodes`; -CREATE TABLE `fii_regcodes` ( - `id` bigint(128) unsigned NOT NULL AUTO_INCREMENT COMMENT 'Automatically generated ID by MySQL for management.', - `code` varchar(32) COLLATE utf8_bin NOT NULL COMMENT 'Randomly generated registration key.', - `created_by` bigint(128) unsigned NOT NULL COMMENT 'ID of user who generated this code.', - `used_by` bigint(128) unsigned NOT NULL COMMENT 'ID of user who used this code.', - `key_used` tinyint(1) unsigned NOT NULL COMMENT 'Boolean for setting this key as used.', - PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COLLATE=utf8_bin; - - -DROP TABLE IF EXISTS `fii_sessions`; -CREATE TABLE `fii_sessions` ( - `id` bigint(128) unsigned NOT NULL AUTO_INCREMENT COMMENT 'Automatically generated ID by MySQL for management. ', - `userip` varchar(255) COLLATE utf8_bin NOT NULL COMMENT 'IP of the user this session is spawned for.', - `useragent` varchar(255) COLLATE utf8_bin DEFAULT NULL COMMENT 'User agent of the user this session is spawned for.', - `userid` bigint(128) unsigned NOT NULL COMMENT 'ID of the user this session is spawned for. ', - `skey` varchar(255) COLLATE utf8_bin NOT NULL COMMENT 'Session key, allow direct access to the user''s account. ', - `started` int(64) unsigned NOT NULL COMMENT 'The timestamp for when the session was started. ', - `expire` int(64) unsigned NOT NULL COMMENT 'The timestamp for when this session should end, -1 for permanent. ', - `remember` tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT 'If set to 1 session will be extended each time a page is loaded.', - PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=66 DEFAULT CHARSET=utf8 COLLATE=utf8_bin; - - -DROP TABLE IF EXISTS `fii_sock_perms`; -CREATE TABLE `fii_sock_perms` ( - `rid` bigint(128) unsigned NOT NULL DEFAULT '0' COMMENT 'ID of rank that this permission counts for (set to 0 if user).', - `uid` bigint(255) unsigned NOT NULL DEFAULT '0' COMMENT 'ID of the user this permission counts for (set to 0 if rank).', - `perms` varchar(128) COLLATE utf8_bin NOT NULL DEFAULT '1,0,0,0,0,0' COMMENT 'Permission data (has access, in-chat rank, user type, log access, nick access, channel creation)' -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin; - -TRUNCATE `fii_sock_perms`; -INSERT INTO `fii_sock_perms` (`rid`, `uid`, `perms`) VALUES -(1, 0, '0,0,0,0,0,0'), -(2, 0, '1,0,0,0,0,0'), -(3, 0, '1,3,1,1,1,1'), -(4, 0, '1,4,2,1,1,2'), -(5, 0, '1,2,1,1,1,1'), -(6, 0, '1,0,0,0,0,0'), -(7, 0, '1,2,1,1,1,1'), -(8, 0, '1,1,0,1,1,1'), -(9, 0, '1,1,0,1,1,1'), -(0, 1, '1,945,1,1,1,2'); - -DROP TABLE IF EXISTS `fii_tenshi`; -CREATE TABLE `fii_tenshi` ( - `id` bigint(255) unsigned NOT NULL AUTO_INCREMENT COMMENT 'Automatically generated ID by MySQL for management.', - `startdate` int(64) unsigned NOT NULL COMMENT 'Purchase timestamp.', - `uid` bigint(255) unsigned NOT NULL COMMENT 'ID of the user that purchased Tenshi.', - `expiredate` int(64) unsigned NOT NULL COMMENT 'Expiration timestamp.', - PRIMARY KEY (`id`) +DROP TABLE IF EXISTS `sakura_infopages`; +CREATE TABLE `sakura_infopages` ( + `shorthand` varchar(255) COLLATE utf8_bin NOT NULL COMMENT 'Name used for calling this page up in the /r/URL', + `pagetitle` varchar(255) COLLATE utf8_bin NOT NULL COMMENT 'Title displayed on the top of the page', + `content` text COLLATE utf8_bin NOT NULL COMMENT 'Content of the page' ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin; -DROP TABLE IF EXISTS `fii_topics`; -CREATE TABLE `fii_topics` ( - `topic_id` bigint(255) unsigned NOT NULL AUTO_INCREMENT COMMENT 'MySQL Generated ID used for sorting.', - `forum_id` bigint(255) unsigned NOT NULL DEFAULT '0' COMMENT 'ID of forum this topic was created in.', - `topic_hidden` tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT 'Boolean to set the topic as hidden.', - `topic_title` varchar(255) COLLATE utf8_bin NOT NULL COMMENT 'Title of the topic.', - `topic_time` int(11) unsigned NOT NULL DEFAULT '0' COMMENT 'Timestamp when the topic was created.', - `topic_time_limit` int(11) unsigned NOT NULL DEFAULT '0' COMMENT 'After how long a topic should be locked.', - `topic_last_reply` int(11) unsigned NOT NULL DEFAULT '0' COMMENT 'Last time a post was posted in this topic.', - `topic_views` bigint(64) unsigned NOT NULL DEFAULT '0' COMMENT 'Amount of times the topic has been viewed.', - `topic_replies` bigint(128) unsigned NOT NULL DEFAULT '0' COMMENT 'Amount of replies the topic has.', - `topic_status` tinyint(3) unsigned NOT NULL DEFAULT '0' COMMENT 'Status of topic.', - `topic_status_change` int(11) unsigned NOT NULL DEFAULT '0' COMMENT 'Date the topic status was changed (used for deletion cooldown as well).', - `topic_type` tinyint(3) unsigned NOT NULL DEFAULT '0' COMMENT 'Type of the topic.', - `topic_first_post_id` bigint(255) unsigned NOT NULL DEFAULT '0' COMMENT 'ID of first post made in this topic.', - `topic_first_poster_id` bigint(255) unsigned NOT NULL DEFAULT '0' COMMENT 'User ID of person who made the first post.', - `topic_last_post_id` bigint(255) unsigned NOT NULL DEFAULT '0' COMMENT 'ID of last post made in this topic.', - `topic_last_poster_id` bigint(255) unsigned NOT NULL DEFAULT '0' COMMENT 'User ID of person who made the last post.', - PRIMARY KEY (`topic_id`) +DROP TABLE IF EXISTS `sakura_logs`; +CREATE TABLE `sakura_logs` ( + `id` bigint(255) unsigned NOT NULL AUTO_INCREMENT COMMENT 'Automatically generated ID by MySQL for management.', + `uid` bigint(255) unsigned NOT NULL COMMENT 'User ID of user that took this action.', + `action` varchar(255) COLLATE utf8_bin NOT NULL COMMENT 'Action identifier.', + `attribs` varchar(255) COLLATE utf8_bin NOT NULL COMMENT 'Optional attributes, vsprintf() style.', + PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin; -DROP TABLE IF EXISTS `fii_users`; -CREATE TABLE `fii_users` ( - `id` bigint(255) unsigned NOT NULL AUTO_INCREMENT COMMENT 'Automatically generated ID by MySQL for management. ', - `username` varchar(255) COLLATE utf8_bin NOT NULL COMMENT 'Username set at registration.', - `username_clean` varchar(255) COLLATE utf8_bin NOT NULL COMMENT 'A more cleaned up version of the username for backend usage.', - `password_hash` varchar(255) COLLATE utf8_bin NOT NULL COMMENT 'Hashing algo used for the password hash.', - `password_salt` varchar(255) COLLATE utf8_bin NOT NULL COMMENT 'Salt used for the password hash.', - `password_algo` varchar(255) COLLATE utf8_bin NOT NULL COMMENT 'Algorithm used for the password hash.', - `password_iter` int(16) unsigned NOT NULL COMMENT 'Password hash iterations.', - `password_chan` int(16) unsigned NOT NULL COMMENT 'Last time the user changed their password.', - `password_new` varchar(255) COLLATE utf8_bin DEFAULT NULL COMMENT 'Field with array containing new password data beit that they requested a password change.', - `email` varchar(32) COLLATE utf8_bin NOT NULL COMMENT 'E-mail of the user for password restoring etc.', - `rank_main` mediumint(4) unsigned NOT NULL DEFAULT '0' COMMENT 'Main rank of the user.', - `ranks` varchar(255) COLLATE utf8_bin NOT NULL DEFAULT '[0]' COMMENT 'Array containing the ranks the user is part of.', - `name_colour` varchar(255) COLLATE utf8_bin DEFAULT NULL COMMENT 'Additional name colour, when empty colour defaults to group colour.', - `register_ip` varchar(16) COLLATE utf8_bin NOT NULL COMMENT 'IP used for the creation of this account.', - `last_ip` varchar(16) COLLATE utf8_bin NOT NULL COMMENT 'Last IP that was used to log into this account.', - `usertitle` varchar(64) COLLATE utf8_bin DEFAULT NULL COMMENT 'Custom user title of the user, when empty reverts to their derault group name.', - `profile_md` text COLLATE utf8_bin COMMENT 'Markdown customise page thing on the profile of the user.', - `avatar_url` varchar(255) COLLATE utf8_bin DEFAULT NULL COMMENT 'Full url to the user''s avatar.', - `background_url` varchar(255) COLLATE utf8_bin DEFAULT NULL COMMENT 'Full url to the user''s profile background.', - `regdate` int(16) unsigned NOT NULL DEFAULT '0' COMMENT 'Timestamp of account creation.', - `lastdate` int(16) unsigned NOT NULL DEFAULT '0' COMMENT 'Last time anything was done on this account.', - `lastunamechange` int(16) unsigned NOT NULL DEFAULT '0' COMMENT 'Last username change.', - `birthday` varchar(16) COLLATE utf8_bin DEFAULT NULL COMMENT 'Birthdate of the user.', - `posts` int(16) unsigned NOT NULL DEFAULT '0' COMMENT 'Amount of posts the user has made on the forum.', - `country` varchar(4) COLLATE utf8_bin NOT NULL COMMENT 'Contains ISO 3166 country code of user''s registration location.', - `profile_data` text COLLATE utf8_bin NOT NULL COMMENT 'Modular array containing profile data.', - PRIMARY KEY (`id`), - UNIQUE KEY `username_clean` (`username_clean`) -) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8 COLLATE=utf8_bin; +DROP TABLE IF EXISTS `sakura_logtypes`; +CREATE TABLE `sakura_logtypes` ( + `id` varchar(255) COLLATE utf8_bin NOT NULL COMMENT 'Identifier of action (has to match things in the logs table).', + `string` varchar(255) COLLATE utf8_bin NOT NULL COMMENT 'String to format using vsprintf and the attributes in the logs table.' +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin; -DROP TABLE IF EXISTS `fii_warnings`; -CREATE TABLE `fii_warnings` ( - `id` bigint(128) unsigned NOT NULL AUTO_INCREMENT COMMENT 'Automatically generated ID by MySQL for management.', - `uid` bigint(128) unsigned NOT NULL COMMENT 'ID of user that was warned.', - `iid` bigint(128) unsigned NOT NULL COMMENT 'ID of the user that issued the warning.', - `issued` int(64) unsigned NOT NULL COMMENT 'Timestamp of the date the warning was issued.', - `expire` int(64) unsigned NOT NULL COMMENT 'Timstamp when the warning should expire, 0 for a permanent warning.', - `reason` varchar(255) COLLATE utf8_bin DEFAULT NULL COMMENT 'Reason for the warning.', - PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COLLATE=utf8_bin; +DROP TABLE IF EXISTS `sakura_messages`; +CREATE TABLE `sakura_messages` ( + `id` bigint(128) unsigned NOT NULL AUTO_INCREMENT COMMENT 'Automatically generated ID by MySQL for management.', + `from_user` bigint(255) unsigned NOT NULL COMMENT 'ID of the user that sent this message.', + `to_user` bigint(255) unsigned NOT NULL COMMENT 'ID of user that should receive this message.', + `read` varchar(255) COLLATE utf8_bin NOT NULL COMMENT 'IDs of users who read this message.', + `deleted` varchar(255) COLLATE utf8_bin NOT NULL COMMENT 'Indicator if one of the parties deleted the message, if it is already 1 the script will remove this row.', + `timestamp` int(11) unsigned NOT NULL COMMENT 'Timestamp of the time this message was sent', + `subject` varchar(255) COLLATE utf8_bin NOT NULL COMMENT 'Title of the message', + `content` text COLLATE utf8_bin NOT NULL COMMENT 'Contents of the message.', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin; --- 2015-05-09 00:57:52 +DROP TABLE IF EXISTS `sakura_news`; +CREATE TABLE `sakura_news` ( + `id` bigint(128) unsigned NOT NULL AUTO_INCREMENT COMMENT 'Automatically generated ID by MySQL for management.', + `uid` bigint(128) unsigned NOT NULL COMMENT 'ID of user who posted this news message.', + `date` int(64) unsigned NOT NULL COMMENT 'News post timestamp.', + `title` varchar(255) COLLATE utf8_bin NOT NULL COMMENT 'Title of the post.', + `content` text COLLATE utf8_bin NOT NULL COMMENT 'Contents of the post', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin; + + +DROP TABLE IF EXISTS `sakura_notifications`; +CREATE TABLE `sakura_notifications` ( + `id` bigint(255) unsigned NOT NULL AUTO_INCREMENT COMMENT 'Automatically generated ID by MySQL for management.', + `uid` bigint(255) unsigned NOT NULL DEFAULT '0' COMMENT 'User ID this notification is intended for.', + `timestamp` int(11) unsigned NOT NULL DEFAULT '0' COMMENT 'Timestamp when this notification was created.', + `notif_read` tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT 'Toggle for unread and read.', + `notif_sound` tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT 'Toggle if a sound should be played upon receiving the notification.', + `notif_title` varchar(255) COLLATE utf8_bin NOT NULL COMMENT 'Title displayed on the notification.', + `notif_text` varchar(255) COLLATE utf8_bin NOT NULL COMMENT 'Text displayed.', + `notif_link` varchar(255) COLLATE utf8_bin DEFAULT NULL COMMENT 'Link (empty for no link).', + `notif_img` varchar(255) COLLATE utf8_bin NOT NULL COMMENT 'Image path, prefix with font: to use a font class instead of an image.', + `notif_timeout` int(16) unsigned NOT NULL DEFAULT '0' COMMENT 'How long the notification should stay on screen in milliseconds, 0 for forever.', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin; + + +DROP TABLE IF EXISTS `sakura_posts`; +CREATE TABLE `sakura_posts` ( + `post_id` bigint(255) unsigned NOT NULL AUTO_INCREMENT COMMENT 'MySQL Generated ID used for sorting.', + `topic_id` bigint(255) unsigned NOT NULL DEFAULT '0' COMMENT 'ID of topic this post is a part of.', + `forum_id` bigint(255) unsigned NOT NULL DEFAULT '0' COMMENT 'ID of forum this was posted in.', + `poster_id` bigint(255) unsigned NOT NULL DEFAULT '0' COMMENT 'ID of poster of this post.', + `poster_ip` varchar(40) COLLATE utf8_bin NOT NULL COMMENT 'IP of poster.', + `post_time` int(11) unsigned NOT NULL DEFAULT '0' COMMENT 'Time this post was made.', + `enable_markdown` tinyint(1) unsigned NOT NULL DEFAULT '1' COMMENT 'Toggle if markdown should be enabled.', + `enable_sig` tinyint(1) unsigned NOT NULL DEFAULT '1' COMMENT 'Toggle if signature should be shown.', + `post_subject` varchar(255) COLLATE utf8_bin NOT NULL COMMENT 'Subject of the post.', + `post_text` text COLLATE utf8_bin NOT NULL COMMENT 'Contents of the post.', + `post_edit_time` int(11) unsigned NOT NULL DEFAULT '0' COMMENT 'Time this post was last edited.', + `post_edit_reason` varchar(255) COLLATE utf8_bin NOT NULL COMMENT 'Reason this was edited.', + `post_edit_user` int(255) unsigned NOT NULL DEFAULT '0' COMMENT 'ID of user that edited.', + PRIMARY KEY (`post_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin; + + +DROP TABLE IF EXISTS `sakura_profilefields`; +CREATE TABLE `sakura_profilefields` ( + `id` int(64) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID used for ordering on the userpage.', + `name` varchar(255) COLLATE utf8_bin NOT NULL COMMENT 'Name of the field.', + `formtype` varchar(255) COLLATE utf8_bin NOT NULL COMMENT 'Type attribute in the input element.', + `islink` tinyint(1) unsigned NOT NULL COMMENT 'Set if this value should be put in a href.', + `linkformat` varchar(255) COLLATE utf8_bin NOT NULL COMMENT 'If the form is a link how should it be formatted? {{ VAL }} gets replace with the value.', + `description` varchar(255) COLLATE utf8_bin NOT NULL COMMENT 'Description of the field displayed in the control panel.', + `additional` varchar(255) COLLATE utf8_bin NOT NULL COMMENT 'Undocumented JSON array containing special options if needed (probably only going to be used for the YouTube field).', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin; + + +INSERT INTO `sakura_profilefields` (`id`, `name`, `formtype`, `islink`, `linkformat`, `description`, `additional`) VALUES +(1, 'Website', 'url', 1, '{{ VAL }}', 'URL to your website', ''), +(2, 'Twitter', 'text', 1, 'https://twitter.com/{{ VAL }}', 'Your @twitter Username', ''), +(3, 'GitHub', 'text', 1, 'https://github.com/{{ VAL }}', 'Your GitHub Username', ''), +(4, 'Skype', 'text', 1, 'skype:{{ VAL }}?userinfo', 'Your Skype Username', ''), +(5, 'YouTube', 'text', 0, '', 'ID or Username excluding http://youtube.com/*/', '{\"youtubetype\": [\"checkbox\", \"I do not have a Channel Username (url looks like https://www.youtube.com/channel/UCXZcw5hw5C7Neto-T_nRXBQ).\"]}'), +(6, 'SoundCloud', 'text', 1, 'https://soundcloud.com/{{ VAL }}', 'Your SoundCloud username', ''), +(7, 'Steam', 'text', 1, 'https://steamcommunity.com/id/{{ VAL }}', 'Your Steam Community Username (may differ from login username)', ''), +(8, 'osu!', 'text', 1, 'https://osu.ppy.sh/u/{{ VAL }}', 'Your osu! Username', ''), +(9, 'Origin', 'text', 0, '', 'Your Origin User ID', ''), +(10, 'Xbox Live', 'text', 1, 'https://account.xbox.com/en-GB/Profile?Gamertag={{ VAL }}', 'Your Xbox User ID', ''), +(11, 'PSN', 'text', 1, 'http://psnprofiles.com/{{ VAL }}', 'Your PSN User ID', ''); + +DROP TABLE IF EXISTS `sakura_ranks`; +CREATE TABLE `sakura_ranks` ( + `id` bigint(128) unsigned NOT NULL AUTO_INCREMENT COMMENT 'Automatically generated ID by MySQL for management.', + `name` varchar(255) COLLATE utf8_bin NOT NULL COMMENT 'Display name of the rank.', + `multi` tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT 'Can the rank name have an s at the end?', + `colour` varchar(255) COLLATE utf8_bin NOT NULL COMMENT 'Colour used for the username of a member of this rank.', + `description` text COLLATE utf8_bin NOT NULL COMMENT 'A description of what a user of this rank can do/is supposed to do.', + `title` varchar(255) COLLATE utf8_bin NOT NULL COMMENT 'Default user title if user has none set.', + `is_premium` tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT 'Flag to set if the user group is a premium group.', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin; + + +DROP TABLE IF EXISTS `sakura_regcodes`; +CREATE TABLE `sakura_regcodes` ( + `id` bigint(128) unsigned NOT NULL AUTO_INCREMENT COMMENT 'Automatically generated ID by MySQL for management.', + `code` varchar(32) COLLATE utf8_bin NOT NULL COMMENT 'Randomly generated registration key.', + `created_by` bigint(128) unsigned NOT NULL COMMENT 'ID of user who generated this code.', + `used_by` bigint(128) unsigned NOT NULL COMMENT 'ID of user who used this code.', + `key_used` tinyint(1) unsigned NOT NULL COMMENT 'Boolean for setting this key as used.', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin; + + +DROP TABLE IF EXISTS `sakura_sessions`; +CREATE TABLE `sakura_sessions` ( + `id` bigint(128) unsigned NOT NULL AUTO_INCREMENT COMMENT 'Automatically generated ID by MySQL for management. ', + `userip` varchar(255) COLLATE utf8_bin NOT NULL COMMENT 'IP of the user this session is spawned for.', + `useragent` varchar(255) COLLATE utf8_bin DEFAULT NULL COMMENT 'User agent of the user this session is spawned for.', + `userid` bigint(128) unsigned NOT NULL COMMENT 'ID of the user this session is spawned for. ', + `skey` varchar(255) COLLATE utf8_bin NOT NULL COMMENT 'Session key, allow direct access to the user''s account. ', + `started` int(64) unsigned NOT NULL COMMENT 'The timestamp for when the session was started. ', + `expire` int(64) unsigned NOT NULL COMMENT 'The timestamp for when this session should end, -1 for permanent. ', + `remember` tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT 'If set to 1 session will be extended each time a page is loaded.', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin; + + +DROP TABLE IF EXISTS `sakura_sock_perms`; +CREATE TABLE `sakura_sock_perms` ( + `rid` bigint(128) unsigned NOT NULL DEFAULT '0' COMMENT 'ID of rank that this permission counts for (set to 0 if user).', + `uid` bigint(255) unsigned NOT NULL DEFAULT '0' COMMENT 'ID of the user this permission counts for (set to 0 if rank).', + `perms` varchar(128) COLLATE utf8_bin NOT NULL DEFAULT '1,0,0,0,0,0' COMMENT 'Permission data (has access, in-chat rank, user type, log access, nick access, channel creation)' +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin; + +INSERT INTO `sakura_sock_perms` (`rid`, `uid`, `perms`) VALUES +(1, 0, '0,0,0,0,0,0'), +(2, 0, '1,0,0,0,0,0'), +(3, 0, '1,3,1,1,1,1'), +(4, 0, '1,4,2,1,1,2'), +(5, 0, '1,2,1,1,1,1'), +(6, 0, '1,0,0,0,0,0'), +(7, 0, '1,2,1,1,1,1'), +(8, 0, '1,1,0,1,1,1'), +(9, 0, '1,1,0,1,1,1'), + + +DROP TABLE IF EXISTS `sakura_tenshi`; +CREATE TABLE `sakura_tenshi` ( + `id` bigint(255) unsigned NOT NULL AUTO_INCREMENT COMMENT 'Automatically generated ID by MySQL for management.', + `startdate` int(64) unsigned NOT NULL COMMENT 'Purchase timestamp.', + `uid` bigint(255) unsigned NOT NULL COMMENT 'ID of the user that purchased Tenshi.', + `expiredate` int(64) unsigned NOT NULL COMMENT 'Expiration timestamp.', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin; + + +DROP TABLE IF EXISTS `sakura_topics`; +CREATE TABLE `sakura_topics` ( + `topic_id` bigint(255) unsigned NOT NULL AUTO_INCREMENT COMMENT 'MySQL Generated ID used for sorting.', + `forum_id` bigint(255) unsigned NOT NULL DEFAULT '0' COMMENT 'ID of forum this topic was created in.', + `topic_hidden` tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT 'Boolean to set the topic as hidden.', + `topic_title` varchar(255) COLLATE utf8_bin NOT NULL COMMENT 'Title of the topic.', + `topic_time` int(11) unsigned NOT NULL DEFAULT '0' COMMENT 'Timestamp when the topic was created.', + `topic_time_limit` int(11) unsigned NOT NULL DEFAULT '0' COMMENT 'After how long a topic should be locked.', + `topic_last_reply` int(11) unsigned NOT NULL DEFAULT '0' COMMENT 'Last time a post was posted in this topic.', + `topic_views` bigint(64) unsigned NOT NULL DEFAULT '0' COMMENT 'Amount of times the topic has been viewed.', + `topic_replies` bigint(128) unsigned NOT NULL DEFAULT '0' COMMENT 'Amount of replies the topic has.', + `topic_status` tinyint(3) unsigned NOT NULL DEFAULT '0' COMMENT 'Status of topic.', + `topic_status_change` int(11) unsigned NOT NULL DEFAULT '0' COMMENT 'Date the topic status was changed (used for deletion cooldown as well).', + `topic_type` tinyint(3) unsigned NOT NULL DEFAULT '0' COMMENT 'Type of the topic.', + `topic_first_post_id` bigint(255) unsigned NOT NULL DEFAULT '0' COMMENT 'ID of first post made in this topic.', + `topic_first_poster_id` bigint(255) unsigned NOT NULL DEFAULT '0' COMMENT 'User ID of person who made the first post.', + `topic_last_post_id` bigint(255) unsigned NOT NULL DEFAULT '0' COMMENT 'ID of last post made in this topic.', + `topic_last_poster_id` bigint(255) unsigned NOT NULL DEFAULT '0' COMMENT 'User ID of person who made the last post.', + PRIMARY KEY (`topic_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin; + + +DROP TABLE IF EXISTS `sakura_users`; +CREATE TABLE `sakura_users` ( + `id` bigint(255) unsigned NOT NULL AUTO_INCREMENT COMMENT 'Automatically generated ID by MySQL for management. ', + `username` varchar(255) COLLATE utf8_bin NOT NULL COMMENT 'Username set at registration.', + `username_clean` varchar(255) COLLATE utf8_bin NOT NULL COMMENT 'A more cleaned up version of the username for backend usage.', + `password_hash` varchar(255) COLLATE utf8_bin NOT NULL COMMENT 'Hashing algo used for the password hash.', + `password_salt` varchar(255) COLLATE utf8_bin NOT NULL COMMENT 'Salt used for the password hash.', + `password_algo` varchar(255) COLLATE utf8_bin NOT NULL COMMENT 'Algorithm used for the password hash.', + `password_iter` int(16) unsigned NOT NULL COMMENT 'Password hash iterations.', + `password_chan` int(16) unsigned NOT NULL COMMENT 'Last time the user changed their password.', + `password_new` varchar(255) COLLATE utf8_bin DEFAULT NULL COMMENT 'Field with array containing new password data beit that they requested a password change.', + `email` varchar(32) COLLATE utf8_bin NOT NULL COMMENT 'E-mail of the user for password restoring etc.', + `rank_main` mediumint(4) unsigned NOT NULL DEFAULT '0' COMMENT 'Main rank of the user.', + `ranks` varchar(255) COLLATE utf8_bin NOT NULL DEFAULT '[0]' COMMENT 'Array containing the ranks the user is part of.', + `name_colour` varchar(255) COLLATE utf8_bin DEFAULT NULL COMMENT 'Additional name colour, when empty colour defaults to group colour.', + `register_ip` varchar(16) COLLATE utf8_bin NOT NULL COMMENT 'IP used for the creation of this account.', + `last_ip` varchar(16) COLLATE utf8_bin NOT NULL COMMENT 'Last IP that was used to log into this account.', + `usertitle` varchar(64) COLLATE utf8_bin DEFAULT NULL COMMENT 'Custom user title of the user, when empty reverts to their derault group name.', + `profile_md` text COLLATE utf8_bin COMMENT 'Markdown customise page thing on the profile of the user.', + `avatar_url` varchar(255) COLLATE utf8_bin DEFAULT NULL COMMENT 'Full url to the user''s avatar.', + `background_url` varchar(255) COLLATE utf8_bin DEFAULT NULL COMMENT 'Full url to the user''s profile background.', + `regdate` int(16) unsigned NOT NULL DEFAULT '0' COMMENT 'Timestamp of account creation.', + `lastdate` int(16) unsigned NOT NULL DEFAULT '0' COMMENT 'Last time anything was done on this account.', + `lastunamechange` int(16) unsigned NOT NULL DEFAULT '0' COMMENT 'Last username change.', + `birthday` varchar(16) COLLATE utf8_bin DEFAULT NULL COMMENT 'Birthdate of the user.', + `posts` int(16) unsigned NOT NULL DEFAULT '0' COMMENT 'Amount of posts the user has made on the forum.', + `country` varchar(4) COLLATE utf8_bin NOT NULL COMMENT 'Contains ISO 3166 country code of user''s registration location.', + `profile_data` text COLLATE utf8_bin NOT NULL COMMENT 'Modular array containing profile data.', + PRIMARY KEY (`id`), + UNIQUE KEY `username_clean` (`username_clean`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin; + + +DROP TABLE IF EXISTS `sakura_warnings`; +CREATE TABLE `sakura_warnings` ( + `id` bigint(128) unsigned NOT NULL AUTO_INCREMENT COMMENT 'Automatically generated ID by MySQL for management.', + `uid` bigint(128) unsigned NOT NULL COMMENT 'ID of user that was warned.', + `iid` bigint(128) unsigned NOT NULL COMMENT 'ID of the user that issued the warning.', + `issued` int(64) unsigned NOT NULL COMMENT 'Timestamp of the date the warning was issued.', + `expire` int(64) unsigned NOT NULL COMMENT 'Timstamp when the warning should expire, 0 for a permanent warning.', + `reason` varchar(255) COLLATE utf8_bin DEFAULT NULL COMMENT 'Reason for the warning.', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin; + + +-- 2015-05-24 14:34:25 diff --git a/_sakura/changelog.json b/_sakura/changelog.json index 82c4a4a..eb662b1 100644 --- a/_sakura/changelog.json +++ b/_sakura/changelog.json @@ -12,7 +12,8 @@ "20150509", "20150509.1", "20150512", - "20150523" + "20150523", + "20150524" ] @@ -1061,6 +1062,47 @@ "change": "Fixed broken links because of the domainset changes." } + ], + + "20150524": [ + + { + "type": "UPD", + "change": "Move site description and tags to the config." + }, + { + "type": "UPD", + "change": "Export SQL structure." + }, + { + "type": "UPD", + "change": "Added new favicon." + }, + { + "type": "UPD", + "change": "Moved Members button to the user part of the header menu and added a link to search." + }, + { + "type": "UPD", + "change": "Redid scroll to top button and added a cute little animation to it." + }, + { + "type": "REM", + "change": "Removed unused code for error logging." + }, + { + "type": "ADD", + "change": "Added flag to login function that doesn't set cookies." + }, + { + "type": "ADD", + "change": "Added a method to checkLogin to bypass cookies." + }, + { + "type": "UPD", + "change": "Made the manage footer sticky to the bottom." + } + ] } diff --git a/_sakura/components/Main.php b/_sakura/components/Main.php index 874dab1..422f5b7 100644 --- a/_sakura/components/Main.php +++ b/_sakura/components/Main.php @@ -555,4 +555,18 @@ class Main { } + // Convert a number to a hexadecimal value + public static function toHex($num) { + + // Convert $num to an int if not yet + $num = intval($num); + + // Check if it's within the proper range + if($num < 0 || $num > 255) + return 00; + + + + } + } diff --git a/_sakura/components/Users.php b/_sakura/components/Users.php index 78e7b90..bdfe71e 100644 --- a/_sakura/components/Users.php +++ b/_sakura/components/Users.php @@ -48,27 +48,34 @@ class Users { ]; // Check if a user is logged in - public static function checkLogin() { + public static function checkLogin($uid = null, $sid = null, $bypassCookies = false) { - // Check if the cookies are set - if( - !isset($_COOKIE[Configuration::getConfig('cookie_prefix') .'id']) || - !isset($_COOKIE[Configuration::getConfig('cookie_prefix') .'session']) - ) - return false; + // Set $uid and $sid if they're null + if($uid == null) + $uid = Session::$userId; + + // ^ + if($sid == null) + $sid = Session::$sessionId; + + // Check if cookie bypass is false + if(!$bypassCookies) { + + // Check if the cookies are set + if(!isset($_COOKIE[Configuration::getConfig('cookie_prefix') .'id']) || !isset($_COOKIE[Configuration::getConfig('cookie_prefix') .'session'])) + return false; + + } // Check if the session exists - if(!$session = Session::checkSession( - Session::$userId, - Session::$sessionId - )) + if(!$session = Session::checkSession($uid, $sid)) return false; // Extend the cookie times if the remember flag is set - if($session == 2) { + if($session == 2 && !$bypassCookies) { - setcookie(Configuration::getConfig('cookie_prefix') .'id', Session::$userId, time() + 604800, Configuration::getConfig('cookie_path'), Configuration::getConfig('cookie_domain')); - setcookie(Configuration::getConfig('cookie_prefix') .'session', Session::$sessionId, time() + 604800, Configuration::getConfig('cookie_path'), Configuration::getConfig('cookie_domain')); + setcookie(Configuration::getConfig('cookie_prefix') .'id', $uid, time() + 604800, Configuration::getConfig('cookie_path'), Configuration::getConfig('cookie_domain')); + setcookie(Configuration::getConfig('cookie_prefix') .'session', $sid, time() + 604800, Configuration::getConfig('cookie_path'), Configuration::getConfig('cookie_domain')); } @@ -78,12 +85,12 @@ class Users { 'lastdate' => time() ], [ - 'id' => [Session::$userId, '='] + 'id' => [$uid, '='] ] ]); // Redirect people that need to change their password to the new format - if(self::getUser(Session::$userId)['password_algo'] == 'legacy' && $_SERVER['PHP_SELF'] != '/authenticate.php' && $_SERVER['PHP_SELF'] != '/imageserve.php') + if(self::getUser($uid)['password_algo'] == 'legacy' && $_SERVER['PHP_SELF'] != '/authenticate.php' && $_SERVER['PHP_SELF'] != '/imageserve.php') header('Location: /authenticate.php?legacy=true'); // If everything went through return true @@ -92,7 +99,7 @@ class Users { } // Log a user in - public static function login($username, $password, $remember = false) { + public static function login($username, $password, $remember = false, $cookies = true) { // Check if authentication is disallowed if(Configuration::getConfig('lock_authentication')) @@ -135,8 +142,12 @@ class Users { $sessionKey = Session::newSession($user['id'], $remember); // Set cookies - setcookie(Configuration::getConfig('cookie_prefix') .'id', $user['id'], time() + 604800, Configuration::getConfig('cookie_path'), Configuration::getConfig('cookie_domain')); - setcookie(Configuration::getConfig('cookie_prefix') .'session', $sessionKey, time() + 604800, Configuration::getConfig('cookie_path'), Configuration::getConfig('cookie_domain')); + if($cookies) { + + setcookie(Configuration::getConfig('cookie_prefix') .'id', $user['id'], time() + 604800, Configuration::getConfig('cookie_path'), Configuration::getConfig('cookie_domain')); + setcookie(Configuration::getConfig('cookie_prefix') .'session', $sessionKey, time() + 604800, Configuration::getConfig('cookie_path'), Configuration::getConfig('cookie_domain')); + + } // Successful login! (also has a thing for the legacy password system) return [1, ($user['password_algo'] == 'legacy' ? 'LEGACY_SUCCESS' : 'LOGIN_SUCESS')]; @@ -1034,4 +1045,11 @@ class Users { } + // Checking bans + public static function checkBan($uid) { + + + + } + } diff --git a/_sakura/sakura.php b/_sakura/sakura.php index 233bad6..e967825 100644 --- a/_sakura/sakura.php +++ b/_sakura/sakura.php @@ -1,6 +1,6 @@ */ @@ -8,7 +8,7 @@ namespace Sakura; // Define Sakura version -define('SAKURA_VERSION', '20150523'); +define('SAKURA_VERSION', '20150524'); define('SAKURA_VLABEL', 'Eminence'); define('SAKURA_VTYPE', 'Development'); define('SAKURA_COLOUR', '#6C3082'); @@ -18,8 +18,6 @@ define('ROOT', str_replace(basename(__DIR__), '', dirname(__FILE__))); // Error Reporting: 0 for production and -1 for testing error_reporting(-1); -ini_set('log_errors', 1); -ini_set('error_log', ROOT .'errors.log'); // Start output buffering ob_start(); @@ -73,6 +71,8 @@ $renderData = array( 'requireregcodes' => Configuration::getConfig('require_registration_code'), 'requireactiveate' => Configuration::getConfig('require_activation'), 'sitename' => Configuration::getConfig('sitename'), + 'sitedesc' => Configuration::getConfig('sitedesc'), + 'sitetags' => implode(", ", json_decode(Configuration::getConfig('sitetags'), true)), 'cookieprefix' => Configuration::getConfig('cookie_prefix'), 'cookiedomain' => Configuration::getConfig('cookie_domain'), 'cookiepath' => Configuration::getConfig('cookie_path') diff --git a/_sakura/templates/changeLog.tpl b/_sakura/templates/changeLog.tpl index afc1dd0..f55f98e 100644 --- a/_sakura/templates/changeLog.tpl +++ b/_sakura/templates/changeLog.tpl @@ -106,7 +106,7 @@ diff --git a/_sakura/templates/errorPage.tpl b/_sakura/templates/errorPage.tpl index b4f99df..24bb184 100644 --- a/_sakura/templates/errorPage.tpl +++ b/_sakura/templates/errorPage.tpl @@ -68,7 +68,7 @@
{{ error }}
-

If you have an account on GitHub please go to the issues section and report the error listed above (do a check to see if it hasn't been reported yet as well).

+

If you have an account on GitHub please go to the issues section and report the error listed above (do a check to see if it hasn't been reported yet as well).

Contact the System Operator at me@flash.moe or check our Status Page and Twitter Account to see if anything is going on. diff --git a/_sakura/templates/yuuno/global/footer.tpl b/_sakura/templates/yuuno/global/footer.tpl index 7cbbfc6..ef5cc68 100644 --- a/_sakura/templates/yuuno/global/footer.tpl +++ b/_sakura/templates/yuuno/global/footer.tpl @@ -1,8 +1,8 @@ - +
diff --git a/_sakura/templates/yuuno/global/header.tpl b/_sakura/templates/yuuno/global/header.tpl index bc87c97..e395709 100644 --- a/_sakura/templates/yuuno/global/header.tpl +++ b/_sakura/templates/yuuno/global/header.tpl @@ -4,8 +4,8 @@ {{ page.title }} - - + + {% if page.redirect %} @@ -174,8 +174,8 @@ News Chat Forums + Search {% if user.checklogin %} - Members Support us {% endif %} @@ -183,6 +183,7 @@ {% if user.checklogin %} {{ user.data.username }} + Members Messages Manage Settings diff --git a/api/favicon.ico b/api/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..138053dce0c54b4dcbb4c24ee64550cf994d9a82 GIT binary patch literal 1150 zcmchUU279T6oyZ1WK)aM7OZ&Zr671Gh%vOWwpu|ETQ6G03bnC@WRvEr+eEwB-F)oF z>}=LV61CuGtNsh27yb>QKP0}J*btD?=0=uxW_D(tbKY}?$cJxqlrUbPH9ye=5nY6^ zg`Ms`CL)}Tk95`f|Br*3vZztF(4VT8tE=T;`Gp?S66_27>&4C2+w#jdC*^#j!`o9yaxbkCyO|2GxvUHi z2Kbh-B=3SZtIx{Ka#a5gzM-Z$D{j_T2mN<~aW96zL*irbF6wvT|A+aopc#u>QGHoas*#F``X%r&yx|b~NC*Ar zL6MxRF+UF_-ok$k{73MM)`R?c_!p3W82m(KtvZJKPpFxi_l~{3^XnpU^p8&_L_54* zhyRFmCl^2;dUuXmboi-c2>e$zlNL}1A;wWy@7#Mo=q&tec*Ak1cXpgbhYu%x;03Tg oHZvH1oE(SUX}5{m`+v2E8T#!b`srz?tD->UX%BaQ^~q!Z0LnM|ssI20 literal 0 HcmV?d00001 diff --git a/content/data/broomcloset/css/manage.css b/content/data/broomcloset/css/manage.css index 54276a9..b7c961c 100644 --- a/content/data/broomcloset/css/manage.css +++ b/content/data/broomcloset/css/manage.css @@ -102,4 +102,13 @@ a:active { padding-top: 1px; margin-top: 10px; box-shadow: 0 0 1em #222; + position: absolute; + bottom: 0; + left: 0; + right: 0; +} + +/* Page content */ +#contentwrapper { + padding-bottom: 50px; } diff --git a/content/data/yuuno/css/yuuno.css b/content/data/yuuno/css/yuuno.css index c796305..ea8f2e0 100644 --- a/content/data/yuuno/css/yuuno.css +++ b/content/data/yuuno/css/yuuno.css @@ -121,7 +121,7 @@ a.default:active { } a.gotop { display: inline-block; - background: url('../images/arrow.png') #111; + background: #111; color: #FFF; width: 60px; height: 60px; @@ -135,15 +135,27 @@ a.gotop { bottom: 0; right: 5px; z-index: 2; + line-height: 60px; + text-align: center; + font-size: 5em; + text-shadow: 0 0 5px #FFF; } a.gotop:hover { opacity: .8; - box-shadow: 0 0 1em #FFF inset; + box-shadow: 0 0 7px #FFF inset; + text-shadow: 0 0 7px #FFF; } a.gotop:active { - box-shadow: 0 0 1em #FFF inset; + box-shadow: 0 0 15px #FFF inset; + text-shadow: 0 0 10px #FFF; opacity: .9; } +a.gotop.enter { + animation: slideInFromRight 1 .6s; +} +a.gotop.exit { + animation: slideOutToBottom 1 .6s; +} /* Keyframe Elements */ @keyframes spin { diff --git a/content/data/yuuno/images/add-friend.png b/content/data/yuuno/images/add-friend.png deleted file mode 100644 index 0c78e2d6dec6ceba5e213ab8af8cb7fcc30216bd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2225 zcmaJ@dpMMN8y<_+kP+HdqGm_h#LO7XEQ4we4ztW8hEZgVnHPhZd7F7_hL4TRW-Bt+ zhjFM++d&7!Y?qK6HY5@qY((W8`&~Kph0y7H$EMvszP|VLJ6!jDKlkr>oqJ!j4J^U6uvkDKr@8gD8L`!^5gfn z0Wd=wBVY$Z!AxH=Pb|c7H5i;+2*PYwY=<1=@?rr99RWlMMDCdB8x0t=fbWjs5SjK& zkOo8xyb~lqKmv=+ONiyU@G(2Kquu0WSU?CsT(n#mCz6uo?wDm=GCbF8<1y%E2o&p% z`O{P|(+^D(O8_(x=ZNLm69{M$2}f`ul1KzQw1Yjt0dEgKBrL&+OeB#VzC(Y!FmN;p zKa%WE_xuk8sIAM4>7sL~A_L?KD0GZ7H4;2bOp{0;N z@R#5JDJ*5jg8<$ikctmTcyQq&tu&!PGED+-A+dxl7RRk*(JxvIiKWqE5KRjpp|^4b zBEDEAwOPh9nPi4Y3UNg|fI)Z1zzR5lfKMjTJ?veasUDtG4`%|w!_md_I~s-JNTSoJ zL{FlN^9q+P<{c0MB4~xn|BLJSS+1rPgdiN54oCzC0lue1EJQCKnJoCc7usj_K63e= z_d@?H7Z01kYYO|fLa%JW-J_X)YFl{msqq03-0c#$txW-{F#@4$&7f1*^1g|X4v{Hi z&D8qL5ryLM8j~;fkdl)nWwOdaP#n>&c_qCMHoVi^I(Z3s`5h zZN*z!vd+YsxZ8zSOn#sM5w7kdg_pFdW(9A%0;bAKYHErTESmSn)nEL&V7k;0X@oq) z!}k3&pr@znTNVnOb=?`VZ=^gQ)M_A5*IB0J z!EEh4qyhK)V|GJcgX@MQnQufU8%;K9;eVMkvVT>XsnBlaU44U;Dn=Bi^)Bj-FFkEH z-EY>d{xWOcY3OmpfSy@+3!ntfMj<(N)49m&l&#w?R$eaapJ>vmXzUaefZ5;{-969B z2K&z`iCVoWyA;6W)U6sIpq`vuTcRWwZ`P$`hZ~VoIgVTtwaA)*6N4Z%-|)X~!hnHvWpKrOJJ)iOIDg z%9rMWnJ12odIrvZRm9w|Z>mYSn&tEsKNPmg4x@YHJ1gctMZemU+XaHhxG>N+<`L)#-DmJg~75^*X2{*MBl38mqAJ$%tdj{h+7> zK8Ppg%~gFtmn;}@55F298`qC$2lkk!(t3^9{;f9F=&O+l zv!`47aJ}2`5^rcNtLU(nWayn@k)0H(R$fD7ZAW1IM+$E)O?F2hrkQoO5L#uEMO!n78NzK<)hws&?0nZ39`XqVb^w=BIt_?#~e`w&-u%3(e>QFP6S zC)awotE0Q?_`Q&z?34)|r)_<1TBkPM-^6~jw^CTQge#bgx_8-kZx-;aMCU@Y7be$I z6l-u|bVhZ+xUb*;WxAbZw*0P*(%mrYP1nMc%`Lb;bgX>OJgb}eEpbfRExqbllpRvJ zWkaJx#7?=*52(-XLYJHvwZn9W?NX(Eaoo$uS{~K$o?2aaE~wb1r)swRreiGrozDJ6 zbBo+-xu^%_zenx3`$RBzQjcZ5DLK3T zYFt6y6fbmOa;;CAN)g}P&&vpX^|QLPH&D4R?O>IFgdNIUv!pZj%513eO9jwDN(a{W zw45(Gw!2B^R-T8=2)O!Rwj!zmMAsUN#23w^k=&>N!W8GO)4wMR|mgv6&iV zNuOWO&Lj?pctseJY0y|F8D!AIsX>Le)@7@M15HzCw!2rwK$rKDgvBb#kq>Us!_<03 z&)H`bq>Me>&&n%F>~RR$W%jQEXvc8d_%HhkIk%AO=4#GGX#c~}@_h;5EnmJLkIXk9 Zv=Lx&_Pr}*R^ghT2!;oXUPcW+{9liOnFIg; diff --git a/content/data/yuuno/images/arrow.png b/content/data/yuuno/images/arrow.png deleted file mode 100644 index 312ecc72ba0f9e61f6752be151635cfc54cba153..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1655 zcmaJ?2~ZPP7!KhkLu%EjVm+3{7O3Xfkb|rSIReUHA`+$q9a}=O32Dggx>-y>txzf; zj#jN$MdZ+`p`no0p+$uf>OrNBV$(*{f>Ec|0;2X{9F1)^2-wb)?(FV+|C{go{&VJS zOP4PX4Ve={qtQZBS4cCcb*c9Y3ZVY5=NdsRVPvwBRA5@ttRfIvf(FY)fK;POhh!is zP2u_r2*vOP^_faiDO(AvF(X^$#jq_#oMKaA%PhD`Z9qsM7t!fa3Hac2CkW^@5->|3 z|Ltx-hl(9&LZgK< zq$%URC`$t7kt7atIA*h%ZH{4MgpLD=#bU1pkH?}AEK?y$sw^zj6fvP7MNDc!kCS=~ z1-y!?T&#eUfK;TYu=RQkEKU%LAYM{JN}^N*LCG; z+u@Hs4ERZWZ+BW{wZjKUrGv>Q|+A=ub-jm>2h3s4TQ=K-I64yuW2DuO+)qxnT9c zbKLLHQ1H-Eh1_w|?ux9PJy72muJqa5b3N{OJKwQZcXu>|qQH{@W~ zN=E)hi@(@9)U<9!?ft{3&1xv>vT0fFv(YDXU$;uiBOB?>bIu6gu2I)4)%C0U1qj%@ zV|$b8CVZ(sgI*ZOQD^Si6lrxj_69pznmCV_i2k~;{;JOxU7ZI`cpinL;pTR-cN(uj zl0MS0*%erf^obHXp6qX99ttbc=7{jJ`|}-<-IW(_ciKA|f^PT@Z*=KgkEFVq!|$Gq zNxSTs%dYuwc~CV>+<)D}`cb<^i)EKokt0{mKKks)?mN1XTlCAVuX$hI$vF-BP^HMS}!O$ zD$*eFOJs)5Bh2Z_@2r89j=+k>fSRahpPYLZw8>e+`ZB+I%hme9o!O_g3++!Ij&$EK zg+-6zXpi({=E{AV;h+Efw0eEYF;8~!*(bqu<*qZqb5<4oS{*&>_>I0g`4v2gzyHt- zLeV@ttAV!m-Yf2=Rl5C=$KK+cTI_yY_h!XtR