version 1.27, 2001/01/02 12:12:43
|
version 1.28, 2001/01/02 16:03:14
|
Line 30 my %courseopt;
|
Line 30 my %courseopt;
|
my %useropt; |
my %useropt; |
my %parmhash; |
my %parmhash; |
|
|
|
# Stuff that only the screen handler can know |
|
|
|
my $includedir; |
|
my $tmpdir; |
|
|
# ============================================================================= |
# ============================================================================= |
# ===================================== Implements an instance of a spreadsheet |
# ===================================== Implements an instance of a spreadsheet |
|
|
Line 75 $csec='';
|
Line 80 $csec='';
|
$chome=''; |
$chome=''; |
$cnum=''; |
$cnum=''; |
$cdom=''; |
$cdom=''; |
|
$cid=''; |
|
|
# symb |
# symb |
|
|
Line 399 sub outrow {
|
Line 405 sub outrow {
|
} |
} |
|
|
sub exportrowa { |
sub exportrowa { |
my $rowa=''; |
my @exportarray=(); |
map { |
map { |
$rowa.=$v{$_.'0'}."___;___"; |
$exportarray[$#exportarray+1]=$v{$_.'0'}; |
} ('A','B','C','D','E','F','G','H','I','J','K','L','M', |
} ('A','B','C','D','E','F','G','H','I','J','K','L','M', |
'N','O','P','Q','R','S','T','U','V','W','X','Y','Z'); |
'N','O','P','Q','R','S','T','U','V','W','X','Y','Z'); |
$rowa=~s/\_\_\_\;\_\_\_$//; |
return @exportarray; |
return $rowa; |
|
} |
} |
|
|
# ------------------------------------------- End of "Inside of the safe space" |
# ------------------------------------------- End of "Inside of the safe space" |
Line 456 sub getformulas {
|
Line 461 sub getformulas {
|
return $safeeval->reval('%f'); |
return $safeeval->reval('%f'); |
} |
} |
|
|
# -------------------------------------------------------------------- Set type |
|
|
|
sub settype { |
|
my ($safeeval,$type)=@_; |
|
$safeeval->reval('$sheettype="'.$type.'";'); |
|
} |
|
|
|
# -------------------------------------------------------------------- Get type |
# -------------------------------------------------------------------- Get type |
|
|
sub gettype { |
sub gettype { |
Line 497 sub getfilename {
|
Line 495 sub getfilename {
|
my $safeeval=shift; |
my $safeeval=shift; |
return $safeeval->reval('$filename'); |
return $safeeval->reval('$filename'); |
} |
} |
|
# --------------------------------------------------------------- Get course ID |
|
|
|
sub getcid { |
|
my $safeeval=shift; |
|
return $safeeval->reval('$cid'); |
|
} |
|
|
# ----------------------------------------------------------- Get course number |
# ----------------------------------------------------------- Get course number |
|
|
Line 556 sub getusymb {
|
Line 560 sub getusymb {
|
|
|
# ------------------------------------------------------------- Export of A-row |
# ------------------------------------------------------------- Export of A-row |
|
|
sub exportrow { |
sub exportdata { |
my $safeeval=shift; |
my $safeeval=shift; |
return $safeeval->reval('&exportrowa()'); |
return $safeeval->reval('&exportrowa()'); |
} |
} |
Line 684 sub readsheet {
|
Line 688 sub readsheet {
|
my ($safeeval,$fn)=@_; |
my ($safeeval,$fn)=@_; |
my $stype=&gettype($safeeval); |
my $stype=&gettype($safeeval); |
my $cnum=&getcnum($safeeval); |
my $cnum=&getcnum($safeeval); |
|
my $cdom=&getcdom($safeeval); |
|
my $chome=&getchome($safeeval); |
|
|
# --------- There is no filename. Look for defaults in course and global, cache |
# --------- There is no filename. Look for defaults in course and global, cache |
|
|
unless($fn) { |
unless($fn) { |
unless ($fn=$defaultsheets{$cnum.'_'.$stype}) { |
unless ($fn=$defaultsheets{$cnum.'_'.$cdom.'_'.$stype}) { |
$fn=&Apache::lonnet::reply('get:'. |
$fn=&Apache::lonnet::reply('get:'.$cdom.':'.$cnum. |
$ENV{'course.'.$ENV{'request.course.id'}.'.domain'}.':'. |
':environment:spreadsheet_default_'.$stype, |
$ENV{'course.'.$ENV{'request.course.id'}.'.num'}. |
$chome); |
':environment:spreadsheet_default_'.&gettype($safeeval), |
|
$ENV{'course.'.$ENV{'request.course.id'}.'.home'}); |
|
unless (($fn) && ($fn!~/^error\:/)) { |
unless (($fn) && ($fn!~/^error\:/)) { |
$fn='default_'.$stype; |
$fn='default_'.$stype; |
} |
} |
$defaultsheets{$cnum.'_'.$stype}=$fn; |
$defaultsheets{$cnum.'_'.$cdom.'_'.$stype}=$fn; |
} |
} |
} |
} |
|
|
Line 707 sub readsheet {
|
Line 711 sub readsheet {
|
|
|
# ------------------------------------------------------ see if sheet is cached |
# ------------------------------------------------------ see if sheet is cached |
my $fstring=''; |
my $fstring=''; |
if ($fstring=$spreadsheets{$cnum.'_'.$stype.'_'.$fn}) { |
if ($fstring=$spreadsheets{$cnum.'_'.$cdom.'_'.$stype.'_'.$fn}) { |
&setformulas($sheetone,split(/\_\_\_\;\_\_\_/,$fstring)); |
&setformulas($safeeval,split(/\_\_\_\;\_\_\_/,$fstring)); |
} else { |
} else { |
|
|
# ---------------------------------------------------- Not cached, need to read |
# ---------------------------------------------------- Not cached, need to read |
Line 719 sub readsheet {
|
Line 723 sub readsheet {
|
my $sheetxml=''; |
my $sheetxml=''; |
{ |
{ |
my $fh; |
my $fh; |
if ($fh=Apache::File->new($r->dir_config('lonIncludes'). |
if ($fh=Apache::File->new($includedir. |
'/default.'.&gettype($safeeval))) { |
'/default.'.&gettype($safeeval))) { |
$sheetxml=join('',<$fh>); |
$sheetxml=join('',<$fh>); |
} |
} |
Line 739 sub readsheet {
|
Line 743 sub readsheet {
|
} |
} |
} |
} |
} else { |
} else { |
my $sheet=''; |
my $sheet=''; |
my $reply=&Apache::lonnet::reply('dump:'. |
my $reply=&Apache::lonnet::reply('dump:'.$cdom.':'.$cnum.':'.$fn, |
$ENV{'course.'.$ENV{'request.course.id'}.'.domain'}.':'. |
$chome); |
$ENV{'course.'.$ENV{'request.course.id'}.'.num'}.':'.$fn, |
|
$ENV{'course.'.$ENV{'request.course.id'}.'.home'}); |
|
unless ($reply=~/^error\:/) { |
unless ($reply=~/^error\:/) { |
$sheet=$reply; |
$sheet=$reply; |
} |
} |
Line 754 sub readsheet {
|
Line 756 sub readsheet {
|
} split(/\&/,$sheet); |
} split(/\&/,$sheet); |
} |
} |
# --------------------------------------------------------------- Cache and set |
# --------------------------------------------------------------- Cache and set |
$spreadsheets{$cnum.'_'.$stype.'_'.$fn}=join('___;___',%f); |
$spreadsheets{$cnum.'_'.$cdom.'_'.$stype.'_'.$fn}=join('___;___',%f); |
&setformulas($safeeval,%f); |
&setformulas($safeeval,%f); |
} |
} |
} |
} |
|
|
|
# -------------------------------------------------------- Make new spreadsheet |
|
|
|
sub makenewsheet { |
|
my ($uname,$udom,$stype,$usymb)=@_; |
|
my $safeeval=initsheet(); |
|
$safeeval->reval( |
|
'$uname='.$uname. |
|
';$udom='.$udom. |
|
';$sheettype='.$stype. |
|
';$usymb='.$usymb. |
|
';$cid='.$ENV{'request.course.id'}. |
|
';$cnum='.$ENV{'course.'.$ENV{'request.course.id'}.'.num'}. |
|
';$cdom='.$ENV{'course.'.$ENV{'request.course.id'}.'.domain'}. |
|
';$chome='.$ENV{'course.'.$ENV{'request.course.id'}.'.home'}.';'); |
|
return $safeeval; |
|
} |
|
|
# ------------------------------------------------------------ Save spreadsheet |
# ------------------------------------------------------------ Save spreadsheet |
|
|
sub writesheet { |
sub writesheet { |
my $safeeval=shift; |
my ($safeeval,$makedef)=@_; |
if (&Apache::lonnet::allowed('opa',$ENV{'request.course.id'})) { |
my $cid=&getcid($safeeval); |
|
if (&Apache::lonnet::allowed('opa',$cid)) { |
my %f=&getformulas($safeeval); |
my %f=&getformulas($safeeval); |
|
my $stype=&gettype($safeeval); |
|
my $cnum=&getcnum($safeeval); |
|
my $cdom=&getcdom($safeeval); |
|
my $chome=&getchome($safeeval); |
|
my $fn=&getfilename($safeeval); |
|
|
|
# ------------------------------------------------------------- Cache new sheet |
|
$spreadsheets{$cnum.'_'.$cdom.'_'.$stype.'_'.$fn}=join('___;___',%f); |
|
# ----------------------------------------------------------------- Write sheet |
my $sheetdata=''; |
my $sheetdata=''; |
map { |
map { |
$sheetdata.=&Apache::lonnet::escape($_).'='. |
$sheetdata.=&Apache::lonnet::escape($_).'='. |
&Apache::lonnet::escape($f{$_}).'&'; |
&Apache::lonnet::escape($f{$_}).'&'; |
} keys %f; |
} keys %f; |
$sheetdata=~s/\&$//; |
$sheetdata=~s/\&$//; |
my $reply=&Apache::lonnet::reply('put:'. |
my $reply=&Apache::lonnet::reply('put:'.$cdom.':'.$cnum.':'.$fn.':'. |
$ENV{'course.'.$ENV{'request.course.id'}.'.domain'}.':'. |
$sheetdata,$chome); |
$ENV{'course.'.$ENV{'request.course.id'}.'.num'}.':'. |
|
&getfilename($safeeval).':'. |
|
$sheetdata, |
|
$ENV{'course.'.$ENV{'request.course.id'}.'.home'}); |
|
if ($reply eq 'ok') { |
if ($reply eq 'ok') { |
return &Apache::lonnet::reply('put:'. |
$reply=&Apache::lonnet::reply('put:'.$cdom.':'.$cnum.':'. |
$ENV{'course.'.$ENV{'request.course.id'}.'.domain'}.':'. |
&stype.'_spreadsheets:'. |
$ENV{'course.'.$ENV{'request.course.id'}.'.num'}.':'. |
&Apache::lonnet::escape($fn).'='.$ENV{'user.name'}, |
&gettype($safeeval).'_spreadsheets:'. |
$chome); |
&Apache::lonnet::escape(&getfilename($safeeval)).'='. |
if ($reply eq 'ok') { |
$ENV{'user.name'}, |
if ($makedef) { |
$ENV{'course.'.$ENV{'request.course.id'}.'.home'}); |
return &Apache::lonnet::reply('put:'.$cdom.':'.$cnum. |
|
':environment:spreadsheet_default_'.$stype.'='. |
|
&Apache::lonnet::escape($fn), |
|
$chome); |
|
} else { |
|
return $reply; |
|
} |
|
} else { |
|
return $reply; |
|
} |
} else { |
} else { |
return $reply; |
return $reply; |
} |
} |
Line 793 sub writesheet {
|
Line 827 sub writesheet {
|
} |
} |
|
|
# ----------------------------------------------- Make a temp copy of the sheet |
# ----------------------------------------------- Make a temp copy of the sheet |
|
# "Modified workcopy" - interactive only |
|
# |
|
|
sub tmpwrite { |
sub tmpwrite { |
my ($safeeval,$tmpdir,$symb)=@_; |
my $safeeval=shift; |
my $fn=$uname.'_'.$udom.'_spreadsheet_'.$symb.'_'.&getfilename($safeeval); |
my $fn=$ENV{'user.name'}.'_'. |
|
$ENV{'user.domain'}.'_spreadsheet_'.&getusymb($safeeval).'_'. |
|
&getfilename($safeeval); |
$fn=~s/\W/\_/g; |
$fn=~s/\W/\_/g; |
$fn=$tmpdir.$fn.'.tmp'; |
$fn=$tmpdir.$fn.'.tmp'; |
my $fh; |
my $fh; |
Line 808 sub tmpwrite {
|
Line 846 sub tmpwrite {
|
# ---------------------------------------------------------- Read the temp copy |
# ---------------------------------------------------------- Read the temp copy |
|
|
sub tmpread { |
sub tmpread { |
my ($safeeval,$tmpdir,$symb,$nfield,$nform)=@_; |
my ($safeeval,$nfield,$nform)=@_; |
my $fn=$uname.'_'.$udom.'_spreadsheet_'.$symb.'_'.&getfilename($safeeval); |
my $fn=$ENV{'user.name'}.'_'. |
|
$ENV{'user.domain'}.'_spreadsheet_'.&getusymb($safeeval).'_'. |
|
&getfilename($safeeval); |
$fn=~s/\W/\_/g; |
$fn=~s/\W/\_/g; |
$fn=$tmpdir.$fn.'.tmp'; |
$fn=$tmpdir.$fn.'.tmp'; |
my $fh; |
my $fh; |
Line 827 sub tmpread {
|
Line 867 sub tmpread {
|
&setformulas($safeeval,%fo); |
&setformulas($safeeval,%fo); |
} |
} |
|
|
# --------------------------------------------------------------- Read metadata |
|
|
|
sub readmeta { |
|
my $fn=shift; |
|
unless ($fn=~/\.meta$/) { $fn.='meta'; } |
|
my $content; |
|
my %returnhash=(); |
|
{ |
|
my $fh=Apache::File->new($fn); |
|
$content=join('',<$fh>); |
|
} |
|
my $parser=HTML::TokeParser->new(\$content); |
|
my $token; |
|
while ($token=$parser->get_token) { |
|
if ($token->[0] eq 'S') { |
|
my $entry=$token->[1]; |
|
if (($entry eq 'stores') || ($entry eq 'parameter')) { |
|
my $unikey=$entry; |
|
$unikey.='_'.$token->[2]->{'part'}; |
|
$unikey.='_'.$token->[2]->{'name'}; |
|
$returnhash{$unikey}=$token->[2]->{'display'}; |
|
} |
|
} |
|
} |
|
return %returnhash; |
|
} |
|
|
|
# ================================================================== Parameters |
# ================================================================== Parameters |
# -------------------------------------------- Figure out a cascading parameter |
# -------------------------------------------- Figure out a cascading parameter |
|
# |
|
|
sub parmval { |
sub parmval { |
my ($what,$symb)=@_; |
my ($what,$safeeval)=@_; |
|
my $cid=&getcid($safeeval); |
|
my $csec=&getcsec($safeeval); |
|
my $uname=&getuname($safeeval); |
|
my $udom=&getudom($safeeval); |
|
my $symb=&getusymb($safeeval); |
|
|
unless ($symb) { return ''; } |
unless ($symb) { return ''; } |
my $result=''; |
my $result=''; |
Line 871 sub parmval {
|
Line 890 sub parmval {
|
|
|
my $symbparm=$symb.'.'.$what; |
my $symbparm=$symb.'.'.$what; |
my $mapparm=$mapname.'___(all).'.$what; |
my $mapparm=$mapname.'___(all).'.$what; |
|
my $usercourseprefix=$cid.'_'.$uname.'_'.$udom; |
|
|
my $seclevel= |
my $seclevel= |
$ENV{'request.course.id'}.'.['. |
$usercourseprefix.'.['. |
$csec.'].'.$what; |
$csec.'].'.$what; |
my $seclevelr= |
my $seclevelr= |
$ENV{'request.course.id'}.'.['. |
$usercourseprefix.'.['. |
$csec.'].'.$symbparm; |
$csec.'].'.$symbparm; |
my $seclevelm= |
my $seclevelm= |
$ENV{'request.course.id'}.'.['. |
$usercourseprefix.'.['. |
$csec.'].'.$mapparm; |
$csec.'].'.$mapparm; |
|
|
my $courselevel= |
my $courselevel= |
$ENV{'request.course.id'}.'.'.$what; |
$usercourseprefix.'.'.$what; |
my $courselevelr= |
my $courselevelr= |
$ENV{'request.course.id'}.'.'.$symbparm; |
$usercourseprefix.'.'.$symbparm; |
my $courselevelm= |
my $courselevelm= |
$ENV{'request.course.id'}.'.'.$mapparm; |
$usercourseprefix.'.'.$mapparm; |
|
|
# ---------------------------------------------------------- fourth, check user |
# ---------------------------------------------------------- fourth, check user |
|
|
Line 932 sub parmval {
|
Line 952 sub parmval {
|
|
|
# ---------------------------------------------- Update rows for course listing |
# ---------------------------------------------- Update rows for course listing |
|
|
sub updatestudentrows { |
sub updateclasssheet { |
my $safeeval=shift; |
my $safeeval=shift; |
my $cid=$ENV{'request.course.id'}; |
my $cnum=&getcnum($safeeval); |
|
my $cdom=&getcdom($safeeval); |
|
my $cid=&getcid($safeeval); |
|
my $chome=&getchome($safeeval); |
|
|
|
# ---------------------------------------------- Read class list and row labels |
|
|
my $classlst=&Apache::lonnet::reply |
my $classlst=&Apache::lonnet::reply |
('dump:'.$ENV{'course.'.$cid.'.domain'}.':'. |
('dump:'.$cdom.':'.$cnum.':classlist',$chome); |
$ENV{'course.'.$cid.'.num'}.':classlist', |
|
$ENV{'course.'.$cid.'.home'}); |
|
my %currentlist=(); |
my %currentlist=(); |
my $now=time; |
my $now=time; |
unless ($classlst=~/^error\:/) { |
unless ($classlst=~/^error\:/) { |
Line 950 sub updatestudentrows {
|
Line 974 sub updatestudentrows {
|
if ($active) { |
if ($active) { |
my $rowlabel=''; |
my $rowlabel=''; |
$name=&Apache::lonnet::unescape($name); |
$name=&Apache::lonnet::unescape($name); |
my ($cname,$cdom)=split(/\:/,$name); |
my ($sname,$sdom)=split(/\:/,$name); |
my $csec= |
my $ssec=&Apache::lonnet::usection($sdom,$sname,$cid); |
&Apache::lonnet::usection($cdom,$cname,$ENV{'request.course.id'}); |
if ($ssec==-1) { |
if ($csec==-1) { |
|
$rowlabel='<font color=red>Data not available: '.$name. |
$rowlabel='<font color=red>Data not available: '.$name. |
'</font>'; |
'</font>'; |
} else { |
} else { |
my %reply=&Apache::lonnet::idrget($cdom,$cname); |
my %reply=&Apache::lonnet::idrget($sdom,$sname); |
my $reply=&Apache::lonnet::reply('get:'.$cdom.':'.$cname. |
my $reply=&Apache::lonnet::reply('get:'.$sdom.':'.$sname. |
':environment:firstname&middlename&lastname&generation', |
':environment:firstname&middlename&lastname&generation', |
&Apache::lonnet::homeserver($cname,$cdom)); |
&Apache::lonnet::homeserver($sname,$sdom)); |
$rowlabel=$csec.' '.$reply{$cname}.'<br>'; |
$rowlabel=$ssec.' '.$reply{$sname}.'<br>'; |
map { |
map { |
$rowlabel.=&Apache::lonnet::unescape($_).' '; |
$rowlabel.=&Apache::lonnet::unescape($_).' '; |
} split(/\&/,$reply); |
} split(/\&/,$reply); |
} |
} |
|
|
$currentlist{&Apache::lonnet::unescape($name)}=$rowlabel; |
$currentlist{&Apache::lonnet::unescape($name)}=$rowlabel; |
} |
} |
} split(/\&/,$classlst); |
} split(/\&/,$classlst); |
Line 1010 sub updatestudentrows {
|
Line 1032 sub updatestudentrows {
|
return 'Could not access course data'; |
return 'Could not access course data'; |
} |
} |
} |
} |
# ----------------------------------------------------------------- Update rows |
|
|
|
sub updaterows { |
# ----------------------------------- Update rows for student and assess sheets |
|
|
|
sub updatestudentassesssheet { |
my $safeeval=shift; |
my $safeeval=shift; |
my %bighash; |
my %bighash; |
# -------------------------------------------------------------------- Tie hash |
# -------------------------------------------------------------------- Tie hash |
Line 1249 sub rowaassess {
|
Line 1272 sub rowaassess {
|
if ($_=~/^A/) { |
if ($_=~/^A/) { |
unless ($f{$_}=~/^\!/) { |
unless ($f{$_}=~/^\!/) { |
if ($f{$_}=~/^parameter/) { |
if ($f{$_}=~/^parameter/) { |
$c{$_}=&parmval($f{$_},$symb); |
$c{$_}=&parmval($f{$_},$safeeval); |
} else { |
} else { |
my $key=$f{$_}; |
my $key=$f{$_}; |
$key=~s/^stores\_/resource\./; |
$key=~s/^stores\_/resource\./; |
Line 1287 sub selectbox {
|
Line 1310 sub selectbox {
|
return $selout.'</select>'; |
return $selout.'</select>'; |
} |
} |
|
|
|
# =============================================== Update information in a sheet |
|
# |
|
# Add new users or assessments, etc. |
|
# |
|
|
|
sub updatesheet { |
|
my $safeeval=shift; |
|
my $stype=&gettype($safeeval); |
|
if ($stype eq 'classcalc') { |
|
return &updateclasssheet($safeeval); |
|
} else { |
|
return &updatestudentassesssheet($safeeval); |
|
} |
|
} |
|
|
|
# =================================================== Load the rows for a sheet |
|
# |
|
# Import the data for rows |
|
# |
|
|
|
sub loadrows() { |
|
my $safeeval=shift; |
|
my $stype=&gettype($safeeval); |
|
if ($stype eq 'classcalc') { |
|
&loadcourse($thissheet); |
|
} elsif ($stype eq 'studentcalc') { |
|
&loadstudent($thissheet); |
|
} else { |
|
&loadassessment($thissheet); |
|
} |
|
} |
|
|
|
# ============================================================== Export handler |
|
# |
|
# Non-interactive call from with program |
|
# |
|
|
|
sub exportsheet { |
|
my ($uname,$udom,$stype,$usymb,$fn)=@_; |
|
my $thissheet=($uname,$udom,$stype,$usymb); |
|
&readsheet($thissheet,$fn); |
|
&updatesheet($thissheet); |
|
&loadrows($thissheet); |
|
&calcsheet($thissheet); |
|
return &exportdata($thissheet); |
|
} |
|
|
# ================================================================ Main handler |
# ================================================================ Main handler |
|
# |
|
# Interactive call to screen |
|
# |
|
# |
|
|
|
|
sub handler { |
sub handler { |
my $r=shift; |
my $r=shift; |
|
|
$uname=''; |
if ($r->header_only) { |
$udom=''; |
|
$csec=''; |
|
|
|
if ($r->header_only) { |
|
$r->content_type('text/html'); |
$r->content_type('text/html'); |
$r->send_http_header; |
$r->send_http_header; |
return OK; |
return OK; |
} |
} |
|
|
|
# ---------------------------------------------------- Global directory configs |
|
|
|
$includedir=r->dir_config('lonIncludes'); |
|
$tmpdir=$r->dir_config('lonDaemons').'/tmp/'; |
|
|
# ----------------------------------------------------- Needs to be in a course |
# ----------------------------------------------------- Needs to be in a course |
|
|
Line 1385 ENDSCRIPT
|
Line 1461 ENDSCRIPT
|
$ENV{'form.unewfield'},$ENV{'form.unewformula'}); |
$ENV{'form.unewfield'},$ENV{'form.unewformula'}); |
} elsif ($ENV{'form.saveas'}) { |
} elsif ($ENV{'form.saveas'}) { |
&setfilename($sheetone,$ENV{'form.ufn'}); |
&setfilename($sheetone,$ENV{'form.ufn'}); |
&tmpread($sheetone,$r->dir_config('lonDaemons').'/tmp/', |
&tmpread($sheetone,, |
$ENV{'form.usymb'}); |
$ENV{'form.usymb'}); |
} else { |
} else { |
unless ($ENV{'form.ufn'}) { |
unless ($ENV{'form.ufn'}) { |
Line 1493 ENDSCRIPT
|
Line 1569 ENDSCRIPT
|
return HTTP_NOT_ACCEPTABLE; |
return HTTP_NOT_ACCEPTABLE; |
} |
} |
return OK; |
return OK; |
|
|
|
$bombnomatterwhat='yes'; |
} |
} |
|
|
1; |
1; |