Global: Some fixes

I corrected the layout and tabulation a bit and put the QA Team back in the OpenVK version description.
This commit is contained in:
Ilya Prokopenko 2022-01-09 08:47:57 +03:00
parent 70dd7e3773
commit 3b1d85d64f
No known key found for this signature in database
GPG key ID: 7736BBBB05F14A56
3 changed files with 193 additions and 219 deletions

View file

@ -1,24 +1,26 @@
{var instance_name = OPENVK_ROOT_CONF['openvk']['appearance']['name']}
<!DOCTYPE html>
<html>
<head>
<title>Произошёл троллинг... | OpenVK</title>
<title>An error occurred - {$instance_name}</title>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, user-scalable=no" />
<style>
@keyframes gradient {
0% {
background-position:0% 50%
background-position: 0% 50%;
}
50% {
background-position:100% 50%
background-position: 100% 50%;
}
100% {
background-position:0% 50%
background-position: 0% 50%;
}
}
body {
background: linear-gradient(-30deg, #2b2b2b, #f479ff);
color: #fff;
@ -27,25 +29,25 @@
animation: gradient 30s ease-in-out infinite;
background-size: 400% 400%;
}
#error {
width: 35rem;
max-width: 85vw;
}
main {
display: flex;
justify-content: space-evenly;
align-items: center;
height: 97vh;
}
@media screen and (max-width: 768px) {
main {
flex-direction: column;
justify-content: center;
}
main > p:first-of-type {
display: none;
}
@ -56,7 +58,7 @@
<!-- OpenVK ERROR REPORT: -->
<!-- HTTP {$code} -->
<!-- {$msg} -->
<main>
<p>{$desc}</p>
<a href="/"><img src="/assets/packages/static/openvk/img/oof.apng" alt="Ouch" id="error" /></a>

View file

@ -1,5 +1,6 @@
{var instance_name = OPENVK_ROOT_CONF['openvk']['appearance']['name']}
<!DOCTYPE html n:if="!isset($parentModule) || substr($parentModule, 0, 21) === 'libchandler:absolute.'">
<html n:if="!isset($parentModule) || substr($parentModule, 0, 21) === 'libchandler:absolute.'">
<head>
<title>
@ -9,28 +10,31 @@
<link rel="shortcut icon" href="/assets/packages/static/openvk/img/icon.ico" />
<meta name="application-name" content="{$instance_name}" />
<meta n:ifset="$csrfToken" name="csrf" value="{$csrfToken}" />
<script src="/language/{php echo getLanguage()}.js" crossorigin="anonymous"></script>
{script "js/node_modules/jquery/dist/jquery.min.js"}
{script "js/node_modules/jquery/dist/jquery.min.js"}
{script "js/node_modules/umbrellajs/umbrella.min.js"}
{script "js/l10n.js"}
{script "js/openvk.cls.js"}
{ifset $thisUser}
{if $thisUser->getNsfwTolerance() < 2}
{css "css/nsfw-posts.css"}
{/if}
{if $theme !== null}
{if $theme->inheritDefault()}
{if $theme->inheritDefault()}
{css "css/style.css"}
{css "css/dialog.css"}
{css "css/notifications.css"}
{if $isXmas}
{css "css/xmas.css"}
{/if}
{/if}
<link rel="stylesheet" href="/themepack/{$theme->getId()}/{$theme->getVersion()}/stylesheet/styles.css" />
{if $isXmas}
<link rel="stylesheet" href="/themepack/{$theme->getId()}/{$theme->getVersion()}/resource/xmas.css" />
{/if}
@ -38,34 +42,37 @@
{css "css/style.css"}
{css "css/dialog.css"}
{css "css/notifications.css"}
{if $isXmas}
{css "css/xmas.css"}
{/if}
{/if}
{if $thisUser->getStyleAvatar() == 1}
{css "css/avatar.1.css"}
{/if}
{if $thisUser->getStyleAvatar() == 2}
{css "css/avatar.2.css"}
{css "css/avatar.2.css"}
{/if}
{if $thisUser->hasMicroblogEnabled() == 1}
{css "css/microblog.css"}
{css "css/microblog.css"}
{/if}
{else}
{css "css/style.css"}
{css "css/dialog.css"}
{css "css/nsfw-posts.css"}
{css "css/notifications.css"}
{if $isXmas}
{css "css/xmas.css"}
{/if}
{/ifset}
{ifset headIncludes}{include headIncludes}{/ifset}
{ifset headIncludes}
{include headIncludes}
{/ifset}
</head>
<body>
<div id="sudo-banner" n:if="isset($thisUser) && $userTainted">
@ -75,197 +82,167 @@
Нажмите <a href="/setSID/unset?hash={rawurlencode($csrfToken)}">здесь</a>, чтобы выйти.
</p>
</div>
<div n:if="OPENVK_ROOT_CONF['openvk']['preferences']['bellsAndWhistles']['testLabel']" id="test-label">FOR TESTING PURPOSES ONLY</div>
<div class="notifications_global_wrap"></div>
<div class="notifications_global_wrap"></div>
<div class="dimmer"></div>
<div class="toTop">
⬆ Вверх
</div>
<div class="layout">
<div id="xhead" class="dm"></div>
<div class="page_header {if $instance_name != OPENVK_DEFAULT_INSTANCE_NAME}page_custom_header{/if}">
<a href="/" class="home_button {if $instance_name != OPENVK_DEFAULT_INSTANCE_NAME}home_button_custom{/if}" title="{$instance_name}">{$instance_name}</a>
<div n:if="isset($thisUser) ? !$thisUser->isBanned() : true" class="header_navigation">
{ifset $thisUser}
<div class="link">
<a href="/">{_"header_home"}</a>
</div>
<div class="link">
<a href="/search?type=groups">{_"header_groups"}</a>
</div>
<div class="link">
<a href="/search">{_"header_search"}</a>
</div>
<div class="link">
<a href="/invite">
{_"header_invite"}
</a>
</div>
<div class="link">
<a href="/support">
{_"header_help"}
<b n:if="$ticketAnsweredCount > 0">({$ticketAnsweredCount})</b>
</a>
</div>
<div class="link">
<a href="/logout?hash={urlencode($csrfToken)}">{_"header_log_out"}</a>
</div>
<div class="link">
<form action="/search" method="get">
<input type="search" name="query" placeholder="{_"header_search"}" style="height: 20px;background: url('/assets/packages/static/openvk/img/search_icon.png') no-repeat 3px 4px; background-color: #fff; padding-left: 18px;width: 120px;" />
</form>
</div>
<div class="link">
<a href="/">{_header_home}</a>
</div>
<div class="link">
<a href="/search?type=groups">{_header_groups}</a>
</div>
<div class="link">
<a href="/search">{_header_search}</a>
</div>
<div class="link">
<a href="/invite">{_header_invite}</a>
</div>
<div class="link">
<a href="/support">{_header_help} <b n:if="$ticketAnsweredCount > 0">({$ticketAnsweredCount})</b></a>
</div>
<div class="link">
<a href="/logout?hash={urlencode($csrfToken)}">{_header_log_out}</a>
</div>
<div class="link">
<form action="/search" method="get">
<input type="search" name="query" placeholder="{_header_search}" style="height: 20px;background: url('/assets/packages/static/openvk/img/search_icon.png') no-repeat 3px 4px; background-color: #fff; padding-left: 18px;width: 120px;" />
</form>
</div>
{else}
<div class="link">
<a href="/login">{_"header_login"}</a>
<a href="/login">{_header_login}</a>
</div>
<div n:if="OPENVK_ROOT_CONF['openvk']['preferences']['registration']['enable']" class="link">
<a href="/reg">{_"header_registration"}</a>
<a href="/reg">{_header_registration}</a>
</div>
<div class="link">
<a href="/support">{_"header_help"}</a>
<a href="/support">{_header_help}</a>
</div>
{/ifset}
</div>
</div>
<div class="sidebar">
<div class="navigation">
{ifset $thisUser}
{if !$thisUser->isBanned()}
<a href="/edit" class="link edit-button">{_"edit_button"}</a>
<a href="{$thisUser->getURL()}" class="link">{_"my_page"}</a>
<a href="/friends{$thisUser->getId()}" class="link">{_"my_friends"}
{if $thisUser->getFollowersCount() > 0}
<object type="internal/link">
<a href="/friends{$thisUser->getId()}?act=incoming">
(<b>{$thisUser->getFollowersCount()}</b>)
{ifset $thisUser}
{if !$thisUser->isBanned()}
<a href="/edit" class="link edit-button">{_edit_button}</a>
<a href="{$thisUser->getURL()}" class="link">{_my_page}</a>
<a href="/friends{$thisUser->getId()}" class="link">{_my_friends}
<object type="internal/link" n:if="$thisUser->getFollowersCount() > 0">
<a href="/friends{$thisUser->getId()}?act=incoming">
(<b>{$thisUser->getFollowersCount()}</b>)
</a>
</object>
</a>
</object>
{/if}</a>
<a n:if="$thisUser->getLeftMenuItemStatus('photos')" href="/albums{$thisUser->getId()}" class="link">{_"my_photos"}</a>
<a n:if="$thisUser->getLeftMenuItemStatus('videos')" href="/videos{$thisUser->getId()}" class="link">{_"my_videos"}</a>
<a n:if="$thisUser->getLeftMenuItemStatus('messages')" href="/im" class="link">{_"my_messages"}
{if $thisUser->getUnreadMessagesCount() > 0}
<object type="internal/link">
(<b>{$thisUser->getUnreadMessagesCount()}</b>)
</object>
{/if}
</a>
<a n:if="$thisUser->getLeftMenuItemStatus('notes')" href="/notes{$thisUser->getId()}" class="link">{_"my_notes"}</a>
<a n:if="$thisUser->getLeftMenuItemStatus('groups')" href="/groups{$thisUser->getId()}" class="link">{_"my_groups"}</a>
<a n:if="$thisUser->getLeftMenuItemStatus('news')" href="/feed" class="link">{_"my_feed"}</a>
<a href="/notifications" class="link">{_my_feedback}
{if $thisUser->getNotificationsCount() > 0}
(<b>{$thisUser->getNotificationsCount()}</b>)
{/if}
</a>
<a href="/settings" class="link">{_"my_settings"}</a>
{var canAccessAdminPanel = $thisUser->getChandlerUser()->can("access")->model("admin")->whichBelongsTo(NULL)}
{var canAccessHelpdesk = $thisUser->getChandlerUser()->can("write")->model('openvk\Web\Models\Entities\TicketReply')->whichBelongsTo(0)}
{var menuLinksAvaiable = sizeof(OPENVK_ROOT_CONF['openvk']['preferences']['menu']['links']) > 0 && $thisUser->getLeftMenuItemStatus('links')}
<div n:if="$canAccessAdminPanel || $canAccessHelpdesk || $menuLinksAvaiable" class="menu_divider"></div>
{if $canAccessAdminPanel}
<a href="/admin" class="link">Админ-панель</a>
{/if}
{if $canAccessHelpdesk}
<a href="/support/tickets" class="link">Helpdesk
<a n:if="$thisUser->getLeftMenuItemStatus('photos')" href="/albums{$thisUser->getId()}" class="link">{_my_photos}</a>
<a n:if="$thisUser->getLeftMenuItemStatus('videos')" href="/videos{$thisUser->getId()}" class="link">{_my_videos}</a>
<a n:if="$thisUser->getLeftMenuItemStatus('messages')" href="/im" class="link">{_my_messages}
<object type="internal/link" n:if="$thisUser->getUnreadMessagesCount() > 0">
(<b>{$thisUser->getUnreadMessagesCount()}</b>)
</object>
</a>
<a n:if="$thisUser->getLeftMenuItemStatus('notes')" href="/notes{$thisUser->getId()}" class="link">{_my_notes}</a>
<a n:if="$thisUser->getLeftMenuItemStatus('groups')" href="/groups{$thisUser->getId()}" class="link">{_my_groups}</a>
<a n:if="$thisUser->getLeftMenuItemStatus('news')" href="/feed" class="link">{_my_feed}</a>
<a href="/notifications" class="link">{_my_feedback}
{if $thisUser->getNotificationsCount() > 0}
(<b>{$thisUser->getNotificationsCount()}</b>)
{/if}
</a>
<a href="/settings" class="link">{_my_settings}</a>
{var canAccessAdminPanel = $thisUser->getChandlerUser()->can("access")->model("admin")->whichBelongsTo(NULL)}
{var canAccessHelpdesk = $thisUser->getChandlerUser()->can("write")->model('openvk\Web\Models\Entities\TicketReply')->whichBelongsTo(0)}
{var menuLinksAvaiable = sizeof(OPENVK_ROOT_CONF['openvk']['preferences']['menu']['links']) > 0 && $thisUser->getLeftMenuItemStatus('links')}
<div n:if="$canAccessAdminPanel || $canAccessHelpdesk || $menuLinksAvaiable" class="menu_divider"></div>
<a href="/admin" class="link" n:if="$canAccessAdminPanel">Админ-панель</a>
<a href="/support/tickets" class="link" n:if="$canAccessHelpdesk">Helpdesk
{if $helpdeskTicketNotAnsweredCount > 0}
(<b>{$helpdeskTicketNotAnsweredCount}</b>)
{/if}
</a>
{/if}
<a
n:if="$thisUser->getLeftMenuItemStatus('links')"
n:foreach="OPENVK_ROOT_CONF['openvk']['preferences']['menu']['links'] as $menuItem"
href="{$menuItem['url']}"
target="_blank"
class="link">{strpos($menuItem["name"], "@") === 0 ? tr(substr($menuItem["name"], 1)) : $menuItem["name"]}</a>
<div id="_groupListPinnedGroups">
<div n:if="$thisUser->getPinnedClubCount() > 0" class="menu_divider"></div>
<a
n:foreach="$thisUser->getPinnedClubs() as $club"
href="{$club->getURL()}"
class="link group_link">{$club->getName()}</a>
</div>
<a
n:if="OPENVK_ROOT_CONF['openvk']['preferences']['adPoster']['enable'] && $thisUser->getLeftMenuItemStatus('poster')"
href="{php echo OPENVK_ROOT_CONF['openvk']['preferences']['adPoster']['link']}" >
<img
src="{php echo OPENVK_ROOT_CONF['openvk']['preferences']['adPoster']['src']}"
alt="{php echo OPENVK_ROOT_CONF['openvk']['preferences']['adPoster']['caption']}"
class="psa-poster"
style="max-width: 100%; margin-top: 50px;" />
</a>
<a n:if="$thisUser->getLeftMenuItemStatus('links')" n:foreach="OPENVK_ROOT_CONF['openvk']['preferences']['menu']['links'] as $menuItem" href="{$menuItem['url']}" target="_blank" class="link">{strpos($menuItem["name"], "@") === 0 ? tr(substr($menuItem["name"], 1)) : $menuItem["name"]}</a>
<div id="_groupListPinnedGroups">
<div n:if="$thisUser->getPinnedClubCount() > 0" class="menu_divider"></div>
<a n:foreach="$thisUser->getPinnedClubs() as $club" href="{$club->getURL()}" class="link group_link">{$club->getName()}</a>
</div>
<a n:if="OPENVK_ROOT_CONF['openvk']['preferences']['adPoster']['enable'] && $thisUser->getLeftMenuItemStatus('poster')" href="{php echo OPENVK_ROOT_CONF['openvk']['preferences']['adPoster']['link']}" >
<img src="{php echo OPENVK_ROOT_CONF['openvk']['preferences']['adPoster']['src']}" alt="{php echo OPENVK_ROOT_CONF['openvk']['preferences']['adPoster']['caption']}" class="psa-poster" style="max-width: 100%; margin-top: 50px;" />
</a>
{else}
<a href="/support" class="link">{_menu_support}</a>
<a href="/logout?hash={urlencode($csrfToken)}" class="link">{_menu_logout}</a>
{/if}
{else}
<a href="/support" class="link">{_"menu_support"}</a>
<a href="/logout?hash={urlencode($csrfToken)}" class="link">{_"menu_logout"}</a>
{/if}
{else}
<form id="fastLogin" action="/login" method="POST" enctype="multipart/form-data">
<label for="login"><span>{_"email"}:</span></label>
<input id="login" type="text" name="login" required />
<label for="password"><span>{_"password"}:</span></label>
<input id="password" type="password" name="password" required />
<input type="hidden" name="jReturnTo" value="{$_SERVER['REQUEST_URI']}" />
<input type="hidden" name="hash" value="{$csrfToken}" />
<input type="submit" value="{_'log_in'}" class="button" style="display: inline-block;" />
<a n:if="OPENVK_ROOT_CONF['openvk']['preferences']['registration']['enable']" href="/reg" class="button" style="display: inline-block;" >{_registration}</a><br><br>
<a href="/restore">{_"forgot_password"}</a>
</form>
{/ifset}
<form id="fastLogin" action="/login" method="POST" enctype="multipart/form-data">
<label for="login"><span>{_email}:</span></label>
<input id="login" type="text" name="login" required />
<label for="password"><span>{_password}:</span></label>
<input id="password" type="password" name="password" required />
<input type="hidden" name="jReturnTo" value="{$_SERVER['REQUEST_URI']}" />
<input type="hidden" name="hash" value="{$csrfToken}" />
<input type="submit" value="{_log_in}" class="button" style="display: inline-block;" />
<a n:if="OPENVK_ROOT_CONF['openvk']['preferences']['registration']['enable']" href="/reg" class="button" style="display: inline-block;">{_registration}</a><br><br>
<a href="/restore">{_forgot_password}</a>
</form>
{/ifset}
</div>
</div>
<div class="page_body">
<div id="wrapH">
<div id="wrapHI">
<div n:ifcontent class="page_yellowheader">
{include header}
{include header}
</div>
</div>
</div>
{ifset wrap}
{ifset $flashMessage}
<div class="msg msg_{$flashMessage->type}">
{ifset wrap}
<div class="msg msg_{$flashMessage->type}" n:ifset="$flashMessage">
<b>{$flashMessage->title}</b><br/>
{$flashMessage->msg|noescape}
</div>
{include wrap}
{else}
<div class="wrap2">
<div class="wrap1">
<div id="auth" class="page-wrap">
<div class="page_content">
<div class="msg msg_{$flashMessage->type}" n:ifset="$flashMessage">
<b>{$flashMessage->title}</b><br/>
{$flashMessage->msg|noescape}
</div>
{/ifset}
{include wrap}
{else}
<div class="wrap2">
<div class="wrap1">
<div id="auth" class="page-wrap">
<div class="page_content">
{ifset $flashMessage}
<div class="msg msg_{$flashMessage->type}">
<b>{$flashMessage->title}</b><br/>
{$flashMessage->msg|noescape}
</div>
{/ifset}
{include content}
</div>
</div>
</div>
{include content}
</div>
{/ifset}
</div>
</div>
</div>
{/ifset}
</div>
</div>
<div class="page_footer">
{var dbVersion = \Chandler\Database\DatabaseConnection::i()->getConnection()->getPdo()->getAttribute(\PDO::ATTR_SERVER_VERSION)}
<div class="navigation_footer">
<a href="/about" class="link">{_footer_about_instance}</a>
<a href="/blog" class="link">{_footer_blog}</a>
@ -279,7 +256,7 @@
{php echo OPENVK_ROOT_CONF["openvk"]["appearance"]["motd"]}
</p>
</div>
{script "js/node_modules/msgpack-lite/dist/msgpack.min.js"}
{script "js/node_modules/soundjs/lib/soundjs.min.js"}
{script "js/node_modules/ky/umd.js"}
@ -288,22 +265,20 @@
{script "js/scroll.js"}
{script "js/al_wall.js"}
{script "js/al_api.js"}
{ifset $thisUser}
{script "js/al_notifs.js"}
{/ifset}
{if OPENVK_ROOT_CONF['openvk']['preferences']['bellsAndWhistles']['fartscroll']}
<script src="https://unpkg.com/fartscroll@1.0.0/fartscroll.js"></script>
<script>
fartscroll(400);
</script>
{/if}
<script n:if="OPENVK_ROOT_CONF['openvk']['telemetry']['plausible']['enable']"
async defer data-domain="{php echo OPENVK_ROOT_CONF['openvk']['telemetry']['plausible']['domain']}"
src="{php echo OPENVK_ROOT_CONF['openvk']['telemetry']['plausible']['server']}js/plausible.js"></script>
<script n:if="OPENVK_ROOT_CONF['openvk']['telemetry']['plausible']['enable']" async defer data-domain="{php echo OPENVK_ROOT_CONF['openvk']['telemetry']['plausible']['domain']}" src="{php echo OPENVK_ROOT_CONF['openvk']['telemetry']['plausible']['server']}js/plausible.js"></script>
{ifset bodyScripts}
{include bodyScripts}
{/ifset}
@ -312,6 +287,6 @@
{if isset($parentModule) && substr($parentModule, 0, 21) !== 'libchandler:absolute.'}
<!-- INCLUDING TEMPLATE FROM PARENTMODULE: {$parentModule} -->
{include content}
{/if}

View file

@ -28,8 +28,7 @@
text-align: center !important;
}
td,
th {
td, th {
border: 1px solid #666;
vertical-align: baseline;
padding: 4px 5px;
@ -62,7 +61,7 @@
.h {
background-color: #13599f;
font-weight: bold;
color: #fff
color: #fff;
}
.v {
@ -90,7 +89,7 @@
height: 1px;
}
</style>
<div class="center">
<table>
<tbody>
@ -102,7 +101,7 @@
</tr>
</tbody>
</table>
<table>
<tbody>
<tr>
@ -127,22 +126,22 @@
</tr>
</tbody>
</table>
<table>
<tbody>
<tr class="v">
<td>
This program makes use of the Chandler open-source web application server:<br/>
libchandler {=CHANDLER_VER} by rem-pai
libchandler {=CHANDLER_VER} by Celestora
</td>
</tr>
</tbody>
</table>
<hr/>
<h1>Configuration</h1>
<table>
<tbody>
<tr class="h">
@ -313,13 +312,13 @@
</tr>
</tbody>
</table>
<hr/>
<h1>Extensions</h1>
<h2>Core</h2>
<table>
<tbody>
<tr>
@ -332,13 +331,13 @@
</tr>
</tbody>
</table>
{* TODO: add hook to let extensions to register themselves here *}
<hr/>
<h1>Themepacks</h1>
<table>
<tbody>
<tr class="h">
@ -362,7 +361,7 @@
Default OpenVK look and feel.
</td>
<td class="v">
Vladimir Barinov, Konstantin Kichulkin and Daniil Myslivets
Vladimir Barinov, Konstantin Kichulkin and Daniel Myslivets
</td>
</tr>
<tr n:foreach="$themes as $theme">
@ -384,11 +383,11 @@
</tr>
</tbody>
</table>
<hr/>
<h1>OpenVK Credits</h1>
<table>
<tbody>
<tr class="h">
@ -396,14 +395,14 @@
</tr>
<tr>
<td class="e">
Vladimir Barinov (veselcraft), Alexandra Katunina (rem-pai), Konstantin Kichulkin (kosfurler),
Nikita Volkov (sup_ban), Daniel Myslivets (myslivets), Alexander Kotov (l-lacker),
Vladimir Barinov (veselcraft), Celestora, Konstantin Kichulkin (kosfurler),
Nikita Volkov (sup_ban), Daniel Myslivets, Alexander Kotov (l-lacker),
Alexey Assemblerov (BiosNod), Ilya Prokopenko (dsrev) and Maxim Leshchenko (maksales / maksalees)
</td>
</tr>
</tbody>
</table>
<table>
<tbody>
<tr class="h">
@ -417,7 +416,7 @@
</tr>
</tbody>
</table>
<table>
<tbody>
<tr class="h">
@ -443,7 +442,7 @@
{/foreach}
</tbody>
</table>
<table>
<tbody>
<tr class="h">
@ -459,7 +458,7 @@
</tr>
<tr>
<td class="e">Initial hosting</td>
<td class="v">Ilya Prokopenko (dsrev) and Alexandra Katunina (rem-pai)</td>
<td class="v">Ilya Prokopenko (dsrev) and Celestora</td>
</tr>
<tr>
<td class="e">Initial bug-tracker hosting</td>
@ -467,27 +466,23 @@
</tr>
<tr>
<td class="e">Images</td>
<td class="v">Vladimir Barinov (veselcraft), Konstantin Kichulkin (kosfurler) and Daniil Myslivets (myslivets)</td>
<td class="v">Vladimir Barinov (veselcraft), Konstantin Kichulkin (kosfurler) and Daniel Myslivets</td>
</tr>
<tr>
<td class="e">Illustrations</td>
<td class="v">Ash Defenders</td>
</tr>
<tr>
<td class="e">Soundtrack</td>
<td class="v">Ash Defenders</td>
<td class="v">Ash Defenders, Polina Katunina (RousPhaul)</td>
</tr>
<tr>
<td class="e">Best barmaid</td>
<td class="v">Jill</td>
<td class="v">Jill</td> {* I can agree ~~ dsrev *}
</tr>
<tr>
<td class="e">Helpdesk implementation</td>
<td class="e">Initial Helpdesk implementation</td>
<td class="v">Nikita Volkov (sup_ban)</td>
</tr>
</tbody>
</table>
<table>
<tbody>
<tr class="h">
@ -495,17 +490,19 @@
</tr>
<tr class="e">
<td>
Vladimir Lapskiy (0x7d5), Alexander Minkin (WerySkok), Polina Katunina (RousPhaul),
Egor Shevchenko, Dmitriy Daemon and Ilya Prokopenko (dsrev).
kovaltim, Vladimir Lapskiy (0x7d5), Alexander Minkin (WerySkok), Polina Katunina (RousPhaul), veth,
Egor Shevchenko, Vadim Korovin (yuni), Ash Defenders,
Pavel Silaev, Dmitriy Daemon, Ilya Prokopenko (dsrev),
cmed404 and unknown tester, who disappeared shortly after trying to upload post with cat.
</td>
</tr>
</tbody>
</table>
<hr/>
<h1>OpenVK License</h1>
<table>
<tbody>
<tr class="v">