2006-09-22 20:09:47 +00:00
|
|
|
<?php //$Id$
|
2006-09-20 21:00:45 +00:00
|
|
|
|
2006-09-22 20:09:47 +00:00
|
|
|
require_once('../../config.php');
|
2006-09-20 21:00:45 +00:00
|
|
|
|
2007-03-05 11:27:01 +00:00
|
|
|
$contextid = required_param('contextid', PARAM_INT); // context id
|
2006-09-22 20:09:47 +00:00
|
|
|
$roleid = optional_param('roleid', 0, PARAM_INT); // requested role id
|
|
|
|
$userid = optional_param('userid', 0, PARAM_INT); // needed for user tabs
|
|
|
|
$courseid = optional_param('courseid', 0, PARAM_INT); // needed for user tabs
|
2006-09-20 21:00:45 +00:00
|
|
|
|
2008-11-05 08:17:30 +00:00
|
|
|
$baseurl = $CFG->wwwroot . '/' . $CFG->admin . '/roles/override.php?contextid=' . $contextid;
|
|
|
|
if (!empty($userid)) {
|
|
|
|
$baseurl .= '&userid=' . $userid;
|
2006-09-24 13:30:43 +00:00
|
|
|
}
|
2008-11-05 08:17:30 +00:00
|
|
|
if ($courseid && $courseid != SITEID) {
|
|
|
|
$baseurl .= '&courseid=' . $courseid;
|
2006-08-15 08:29:29 +00:00
|
|
|
}
|
2006-09-20 21:00:45 +00:00
|
|
|
|
2008-11-05 08:17:30 +00:00
|
|
|
if (!$context = $DB->get_record('context', array('id'=>$contextid))) {
|
|
|
|
print_error('wrongcontextid', 'error');
|
2006-09-22 20:09:47 +00:00
|
|
|
}
|
2008-11-05 08:17:30 +00:00
|
|
|
$isfrontpage = $context->contextlevel == CONTEXT_COURSE && $context->instanceid == SITEID;
|
|
|
|
$contextname = print_context_name($context);
|
2006-09-22 20:09:47 +00:00
|
|
|
|
2008-11-05 08:17:30 +00:00
|
|
|
if ($context->contextlevel == CONTEXT_SYSTEM) {
|
|
|
|
print_error('cannotoverridebaserole', 'error');
|
2007-03-05 11:27:01 +00:00
|
|
|
}
|
2006-09-24 13:30:43 +00:00
|
|
|
|
2008-11-05 08:17:30 +00:00
|
|
|
if ($context->contextlevel == CONTEXT_COURSE) {
|
|
|
|
$courseid = $context->instanceid;
|
|
|
|
if (!$course = $DB->get_record('course', array('id'=>$courseid))) {
|
|
|
|
print_error('invalidcourse');
|
|
|
|
}
|
|
|
|
} if ($courseid) { // we need this for user tabs in user context
|
2008-05-31 10:30:30 +00:00
|
|
|
if (!$course = $DB->get_record('course', array('id'=>$courseid))) {
|
2008-04-10 06:19:07 +00:00
|
|
|
print_error('invalidcourse');
|
2006-09-24 13:30:43 +00:00
|
|
|
}
|
2006-09-22 20:09:47 +00:00
|
|
|
} else {
|
2007-03-05 11:27:01 +00:00
|
|
|
$course = clone($SITE);
|
|
|
|
$courseid = SITEID;
|
2006-09-22 20:09:47 +00:00
|
|
|
}
|
|
|
|
|
2007-03-05 11:27:01 +00:00
|
|
|
require_login($course);
|
|
|
|
|
2008-11-05 08:17:30 +00:00
|
|
|
$safeoverridesonly = !has_capability('moodle/role:override', $context);
|
|
|
|
if ($safeoverridesonly) {
|
|
|
|
require_capability('moodle/role:safeoverride', $context);
|
2006-08-15 08:29:29 +00:00
|
|
|
}
|
|
|
|
|
2008-11-05 08:17:30 +00:00
|
|
|
if (optional_param('cancel', false, PARAM_BOOL)) {
|
2006-09-22 20:09:47 +00:00
|
|
|
redirect($baseurl);
|
|
|
|
}
|
|
|
|
|
2008-11-05 08:17:30 +00:00
|
|
|
/// These are needed early because of tabs.php
|
2008-10-30 06:26:18 +00:00
|
|
|
$assignableroles = get_assignable_roles($context, ROLENAME_BOTH);
|
2008-11-05 08:17:30 +00:00
|
|
|
list($overridableroles, $overridecounts, $nameswithcounts) = get_overridable_roles($context, ROLENAME_BOTH, true);
|
2006-09-20 21:00:45 +00:00
|
|
|
|
2006-09-16 12:41:47 +00:00
|
|
|
/// Make sure this user can override that role
|
2008-11-05 08:17:30 +00:00
|
|
|
if ($roleid && !isset($overridableroles[$roleid])) {
|
|
|
|
$a = stdClass;
|
|
|
|
$a->role = $roleid;
|
|
|
|
$a->context = $contextname;
|
|
|
|
print_error('cannotoverriderolehere', '', get_context_url($context), $a);
|
|
|
|
}
|
|
|
|
|
|
|
|
/// Get some language strings
|
|
|
|
$straction = get_string('overrideroles', 'role'); // Used by tabs.php
|
2007-03-05 11:27:01 +00:00
|
|
|
|
2008-11-05 08:17:30 +00:00
|
|
|
/// Work out an appropriate page title.
|
2006-08-18 08:01:16 +00:00
|
|
|
if ($roleid) {
|
2008-11-05 08:17:30 +00:00
|
|
|
$a = new stdClass;
|
|
|
|
$a->role = $overridableroles[$roleid];
|
|
|
|
$a->context = $contextname;
|
|
|
|
$title = get_string('overridepermissionsforrole', 'role', $a);
|
|
|
|
} else {
|
|
|
|
if ($isfrontpage) {
|
|
|
|
$title = get_string('frontpageoverrides', 'admin');
|
|
|
|
} else {
|
|
|
|
$title = get_string('overridepermissionsin', 'role', $contextname);
|
2006-09-20 21:00:45 +00:00
|
|
|
}
|
2006-08-18 08:01:16 +00:00
|
|
|
}
|
2006-09-20 21:00:45 +00:00
|
|
|
|
2007-03-05 11:27:01 +00:00
|
|
|
/// get all cababilities
|
2008-07-23 16:10:06 +00:00
|
|
|
$safeoverridenotice = false;
|
|
|
|
if ($roleid) {
|
2008-11-05 08:17:30 +00:00
|
|
|
$capabilities = fetch_context_capabilities($context);
|
|
|
|
if (!$capabilities) {
|
|
|
|
$capabilities = array();
|
|
|
|
}
|
|
|
|
// Determine which capabilities should be locked.
|
|
|
|
foreach ($capabilities as $capname=>$capability) {
|
|
|
|
$capabilities[$capname]->locked = false;
|
|
|
|
if ($safeoverridesonly && !is_safe_capability($capability)) {
|
|
|
|
$capabilities[$capname]->locked = true;
|
|
|
|
$safeoverridenotice = true;
|
2008-07-23 16:10:06 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2007-03-05 11:27:01 +00:00
|
|
|
|
2008-11-05 08:17:30 +00:00
|
|
|
if ($roleid && optional_param('savechanges', false, PARAM_BOOL) && confirm_sesskey()) {
|
|
|
|
/// Process incoming role override
|
|
|
|
$localoverrides = $DB->get_records('role_capabilities', array('roleid' => $roleid,
|
|
|
|
'contextid' => $context->id), '', 'capability,permission,id');
|
2006-09-22 20:09:47 +00:00
|
|
|
|
|
|
|
foreach ($capabilities as $cap) {
|
2008-11-05 08:17:30 +00:00
|
|
|
if ($cap->locked || is_legacy($cap->name)) {
|
2008-07-23 16:10:06 +00:00
|
|
|
//user not allowed to change this cap
|
|
|
|
continue;
|
|
|
|
}
|
2007-03-05 11:27:01 +00:00
|
|
|
|
2008-11-05 08:17:30 +00:00
|
|
|
$capname = $cap->name;
|
|
|
|
$value = optional_param($capname, null, PARAM_PERMISSION);
|
|
|
|
if (is_null($value)) {
|
2007-03-05 11:27:01 +00:00
|
|
|
//cap not specified in form
|
2006-09-22 20:09:47 +00:00
|
|
|
continue;
|
|
|
|
}
|
2007-03-05 11:27:01 +00:00
|
|
|
|
2007-08-17 07:25:47 +00:00
|
|
|
if (isset($localoverrides[$capname])) {
|
|
|
|
// Something exists, so update it
|
2007-08-02 08:28:29 +00:00
|
|
|
assign_capability($capname, $value, $roleid, $context->id, true);
|
2006-09-22 20:09:47 +00:00
|
|
|
} else { // insert a record
|
|
|
|
if ($value != CAP_INHERIT) { // Ignore inherits
|
2007-08-02 08:28:29 +00:00
|
|
|
assign_capability($capname, $value, $roleid, $context->id);
|
2006-09-22 20:09:47 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2007-09-19 07:10:52 +00:00
|
|
|
|
|
|
|
// force accessinfo refresh for users visiting this context...
|
|
|
|
mark_context_dirty($context->path);
|
2008-11-05 08:17:30 +00:00
|
|
|
$rolename = $overridableroles[$roleid];
|
2007-10-18 05:53:14 +00:00
|
|
|
add_to_log($course->id, 'role', 'override', 'admin/roles/override.php?contextid='.$context->id.'&roleid='.$roleid, $rolename, '', $USER->id);
|
2006-09-22 20:09:47 +00:00
|
|
|
redirect($baseurl);
|
|
|
|
}
|
|
|
|
|
2006-09-16 12:41:47 +00:00
|
|
|
/// Print the header and tabs
|
2008-09-26 06:50:31 +00:00
|
|
|
require_js(array('yui_yahoo', 'yui_dom', 'yui_event'));
|
|
|
|
require_js($CFG->admin . '/roles/roles.js');
|
2006-09-22 06:19:32 +00:00
|
|
|
if ($context->contextlevel == CONTEXT_USER) {
|
2008-11-05 08:17:30 +00:00
|
|
|
$user = $DB->get_record('user', array('id'=>$userid));
|
|
|
|
$fullname = fullname($user, has_capability('moodle/site:viewfullnames', $context));
|
|
|
|
|
2006-08-16 09:11:43 +00:00
|
|
|
/// course header
|
2008-11-05 08:17:30 +00:00
|
|
|
$navlinks = array();
|
2006-09-16 12:41:47 +00:00
|
|
|
if ($course->id != SITEID) {
|
2008-01-10 10:58:16 +00:00
|
|
|
if (has_capability('moodle/course:viewparticipants', get_context_instance(CONTEXT_COURSE, $course->id))) {
|
2008-11-05 08:17:30 +00:00
|
|
|
$navlinks[] = array('name' => get_string('participants'), 'link' => "$CFG->wwwroot/user/index.php?id=$course->id", 'type' => 'misc');
|
2008-01-10 10:58:16 +00:00
|
|
|
}
|
2007-08-17 07:25:47 +00:00
|
|
|
$navlinks[] = array('name' => $fullname, 'link' => "$CFG->wwwroot/user/view.php?id=$userid&course=$courseid", 'type' => 'misc');
|
|
|
|
$navlinks[] = array('name' => $straction, 'link' => null, 'type' => 'misc');
|
|
|
|
$navigation = build_navigation($navlinks);
|
2008-11-05 08:17:30 +00:00
|
|
|
print_header($title, "$fullname", $navigation, "", "", true, " ", navmenu($course));
|
2006-09-20 21:00:45 +00:00
|
|
|
|
|
|
|
/// site header
|
2006-08-16 09:11:43 +00:00
|
|
|
} else {
|
2007-08-17 07:25:47 +00:00
|
|
|
$navlinks[] = array('name' => $fullname, 'link' => "$CFG->wwwroot/user/view.php?id=$userid&course=$courseid", 'type' => 'misc');
|
|
|
|
$navlinks[] = array('name' => $straction, 'link' => null, 'type' => 'misc');
|
|
|
|
$navigation = build_navigation($navlinks);
|
2008-11-05 08:17:30 +00:00
|
|
|
print_header($title, $course->fullname, $navigation, "", "", true, " ", navmenu($course));
|
2006-08-16 09:11:43 +00:00
|
|
|
}
|
2006-08-15 08:29:29 +00:00
|
|
|
$showroles = 1;
|
|
|
|
$currenttab = 'override';
|
|
|
|
include_once($CFG->dirroot.'/user/tabs.php');
|
2007-01-29 21:29:27 +00:00
|
|
|
} else if ($context->contextlevel==CONTEXT_COURSE and $context->instanceid == SITEID) {
|
|
|
|
require_once($CFG->libdir.'/adminlib.php');
|
2007-04-30 17:08:34 +00:00
|
|
|
admin_externalpage_setup('frontpageroles');
|
|
|
|
admin_externalpage_print_header();
|
2007-11-19 07:13:02 +00:00
|
|
|
$currenttab = 'override';
|
2007-01-29 21:29:27 +00:00
|
|
|
include_once('tabs.php');
|
2006-08-15 08:29:29 +00:00
|
|
|
} else {
|
2007-11-19 07:13:02 +00:00
|
|
|
$currenttab = 'override';
|
2006-08-15 08:29:29 +00:00
|
|
|
include_once('tabs.php');
|
|
|
|
}
|
2006-08-09 05:37:53 +00:00
|
|
|
|
2008-11-05 08:17:30 +00:00
|
|
|
print_heading_with_help($title, 'overrides');
|
2006-08-09 05:37:53 +00:00
|
|
|
|
2006-08-09 13:18:33 +00:00
|
|
|
if ($roleid) {
|
2008-11-05 08:17:30 +00:00
|
|
|
/// Show UI for overriding roles.
|
2006-09-20 21:00:45 +00:00
|
|
|
|
2008-11-05 08:17:30 +00:00
|
|
|
/// Get the capabiltites from the parent context, so that can be shown in the interface.
|
|
|
|
$parentcontext = get_context_instance_by_id(get_parent_contextid($context));
|
2006-09-20 06:24:55 +00:00
|
|
|
$r_caps = role_context_capabilities($roleid, $parentcontext);
|
2006-09-15 06:04:10 +00:00
|
|
|
|
2008-11-05 08:17:30 +00:00
|
|
|
/// And get the current overrides in this context.
|
|
|
|
$localoverrides = $DB->get_records('role_capabilities', array('roleid' => $roleid,
|
|
|
|
'contextid' => $context->id), '', 'capability,permission,id');
|
2006-10-01 10:15:50 +00:00
|
|
|
|
2007-03-05 11:27:01 +00:00
|
|
|
if (!empty($capabilities)) {
|
|
|
|
// Print the capabilities overrideable in this context
|
2008-11-05 08:17:30 +00:00
|
|
|
print_box_start('generalbox boxwidthwide boxaligncenter');
|
|
|
|
|
|
|
|
$allrisks = get_all_risks();
|
|
|
|
$allpermissions = array(
|
|
|
|
CAP_INHERIT => 'inherit',
|
|
|
|
CAP_ALLOW => 'allow',
|
|
|
|
CAP_PREVENT => 'prevent' ,
|
|
|
|
CAP_PROHIBIT => 'prohibit',
|
|
|
|
);
|
|
|
|
$strperms = array();
|
|
|
|
foreach ($allpermissions as $permname) {
|
|
|
|
$strperms[$permname] = get_string($permname, 'role');
|
|
|
|
}
|
|
|
|
?>
|
|
|
|
<form id="overrideform" action=""<?php echo $baseurl; ?>" method="post"><div>
|
|
|
|
<input type="hidden" name="sesskey" value="<?php p(sesskey()) ?>" />
|
|
|
|
|
|
|
|
<table class="rolecap" id="overriderolestable">
|
|
|
|
<tr>
|
|
|
|
<th class="name" align="left" scope="col"><?php print_string('capability','role') ?></th>
|
|
|
|
<?php
|
|
|
|
foreach ($strperms as $permname => $strpermname) {
|
|
|
|
echo '<th class="' . $permname . '" scope="col">' . $strpermname . '</th>';
|
|
|
|
}
|
|
|
|
echo '<th class="risk" colspan="' . count($allrisks) . '" scope="col">' . get_string('risks','role') . '</th>';
|
|
|
|
echo "</tr>\n";
|
|
|
|
|
|
|
|
/// Loop over capabilities.
|
|
|
|
$contextlevel = 0;
|
|
|
|
$component = '';
|
|
|
|
foreach ($capabilities as $capability) {
|
|
|
|
|
|
|
|
/// Legacy caps and doanything should not be overriden - we must use proper capabilities if needed
|
|
|
|
if (is_legacy($capability->name)) {
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
|
|
|
/// Prints a breaker if component or name or context level has changed
|
|
|
|
if (component_level_changed($capability, $component, $contextlevel)) {
|
|
|
|
echo '<tr class="rolecapheading header"><td colspan="' . (2 + count($allpermissions) + count($allrisks)) . '" class="header"><strong>' .
|
|
|
|
get_component_string($capability->component, $capability->contextlevel) .
|
|
|
|
'</strong></td></tr>';
|
|
|
|
}
|
|
|
|
$contextlevel = $capability->contextlevel;
|
|
|
|
$component = $capability->component;
|
|
|
|
|
|
|
|
/// Check the capability override for this cap, this role in this context
|
|
|
|
if (isset($localoverrides[$capability->name])) {
|
|
|
|
$localpermission = $localoverrides[$capability->name]->permission;
|
|
|
|
} else {
|
|
|
|
$localpermission = 0; // Just inherit
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!isset($r_caps[$capability->name])) {
|
|
|
|
$r_caps[$capability->name] = CAP_INHERIT;
|
|
|
|
}
|
|
|
|
|
|
|
|
$disabled = '';
|
|
|
|
if ($capability->locked || $r_caps[$capability->name] == CAP_PROHIBIT) {
|
|
|
|
$disabled = ' disabled="disabled"';
|
|
|
|
}
|
|
|
|
|
|
|
|
/// Start the table row.
|
|
|
|
$rowclasses = array('rolecap');
|
|
|
|
foreach ($allrisks as $riskname => $risk) {
|
|
|
|
if ($risk & (int)$capability->riskbitmask) {
|
|
|
|
$rowclasses[] = $riskname;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
echo '<tr class="' . implode(' ', $rowclasses) . '">';
|
|
|
|
|
|
|
|
/// Table cell for the capability name.
|
|
|
|
echo '<td class="name"><span class="cap-desc">' . get_capability_docs_link($capability) .
|
|
|
|
'<span class="cap-name">' . $capability->name . '</span></span></td>';
|
|
|
|
|
|
|
|
/// One cell for each possible permission.
|
|
|
|
foreach ($allpermissions as $perm => $permname) {
|
|
|
|
$extraclass = '';
|
|
|
|
if ($perm != CAP_INHERIT && $perm == $r_caps[$capability->name]) {
|
|
|
|
$extraclass = ' capcurrent';
|
|
|
|
}
|
|
|
|
$checked = '';
|
|
|
|
if ($localpermission == $perm) {
|
|
|
|
$checked = ' checked="checked"';
|
|
|
|
}
|
|
|
|
echo '<td class="' . $permname . $extraclass . '">';
|
|
|
|
echo '<input type="radio" title="' . $strperms[$permname] . '" name="' . $capability->name .
|
|
|
|
'" value="' . $perm . '"' . $checked . $disabled . ' />';
|
|
|
|
echo '</td>';
|
|
|
|
}
|
|
|
|
|
|
|
|
/// One cell for each possible risk.
|
|
|
|
foreach ($allrisks as $riskname => $risk) {
|
|
|
|
echo '<td class="risk ' . str_replace('risk', '', $riskname) . '">';
|
|
|
|
if ($risk & (int)$capability->riskbitmask) {
|
|
|
|
print_risk_icon($riskname);
|
|
|
|
}
|
|
|
|
echo '</td>';
|
|
|
|
}
|
|
|
|
|
|
|
|
/// End of the row.
|
|
|
|
echo "</tr>\n";
|
|
|
|
}
|
|
|
|
?>
|
|
|
|
</table>
|
|
|
|
<div class="submit buttons">
|
|
|
|
<input type="submit" name="savechanges" value="<?php print_string('savechanges') ?>" />
|
|
|
|
<input type="submit" name="cancel" value="<?php print_string('cancel') ?>" />
|
|
|
|
</div>
|
|
|
|
|
|
|
|
<?php
|
|
|
|
if ($safeoverridenotice) {
|
|
|
|
echo '<div class="sefeoverridenotice">' . get_string('safeoverridenotice', 'role') . "</div>\n";
|
|
|
|
}
|
|
|
|
|
|
|
|
if (count($capabilities) > 12) {
|
|
|
|
print_js_call('cap_table_filter.init',
|
|
|
|
array('overriderolestable', get_string('search'), get_string('clear')));
|
|
|
|
}
|
|
|
|
|
|
|
|
echo "</div></form>\n";
|
|
|
|
print_box_end();
|
2007-03-05 11:27:01 +00:00
|
|
|
|
2006-08-28 06:36:36 +00:00
|
|
|
} else {
|
2008-11-05 08:17:30 +00:00
|
|
|
print_box(get_string('nocapabilitiesincontext', 'role'), 'generalbox boxaligncenter');
|
2006-08-28 06:36:36 +00:00
|
|
|
}
|
2006-09-15 06:04:10 +00:00
|
|
|
|
2008-11-05 08:17:30 +00:00
|
|
|
/// Print a form to swap roles, and a link back to the all roles list.
|
|
|
|
echo '<div class="backlink">';
|
|
|
|
popup_form($baseurl . '&roleid=', $nameswithcounts, 'switchrole',
|
|
|
|
$roleid, '', '', '', false, 'self', get_string('overrideanotherrole', 'role'));
|
|
|
|
echo '<p><a href="' . $baseurl . '">' . get_string('backtoallroles', 'role') . '</a></p>';
|
|
|
|
echo '</div>';
|
|
|
|
|
2008-11-06 07:34:01 +00:00
|
|
|
} else if (empty($overridableroles)) {
|
|
|
|
/// Print a message that there are no roles that can me assigned here.
|
|
|
|
print_heading(get_string('notabletooverrideroleshere', 'role'), 'center', 3);
|
|
|
|
|
2008-11-05 08:17:30 +00:00
|
|
|
} else {
|
|
|
|
/// Show UI for choosing a role to assign.
|
2006-09-16 12:41:47 +00:00
|
|
|
|
2006-09-15 06:04:10 +00:00
|
|
|
$table->tablealign = 'center';
|
2006-10-31 08:14:36 +00:00
|
|
|
$table->width = '60%';
|
2008-11-05 08:17:30 +00:00
|
|
|
$table->head = array(get_string('role'), get_string('description'), get_string('overrides', 'role'));
|
2006-10-31 08:14:36 +00:00
|
|
|
$table->wrap = array('nowrap', '', 'nowrap');
|
|
|
|
$table->align = array('right', 'left', 'center');
|
2006-09-20 21:00:45 +00:00
|
|
|
|
2006-09-15 06:04:10 +00:00
|
|
|
foreach ($overridableroles as $roleid => $rolename) {
|
|
|
|
$countusers = 0;
|
2008-06-02 21:39:23 +00:00
|
|
|
$description = format_string($DB->get_field('role', 'description', array('id'=>$roleid)));
|
2008-11-05 08:17:30 +00:00
|
|
|
$table->data[] = array('<a href="'.$baseurl.'&roleid='.$roleid.'">'.$rolename.'</a>',
|
|
|
|
$description, $overridecounts[$roleid]);
|
2006-09-15 06:04:10 +00:00
|
|
|
}
|
2006-09-20 21:00:45 +00:00
|
|
|
|
2006-09-15 06:04:10 +00:00
|
|
|
print_table($table);
|
2008-11-05 08:17:30 +00:00
|
|
|
|
|
|
|
if (!$isfrontpage && ($url = get_context_url($context))) {
|
|
|
|
echo '<div class="backlink"><a href="' . $url . '">' .
|
|
|
|
get_string('backto', '', $contextname) . '</a></div>';
|
|
|
|
}
|
2006-08-09 13:18:33 +00:00
|
|
|
}
|
2006-09-20 21:00:45 +00:00
|
|
|
|
2007-04-30 17:28:29 +00:00
|
|
|
print_footer($course);
|
2006-09-20 21:00:45 +00:00
|
|
|
|
2008-11-05 08:17:30 +00:00
|
|
|
?>
|