+ sub (/us/:user) {
+ my $user = user_entry $_{user};
+ response us_entry => $user->{name}, $user
+ },
+ sub (/ct/:contest) {
+ my $contest = contest_entry $_{contest};
+ response ct_entry => $contest->{name}, $contest, 60
+ },
+ sub (/log/:job) {
+ my $job = job_entry $_{job};
+ forbid $job->{private};
+ response log_entry => "Job $_{job}", $job, 10
+ },
+ sub (/pb/:problem + ?contest~) {
+ my (undef, undef, $contest) = @_;
+ $_{contest} = $contest;
+ $contest = $contest && contest_entry $_{contest};
+ return NOT_FOUND if $contest && !contest_has_problem $_{contest}, $_{problem};
+ my $problem = problem_entry $_{problem}, $_{contest};
+ forbid $problem->{private} && !$contest;
+ if ($contest) {
+ return redirect "/pb/$_{problem}" if !$contest->{started} || $contest->{finished};
+ forbid !remote_user;
+ $privacy = 'private';
+ }
+ response pb_entry => $problem->{name}, $problem, $_{contest} ? 10 : ();
+ },
+ sub (/sol/:problem) {
+ my $problem = problem_entry $_{problem};
+ forbid $problem->{private};
+ response sol => 'Solution of ' . $problem->{name}, {solution => $problem->{solution}};
+ },