diff --git a/LICENSE b/LICENSE index 8df1667545..980aae59d3 100644 --- a/LICENSE +++ b/LICENSE @@ -2,7 +2,7 @@ Online Homework Delivery System Version 2.* - Copyright 2000-2018, The WeBWorK Project + Copyright 2000-2022, The WeBWorK Project All rights reserved. This program is free software; you can redistribute it and/or modify diff --git a/README b/README index 2326906afb..45ed6d2993 100644 --- a/README +++ b/README @@ -6,6 +6,6 @@ http://webwork.maa.org/wiki/Category:Release_Notes - Copyright 2000-2017, The WeBWorK Project + Copyright 2000-2022, The WeBWorK Project http://webwork.maa.org All rights reserved. diff --git a/VERSION b/VERSION index e9d9c39ee9..0048b529d4 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ -$PG_VERSION ='2.16+develop'; -$PG_COPYRIGHT_YEARS = '1996-2021'; +$PG_VERSION ='2.17'; +$PG_COPYRIGHT_YEARS = '1996-2022'; 1; diff --git a/htdocs/js/apps/Problem/problem.scss b/htdocs/js/apps/Problem/problem.scss index 465f12e7e9..d85a39204e 100644 --- a/htdocs/js/apps/Problem/problem.scss +++ b/htdocs/js/apps/Problem/problem.scss @@ -1,5 +1,5 @@ /* WeBWorK Online Homework Delivery System - * Copyright © 2000-2021 The WeBWorK Project, https://github.com/openwebwork + * Copyright © 2000-2022 The WeBWorK Project, https://github.com/openwebwork * * This program is free software; you can redistribute it and/or modify it under * the terms of either: (a) the GNU General Public License as published by the diff --git a/lib/AnswerHash.pm b/lib/AnswerHash.pm index 8a029cc8a4..f199b4266f 100755 --- a/lib/AnswerHash.pm +++ b/lib/AnswerHash.pm @@ -3,16 +3,26 @@ ## ## Provides a data structure for answer hashes. Currently just a wrapper ## for the hash, but that might change -#################################################################### -# Copyright @ 1995-2002 WeBWorK Team -# All Rights Reserved -#################################################################### +################################################################################ +# WeBWorK Online Homework Delivery System +# Copyright © 2000-2022 The WeBWorK Project, https://github.com/openwebwork +# +# This program is free software; you can redistribute it and/or modify it under +# the terms of either: (a) the GNU General Public License as published by the +# Free Software Foundation; either version 2, or (at your option) any later +# version, or (b) the "Artistic License" which comes with this package. +# +# This program is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +# FOR A PARTICULAR PURPOSE. See either the GNU General Public License or the +# Artistic License for more details. +################################################################################ #$Id$ =head1 NAME AnswerHash.pm -- located in the courseScripts directory - + This file contains the packages/classes: AnswerHash and AnswerEvaluator @@ -20,14 +30,14 @@ AnswerHash -- this class stores information related to the student's answer. It is little more than a standard perl hash with - a special name, but it does have some access and + a special name, but it does have some access and manipulation methods. More of these may be added as it becomes necessary. - + Usage: $rh_ans = new AnswerHash; - + AnswerEvaluator -- this class organizes the construction of - answer evaluator subroutines which check the + answer evaluator subroutines which check the student's answer. By plugging filters into the answer evaluator class you can customize the way the student's answer is normalized and checked. Our hope @@ -36,7 +46,7 @@ combinations to obtain different answer evaluators, thus greatly reducing the programming and maintenance required for constructing answer evaluators. - + Usage: $ans_eval = new AnswerEvaluator; =cut @@ -72,16 +82,16 @@ The answer hash class is guaranteed to contain the following instance variables: This is displayed in the section reporting the results of checking the student answers. - $ans_hash->{original_student_ans} -- This is the original student answer. + $ans_hash->{original_student_ans} -- This is the original student answer. This is displayed on the preview page and may be used for sticky answers. - $ans_hash->{ans_message} -- Any error message, or hint provided by + $ans_hash->{ans_message} -- Any error message, or hint provided by the answer evaluator. This is also displayed in the section reporting the results of checking the student answers. - $ans_hash->{type} -- A string indicating the type of answer evaluator. + $ans_hash->{type} -- A string indicating the type of answer evaluator. This helps in preprocessing the student answer for errors. Some examples: 'number_with_units' @@ -97,13 +107,13 @@ The answer hash class is guaranteed to contain the following instance variables: same as $ans_hash{student_ans}. - $ans_hash->{preview_latex_string} -- + $ans_hash->{preview_latex_string} -- THIS IS OPTIONAL. This is latex version of the student answer which is used to show a typeset view on the answer on the preview page. For a student answer of 2/3, this would be \frac{2}{3}. 'ans_message' => '', # null string - + 'preview_text_string' => undef, 'preview_latex_string' => undef, 'error_flag' => undef, @@ -116,7 +126,7 @@ The answer hash class is guaranteed to contain the following instance variables: BEGIN { # main::be_strict(); # an alias for use strict. This means that all global variable must contain main:: as a prefix. - + } package AnswerHash; @@ -140,14 +150,14 @@ my %fields = ( 'score' => undef, =head4 new Useage $rh_anshash = new AnswerHash; - + returns an object of type AnswerHash. - + =cut sub new { my $class = shift @_; - + my $self = { 'score' => 0, 'correct_ans' => 'No correct answer specified', 'student_ans' => undef, @@ -161,10 +171,10 @@ sub new { 'error_message' => '', }; # return a reference to a hash. - + bless $self, $class; $self -> setKeys(@_); - + return $self; } @@ -172,26 +182,26 @@ sub new { ## Checks to make sure that the keys are valid, ## then sets their value -=head4 setKeys - - $rh_ans->setKeys(score=>1, student_answer => "yes"); +=head4 setKeys + + $rh_ans->setKeys(score=>1, student_answer => "yes"); Sets standard elements in the AnswerHash (the ones defined above). Will give error if one attempts to set non-standard keys. - + To set a non-standard element in a hash use - + $rh_ans->{non-standard-key} = newValue; - + There are no safety checks when using this method. =cut - + sub setKeys { my $self = shift; my %inits = @_; foreach my $item (keys %inits) { - if ( exists $fields{$item} ) { + if ( exists $fields{$item} ) { $self -> {$item} = $inits{$item}; } else { @@ -206,14 +216,14 @@ sub setKeys { Usage: $rh_ans->data('foo'); set $rh_ans->{student_ans} = 'foo'; $student_input = $rh_ans->data(); retrieve value of $rh_ans->{student_ans} - + synonym for input -=head4 input +=head4 input Usage: $rh_ans->input('foo') sets $rh_ans->{student_ans} = 'foo'; $student_input = $rh_ans->input(); - + synonym for data =cut @@ -230,16 +240,16 @@ sub input { #$rh_ans->input('foo') is a synonym for $rh_ans->{student_ans}=' $self->{student_ans} } -=head4 input +=head4 input - Usage: $rh_ans->score(1) + Usage: $rh_ans->score(1) $score = $rh_ans->score(); - + Retrieve or set $rh_ans->{score}, the student's score on the problem. =cut -sub score { +sub score { my $self = shift; my $score = shift; $self->{score} = $score if defined($score); @@ -276,20 +286,20 @@ sub stringify_hash { =head4 throw_error Usage: $rh_ans->throw_error("FLAG", "message"); - - FLAG is a distinctive word that describes the type of error. + + FLAG is a distinctive word that describes the type of error. Examples are EVAL for an evaluation error or "SYNTAX" for a syntax error. The entry $rh_ans->{error_flag} is set to "FLAG". - + The catch_error and clear_error methods use this entry. - + message is a descriptive message for the end user, defining what error occured. =head4 catch_error Usage: $rh_ans->catch_error("FLAG2"); - + Returns true (1) if $rh_ans->{error_flag} equals "FLAG2", otherwise it returns false (empty string). @@ -298,8 +308,8 @@ sub stringify_hash { =head4 clear_error Usage: $rh_ans->clear_error("FLAG2"); - - If $rh_ans->{error_flag} equals "FLAG2" then the {error_flag} entry is set to + + If $rh_ans->{error_flag} equals "FLAG2" then the {error_flag} entry is set to the empty string as is the entry {error_message} =head4 error_flag @@ -307,11 +317,11 @@ sub stringify_hash { =head4 error_message Usage: $flag = $rh_ans -> error_flag(); - + $message = $rh_ans -> error_message(); - Retrieve or set the {error_flag} and {error_message} entries. - + Retrieve or set the {error_flag} and {error_message} entries. + Use catch_error and throw_error where possible. =cut @@ -359,15 +369,15 @@ sub error_message { # error print out method # =head4 pretty_print -# -# +# +# # Usage: $rh_ans -> pretty_print(); -# -# +# +# # Returns a string containing a representation of the AnswerHash as an HTML table. -# +# # =cut -# +# # sub pretty_print { # my $r_input = shift; # my $level = shift; @@ -391,7 +401,7 @@ sub error_message { # while (@array) { # $out .= pretty_print(shift @array, $level) . " , "; # } -# $out .= " )"; +# $out .= " )"; # } elsif (ref($r_input) eq 'CODE') { # $out = "$r_input"; # } else { @@ -401,14 +411,14 @@ sub error_message { # $out; # } -# action methods +# action methods =head4 OR Usage: $rh_ans->OR($rh_ans2); - + Returns a new AnswerHash whose score is the maximum of the scores in $rh_ans and $rh_ans2. - The correct answers for the two hashes are combined with "OR". + The correct answers for the two hashes are combined with "OR". The types are concatenated with "OR" as well. Currently nothing is done with the error flags and messages. @@ -418,9 +428,9 @@ sub error_message { Usage: $rh_ans->AND($rh_ans2); - + Returns a new AnswerHash whose score is the minimum of the scores in $rh_ans and $rh_ans2. - The correct answers for the two hashes are combined with "AND". + The correct answers for the two hashes are combined with "AND". The types are concatenated with "AND" as well. Currently nothing is done with the error flags and messages. @@ -433,11 +443,11 @@ sub error_message { sub OR { my $self = shift; - + my $rh_ans2 = shift; my %options = @_; return($self) unless defined($rh_ans2) and ref($rh_ans2) eq 'AnswerHash'; - + my $out_hash = new AnswerHash; # score is the maximum of the two scores $out_hash->{score} = ( $self->{score} < $rh_ans2->{score} ) ? $rh_ans2->{score} :$self->{score}; @@ -498,17 +508,17 @@ use PGUtil qw(not_null pretty_print); sub new { my $class = shift @_; - + my $self = { pre_filters => [ [\&blank_prefilter] ], evaluators => [], post_filters => [ [\&blank_postfilter] ], debug => 0, rh_ans => new AnswerHash, - + }; - + bless $self, $class; - $self->rh_ans(@_); #initialize answer hash + $self->rh_ans(@_); #initialize answer hash return $self; } sub clone { @@ -527,15 +537,15 @@ sub dereference_array_ans { } $rh_ans; } - + sub get_student_answer { my $self = shift; - my $input = shift; + my $input = shift; my %answer_options = @_; my $display_input = $input; $display_input =~ s/\0/\\0/g; # make null spacings visible eval (q!main::DEBUG_MESSAGE( "Raw student answer is |$display_input|")!) if $self->{debug}; - $input = '' unless defined($input); + $input = '' unless defined($input); if (ref($input) =~/AnswerHash/) { # in this case nothing needs to be done, since the student's answer is already in an answerhash. # This is useful when an AnswerEvaluator is used as a filter in another answer evaluator. @@ -544,17 +554,17 @@ sub get_student_answer { $self-> {rh_ans} -> {original_student_ans} = " ( " .join(", ",@input) . " ) "; $input = \@input; $self-> {rh_ans} -> {student_ans} = $input; - } elsif (ref($input) eq 'ARRAY' ) { # sometimes the answer may already be decoded into an array. + } elsif (ref($input) eq 'ARRAY' ) { # sometimes the answer may already be decoded into an array. my @input = @$input; $self-> {rh_ans} -> {original_student_ans} = " ( " .join(", ",@input) . " ) "; $input = \@input; $self-> {rh_ans} -> {student_ans} = $input; } else { - + $self-> {rh_ans} -> {original_student_ans} = $input; $self-> {rh_ans} -> {student_ans} = $input; } - $self->{rh_ans}->{ans_label} = $answer_options{ans_label} if defined($answer_options{ans_label}); + $self->{rh_ans}->{ans_label} = $answer_options{ans_label} if defined($answer_options{ans_label}); $self->{rh_ans}->{_filter_name} = 'get_student_answer'; $input; } @@ -572,12 +582,12 @@ sub evaluate { $self->get_student_answer(@_); # dereference $self->{rh_ans}; my $rh_ans = $self ->{rh_ans}; - $rh_ans->{error_flag}=undef; #reset the error flags in case + $rh_ans->{error_flag}=undef; #reset the error flags in case $rh_ans->{done}=undef; #the answer evaluator is called twice - + eval (q!main::DEBUG_MESSAGE( "

Answer evaluator information:

")!) if defined($self->{debug}) and $self->{debug}>0; $self->print_result_if_debug('pre_filter',$rh_ans); - + my @prefilters = @{$self -> {pre_filters}}; $count = 0; # the get student answer filter is counted as filter -1 foreach my $i (@prefilters) { @@ -630,7 +640,7 @@ sub print_result_if_debug { my $name = (defined($rh_ans->{_filter_name})) ? $rh_ans->{_filter_name}: 'unnamed'; eval (q! main::DEBUG_MESSAGE( "\n $count. Result from queue $queue: name: \"$name\"n", pretty_print($rh_ans,'html',4)) !); - ++$count; + ++$count; } $rh_ans->{_filter_name} = undef; } @@ -639,7 +649,7 @@ sub print_result_if_debug { # sub correct_answer_evaluate { # my $self = shift; # $self-> {rh_ans} -> {correct_ans} = shift @_; -# my $rh_ans = $self ->{rh_ans}; +# my $rh_ans = $self ->{rh_ans}; # my @prefilters = @{$self -> {correct_answer_pre_filters}}; # my $count = -1; # the blank filter is counted as filter 0 # foreach my $i (@prefilters) { @@ -669,7 +679,7 @@ sub print_result_if_debug { # $rh_ans = &$filter($rh_ans,@array); # warn "Filter Name:", $rh_ans->{_filter_name},"
\n" if $self->{debug}>0 and defined($rh_ans->{_filter_name}) # } -# $rh_ans = $self->dereference_array_ans($rh_ans); +# $rh_ans = $self->dereference_array_ans($rh_ans); # # make sure that the student answer is not an array so that it is reported correctly in answer section. # warn "final result: ", $self->{rh_ans}->pretty_print() if defined($self->{debug}) and $self->{debug}>0; # $self ->{rh_ans} = $rh_ans; @@ -811,7 +821,7 @@ sub withPostFilter { sub ans_hash { #alias for rh_ans my $self = shift; $self->rh_ans(@_); -} +} sub rh_ans { my $self = shift; my %in_hash = @_; @@ -823,11 +833,11 @@ sub rh_ans { =head1 Description: Filters -A filter is a subroutine which takes one AnswerHash as an input, followed by +A filter is a subroutine which takes one AnswerHash as an input, followed by a hash of options. Usage: filter($ans_hash, option1 =>value1, option2=> value2 ); - + The filter performs some operations on the input AnswerHash and returns an AnswerHash as output. @@ -837,17 +847,17 @@ three queues: pre_filters: these normalize student input, prepare text and so forth evaluators: these decide whether or not an answer is correct - post_filters: typically these clean up error messages or process errors + post_filters: typically these clean up error messages or process errors and generate error messages. If a filter detects an error it can throw an error message using the C<$rh_ans->throw_error()> method. This skips the AnswerHash by all remaining pre_filter C<$rh_ans->catch_error>, decides how ( or whether) it is supposed to handle the error and then passes the result on -to the next post_filter. +to the next post_filter. -Setting the flag C<$rh_ans->{done} = 1> will skip -the AnswerHash past the remaining post_filters. +Setting the flag C<$rh_ans->{done} = 1> will skip +the AnswerHash past the remaining post_filters. =head3 Built in filters @@ -867,7 +877,7 @@ the AnswerHash past the remaining post_filters. sub blank_prefilter { # check for blanks - my $rh_ans = shift; + my $rh_ans = shift; $rh_ans->{_filter_name} = 'blank_prefilter'; # undefined answers are BLANKS ( not defined($rh_ans->{student_ans}) ) && do {$rh_ans->throw_error("BLANK", 'The answer is blank'); @@ -882,7 +892,7 @@ sub blank_prefilter { # check for blanks $rh_ans; }; -sub blank_postfilter { +sub blank_postfilter { my $rh_ans=shift; $rh_ans->{_filter_name} = 'blank_postfilter'; return($rh_ans) unless defined($rh_ans->{error_flag}) and $rh_ans->{error_flag} eq 'BLANK'; diff --git a/lib/DragNDrop.pm b/lib/DragNDrop.pm index 591e1e4cf8..fc08c37317 100644 --- a/lib/DragNDrop.pm +++ b/lib/DragNDrop.pm @@ -1,6 +1,6 @@ ################################################################################ # WeBWorK Online Homework Delivery System -# Copyright © 2000-2021 The WeBWorK Project, https://github.com/openwebwork +# Copyright © 2000-2022 The WeBWorK Project, https://github.com/openwebwork # # This program is free software; you can redistribute it and/or modify it under # the terms of either: (a) the GNU General Public License as published by the diff --git a/lib/LaTeXImage.pm b/lib/LaTeXImage.pm index aec9db1b4c..43ea3317f1 100644 --- a/lib/LaTeXImage.pm +++ b/lib/LaTeXImage.pm @@ -1,13 +1,13 @@ #!/bin/perl ################################################################################ # WeBWorK Online Homework Delivery System -# Copyright © 2000-2018 The WeBWorK Project, http://openwebwork.sf.net/ -# +# Copyright © 2000-2022 The WeBWorK Project, https://github.com/openwebwork +# # This program is free software; you can redistribute it and/or modify it under # the terms of either: (a) the GNU General Public License as published by the # Free Software Foundation; either version 2, or (at your option) any later # version, or (b) the "Artistic License" which comes with this package. -# +# # This program is distributed in the hope that it will be useful, but WITHOUT # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS # FOR A PARTICULAR PURPOSE. See either the GNU General Public License or the diff --git a/lib/PGEnvironment.pm b/lib/PGEnvironment.pm index e4944b9a16..c7bd9b793e 100644 --- a/lib/PGEnvironment.pm +++ b/lib/PGEnvironment.pm @@ -1,6 +1,6 @@ ################################################################################ # WeBWorK Online Homework Delivery System -# Copyright © 2000-2021 The WeBWorK Project, http://github.com/openwebwork +# Copyright © 2000-2022 The WeBWorK Project, https://github.com/openwebwork # # This program is free software; you can redistribute it and/or modify it under # the terms of either: (a) the GNU General Public License as published by the diff --git a/lib/PGUtil.pm b/lib/PGUtil.pm index 06dcee6c75..b2a92e0ad0 100644 --- a/lib/PGUtil.pm +++ b/lib/PGUtil.pm @@ -1,13 +1,12 @@ ############################################################################### # WeBWorK Online Homework Delivery System -# Copyright © 2000-2018 The WeBWorK Project, http://openwebwork.sf.net/ -# $CVSHeader: pg/lib/PGcore.pm,v 1.6 2010/05/25 22:47:52 gage Exp $ -# +# Copyright © 2000-2022 The WeBWorK Project, https://github.com/openwebwork +# # This program is free software; you can redistribute it and/or modify it under # the terms of either: (a) the GNU General Public License as published by the # Free Software Foundation; either version 2, or (at your option) any later # version, or (b) the "Artistic License" which comes with this package. -# +# # This program is distributed in the hope that it will be useful, but WITHOUT # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS # FOR A PARTICULAR PURPOSE. See either the GNU General Public License or the diff --git a/lib/PGalias.pm b/lib/PGalias.pm index a2b1556719..9216e69120 100644 --- a/lib/PGalias.pm +++ b/lib/PGalias.pm @@ -1,7 +1,6 @@ ################################################################################ # WeBWorK Online Homework Delivery System -# Copyright © 2000-2018 The WeBWorK Project, http://openwebwork.sf.net/ -# $CVSHeader: pg/lib/PGalias.pm,v 1.6 2010/05/15 18:41:23 gage Exp $ +# Copyright © 2000-2022 The WeBWorK Project, https://github.com/openwebwork # # This program is free software; you can redistribute it and/or modify it under # the terms of either: (a) the GNU General Public License as published by the diff --git a/lib/PGanswergroup.pm b/lib/PGanswergroup.pm index 14a8eff61c..bfd84893b0 100644 --- a/lib/PGanswergroup.pm +++ b/lib/PGanswergroup.pm @@ -1,13 +1,12 @@ ################################################################################ # WeBWorK Online Homework Delivery System -# Copyright © 2000-2018 The WeBWorK Project, http://openwebwork.sf.net/ -# $CVSHeader: pg/lib/PGanswergroup.pm,v 1.1 2010/05/14 11:39:02 gage Exp $ -# +# Copyright © 2000-2022 The WeBWorK Project, https://github.com/openwebwork +# # This program is free software; you can redistribute it and/or modify it under # the terms of either: (a) the GNU General Public License as published by the # Free Software Foundation; either version 2, or (at your option) any later # version, or (b) the "Artistic License" which comes with this package. -# +# # This program is distributed in the hope that it will be useful, but WITHOUT # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS # FOR A PARTICULAR PURPOSE. See either the GNU General Public License or the diff --git a/lib/PGcore.pm b/lib/PGcore.pm index 446010a40b..57e44d9319 100755 --- a/lib/PGcore.pm +++ b/lib/PGcore.pm @@ -1,7 +1,6 @@ ################################################################################ # WeBWorK Online Homework Delivery System -# Copyright © 2000-2018 The WeBWorK Project, http://openwebwork.sf.net/ -# $CVSHeader: pg/lib/PGcore.pm,v 1.6 2010/05/25 22:47:52 gage Exp $ +# Copyright © 2000-2022 The WeBWorK Project, https://github.com/openwebwork # # This program is free software; you can redistribute it and/or modify it under # the terms of either: (a) the GNU General Public License as published by the diff --git a/lib/PGloadfiles.pm b/lib/PGloadfiles.pm index 035329d2d0..f13c339a6d 100644 --- a/lib/PGloadfiles.pm +++ b/lib/PGloadfiles.pm @@ -1,13 +1,12 @@ ################################################################################ # WeBWorK Online Homework Delivery System -# Copyright © 2000-2012 The WeBWorK Project, http://openwebwork.org -# $CVSHeader: pg/lib/PGloadfiles.pm,v 1.1 2010/05/14 11:39:02 gage Exp $ -# +# Copyright © 2000-2022 The WeBWorK Project, https://github.com/openwebwork +# # This program is free software; you can redistribute it and/or modify it under # the terms of either: (a) the GNU General Public License as published by the # Free Software Foundation; either version 2, or (at your option) any later # version, or (b) the "Artistic License" which comes with this package. -# +# # This program is distributed in the hope that it will be useful, but WITHOUT # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS # FOR A PARTICULAR PURPOSE. See either the GNU General Public License or the diff --git a/lib/PGresource.pm b/lib/PGresource.pm index 2d35fdb943..d6208f9ac1 100644 --- a/lib/PGresource.pm +++ b/lib/PGresource.pm @@ -1,13 +1,12 @@ ################################################################################ # WeBWorK Online Homework Delivery System -# Copyright © 2000-2018 The WeBWorK Project, http://openwebwork.sf.net/ -# $CVSHeader: pg/lib/PGalias.pm,v 1.6 2010/05/15 18:41:23 gage Exp $ -# +# Copyright © 2000-2022 The WeBWorK Project, https://github.com/openwebwork +# # This program is free software; you can redistribute it and/or modify it under # the terms of either: (a) the GNU General Public License as published by the # Free Software Foundation; either version 2, or (at your option) any later # version, or (b) the "Artistic License" which comes with this package. -# +# # This program is distributed in the hope that it will be useful, but WITHOUT # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS # FOR A PARTICULAR PURPOSE. See either the GNU General Public License or the diff --git a/lib/PGresponsegroup.pm b/lib/PGresponsegroup.pm index 27d093efb7..33f236ef56 100644 --- a/lib/PGresponsegroup.pm +++ b/lib/PGresponsegroup.pm @@ -1,13 +1,12 @@ ################################################################################ # WeBWorK Online Homework Delivery System -# Copyright © 2000-2018 The WeBWorK Project, http://openwebwork.sf.net/ -# $CVSHeader: pg/lib/PGresponsegroup.pm,v 1.2 2010/05/25 22:13:52 gage Exp $ -# +# Copyright © 2000-2022 The WeBWorK Project, https://github.com/openwebwork +# # This program is free software; you can redistribute it and/or modify it under # the terms of either: (a) the GNU General Public License as published by the # Free Software Foundation; either version 2, or (at your option) any later # version, or (b) the "Artistic License" which comes with this package. -# +# # This program is distributed in the hope that it will be useful, but WITHOUT # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS # FOR A PARTICULAR PURPOSE. See either the GNU General Public License or the diff --git a/lib/Statistics.pm b/lib/Statistics.pm index b06084abd1..b759ff3a56 100644 --- a/lib/Statistics.pm +++ b/lib/Statistics.pm @@ -1,15 +1,13 @@ ################################################################################ # WeBWorK Online Homework Delivery System -# Copyright © 2013 The WeBWorK Project, http://openwebwork.sf.net/ -# $CVSHeader: $ -# Author: Kelly Black - kjblack@gmail.com -# +# Copyright © 2000-2022 The WeBWorK Project, https://github.com/openwebwork +# # This program is free software; you can redistribute it and/or modify it under # the terms of either: (a) the GNU General Public License as published by the # Free Software Foundation; either version 2, or (at your option) any later # version, or (b) the "Artistic License" which comes with this package. -# +# # This program is distributed in the hope that it will be useful, but WITHOUT # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS # FOR A PARTICULAR PURPOSE. See either the GNU General Public License or the diff --git a/lib/WeBWorK/EquationCache.pm b/lib/WeBWorK/EquationCache.pm index db144de5f6..9e886c423b 100644 --- a/lib/WeBWorK/EquationCache.pm +++ b/lib/WeBWorK/EquationCache.pm @@ -1,6 +1,16 @@ ################################################################################ -# WeBWorK mod_perl (c) 2000-2002 WeBWorK Project -# $Id$ +# WeBWorK Online Homework Delivery System +# Copyright © 2000-2022 The WeBWorK Project, https://github.com/openwebwork +# +# This program is free software; you can redistribute it and/or modify it under +# the terms of either: (a) the GNU General Public License as published by the +# Free Software Foundation; either version 2, or (at your option) any later +# version, or (b) the "Artistic License" which comes with this package. +# +# This program is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +# FOR A PARTICULAR PURPOSE. See either the GNU General Public License or the +# Artistic License for more details. ################################################################################ package WeBWorK::EquationCache; @@ -63,7 +73,7 @@ sub new { my $self = { %options, }; - + bless $self, $class; } @@ -90,14 +100,14 @@ sub lookup { # $tex =~ s/\s+//g; my $md5 = md5_hex(encode_utf8($tex)); - + my $db = $self->{cacheDB}; unless($db) { return($md5 ."1"); } sysopen(DB, $db, O_RDWR|O_CREAT) or die "failed to create/open cacheDB $db: $!"; flock(DB, LOCK_EX) or die "failed to write-lock cacheDB $db: $!"; - + my $line = 0; my $max = 0; my $match = 0; @@ -114,14 +124,14 @@ sub lookup { $max = $1 if $1 > $max; } } - + unless ($match) { # no match: invent a new instance number and add TeX string to DB $match = $max + 1; seek(DB, 0, 2); # we should already be at EOF, but what the hell. print DB "$md5\t$match\t$tex\n"; } - + close(DB); return "$md5$match"; } diff --git a/lib/WeBWorK/PG/IO.pm b/lib/WeBWorK/PG/IO.pm index 4d30da0bed..4364e6c7fd 100644 --- a/lib/WeBWorK/PG/IO.pm +++ b/lib/WeBWorK/PG/IO.pm @@ -1,6 +1,16 @@ ################################################################################ -# WeBWorK mod_perl (c) 2000-2002 WeBWorK Project -# $Id$ +# WeBWorK Online Homework Delivery System +# Copyright © 2000-2022 The WeBWorK Project, https://github.com/openwebwork +# +# This program is free software; you can redistribute it and/or modify it under +# the terms of either: (a) the GNU General Public License as published by the +# Free Software Foundation; either version 2, or (at your option) any later +# version, or (b) the "Artistic License" which comes with this package. +# +# This program is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +# FOR A PARTICULAR PURPOSE. See either the GNU General Public License or the +# Artistic License for more details. ################################################################################ package WeBWorK::PG::IO; diff --git a/lib/WeBWorK/PG/IO/Daemon2.pm b/lib/WeBWorK/PG/IO/Daemon2.pm index 8b446acf9f..7afd5e8939 100644 --- a/lib/WeBWorK/PG/IO/Daemon2.pm +++ b/lib/WeBWorK/PG/IO/Daemon2.pm @@ -1,6 +1,16 @@ ################################################################################ -# WeBWorK mod-perl (c) 2000-2002 WeBWorK Project -# $Id$ +# WeBWorK Online Homework Delivery System +# Copyright © 2000-2022 The WeBWorK Project, https://github.com/openwebwork +# +# This program is free software; you can redistribute it and/or modify it under +# the terms of either: (a) the GNU General Public License as published by the +# Free Software Foundation; either version 2, or (at your option) any later +# version, or (b) the "Artistic License" which comes with this package. +# +# This program is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +# FOR A PARTICULAR PURPOSE. See either the GNU General Public License or the +# Artistic License for more details. ################################################################################ package WeBWorK::PG::IO::Daemon2; diff --git a/lib/WeBWorK/PG/IO/WW1.pm b/lib/WeBWorK/PG/IO/WW1.pm index e400aeb22d..faf06ca36b 100644 --- a/lib/WeBWorK/PG/IO/WW1.pm +++ b/lib/WeBWorK/PG/IO/WW1.pm @@ -1,6 +1,16 @@ ################################################################################ -# WeBWorK mod-perl (c) 2000-2002 WeBWorK Project -# $Id$ +# WeBWorK Online Homework Delivery System +# Copyright © 2000-2022 The WeBWorK Project, https://github.com/openwebwork +# +# This program is free software; you can redistribute it and/or modify it under +# the terms of either: (a) the GNU General Public License as published by the +# Free Software Foundation; either version 2, or (at your option) any later +# version, or (b) the "Artistic License" which comes with this package. +# +# This program is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +# FOR A PARTICULAR PURPOSE. See either the GNU General Public License or the +# Artistic License for more details. ################################################################################ package WeBWorK::PG::IO::WW1; @@ -22,7 +32,7 @@ BEGIN { send_mail_to surePathToTmpFile ); - + $WeBWorK::PG::IO::SHARE{$_} = __PACKAGE__ foreach @EXPORT; } @@ -46,30 +56,30 @@ in a new environment. It uses the C module. sub send_mail_to { my $user_address = shift; # user must be an instructor my %options = @_; - + my $subject = ''; $subject = $options{'subject'} if defined($options{'subject'}); - + my $msg_body = ''; $msg_body =$options{'body'} if defined($options{'body'}); - + my @mail_to_allowed_list = (); @mail_to_allowed_list = @{ $options{'ALLOW_MAIL_TO'} } if defined($options{'ALLOW_MAIL_TO'}); my $out; - + # check whether user is an instructor my $mailing_allowed_flag = 0; - + while (@mail_to_allowed_list) { if ($user_address eq shift @mail_to_allowed_list ) { $mailing_allowed_flag =1; last; } } - + my $REMOTE_HOST = (defined( $ENV{'REMOTE_HOST'} ) ) ? $ENV{'REMOTE_HOST'}: 'unknown host'; my $REMOTE_ADDR = (defined( $ENV{'REMOTE_ADDR'}) ) ? $ENV{'REMOTE_ADDR'}: 'unknown address'; - + if ($mailing_allowed_flag) { ## mail header text: my $email_msg ="To: $user_address\n" @@ -79,7 +89,7 @@ sub send_mail_to { my $smtp = Net::SMTP->new($Global::smtpServer, Timeout=>10) or warn "Couldn't contact SMTP server."; $smtp->mail($Global::webmaster); - + if ( $smtp->recipient($user_address)) { # this one's okay, keep going $smtp->data( $email_msg) or warn("Unknown problem sending message data to SMTP server."); @@ -95,7 +105,7 @@ sub send_mail_to { . "Permitted addresses are specified in the courseWeBWorK.ph file."; $out = 0; } - + return $out; } diff --git a/lib/WeBWorK/PG/IO/WW2.pm b/lib/WeBWorK/PG/IO/WW2.pm index 0c7676c16c..223d950c97 100644 --- a/lib/WeBWorK/PG/IO/WW2.pm +++ b/lib/WeBWorK/PG/IO/WW2.pm @@ -1,6 +1,16 @@ ################################################################################ -# WeBWorK mod-perl (c) 2000-2002 WeBWorK Project -# $Id$ +# WeBWorK Online Homework Delivery System +# Copyright © 2000-2022 The WeBWorK Project, https://github.com/openwebwork +# +# This program is free software; you can redistribute it and/or modify it under +# the terms of either: (a) the GNU General Public License as published by the +# Free Software Foundation; either version 2, or (at your option) any later +# version, or (b) the "Artistic License" which comes with this package. +# +# This program is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +# FOR A PARTICULAR PURPOSE. See either the GNU General Public License or the +# Artistic License for more details. ################################################################################ package WeBWorK::PG::IO::WW2; diff --git a/lib/WeBWorK/PG/ImageGenerator.pm b/lib/WeBWorK/PG/ImageGenerator.pm index 5d38de4053..2b9d4068ce 100644 --- a/lib/WeBWorK/PG/ImageGenerator.pm +++ b/lib/WeBWorK/PG/ImageGenerator.pm @@ -1,6 +1,16 @@ ################################################################################ -# WeBWorK mod_perl (c) 2000-2002 WeBWorK Project -# $Id$ +# WeBWorK Online Homework Delivery System +# Copyright © 2000-2022 The WeBWorK Project, https://github.com/openwebwork +# +# This program is free software; you can redistribute it and/or modify it under +# the terms of either: (a) the GNU General Public License as published by the +# Free Software Foundation; either version 2, or (at your option) any later +# version, or (b) the "Artistic License" which comes with this package. +# +# This program is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +# FOR A PARTICULAR PURPOSE. See either the GNU General Public License or the +# Artistic License for more details. ################################################################################ package WeBWorK::PG::ImageGenerator; @@ -175,14 +185,14 @@ sub new { $self->{dvipng_align} = 'absmiddle' unless defined($self->{dvipng_align}); $self->{store_depths} = 1 if ($self->{dvipng_align} eq 'mysql'); $self->{useMarkers} = $self->{useMarkers} || 0; - + if ($self->{useCache}) { $self->{dir} = $self->{cacheDir}; $self->{url} = $self->{cacheURL}; $self->{basename} = ""; $self->{equationCache} = WeBWorK::EquationCache->new(cacheDB => $self->{cacheDB}); } - + bless $self, $class; } @@ -194,7 +204,7 @@ For example Will define a question wide style for interpreting \( \myVec{v} \) - + If this statement is placed in PGcourse.pl then the backslashes must be doubled since it is a .pl file not a .pg file @@ -231,7 +241,7 @@ for displaying the image. sub add { my ($self, $string, $mode) = @_; - + my $names = $self->{names}; my $strings = $self->{strings}; my $dir = $self->{dir}; @@ -239,7 +249,7 @@ sub add { my $basename = $self->{basename}; my $useCache = $self->{useCache}; my $depths = $self->{depths}; - + # if the string came in with delimiters, chop them off and set the mode # based on whether they were \[ .. \] or \( ... \). this means that if # the string has delimiters, the mode *argument* is ignored. @@ -249,16 +259,16 @@ sub add { $mode = "inline"; } # otherwise, leave the string and the mode alone. - + # assume that a bare string with no mode specified is inline $mode ||= "inline"; - + # now that we know what mode we're dealing with, we can generate a "real" # string to pass to latex my $realString = ($mode eq "display") ? '\(\displaystyle{' . $string . '}\)' : '\(' . $string . '\)'; - + # alignment tag could be a fixed default my ($imageNum, $aligntag) = (0, qq|align="$self->{dvipng_align}"|); # if the default is for variable heights, the default should be meaningful @@ -277,7 +287,7 @@ sub add { } else { $imageNum = @$strings + 1; } - + # We are banking on the fact that if useCache is true, then basename is empty. # Maybe we should simplify and drop support for useCache =0 and having a basename. @@ -285,15 +295,15 @@ sub add { my $imageName = ($basename) ? "$basename.$imageNum.png" : "$imageNum.png"; - + # store the full file name of the image, and the "real" tex string to the object push @$names, $imageName; push @$strings, $realString; #warn "ImageGenerator: added string $realString with name $imageName\n"; - + # ... and the full URL. my $imageURL = "$url/$imageName"; - + my $safeString = PGcore::encode_pg_and_html($string); my $imageTag = ($mode eq "display") @@ -305,7 +315,7 @@ sub add { =item render(%options) -Uses LaTeX and dvipng to render the equations stored in the object. +Uses LaTeX and dvipng to render the equations stored in the object. The option C is a reference to the text of the problem's text. After rendering the images and figuring out their depths, we go through and fix the tags @@ -328,7 +338,7 @@ NOTE: It's not clear to me that mtime has been implemented -- MEG - 2011/06 sub render { my ($self, %options) = @_; - + my $tempDir = $self->{tempDir}; my $dir = $self->{dir}; my $basename = $self->{basename}; @@ -347,8 +357,8 @@ sub render { my $success = mkdir "$dir"; warn "Could not make directory $dir" unless $success; } - - ############################################### + + ############################################### # determine which images need to be generated ############################################### my (@newStrings, @newNames); @@ -363,12 +373,12 @@ sub render { push @newNames, $name; } } - + if(@newStrings) { # Don't run latex if there are no images to generate - + # create temporary directory in which to do TeX processing my $wd = makeTempDirectory($tempDir, "ImageGenerator"); - + # store equations in a tex file my $texFile = "$wd/equation.tex"; open my $tex, ">", $texFile @@ -379,19 +389,19 @@ sub render { print $tex $TexPostamble; close $tex; warn "tex file $texFile was not written" unless -e $texFile; - + ############################################### # call LaTeX ############################################### my $latexCommand = "cd $wd && $latex equation > latex.out 2> latex.err"; my $latexStatus = system $latexCommand; - + if ($latexStatus and $latexStatus !=256) { warn "$latexCommand returned non-zero status $latexStatus: $!"; warn "cd $wd failed" if system "cd $wd"; warn "Unable to write to directory $wd. " unless -w $wd; warn "Unable to execute $latex " unless -e $latex ; - + warn `ls -l $wd`; my $errorMessage = ''; if (-r "$wd/equation.log") { @@ -401,10 +411,10 @@ sub render { warn "Unable to read logfile $wd/equation.log "; } } - + warn "$latexCommand failed to generate a DVI file" unless -e "$wd/equation.dvi"; - + ############################################ # call dvipng ############################################ @@ -418,29 +428,29 @@ sub render { my @dvipngdepths = ($dvipngout =~ /depth=(\d+)/g); # kill them all if something goes wrnog @dvipngdepths = () if(scalar(@dvipngdepths) != scalar(@newNames)); - + ############################################ # move/rename images ############################################ - + chmod (0664,<$wd/*>); # first make everything group writable so that a WeBWorK admin can delete images foreach my $image (readDirectory($wd)) { # only work on equation#.png files next unless $image =~ m/^equation(\d+)\.png$/; - + # get image number from above match my $imageNum = $1; # note, problems with solutions/hints can have empty values in newNames next unless $newNames[$imageNum-1]; - + # record the dvipng offset my $hashkey = $newNames[$imageNum-1]; $hashkey =~ s|/||; $hashkey =~ s|\.png$||; $depths->{"$hashkey"} = $dvipngdepths[$imageNum-1] if(defined($dvipngdepths[$imageNum-1])); - + #warn "ImageGenerator: found generated image $imageNum with name $newNames[$imageNum-1]\n"; - + # move/rename image #my $mvCommand = "cd $wd && /bin/mv $wd/$image $dir/$basename.$imageNum.png"; # check to see if this requires a directory we haven't made yet @@ -457,12 +467,12 @@ sub render { warn "$mvCommand returned non-zero status $mvStatus: $!"; warn "Can't write to tmp/equations directory $dir" unless -w $dir; } - + } ############################################ # remove temporary directory (and its contents) ############################################ - + if ($PreserveTempFiles) { warn "ImageGenerator: preserved temp files in working directory '$wd'.\n"; chmod (0775,$wd); diff --git a/lib/WeBWorK/PG/Translator.pm b/lib/WeBWorK/PG/Translator.pm index 15725609e0..92fb7f50a6 100644 --- a/lib/WeBWorK/PG/Translator.pm +++ b/lib/WeBWorK/PG/Translator.pm @@ -1,6 +1,16 @@ ################################################################################ -# WeBWorK mod_perl (c) 2000-2012 The Open WeBWorK Project (openwebwork.org) -# $Id$ +# WeBWorK Online Homework Delivery System +# Copyright © 2000-2022 The WeBWorK Project, https://github.com/openwebwork +# +# This program is free software; you can redistribute it and/or modify it under +# the terms of either: (a) the GNU General Public License as published by the +# Free Software Foundation; either version 2, or (at your option) any later +# version, or (b) the "Artistic License" which comes with this package. +# +# This program is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +# FOR A PARTICULAR PURPOSE. See either the GNU General Public License or the +# Artistic License for more details. ################################################################################ package WeBWorK::PG::Translator; @@ -46,7 +56,7 @@ WeBWorK::PG::Translator - Evaluate PG code and evaluate answers safely # other macros are loaded from within the problem using loadMacros $pt ->translate(); # translate the problem (the out following 4 pieces of information are created) - + $PG_PROBLEM_TEXT_ARRAY_REF = $pt->ra_text(); # output text for the body of the HTML file (in array form) $PG_PROBLEM_TEXT_REF = $pt->r_text(); # output text for the body of the HTML file $PG_HEADER_TEXT_REF = $pt->r_header;#\$PG_HEADER_TEXT; # text for the header of the HTML file @@ -55,7 +65,7 @@ WeBWorK::PG::Translator - Evaluate PG code and evaluate answers safely $PG_FLAGS_REF = $pt ->rh_flags; # misc. status flags. $pt -> process_answers(\%inputs); # evaluates all of the answers using submitted answers from %input - + my $rh_answer_results = $pt->rh_evaluated_answers; # provides a hash of the results of evaluating the answers. my $rh_problem_result = $pt->grade_problem; # grades the problem using the default problem grading method. @@ -149,7 +159,7 @@ BEGIN { require 'ww_strict.pm'; strict::import(); } - + # also define in Main::, for PG modules. sub Main::be_strict { &be_strict } } @@ -175,7 +185,7 @@ sub evaluate_modules { s/\.pm$// and warn "fixing your broken package name: $_.pm => $_"; # call runtime_use on the package name # don't worry -- runtime_use won't load a package twice! - #eval { runtime_use $_ }; # + #eval { runtime_use $_ }; # eval "package Main; require $_; import $_"; # change for WW1 warn "Failed to evaluate module $_: $@" if $@; # record this in the appropriate place @@ -198,7 +208,7 @@ sub load_extra_packages{ my $self = shift; my @package_list = @_; my $package_name; - + foreach (@package_list) { # ensure that the name is in fact a base name s/\.pm$// and warn "fixing your broken package name: $_.pm => $_"; @@ -308,7 +318,7 @@ The macros shared with the safe compartment are =cut # SHARE variables and routines with safe compartment -# +# # Some symbols are defined here (or in the IO module), and used inside the safe # compartment. Under WeBWorK 1.x, functions defined here had access to the # Global:: namespace, which contained course-specific data such things as @@ -317,16 +327,16 @@ The macros shared with the safe compartment are # which need access to course-specific data are now defined in the IO.pl macro # file, which has access to the problem environment. Several entries have been # added to the problem environment to support this move. -# +# # Useful for timing portions of the translating process # The timer $WeBWorK::timer is defined in the module WeBWorK.pm -# You must make sure that the code in that script for initialzing the +# You must make sure that the code in that script for initialzing the # timer is active. sub time_it { - my $msg = shift; + my $msg = shift; $WeBWorK::timer->continue("PG macro:". $msg) if defined($WeBWorK::timer); } @@ -335,14 +345,14 @@ my %Translator_shared_subroutine_hash = ( 'time_it' => __PACKAGE__, '&PG_answer_eval' => __PACKAGE__, '&PG_restricted_eval' => __PACKAGE__, - '&PG_macro_file_eval' => __PACKAGE__, + '&PG_macro_file_eval' => __PACKAGE__, '&be_strict' => __PACKAGE__, '&PGsort' => __PACKAGE__, '&dumpvar' => __PACKAGE__, ); # add names from WeBWorK::PG::IO and WeBWorK::PG::IO::* -my %IO_shared_subroutine_hash = %WeBWorK::PG::IO::SHARE; +my %IO_shared_subroutine_hash = %WeBWorK::PG::IO::SHARE; sub initialize { my $self = shift; @@ -363,7 +373,7 @@ sub initialize { #$safe_cmpt -> share('$rf_answer_eval'); #$safe_cmpt -> share('$rf_restricted_eval'); use strict; - + # The standalone renderer does this when the module is compiled. unless (exists($ENV{MOJO_MODE})) { $safe_cmpt -> share_from('main', $self->{ra_included_modules} ); @@ -461,7 +471,7 @@ sub unrestricted_load { my $store_mask = $safe_cmpt->mask(); $safe_cmpt->mask(Opcode::empty_opset()); my $safe_cmpt_package_name = $safe_cmpt->root(); - + my $macro_file_name = fileFromPath($filePath); $macro_file_name =~s/\.pl//; # trim off the extenstion my $export_subroutine_name = "_${macro_file_name}_export"; @@ -476,11 +486,11 @@ sub unrestricted_load { my $macro_file_loaded = ref($init_subroutine) =~ /CODE/ && defined(&$init_subroutine); - #print STDERR "$macro_file_name has not yet been loaded\n" unless $macro_file_loaded; + #print STDERR "$macro_file_name has not yet been loaded\n" unless $macro_file_loaded; unless ($macro_file_loaded) { ## load the $filePath file ## Using rdo insures that the $filePath file is loaded for every problem, allowing initializations to occur. - ## Ordinary mortals should not be fooling with the fundamental macros in these files. + ## Ordinary mortals should not be fooling with the fundamental macros in these files. my $local_errors = ""; if (-r $filePath ) { my $rdoResult = $safe_cmpt->rdo($filePath); @@ -493,7 +503,7 @@ sub unrestricted_load { $self ->{errors} .= $local_errors if $local_errors; } $safe_cmpt -> mask($store_mask); - + } # try again to define the initization subroutine $init_subroutine = eval { \&{"$init_subroutine_name"} }; @@ -668,7 +678,7 @@ that, so we remove it as well. File names are shortened, when possible, by replacing the templates directory with [TMPL], the WeBWorK root directory by [WW] and the PG root directory by [PG]. - + =cut sub PG_errorMessage { @@ -726,7 +736,7 @@ sub PG_errorMessage { '$GLOBAL_VARIABLE' => \'global', '$t' => \undef, '$s' => \'regular output' - + @@ -740,7 +750,7 @@ sub PG_undef_var_check { local $Data::Dumper::Maxdepth = 2; # takes all lexical variables from caller-nemaspace my $possibles = Data::Dumper::Dumper({ %{PadWalker::peek_my(1)}, %{PadWalker::peek_our(1)} }); - + $possibles ne "\$VAR1 = {};\n" ? ($possibles =~ s/^.*?\n(.*)\n.*?\n$/$1/ms) : ($possibles = ''); return "Warning: " . join(', ', @_) . "Possible variables are:\n$possibles\n"; } @@ -761,20 +771,20 @@ sub translate { $self ->{errors} .= qq{ERROR: This problem file was empty!\n} unless ($evalString) ; $self ->{errors} .= qq{ERROR: You must define the environment before translating.} unless defined( $self->{envir} ); - + # install handlers for warn and die that call PG_errorMessage. # if the existing signal handler is not a coderef, the built-in warn or # die function is called. this does not account for the case where the # handler is set to "IGNORE" or to the name of a function. in these cases # the built-in function will be called. - + my $outer_sig_warn = $SIG{__WARN__}; local $SIG{__WARN__} = sub { ref $outer_sig_warn eq "CODE" ? &$outer_sig_warn(PG_errorMessage('message', $_[0])) : warn PG_errorMessage('message', $_[0]); }; - + my $outer_sig_die = $SIG{__DIE__}; local $SIG{__DIE__} = sub { ref $outer_sig_die eq "CODE" @@ -847,10 +857,10 @@ without warnings. ########################################## ###### PG preprocessing code ############# ########################################## - + $evalString = &{$self->{preprocess_code}}($evalString); - + # # default_preprocess_code # # BEGIN_TEXT and END_TEXT must occur on a line by themselves. # $evalString =~ s/\n\s*END_TEXT[\s;]*\n/\nEND_TEXT\n/g; @@ -873,7 +883,7 @@ case the previously defined safe compartment is used. (See item 1.) my ($PG_PROBLEM_TEXT_REF, $PG_HEADER_TEXT_REF, $PG_POST_HEADER_TEXT_REF,$PG_ANSWER_HASH_REF, $PG_FLAGS_REF, $PGcore) =$safe_cmpt->reval(" $evalString"); - + # This section could use some more error messages. In particular if a problem doesn't produce the right output, the user needs # information about which problem was at fault. @@ -1000,7 +1010,7 @@ the errors. $self ->{ rh_correct_answers } = $PG_ANSWER_HASH_REF; $self ->{ PG_FLAGS_REF } = $PG_FLAGS_REF; $self ->{ rh_pgcore } = $PGcore; - + #warn "PGcore is ", ref($PGcore), " in Translator"; #$self ->{errors}; } # end translate @@ -1082,29 +1092,29 @@ sub process_answers{ # the foreach loop around the conditional involving $rf_fun, but for efficiency # we've moved it out here. This means that the handlers will be active during the # code before and after the actual answer evaluation. - + my $outer_sig_warn = $SIG{__WARN__}; local $SIG{__WARN__} = sub { ref $outer_sig_warn eq "CODE" ? &$outer_sig_warn(PG_errorMessage('message', $_[0])) : warn PG_errorMessage('message', $_[0]); }; - + # the die handler is a closure over %errorTable and $outer_sig_die. - # + # # %errorTable accumulates a "full" error message for each error that occurs during # answer evaluation. then, right after the evaluation (which is done within a call # to Safe::reval), $@ is checked and it's value is looked up in %errorTable to get # the full error to report. - # + # # my question: why is this a hash? this is die, so once one occurs, we exit the reval. # wouldn't it be sufficient to have a scalar like $backtrace_for_last_error? - # + # # Note that %errorTable is cleared for each answer. my %errorTable; my $outer_sig_die = $SIG{__DIE__}; local $SIG{__DIE__} = sub { - + # this chunk taken from dpvc's original handler my $fullerror = PG_errorMessage('traceback', @_); my ($error,$traceback) = split /\n/, $fullerror, 2; @@ -1112,7 +1122,7 @@ sub process_answers{ $error .= "\n"; $errorTable{$error} = $fullerror; # end of dpvc's original code - + ref $outer_sig_die eq "CODE" ? &$outer_sig_die($error) : die $error; @@ -1121,11 +1131,11 @@ sub process_answers{ # apply each instructors answer to the corresponding student answer # my $printAnsHash = 1; # this turns on error printing of the answer hashes - + #$PG->debug_message("Student answers are: ", join(" ", %h_student_answers) ) if $printAnsHash==1; # we will want to redefine the entry order in terms of the answer evaluators - - #### foreach my $ans_name ( @answer_entry_order ) { + + #### foreach my $ans_name ( @answer_entry_order ) { #### @answer_entry_order was created from PG_ANSWERS_HASH which maintains the #### order of its keys @@ -1139,7 +1149,7 @@ sub process_answers{ #################################### # local($rf_fun,$temp_ans)= (undef,undef); -# +# # my ($ans, $errors) = $self->filter_answer( $h_student_answers{$ans_name} ); # $temp_ans = $ans; # $temp_ans = '' unless defined($temp_ans); #make sure that answer is always defined @@ -1147,33 +1157,33 @@ sub process_answers{ # #################################### # # get answer evaluator (old method) # #################################### -# +# # if ( defined($rh_correct_answers ->{$ans_name} ) ) { # $rf_fun = $rh_correct_answers->{$ans_name}; # } else { # warn "There is no answer evaluator for the question labeled $ans_name"; # } # $self->{safe}->share('$rf_fun','$temp_ans'); -# +# #################################### # gather answers and answer evaluator (new method) #################################### local($new_rf_fun,$new_temp_ans) = (undef,undef); - my $answergrp = $PG->{PG_ANSWERS_HASH}->{$ans_name}; #this has all answer evaluators AND answer blanks (just to be sure ) + my $answergrp = $PG->{PG_ANSWERS_HASH}->{$ans_name}; #this has all answer evaluators AND answer blanks (just to be sure ) my $responsegrp = $answergrp->response_obj; ################# # refactor to answer group? ################## - $new_rf_fun = $answergrp->ans_eval; - my ($ans, $errors) = $self->filter_answer( $responsegrp->get_response($ans_name) ); + $new_rf_fun = $answergrp->ans_eval; + my ($ans, $errors) = $self->filter_answer( $responsegrp->get_response($ans_name) ); $new_temp_ans = $ans; # avoid undefined errors in translator my $skip_evaluation=0; if (not defined($new_rf_fun) ) { $PG->warning_message( "No answer evaluator for the question labeled: $ans_name "); $skip_evaluation=1; } elsif (not ref($new_rf_fun) =~ /AnswerEvaluator/ ) { - $PG->warning_message( "Error in Translator.pm::process_answers: Answer $ans_name: + $PG->warning_message( "Error in Translator.pm::process_answers: Answer $ans_name: Unrecognized evaluator type |". ref($rf_fun). "|"); $skip_evaluation=1; } @@ -1182,7 +1192,7 @@ sub process_answers{ $skip_evaluation=1; } $PG->debug_message("Answers associated with $ans_name are $new_temp_ans ref=". ref($new_temp_ans) ) if defined $new_temp_ans and $local_debug; - #FIXME -- this is a hack for handling check boxes. + #FIXME -- this is a hack for handling check boxes. if (ref( $new_temp_ans) =~/HASH/i) { my @tmp = (); foreach my $key (sort keys %$new_temp_ans) { @@ -1192,7 +1202,7 @@ sub process_answers{ $PG->debug_message("Hash answer associated with $ans_name is $new_temp_ans. ref=". ref($new_temp_ans)."
".pretty_print($new_temp_ans) ) if $local_debug; } #FIXME -- hack to allow answers such as <4,6,7> -- < and > have been escaped. - unless( $skip_evaluation) { + unless( $skip_evaluation) { # $new_temp_ans =~ s/\<\;//g; # > # $new_temp_ans =~ s/\&\#91\;/\[/g; # < @@ -1204,12 +1214,12 @@ sub process_answers{ $self->{safe}->share('$new_rf_fun','$new_temp_ans'); - + # clear %errorTable for each problem %errorTable = (); # is the error table being used? perhaps by math objects? - + my ($rh_ans_evaluation_result, $new_rh_ans_evaluation_result); - + if (ref($new_rf_fun) eq 'CODE' ) { # $rh_ans_evaluation_result = $self->{safe} ->reval( '&{ $rf_fun }($temp_ans, ans_label => \''.$ans_name.'\')' ) ; # warn "Error in Translator.pm::process_answers: Answer $ans_name: |$temp_ans|\n $@\n" if $@; @@ -1225,13 +1235,13 @@ sub process_answers{ # warn "Evaluation error: Answer $ans_name:
\n", # $rh_ans_evaluation_result->error_flag(), " :: ", # $rh_ans_evaluation_result->error_message(),"
\n" -# if defined($rh_ans_evaluation_result) +# if defined($rh_ans_evaluation_result) # and defined($rh_ans_evaluation_result->error_flag()); -# +# # $rh_ans_evaluation_result = {%$rh_ans_evaluation_result}; #needed to protect result # # from next evaluation apparently ######################################### - + # Get full traceback, but save it in local variable $errorTable so that # we can add it later. This is because some evaluators use # eval to trap errors and then report them in the message @@ -1246,22 +1256,22 @@ sub process_answers{ $PG->warning_message( "Evaluation error in new process: Answer $ans_name:
\n", $new_rh_ans_evaluation_result->error_flag(), " :: ", $new_rh_ans_evaluation_result->error_message(),"
\n") - if defined($new_rh_ans_evaluation_result) && ref($new_rh_ans_evaluation_result) + if defined($new_rh_ans_evaluation_result) && ref($new_rh_ans_evaluation_result) && defined($new_rh_ans_evaluation_result->error_flag()); } else { $PG->warning_message(" The evaluated answer is not an answer hash ".($new_rh_ans_evaluation_result//'').': |'.ref($new_rh_ans_evaluation_result)."|."); - } + } # $PG->debug_message( $self->{envir}->{'probFileName'} ." new_temp_ans and temp_ans don't agree: ". -# ref($new_temp_ans)." $new_temp_ans ". ref($temp_ans). " $temp_ans".length($new_temp_ans).length($temp_ans)) +# ref($new_temp_ans)." $new_temp_ans ". ref($temp_ans). " $temp_ans".length($new_temp_ans).length($temp_ans)) # unless $new_temp_ans eq $temp_ans; } else { $PG->warning_message( "Answer evaluator $ans_name was not executed due to errors. ", "========"); } -######################################################### +######################################################### # End refactor to answer group ? ############################################# - -######################################################### + +######################################################### # check that old and new answers are the same # foreach my $key (keys %$rh_ans_evaluation_result) { # next unless defined $key; @@ -1272,14 +1282,14 @@ sub process_answers{ # $rh_ans_evaluation_result->{$key}." new: ".$new_rh_ans_evaluation_result->{$key}) # unless $rh_ans_evaluation_result->{$key} eq $new_rh_ans_evaluation_result->{$key}; # } - -######################################################### + +######################################################### #$PG->debug_message("old $ans_name: $rf_fun -- ans: $temp_ans",pretty_print($rh_ans_evaluation_result)) if $printAnsHash==1; - $PG->debug_message("new $ans_name: $new_rf_fun -- ans: - $new_temp_ans",pretty_print($new_rh_ans_evaluation_result)) - if ($PG->{envir}->{inputs_ref}->{showAnsHashInfo})//'' + $PG->debug_message("new $ans_name: $new_rf_fun -- ans: + $new_temp_ans",pretty_print($new_rh_ans_evaluation_result)) + if ($PG->{envir}->{inputs_ref}->{showAnsHashInfo})//'' and ($PG->{envir}->{permissionLevel})//0 >=10; -######################################################### +######################################################### # decide whether to return the new or old answer evaluator hash $rh_ans_evaluation_result = $new_rh_ans_evaluation_result; @@ -1287,7 +1297,7 @@ sub process_answers{ # This warning may not be needed. # unless ( ( ref($rh_ans_evaluation_result) eq 'HASH') or ( ref($rh_ans_evaluation_result) eq 'AnswerHash') ) { # warn "Error in Translator.pm::process_answers: Answer $ans_name:
\n -# Answer evaluators must return a hash or an AnswerHash type, not type |", +# Answer evaluators must return a hash or an AnswerHash type, not type |", # ref($rh_ans_evaluation_result), "|"; # } $rh_ans_evaluation_result ->{ans_message} .= "$errors \n" if $errors; @@ -1519,8 +1529,8 @@ sub filter_answer { my $errors=''; if (ref($ans) eq 'ARRAY') { #handle the case where the answer comes from several inputs with the same name # In many cases this will be passed as a reference to an array - # if it is passed as a single string (separated by \0 characters) as - # some early versions of CGI behave, then + # if it is passed as a single string (separated by \0 characters) as + # some early versions of CGI behave, then # it is unclear what will happen when the answer is filtered. foreach my $item (@{$ans}) { my ($filtered_ans, $error) = &{ $self->{rf_safety_filter} } ($item); @@ -1528,11 +1538,11 @@ sub filter_answer { $errors .= " ". $error if $error; # add error message if error is non-zero. } (\@filtered_answers,$errors); - + } else { &{ $self->{rf_safety_filter} } ($ans); } - + } sub rf_safety_filter { @@ -1592,16 +1602,16 @@ have special significance. C$b} @list> C -sorts the list numerically and lexically respectively. +sorts the list numerically and lexically respectively. If C is used in a problem, before the sort routine is defined in a macro, then -things get badly confused. To correct this the macro PGsort is defined below. It is +things get badly confused. To correct this the macro PGsort is defined below. It is evaluated before the problem template is read. In PGbasicmacros.pl, the two subroutines PGsort sub { $_[0] < $_[1] }, @list; PGsort sub { $_[0] lt $_[1] }, @list; -(called num_sort and lex_sort) provide slightly slower, but safer, routines for the PG language. +(called num_sort and lex_sort) provide slightly slower, but safer, routines for the PG language. (The subroutines for ordering are B. Note the commas!) =cut @@ -1690,10 +1700,10 @@ sub PG_restricted_eval_helper { sub PG_macro_file_eval { # would like to modify this so that it requires use strict on the files that it evaluates. my $string = shift; my ($pck,$file,$line) = caller; - + local $SIG{__WARN__} = "DEFAULT"; local $SIG{__DIE__} = "DEFAULT"; - + no strict; my $out = eval ("package main; be_strict();\n" . $string ); my $errors =$@; @@ -1701,7 +1711,7 @@ sub PG_macro_file_eval { # would like to modify this so that it requires us . $errors . "The calling package is $pck\n" if defined($errors) && $errors =~/\S/; use strict; - + return (wantarray) ? ($out, $errors,$full_error_report) : $out; } =head2 PG_answer_eval @@ -1725,20 +1735,20 @@ sub PG_answer_eval { my($string) = shift; # I made this local just in case -- see PG_restricted_eval my $errors = ''; my $full_error_report = ''; - my ($pck,$file,$line) = caller; + my ($pck,$file,$line) = caller; # Because of the global variable $PG::compartment_name and $PG::safe_cmpt # only one problem safe compartment can be active at a time. # This might cause problems at some point. In that case a cleverer way # of insuring that the package stays in scope until the answer is evaluated # will be required. - + # This is pretty tricky and doesn't always work right. # We seem to need PG_priv instead of main when PG_answer_eval is called within a completion # 'package PG_priv; ' - + local $SIG{__WARN__} = sub {die(@_)}; # make warn die, so all errors are reported. local $SIG{__DIE__} = "DEFAULT"; - + no strict; my $out = eval('package main;'.$string); $out = '' unless defined($out); @@ -1747,7 +1757,7 @@ sub PG_answer_eval { $errors The calling package is $pck\n" if defined($errors) && $errors =~/\S/; use strict; - + return (wantarray) ? ($out, $errors,$full_error_report) : $out; @@ -1759,7 +1769,7 @@ sub PG_answer_eval { # $evalString =~ s/\n\s*END_TEXT[\s;]*\n/\nEND_TEXT\n/g; # $evalString =~ s/\n\s*BEGIN_TEXT[\s;]*\n/\nTEXT\(EV3\(<<'END_TEXT'\)\);\n/g; # $evalString =~ s/ENDDOCUMENT.*/ENDDOCUMENT();/s; # remove text after ENDDOCUMENT -# +# # $evalString =~ s/\\/\\\\/g; # \ can't be used for escapes because of TeX conflict # $evalString =~ s/~~/\\/g; # use ~~ as escape instead, use # for comments # $evalString; @@ -1794,33 +1804,33 @@ sub default_postprocess_code { $evalString_ref; } -no strict; +no strict; sub dumpvar { my ($packageName) = @_; local(*alias); - + sub emit { print @_; } - + *stash = *{"${packageName}::"}; $, = " "; - + emit "Content-type: text/html; charset=UTF-8\n\n
\n";
-    
-    
+
+
     while ( ($varName, $globValue) = each %stash) {
         emit "$varName\n";
-        
+
 	*alias = $globValue;
 	next if $varName=~/main/;
-	
+
 	#if (defined($alias) ) {  # get rid of defined since this is deprecated
 	if ($alias ) {
 	    emit "  \$$varName $alias \n";
 	}
-	
+
 	if ( @alias) {
 	    emit "  \@$varName @alias \n";
 	}
diff --git a/macros/LinearProgramming.pl b/macros/LinearProgramming.pl
index ea7c8f7070..d1edca911a 100644
--- a/macros/LinearProgramming.pl
+++ b/macros/LinearProgramming.pl
@@ -1,13 +1,12 @@
 ################################################################################
 # WeBWorK Online Homework Delivery System
-# Copyright © 2000-2018 The WeBWorK Project, http://openwebwork.sf.net/
-# $CVSHeader$
-# 
+# Copyright © 2000-2022 The WeBWorK Project, https://github.com/openwebwork
+#
 # This program is free software; you can redistribute it and/or modify it under
 # the terms of either: (a) the GNU General Public License as published by the
 # Free Software Foundation; either version 2, or (at your option) any later
 # version, or (b) the "Artistic License" which comes with this package.
-# 
+#
 # This program is distributed in the hope that it will be useful, but WITHOUT
 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 # FOR A PARTICULAR PURPOSE.  See either the GNU General Public License or the
diff --git a/macros/MathObjects.pl b/macros/MathObjects.pl
index b1a17b7fe4..6c8392ecdf 100644
--- a/macros/MathObjects.pl
+++ b/macros/MathObjects.pl
@@ -1,13 +1,12 @@
 ################################################################################
 # WeBWorK Online Homework Delivery System
-# Copyright © 2000-2018 The WeBWorK Project, http://openwebwork.sf.net/
-# $CVSHeader$
-# 
+# Copyright © 2000-2022 The WeBWorK Project, https://github.com/openwebwork
+#
 # This program is free software; you can redistribute it and/or modify it under
 # the terms of either: (a) the GNU General Public License as published by the
 # Free Software Foundation; either version 2, or (at your option) any later
 # version, or (b) the "Artistic License" which comes with this package.
-# 
+#
 # This program is distributed in the hope that it will be useful, but WITHOUT
 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 # FOR A PARTICULAR PURPOSE.  See either the GNU General Public License or the
diff --git a/macros/PG.pl b/macros/PG.pl
index 4228bb852f..b3d81779ba 100644
--- a/macros/PG.pl
+++ b/macros/PG.pl
@@ -913,8 +913,7 @@ sub includePGproblem {
 
 ################################################################################
 # WeBWorK Online Homework Delivery System
-# Copyright © 2000-2018 The WeBWorK Project, http://openwebwork.sf.net/
-# $CVSHeader: pg/macros/PG.pl,v 1.46 2010/05/27 02:22:51 gage Exp $
+# Copyright © 2000-2022 The WeBWorK Project, https://github.com/openwebwork
 #
 # This program is free software; you can redistribute it and/or modify it under
 # the terms of either: (a) the GNU General Public License as published by the
diff --git a/macros/PGanswermacros.pl b/macros/PGanswermacros.pl
index cf3e3ef005..f2d23cbf95 100644
--- a/macros/PGanswermacros.pl
+++ b/macros/PGanswermacros.pl
@@ -1,13 +1,12 @@
 ################################################################################
 # WeBWorK Online Homework Delivery System
-# Copyright © 2000-2018 The WeBWorK Project, http://openwebwork.sf.net/
-# $CVSHeader: pg/macros/PGanswermacros.pl,v 1.72 2010/02/01 01:33:05 apizer Exp $
-# 
+# Copyright © 2000-2022 The WeBWorK Project, https://github.com/openwebwork
+#
 # This program is free software; you can redistribute it and/or modify it under
 # the terms of either: (a) the GNU General Public License as published by the
 # Free Software Foundation; either version 2, or (at your option) any later
 # version, or (b) the "Artistic License" which comes with this package.
-# 
+#
 # This program is distributed in the hope that it will be useful, but WITHOUT
 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 # FOR A PARTICULAR PURPOSE.  See either the GNU General Public License or the
diff --git a/macros/PGauxiliaryFunctions.pl b/macros/PGauxiliaryFunctions.pl
index b813e81524..53042ec4a6 100644
--- a/macros/PGauxiliaryFunctions.pl
+++ b/macros/PGauxiliaryFunctions.pl
@@ -1,12 +1,12 @@
 ################################################################################
 # WeBWorK Online Homework Delivery System
-# Copyright © 2000-2021 The WeBWorK Project, http://openwebwork.sf.net/
-# 
+# Copyright © 2000-2022 The WeBWorK Project, https://github.com/openwebwork
+#
 # This program is free software; you can redistribute it and/or modify it under
 # the terms of either: (a) the GNU General Public License as published by the
 # Free Software Foundation; either version 2, or (at your option) any later
 # version, or (b) the "Artistic License" which comes with this package.
-# 
+#
 # This program is distributed in the hope that it will be useful, but WITHOUT
 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 # FOR A PARTICULAR PURPOSE.  See either the GNU General Public License or the
diff --git a/macros/PGbasicmacros.pl b/macros/PGbasicmacros.pl
index 94ccfe0c81..14599bf583 100644
--- a/macros/PGbasicmacros.pl
+++ b/macros/PGbasicmacros.pl
@@ -1,6 +1,6 @@
 ################################################################################
-# WeBWorK Program Generation Language
-# Copyright © 2000-2020 The WeBWorK Project, http://openwebwork.sf.net/
+# WeBWorK Online Homework Delivery System
+# Copyright © 2000-2022 The WeBWorK Project, https://github.com/openwebwork
 #
 # This program is free software; you can redistribute it and/or modify it under
 # the terms of either: (a) the GNU General Public License as published by the
diff --git a/macros/PGchoicemacros.pl b/macros/PGchoicemacros.pl
index 997d9837f6..1ed09e5550 100644
--- a/macros/PGchoicemacros.pl
+++ b/macros/PGchoicemacros.pl
@@ -1,7 +1,6 @@
 ################################################################################
-# WeBWorK Program Generation Language
-# Copyright � 2000-2007 The WeBWorK Project, http://openwebwork.sf.net/
-# $CVSHeader$
+# WeBWorK Online Homework Delivery System
+# Copyright © 2000-2022 The WeBWorK Project, https://github.com/openwebwork
 #
 # This program is free software; you can redistribute it and/or modify it under
 # the terms of either: (a) the GNU General Public License as published by the
diff --git a/macros/PGcomplexmacros.pl b/macros/PGcomplexmacros.pl
index 7ad47e505e..16e89ca03e 100644
--- a/macros/PGcomplexmacros.pl
+++ b/macros/PGcomplexmacros.pl
@@ -1,13 +1,20 @@
 # This file     is PGcomplexmacros.pl
 # This includes the subroutines for the ANS macros, that
 # is, macros allowing a more flexible answer checking
-####################################################################
-# Copyright @ 1995-2002 The WeBWorK Team
-# All Rights Reserved
-####################################################################
-#$Id$
-
-
+################################################################################
+# WeBWorK Online Homework Delivery System
+# Copyright © 2000-2022 The WeBWorK Project, https://github.com/openwebwork
+#
+# This program is free software; you can redistribute it and/or modify it under
+# the terms of either: (a) the GNU General Public License as published by the
+# Free Software Foundation; either version 2, or (at your option) any later
+# version, or (b) the "Artistic License" which comes with this package.
+#
+# This program is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+# FOR A PARTICULAR PURPOSE.  See either the GNU General Public License or the
+# Artistic License for more details.
+################################################################################
 
 =head1 NAME
 
diff --git a/macros/PGcomplexmacros2.pl b/macros/PGcomplexmacros2.pl
index e307d004e5..d42cf9d242 100644
--- a/macros/PGcomplexmacros2.pl
+++ b/macros/PGcomplexmacros2.pl
@@ -2,10 +2,20 @@
 # This file     is PGcomplexmacros2.pl
 # This includes the subroutines for the ANS macros, that
 # is, macros allowing a more flexible answer checking
-####################################################################
-# Copyright @ 2006-2007 The WeBWorK Team
-# All Rights Reserved
-####################################################################
+################################################################################
+# WeBWorK Online Homework Delivery System
+# Copyright © 2000-2022 The WeBWorK Project, https://github.com/openwebwork
+#
+# This program is free software; you can redistribute it and/or modify it under
+# the terms of either: (a) the GNU General Public License as published by the
+# Free Software Foundation; either version 2, or (at your option) any later
+# version, or (b) the "Artistic License" which comes with this package.
+#
+# This program is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+# FOR A PARTICULAR PURPOSE.  See either the GNU General Public License or the
+# Artistic License for more details.
+################################################################################
 
 
 =head1 NAME
diff --git a/macros/PGessaymacros.pl b/macros/PGessaymacros.pl
index 164409ab63..6abfab559c 100644
--- a/macros/PGessaymacros.pl
+++ b/macros/PGessaymacros.pl
@@ -1,13 +1,12 @@
 ################################################################################
 # WeBWorK Online Homework Delivery System
-# Copyright � 2000-2007 The WeBWorK Project, http://openwebwork.sf.net/
-# $CVSHeader: pg/macros/PGanswermacros.pl,v 1.72 2010/02/01 01:33:05 apizer Exp $
-# 
+# Copyright © 2000-2022 The WeBWorK Project, https://github.com/openwebwork
+#
 # This program is free software; you can redistribute it and/or modify it under
 # the terms of either: (a) the GNU General Public License as published by the
 # Free Software Foundation; either version 2, or (at your option) any later
 # version, or (b) the "Artistic License" which comes with this package.
-# 
+#
 # This program is distributed in the hope that it will be useful, but WITHOUT
 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 # FOR A PARTICULAR PURPOSE.  See either the GNU General Public License or the
diff --git a/macros/PGfunctionevaluators.pl b/macros/PGfunctionevaluators.pl
index ae91f4faca..bfcecdf704 100644
--- a/macros/PGfunctionevaluators.pl
+++ b/macros/PGfunctionevaluators.pl
@@ -1,13 +1,12 @@
 ################################################################################
 # WeBWorK Online Homework Delivery System
-# Copyright © 2000-2018 The WeBWorK Project, http://openwebwork.sf.net/
-# $CVSHeader$
-# 
+# Copyright © 2000-2022 The WeBWorK Project, https://github.com/openwebwork
+#
 # This program is free software; you can redistribute it and/or modify it under
 # the terms of either: (a) the GNU General Public License as published by the
 # Free Software Foundation; either version 2, or (at your option) any later
 # version, or (b) the "Artistic License" which comes with this package.
-# 
+#
 # This program is distributed in the hope that it will be useful, but WITHOUT
 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 # FOR A PARTICULAR PURPOSE.  See either the GNU General Public License or the
diff --git a/macros/PGinfo.pl b/macros/PGinfo.pl
index ad0a0e0291..d72c19be67 100644
--- a/macros/PGinfo.pl
+++ b/macros/PGinfo.pl
@@ -1,8 +1,18 @@
 
-####################################################################
-# Copyright @ 1995-2007 University of Rochester
-# All Rights Reserved
-####################################################################
+################################################################################
+# WeBWorK Online Homework Delivery System
+# Copyright © 2000-2022 The WeBWorK Project, https://github.com/openwebwork
+#
+# This program is free software; you can redistribute it and/or modify it under
+# the terms of either: (a) the GNU General Public License as published by the
+# Free Software Foundation; either version 2, or (at your option) any later
+# version, or (b) the "Artistic License" which comes with this package.
+#
+# This program is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+# FOR A PARTICULAR PURPOSE.  See either the GNU General Public License or the
+# Artistic License for more details.
+################################################################################
 
 =head1 NAME
 
@@ -110,4 +120,4 @@ sub pp {
     my $hash = shift;
     "printing |". ref($hash)."|$BR". pretty_print($hash);
 }
-1;
\ No newline at end of file
+1;
diff --git a/macros/PGlateximage.pl b/macros/PGlateximage.pl
index 59df97a77e..660b9c1082 100644
--- a/macros/PGlateximage.pl
+++ b/macros/PGlateximage.pl
@@ -1,12 +1,12 @@
 ################################################################################
 # WeBWorK Online Homework Delivery System
-# Copyright © 2000-2018 The WeBWorK Project, http://openwebwork.sf.net/
-# 
+# Copyright © 2000-2022 The WeBWorK Project, https://github.com/openwebwork
+#
 # This program is free software; you can redistribute it and/or modify it under
 # the terms of either: (a) the GNU General Public License as published by the
 # Free Software Foundation; either version 2, or (at your option) any later
 # version, or (b) the "Artistic License" which comes with this package.
-# 
+#
 # This program is distributed in the hope that it will be useful, but WITHOUT
 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 # FOR A PARTICULAR PURPOSE.  See either the GNU General Public License or the
diff --git a/macros/PGmiscevaluators.pl b/macros/PGmiscevaluators.pl
index ef9c8e0a9d..d23c140b19 100644
--- a/macros/PGmiscevaluators.pl
+++ b/macros/PGmiscevaluators.pl
@@ -1,13 +1,12 @@
 ################################################################################
 # WeBWorK Online Homework Delivery System
-# Copyright © 2000-2018 The WeBWorK Project, http://openwebwork.sf.net/
-# $CVSHeader$
-# 
+# Copyright © 2000-2022 The WeBWorK Project, https://github.com/openwebwork
+#
 # This program is free software; you can redistribute it and/or modify it under
 # the terms of either: (a) the GNU General Public License as published by the
 # Free Software Foundation; either version 2, or (at your option) any later
 # version, or (b) the "Artistic License" which comes with this package.
-# 
+#
 # This program is distributed in the hope that it will be useful, but WITHOUT
 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 # FOR A PARTICULAR PURPOSE.  See either the GNU General Public License or the
diff --git a/macros/PGnumericevaluators.pl b/macros/PGnumericevaluators.pl
index 684806eab7..12caad6bbb 100644
--- a/macros/PGnumericevaluators.pl
+++ b/macros/PGnumericevaluators.pl
@@ -1,13 +1,12 @@
 ################################################################################
 # WeBWorK Online Homework Delivery System
-# Copyright © 2000-2018 The WeBWorK Project, http://openwebwork.sf.net/
-# $CVSHeader$
-# 
+# Copyright © 2000-2022 The WeBWorK Project, https://github.com/openwebwork
+#
 # This program is free software; you can redistribute it and/or modify it under
 # the terms of either: (a) the GNU General Public License as published by the
 # Free Software Foundation; either version 2, or (at your option) any later
 # version, or (b) the "Artistic License" which comes with this package.
-# 
+#
 # This program is distributed in the hope that it will be useful, but WITHOUT
 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 # FOR A PARTICULAR PURPOSE.  See either the GNU General Public License or the
diff --git a/macros/PGstringevaluators.pl b/macros/PGstringevaluators.pl
index af4ebb1b3f..34f690cb06 100644
--- a/macros/PGstringevaluators.pl
+++ b/macros/PGstringevaluators.pl
@@ -1,13 +1,12 @@
 ################################################################################
 # WeBWorK Online Homework Delivery System
-# Copyright © 2000-2018 The WeBWorK Project, http://openwebwork.sf.net/
-# $CVSHeader$
-# 
+# Copyright © 2000-2022 The WeBWorK Project, https://github.com/openwebwork
+#
 # This program is free software; you can redistribute it and/or modify it under
 # the terms of either: (a) the GNU General Public License as published by the
 # Free Software Foundation; either version 2, or (at your option) any later
 # version, or (b) the "Artistic License" which comes with this package.
-# 
+#
 # This program is distributed in the hope that it will be useful, but WITHOUT
 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 # FOR A PARTICULAR PURPOSE.  See either the GNU General Public License or the
diff --git a/macros/PGtextevaluators.pl b/macros/PGtextevaluators.pl
index c3ac67728c..91648dfd77 100644
--- a/macros/PGtextevaluators.pl
+++ b/macros/PGtextevaluators.pl
@@ -1,13 +1,12 @@
 ################################################################################
 # WeBWorK Online Homework Delivery System
-# Copyright © 2000-2018 The WeBWorK Project, http://openwebwork.sf.net/
-# $CVSHeader$
-# 
+# Copyright © 2000-2022 The WeBWorK Project, https://github.com/openwebwork
+#
 # This program is free software; you can redistribute it and/or modify it under
 # the terms of either: (a) the GNU General Public License as published by the
 # Free Software Foundation; either version 2, or (at your option) any later
 # version, or (b) the "Artistic License" which comes with this package.
-# 
+#
 # This program is distributed in the hope that it will be useful, but WITHOUT
 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 # FOR A PARTICULAR PURPOSE.  See either the GNU General Public License or the
diff --git a/macros/PGtikz.pl b/macros/PGtikz.pl
index 851fd87f77..a6583a638d 100644
--- a/macros/PGtikz.pl
+++ b/macros/PGtikz.pl
@@ -1,12 +1,12 @@
 ################################################################################
 # WeBWorK Online Homework Delivery System
-# Copyright © 2000-2018 The WeBWorK Project, http://openwebwork.sf.net/
-# 
+# Copyright © 2000-2022 The WeBWorK Project, https://github.com/openwebwork
+#
 # This program is free software; you can redistribute it and/or modify it under
 # the terms of either: (a) the GNU General Public License as published by the
 # Free Software Foundation; either version 2, or (at your option) any later
 # version, or (b) the "Artistic License" which comes with this package.
-# 
+#
 # This program is distributed in the hope that it will be useful, but WITHOUT
 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 # FOR A PARTICULAR PURPOSE.  See either the GNU General Public License or the
diff --git a/macros/Parser.pl b/macros/Parser.pl
index 6c94f98e54..e2b60d6b11 100644
--- a/macros/Parser.pl
+++ b/macros/Parser.pl
@@ -1,13 +1,12 @@
 ################################################################################
 # WeBWorK Online Homework Delivery System
-# Copyright © 2000-2018 The WeBWorK Project, http://openwebwork.sf.net/
-# $CVSHeader$
-# 
+# Copyright © 2000-2022 The WeBWorK Project, https://github.com/openwebwork
+#
 # This program is free software; you can redistribute it and/or modify it under
 # the terms of either: (a) the GNU General Public License as published by the
 # Free Software Foundation; either version 2, or (at your option) any later
 # version, or (b) the "Artistic License" which comes with this package.
-# 
+#
 # This program is distributed in the hope that it will be useful, but WITHOUT
 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 # FOR A PARTICULAR PURPOSE.  See either the GNU General Public License or the
diff --git a/macros/answerComposition.pl b/macros/answerComposition.pl
index 84930396da..f63fbcb1fc 100644
--- a/macros/answerComposition.pl
+++ b/macros/answerComposition.pl
@@ -1,13 +1,12 @@
 ################################################################################
 # WeBWorK Online Homework Delivery System
-# Copyright © 2000-2018 The WeBWorK Project, http://openwebwork.sf.net/
-# $CVSHeader: pg/macros/answerComposition.pl,v 1.8 2009/06/25 23:28:44 gage Exp $
-# 
+# Copyright © 2000-2022 The WeBWorK Project, https://github.com/openwebwork
+#
 # This program is free software; you can redistribute it and/or modify it under
 # the terms of either: (a) the GNU General Public License as published by the
 # Free Software Foundation; either version 2, or (at your option) any later
 # version, or (b) the "Artistic License" which comes with this package.
-# 
+#
 # This program is distributed in the hope that it will be useful, but WITHOUT
 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 # FOR A PARTICULAR PURPOSE.  See either the GNU General Public License or the
diff --git a/macros/answerCustom.pl b/macros/answerCustom.pl
index 2b166f9ef9..46ebaee69d 100644
--- a/macros/answerCustom.pl
+++ b/macros/answerCustom.pl
@@ -1,13 +1,12 @@
 ################################################################################
 # WeBWorK Online Homework Delivery System
-# Copyright © 2000-2018 The WeBWorK Project, http://openwebwork.sf.net/
-# $CVSHeader$
-# 
+# Copyright © 2000-2022 The WeBWorK Project, https://github.com/openwebwork
+#
 # This program is free software; you can redistribute it and/or modify it under
 # the terms of either: (a) the GNU General Public License as published by the
 # Free Software Foundation; either version 2, or (at your option) any later
 # version, or (b) the "Artistic License" which comes with this package.
-# 
+#
 # This program is distributed in the hope that it will be useful, but WITHOUT
 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 # FOR A PARTICULAR PURPOSE.  See either the GNU General Public License or the
diff --git a/macros/answerHints.pl b/macros/answerHints.pl
index ad7faaf820..6c67574fb5 100644
--- a/macros/answerHints.pl
+++ b/macros/answerHints.pl
@@ -1,13 +1,12 @@
 ################################################################################
 # WeBWorK Online Homework Delivery System
-# Copyright © 2000-2018 The WeBWorK Project, http://openwebwork.sf.net/
-# $CVSHeader$
-# 
+# Copyright © 2000-2022 The WeBWorK Project, https://github.com/openwebwork
+#
 # This program is free software; you can redistribute it and/or modify it under
 # the terms of either: (a) the GNU General Public License as published by the
 # Free Software Foundation; either version 2, or (at your option) any later
 # version, or (b) the "Artistic License" which comes with this package.
-# 
+#
 # This program is distributed in the hope that it will be useful, but WITHOUT
 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 # FOR A PARTICULAR PURPOSE.  See either the GNU General Public License or the
diff --git a/macros/answerVariableList.pl b/macros/answerVariableList.pl
index 8b0c7a1a5e..32b3ea58b9 100644
--- a/macros/answerVariableList.pl
+++ b/macros/answerVariableList.pl
@@ -1,13 +1,12 @@
 ################################################################################
 # WeBWorK Online Homework Delivery System
-# Copyright © 2000-2018 The WeBWorK Project, http://openwebwork.sf.net/
-# $CVSHeader$
-# 
+# Copyright © 2000-2022 The WeBWorK Project, https://github.com/openwebwork
+#
 # This program is free software; you can redistribute it and/or modify it under
 # the terms of either: (a) the GNU General Public License as published by the
 # Free Software Foundation; either version 2, or (at your option) any later
 # version, or (b) the "Artistic License" which comes with this package.
-# 
+#
 # This program is distributed in the hope that it will be useful, but WITHOUT
 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 # FOR A PARTICULAR PURPOSE.  See either the GNU General Public License or the
diff --git a/macros/compoundProblem5.pl b/macros/compoundProblem5.pl
index cf814cef4e..2523e16dbd 100644
--- a/macros/compoundProblem5.pl
+++ b/macros/compoundProblem5.pl
@@ -1,13 +1,12 @@
 ################################################################################
 # WeBWorK Online Homework Delivery System
-# Copyright © 2014 The WeBWorK Project, http://openwebwork.sf.net/
-# $$
-# 
+# Copyright © 2000-2022 The WeBWorK Project, https://github.com/openwebwork
+#
 # This program is free software; you can redistribute it and/or modify it under
 # the terms of either: (a) the GNU General Public License as published by the
 # Free Software Foundation; either version 2, or (at your option) any later
 # version, or (b) the "Artistic License" which comes with this package.
-# 
+#
 # This program is distributed in the hope that it will be useful, but WITHOUT
 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 # FOR A PARTICULAR PURPOSE.  See either the GNU General Public License or the
diff --git a/macros/contextABCD.pl b/macros/contextABCD.pl
index 774daa5be8..23e34303d8 100644
--- a/macros/contextABCD.pl
+++ b/macros/contextABCD.pl
@@ -1,13 +1,12 @@
 ################################################################################
 # WeBWorK Online Homework Delivery System
-# Copyright © 2000-2018 The WeBWorK Project, http://openwebwork.sf.net/
-# $CVSHeader$
-# 
+# Copyright © 2000-2022 The WeBWorK Project, https://github.com/openwebwork
+#
 # This program is free software; you can redistribute it and/or modify it under
 # the terms of either: (a) the GNU General Public License as published by the
 # Free Software Foundation; either version 2, or (at your option) any later
 # version, or (b) the "Artistic License" which comes with this package.
-# 
+#
 # This program is distributed in the hope that it will be useful, but WITHOUT
 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 # FOR A PARTICULAR PURPOSE.  See either the GNU General Public License or the
diff --git a/macros/contextAlternateDecimal.pl b/macros/contextAlternateDecimal.pl
index c5b9b07d37..cfa4eb213e 100644
--- a/macros/contextAlternateDecimal.pl
+++ b/macros/contextAlternateDecimal.pl
@@ -1,13 +1,12 @@
 ################################################################################
 # WeBWorK Online Homework Delivery System
-# Copyright © 2000-2014 The WeBWorK Project, http://openwebwork.sf.net/
-# $CVSHeader:$
-# 
+# Copyright © 2000-2022 The WeBWorK Project, https://github.com/openwebwork
+#
 # This program is free software; you can redistribute it and/or modify it under
 # the terms of either: (a) the GNU General Public License as published by the
 # Free Software Foundation; either version 2, or (at your option) any later
 # version, or (b) the "Artistic License" which comes with this package.
-# 
+#
 # This program is distributed in the hope that it will be useful, but WITHOUT
 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 # FOR A PARTICULAR PURPOSE.  See either the GNU General Public License or the
diff --git a/macros/contextAlternateIntervals.pl b/macros/contextAlternateIntervals.pl
index 8500cd2766..fca902678f 100644
--- a/macros/contextAlternateIntervals.pl
+++ b/macros/contextAlternateIntervals.pl
@@ -1,13 +1,12 @@
 ################################################################################
 # WeBWorK Online Homework Delivery System
-# Copyright © 2000-2014 The WeBWorK Project, http://openwebwork.sf.net/
-# $CVSHeader:$
-# 
+# Copyright © 2000-2022 The WeBWorK Project, https://github.com/openwebwork
+#
 # This program is free software; you can redistribute it and/or modify it under
 # the terms of either: (a) the GNU General Public License as published by the
 # Free Software Foundation; either version 2, or (at your option) any later
 # version, or (b) the "Artistic License" which comes with this package.
-# 
+#
 # This program is distributed in the hope that it will be useful, but WITHOUT
 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 # FOR A PARTICULAR PURPOSE.  See either the GNU General Public License or the
diff --git a/macros/contextComplexExtras.pl b/macros/contextComplexExtras.pl
index dc5a468c31..c2441deb5b 100644
--- a/macros/contextComplexExtras.pl
+++ b/macros/contextComplexExtras.pl
@@ -1,7 +1,6 @@
 ################################################################################
 # WeBWorK Online Homework Delivery System
-# Copyright © 2000-2012 The WeBWorK Project, http://openwebwork.sf.net/
-# $CVSHeader: pg/macros/contextComplexExtras.pl,v 1.0 2012/08/01 11:33:50 dpvc Exp $
+# Copyright © 2000-2022 The WeBWorK Project, https://github.com/openwebwork
 #
 # This program is free software; you can redistribute it and/or modify it under
 # the terms of either: (a) the GNU General Public License as published by the
diff --git a/macros/contextComplexJ.pl b/macros/contextComplexJ.pl
index c386ccd39e..80bcdfcf0a 100644
--- a/macros/contextComplexJ.pl
+++ b/macros/contextComplexJ.pl
@@ -1,13 +1,12 @@
 ################################################################################
 # WeBWorK Online Homework Delivery System
-# Copyright © 2000-2014 The WeBWorK Project, http://openwebwork.sf.net/
-# $CVSHeader:$
-# 
+# Copyright © 2000-2022 The WeBWorK Project, https://github.com/openwebwork
+#
 # This program is free software; you can redistribute it and/or modify it under
 # the terms of either: (a) the GNU General Public License as published by the
 # Free Software Foundation; either version 2, or (at your option) any later
 # version, or (b) the "Artistic License" which comes with this package.
-# 
+#
 # This program is distributed in the hope that it will be useful, but WITHOUT
 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 # FOR A PARTICULAR PURPOSE.  See either the GNU General Public License or the
diff --git a/macros/contextCongruence.pl b/macros/contextCongruence.pl
index 8e1b9937e2..f7cea379cb 100644
--- a/macros/contextCongruence.pl
+++ b/macros/contextCongruence.pl
@@ -1,13 +1,12 @@
 ################################################################################
 # WeBWorK Online Homework Delivery System
-# Copyright © 2000-2017 The WeBWorK Project, http://openwebwork.sf.net/
-# $CVSHeader:$
-# 
+# Copyright © 2000-2022 The WeBWorK Project, https://github.com/openwebwork
+#
 # This program is free software; you can redistribute it and/or modify it under
 # the terms of either: (a) the GNU General Public License as published by the
 # Free Software Foundation; either version 2, or (at your option) any later
 # version, or (b) the "Artistic License" which comes with this package.
-# 
+#
 # This program is distributed in the hope that it will be useful, but WITHOUT
 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 # FOR A PARTICULAR PURPOSE.  See either the GNU General Public License or the
diff --git a/macros/contextCurrency.pl b/macros/contextCurrency.pl
index 0b8111efb8..68bac416a8 100644
--- a/macros/contextCurrency.pl
+++ b/macros/contextCurrency.pl
@@ -1,13 +1,12 @@
 ################################################################################
 # WeBWorK Online Homework Delivery System
-# Copyright © 2000-2018 The WeBWorK Project, http://openwebwork.sf.net/
-# $CVSHeader: pg/macros/contextCurrency.pl,v 1.17 2009/06/25 23:28:44 gage Exp $
-# 
+# Copyright © 2000-2022 The WeBWorK Project, https://github.com/openwebwork
+#
 # This program is free software; you can redistribute it and/or modify it under
 # the terms of either: (a) the GNU General Public License as published by the
 # Free Software Foundation; either version 2, or (at your option) any later
 # version, or (b) the "Artistic License" which comes with this package.
-# 
+#
 # This program is distributed in the hope that it will be useful, but WITHOUT
 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 # FOR A PARTICULAR PURPOSE.  See either the GNU General Public License or the
diff --git a/macros/contextInequalities.pl b/macros/contextInequalities.pl
index 6e209ce3f9..70e5a72efe 100644
--- a/macros/contextInequalities.pl
+++ b/macros/contextInequalities.pl
@@ -1,13 +1,12 @@
 ################################################################################
 # WeBWorK Online Homework Delivery System
-# Copyright © 2000-2018 The WeBWorK Project, http://openwebwork.sf.net/
-# $CVSHeader: pg/macros/contextInequalities.pl,v 1.23 2010/03/22 11:01:55 dpvc Exp $
-# 
+# Copyright © 2000-2022 The WeBWorK Project, https://github.com/openwebwork
+#
 # This program is free software; you can redistribute it and/or modify it under
 # the terms of either: (a) the GNU General Public License as published by the
 # Free Software Foundation; either version 2, or (at your option) any later
 # version, or (b) the "Artistic License" which comes with this package.
-# 
+#
 # This program is distributed in the hope that it will be useful, but WITHOUT
 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 # FOR A PARTICULAR PURPOSE.  See either the GNU General Public License or the
diff --git a/macros/contextInequalitySetBuilder.pl b/macros/contextInequalitySetBuilder.pl
index f3bc52fdba..c68e625e6d 100644
--- a/macros/contextInequalitySetBuilder.pl
+++ b/macros/contextInequalitySetBuilder.pl
@@ -1,13 +1,12 @@
 ################################################################################
 # WeBWorK Online Homework Delivery System
-# Copyright © 2000-2013 The WeBWorK Project, http://openwebwork.sf.net/
-# $CVSHeader:$
-# 
+# Copyright © 2000-2022 The WeBWorK Project, https://github.com/openwebwork
+#
 # This program is free software; you can redistribute it and/or modify it under
 # the terms of either: (a) the GNU General Public License as published by the
 # Free Software Foundation; either version 2, or (at your option) any later
 # version, or (b) the "Artistic License" which comes with this package.
-# 
+#
 # This program is distributed in the hope that it will be useful, but WITHOUT
 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 # FOR A PARTICULAR PURPOSE.  See either the GNU General Public License or the
diff --git a/macros/contextInteger.pl b/macros/contextInteger.pl
index 15878aaef8..47c943e9f9 100644
--- a/macros/contextInteger.pl
+++ b/macros/contextInteger.pl
@@ -1,13 +1,12 @@
 ################################################################################
 # WeBWorK Online Homework Delivery System
-# Copyright © 2000-2017 The WeBWorK Project, http://openwebwork.sf.net/
-# $CVSHeader:$
-# 
+# Copyright © 2000-2022 The WeBWorK Project, https://github.com/openwebwork
+#
 # This program is free software; you can redistribute it and/or modify it under
 # the terms of either: (a) the GNU General Public License as published by the
 # Free Software Foundation; either version 2, or (at your option) any later
 # version, or (b) the "Artistic License" which comes with this package.
-# 
+#
 # This program is distributed in the hope that it will be useful, but WITHOUT
 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 # FOR A PARTICULAR PURPOSE.  See either the GNU General Public License or the
diff --git a/macros/contextIntegerFunctions.pl b/macros/contextIntegerFunctions.pl
index 49c6ae9808..38488c5ca3 100644
--- a/macros/contextIntegerFunctions.pl
+++ b/macros/contextIntegerFunctions.pl
@@ -1,13 +1,12 @@
 ################################################################################
 # WeBWorK Online Homework Delivery System
-# Copyright © 2000-2018 The WeBWorK Project, http://openwebwork.sf.net/
-# $CVSHeader$
-# 
+# Copyright © 2000-2022 The WeBWorK Project, https://github.com/openwebwork
+#
 # This program is free software; you can redistribute it and/or modify it under
 # the terms of either: (a) the GNU General Public License as published by the
 # Free Software Foundation; either version 2, or (at your option) any later
 # version, or (b) the "Artistic License" which comes with this package.
-# 
+#
 # This program is distributed in the hope that it will be useful, but WITHOUT
 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 # FOR A PARTICULAR PURPOSE.  See either the GNU General Public License or the
diff --git a/macros/contextLimitedComplex.pl b/macros/contextLimitedComplex.pl
index f58cb1bf47..39214b480a 100644
--- a/macros/contextLimitedComplex.pl
+++ b/macros/contextLimitedComplex.pl
@@ -1,13 +1,12 @@
 ################################################################################
 # WeBWorK Online Homework Delivery System
-# Copyright © 2000-2018 The WeBWorK Project, http://openwebwork.sf.net/
-# $CVSHeader$
-# 
+# Copyright © 2000-2022 The WeBWorK Project, https://github.com/openwebwork
+#
 # This program is free software; you can redistribute it and/or modify it under
 # the terms of either: (a) the GNU General Public License as published by the
 # Free Software Foundation; either version 2, or (at your option) any later
 # version, or (b) the "Artistic License" which comes with this package.
-# 
+#
 # This program is distributed in the hope that it will be useful, but WITHOUT
 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 # FOR A PARTICULAR PURPOSE.  See either the GNU General Public License or the
diff --git a/macros/contextLimitedNumeric.pl b/macros/contextLimitedNumeric.pl
index adce6bdef0..c678fbbdc8 100644
--- a/macros/contextLimitedNumeric.pl
+++ b/macros/contextLimitedNumeric.pl
@@ -1,13 +1,12 @@
 ################################################################################
 # WeBWorK Online Homework Delivery System
-# Copyright © 2000-2018 The WeBWorK Project, http://openwebwork.sf.net/
-# $CVSHeader$
-# 
+# Copyright © 2000-2022 The WeBWorK Project, https://github.com/openwebwork
+#
 # This program is free software; you can redistribute it and/or modify it under
 # the terms of either: (a) the GNU General Public License as published by the
 # Free Software Foundation; either version 2, or (at your option) any later
 # version, or (b) the "Artistic License" which comes with this package.
-# 
+#
 # This program is distributed in the hope that it will be useful, but WITHOUT
 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 # FOR A PARTICULAR PURPOSE.  See either the GNU General Public License or the
diff --git a/macros/contextLimitedPoint.pl b/macros/contextLimitedPoint.pl
index 72d93d8083..2d1ba73828 100644
--- a/macros/contextLimitedPoint.pl
+++ b/macros/contextLimitedPoint.pl
@@ -1,13 +1,12 @@
 ################################################################################
 # WeBWorK Online Homework Delivery System
-# Copyright © 2000-2018 The WeBWorK Project, http://openwebwork.sf.net/
-# $CVSHeader: pg/macros/contextLimitedPoint.pl,v 1.14 2009/06/25 23:28:44 gage Exp $
-# 
+# Copyright © 2000-2022 The WeBWorK Project, https://github.com/openwebwork
+#
 # This program is free software; you can redistribute it and/or modify it under
 # the terms of either: (a) the GNU General Public License as published by the
 # Free Software Foundation; either version 2, or (at your option) any later
 # version, or (b) the "Artistic License" which comes with this package.
-# 
+#
 # This program is distributed in the hope that it will be useful, but WITHOUT
 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 # FOR A PARTICULAR PURPOSE.  See either the GNU General Public License or the
diff --git a/macros/contextLimitedPolynomial.pl b/macros/contextLimitedPolynomial.pl
index 017dcc0bea..e4f8c94665 100644
--- a/macros/contextLimitedPolynomial.pl
+++ b/macros/contextLimitedPolynomial.pl
@@ -1,13 +1,12 @@
 ################################################################################
 # WeBWorK Online Homework Delivery System
-# Copyright © 2000-2018 The WeBWorK Project, http://openwebwork.sf.net/
-# $CVSHeader$
-# 
+# Copyright © 2000-2022 The WeBWorK Project, https://github.com/openwebwork
+#
 # This program is free software; you can redistribute it and/or modify it under
 # the terms of either: (a) the GNU General Public License as published by the
 # Free Software Foundation; either version 2, or (at your option) any later
 # version, or (b) the "Artistic License" which comes with this package.
-# 
+#
 # This program is distributed in the hope that it will be useful, but WITHOUT
 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 # FOR A PARTICULAR PURPOSE.  See either the GNU General Public License or the
diff --git a/macros/contextLimitedPowers.pl b/macros/contextLimitedPowers.pl
index adb18de1b2..0a9de2deb2 100644
--- a/macros/contextLimitedPowers.pl
+++ b/macros/contextLimitedPowers.pl
@@ -1,13 +1,12 @@
 ################################################################################
 # WeBWorK Online Homework Delivery System
-# Copyright © 2000-2018 The WeBWorK Project, http://openwebwork.sf.net/
-# $CVSHeader$
-# 
+# Copyright © 2000-2022 The WeBWorK Project, https://github.com/openwebwork
+#
 # This program is free software; you can redistribute it and/or modify it under
 # the terms of either: (a) the GNU General Public License as published by the
 # Free Software Foundation; either version 2, or (at your option) any later
 # version, or (b) the "Artistic License" which comes with this package.
-# 
+#
 # This program is distributed in the hope that it will be useful, but WITHOUT
 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 # FOR A PARTICULAR PURPOSE.  See either the GNU General Public License or the
diff --git a/macros/contextLimitedVector.pl b/macros/contextLimitedVector.pl
index abe12ed044..1c5314b4bb 100644
--- a/macros/contextLimitedVector.pl
+++ b/macros/contextLimitedVector.pl
@@ -1,13 +1,12 @@
 ################################################################################
 # WeBWorK Online Homework Delivery System
-# Copyright © 2000-2018 The WeBWorK Project, http://openwebwork.sf.net/
-# $CVSHeader$
-# 
+# Copyright © 2000-2022 The WeBWorK Project, https://github.com/openwebwork
+#
 # This program is free software; you can redistribute it and/or modify it under
 # the terms of either: (a) the GNU General Public License as published by the
 # Free Software Foundation; either version 2, or (at your option) any later
 # version, or (b) the "Artistic License" which comes with this package.
-# 
+#
 # This program is distributed in the hope that it will be useful, but WITHOUT
 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 # FOR A PARTICULAR PURPOSE.  See either the GNU General Public License or the
diff --git a/macros/contextMatrixExtras.pl b/macros/contextMatrixExtras.pl
index d42e2483b3..d3e835c000 100644
--- a/macros/contextMatrixExtras.pl
+++ b/macros/contextMatrixExtras.pl
@@ -1,7 +1,6 @@
 ################################################################################
 # WeBWorK Online Homework Delivery System
-# Copyright © 2000-2012 The WeBWorK Project, http://openwebwork.sf.net/
-# $CVSHeader: pg/macros/contextMatrixExtras.pl,v 1.0 2012/08/01 11:21:45 dpvc Exp $
+# Copyright © 2000-2022 The WeBWorK Project, https://github.com/openwebwork
 #
 # This program is free software; you can redistribute it and/or modify it under
 # the terms of either: (a) the GNU General Public License as published by the
diff --git a/macros/contextPartition.pl b/macros/contextPartition.pl
index 2e0e4cbcae..d5d74c7b6a 100644
--- a/macros/contextPartition.pl
+++ b/macros/contextPartition.pl
@@ -1,13 +1,12 @@
 ################################################################################
 # WeBWorK Online Homework Delivery System
-# Copyright © 2000-2014 The WeBWorK Project, http://openwebwork.sf.net/
-# $CVSHeader:$
-# 
+# Copyright © 2000-2022 The WeBWorK Project, https://github.com/openwebwork
+#
 # This program is free software; you can redistribute it and/or modify it under
 # the terms of either: (a) the GNU General Public License as published by the
 # Free Software Foundation; either version 2, or (at your option) any later
 # version, or (b) the "Artistic License" which comes with this package.
-# 
+#
 # This program is distributed in the hope that it will be useful, but WITHOUT
 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 # FOR A PARTICULAR PURPOSE.  See either the GNU General Public License or the
diff --git a/macros/contextPercent.pl b/macros/contextPercent.pl
index fb7c788380..f4dd56bb2f 100644
--- a/macros/contextPercent.pl
+++ b/macros/contextPercent.pl
@@ -1,13 +1,12 @@
 ################################################################################
 # WeBWorK Online Homework Delivery System
-# Copyright © 2000-2013 The WeBWorK Project, http://openwebwork.sf.net/
-# $CVSHeader: pg/macros/contextCurrency.pl,v 1.17 2009/06/25 23:28:44 gage Exp $
-# 
+# Copyright © 2000-2022 The WeBWorK Project, https://github.com/openwebwork
+#
 # This program is free software; you can redistribute it and/or modify it under
 # the terms of either: (a) the GNU General Public License as published by the
 # Free Software Foundation; either version 2, or (at your option) any later
 # version, or (b) the "Artistic License" which comes with this package.
-# 
+#
 # This program is distributed in the hope that it will be useful, but WITHOUT
 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 # FOR A PARTICULAR PURPOSE.  See either the GNU General Public License or the
diff --git a/macros/contextPeriodic.pl b/macros/contextPeriodic.pl
index b8186c881b..0a3706326e 100644
--- a/macros/contextPeriodic.pl
+++ b/macros/contextPeriodic.pl
@@ -1,13 +1,12 @@
 ################################################################################
 # WeBWorK Online Homework Delivery System
-# Copyright © 2000-2018 The WeBWorK Project, http://openwebwork.sf.net/
-# $CVSHeader$
-# 
+# Copyright © 2000-2022 The WeBWorK Project, https://github.com/openwebwork
+#
 # This program is free software; you can redistribute it and/or modify it under
 # the terms of either: (a) the GNU General Public License as published by the
 # Free Software Foundation; either version 2, or (at your option) any later
 # version, or (b) the "Artistic License" which comes with this package.
-# 
+#
 # This program is distributed in the hope that it will be useful, but WITHOUT
 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 # FOR A PARTICULAR PURPOSE.  See either the GNU General Public License or the
diff --git a/macros/contextPermutation.pl b/macros/contextPermutation.pl
index 4db42ab4c3..60fb1f61a0 100644
--- a/macros/contextPermutation.pl
+++ b/macros/contextPermutation.pl
@@ -1,13 +1,12 @@
 ################################################################################
 # WeBWorK Online Homework Delivery System
-# Copyright © 2000-2014 The WeBWorK Project, http://openwebwork.sf.net/
-# $CVSHeader:$
-# 
+# Copyright © 2000-2022 The WeBWorK Project, https://github.com/openwebwork
+#
 # This program is free software; you can redistribute it and/or modify it under
 # the terms of either: (a) the GNU General Public License as published by the
 # Free Software Foundation; either version 2, or (at your option) any later
 # version, or (b) the "Artistic License" which comes with this package.
-# 
+#
 # This program is distributed in the hope that it will be useful, but WITHOUT
 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 # FOR A PARTICULAR PURPOSE.  See either the GNU General Public License or the
diff --git a/macros/contextPermutationUBC.pl b/macros/contextPermutationUBC.pl
index b5972b7732..8b9215d176 100644
--- a/macros/contextPermutationUBC.pl
+++ b/macros/contextPermutationUBC.pl
@@ -1,13 +1,12 @@
 ################################################################################
 # WeBWorK Online Homework Delivery System
-# Copyright © 2000-2014 The WeBWorK Project, http://openwebwork.sf.net/
-# $CVSHeader:$
-# 
+# Copyright © 2000-2022 The WeBWorK Project, https://github.com/openwebwork
+#
 # This program is free software; you can redistribute it and/or modify it under
 # the terms of either: (a) the GNU General Public License as published by the
 # Free Software Foundation; either version 2, or (at your option) any later
 # version, or (b) the "Artistic License" which comes with this package.
-# 
+#
 # This program is distributed in the hope that it will be useful, but WITHOUT
 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 # FOR A PARTICULAR PURPOSE.  See either the GNU General Public License or the
diff --git a/macros/contextPiecewiseFunction.pl b/macros/contextPiecewiseFunction.pl
index 724574caa1..1bf49cfda8 100644
--- a/macros/contextPiecewiseFunction.pl
+++ b/macros/contextPiecewiseFunction.pl
@@ -1,13 +1,12 @@
 ################################################################################
 # WeBWorK Online Homework Delivery System
-# Copyright © 2000-2018 The WeBWorK Project, http://openwebwork.sf.net/
-# $CVSHeader$
-# 
+# Copyright © 2000-2022 The WeBWorK Project, https://github.com/openwebwork
+#
 # This program is free software; you can redistribute it and/or modify it under
 # the terms of either: (a) the GNU General Public License as published by the
 # Free Software Foundation; either version 2, or (at your option) any later
 # version, or (b) the "Artistic License" which comes with this package.
-# 
+#
 # This program is distributed in the hope that it will be useful, but WITHOUT
 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 # FOR A PARTICULAR PURPOSE.  See either the GNU General Public License or the
diff --git a/macros/contextPolynomialFactors.pl b/macros/contextPolynomialFactors.pl
index 95686be6eb..40d342b844 100644
--- a/macros/contextPolynomialFactors.pl
+++ b/macros/contextPolynomialFactors.pl
@@ -1,13 +1,12 @@
 ################################################################################
 # WeBWorK Online Homework Delivery System
-# Copyright © 2000-2010 The WeBWorK Project, http://openwebwork.sf.net/
-# $CVSHeader: pg/macros/contextPolynomialFactors.pl,v 1.2 2010/03/31 21:45:42 dpvc Exp $
-# 
+# Copyright © 2000-2022 The WeBWorK Project, https://github.com/openwebwork
+#
 # This program is free software; you can redistribute it and/or modify it under
 # the terms of either: (a) the GNU General Public License as published by the
 # Free Software Foundation; either version 2, or (at your option) any later
 # version, or (b) the "Artistic License" which comes with this package.
-# 
+#
 # This program is distributed in the hope that it will be useful, but WITHOUT
 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 # FOR A PARTICULAR PURPOSE.  See either the GNU General Public License or the
diff --git a/macros/contextRationalFunction.pl b/macros/contextRationalFunction.pl
index 46f07c24ee..84f6f63d46 100644
--- a/macros/contextRationalFunction.pl
+++ b/macros/contextRationalFunction.pl
@@ -1,13 +1,12 @@
 ################################################################################
 # WeBWorK Online Homework Delivery System
-# Copyright © 2000-2010 The WeBWorK Project, http://openwebwork.sf.net/
-# $CVSHeader: pg/macros/contextRationalFunction.pl,v 1.1 2010/03/31 21:01:14 dpvc Exp $
-# 
+# Copyright © 2000-2022 The WeBWorK Project, https://github.com/openwebwork
+#
 # This program is free software; you can redistribute it and/or modify it under
 # the terms of either: (a) the GNU General Public License as published by the
 # Free Software Foundation; either version 2, or (at your option) any later
 # version, or (b) the "Artistic License" which comes with this package.
-# 
+#
 # This program is distributed in the hope that it will be useful, but WITHOUT
 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 # FOR A PARTICULAR PURPOSE.  See either the GNU General Public License or the
diff --git a/macros/contextScientificNotation.pl b/macros/contextScientificNotation.pl
index c098724e6c..dfe52e114e 100644
--- a/macros/contextScientificNotation.pl
+++ b/macros/contextScientificNotation.pl
@@ -1,13 +1,12 @@
 ################################################################################
 # WeBWorK Online Homework Delivery System
-# Copyright © 2000-2018 The WeBWorK Project, http://openwebwork.sf.net/
-# $CVSHeader$
-# 
+# Copyright © 2000-2022 The WeBWorK Project, https://github.com/openwebwork
+#
 # This program is free software; you can redistribute it and/or modify it under
 # the terms of either: (a) the GNU General Public License as published by the
 # Free Software Foundation; either version 2, or (at your option) any later
 # version, or (b) the "Artistic License" which comes with this package.
-# 
+#
 # This program is distributed in the hope that it will be useful, but WITHOUT
 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 # FOR A PARTICULAR PURPOSE.  See either the GNU General Public License or the
diff --git a/macros/contextString.pl b/macros/contextString.pl
index 6a323c3b5b..1e418d12bd 100644
--- a/macros/contextString.pl
+++ b/macros/contextString.pl
@@ -1,13 +1,12 @@
 ################################################################################
 # WeBWorK Online Homework Delivery System
-# Copyright © 2000-2018 The WeBWorK Project, http://openwebwork.sf.net/
-# $CVSHeader$
-# 
+# Copyright © 2000-2022 The WeBWorK Project, https://github.com/openwebwork
+#
 # This program is free software; you can redistribute it and/or modify it under
 # the terms of either: (a) the GNU General Public License as published by the
 # Free Software Foundation; either version 2, or (at your option) any later
 # version, or (b) the "Artistic License" which comes with this package.
-# 
+#
 # This program is distributed in the hope that it will be useful, but WITHOUT
 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 # FOR A PARTICULAR PURPOSE.  See either the GNU General Public License or the
diff --git a/macros/contextTF.pl b/macros/contextTF.pl
index 22fe43c053..29933658f5 100644
--- a/macros/contextTF.pl
+++ b/macros/contextTF.pl
@@ -1,13 +1,12 @@
 ################################################################################
 # WeBWorK Online Homework Delivery System
-# Copyright © 2000-2018 The WeBWorK Project, http://openwebwork.sf.net/
-# $CVSHeader$
-# 
+# Copyright © 2000-2022 The WeBWorK Project, https://github.com/openwebwork
+#
 # This program is free software; you can redistribute it and/or modify it under
 # the terms of either: (a) the GNU General Public License as published by the
 # Free Software Foundation; either version 2, or (at your option) any later
 # version, or (b) the "Artistic License" which comes with this package.
-# 
+#
 # This program is distributed in the hope that it will be useful, but WITHOUT
 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 # FOR A PARTICULAR PURPOSE.  See either the GNU General Public License or the
diff --git a/macros/contextTrigDegrees.pl b/macros/contextTrigDegrees.pl
index a20aa7e7d9..3e8754859a 100644
--- a/macros/contextTrigDegrees.pl
+++ b/macros/contextTrigDegrees.pl
@@ -1,13 +1,12 @@
 ################################################################################
 # WeBWorK Online Homework Delivery System
-# Copyright � 2000-2007 The WeBWorK Project, http://openwebwork.sf.net/
-# $CVSHeader$
-# 
+# Copyright © 2000-2022 The WeBWorK Project, https://github.com/openwebwork
+#
 # This program is free software; you can redistribute it and/or modify it under
 # the terms of either: (a) the GNU General Public License as published by the
 # Free Software Foundation; either version 2, or (at your option) any later
 # version, or (b) the "Artistic License" which comes with this package.
-# 
+#
 # This program is distributed in the hope that it will be useful, but WITHOUT
 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 # FOR A PARTICULAR PURPOSE.  See either the GNU General Public License or the
diff --git a/macros/draggableProof.pl b/macros/draggableProof.pl
index a9cdde8fdd..aba3b584c7 100644
--- a/macros/draggableProof.pl
+++ b/macros/draggableProof.pl
@@ -1,6 +1,6 @@
 ################################################################################
 # WeBWorK Online Homework Delivery System
-# Copyright © 2000-2021 The WeBWorK Project, https://github.com/openwebwork
+# Copyright © 2000-2022 The WeBWorK Project, https://github.com/openwebwork
 #
 # This program is free software; you can redistribute it and/or modify it under
 # the terms of either: (a) the GNU General Public License as published by the
diff --git a/macros/draggableSubsets.pl b/macros/draggableSubsets.pl
index d72b636987..4a82bcc69e 100644
--- a/macros/draggableSubsets.pl
+++ b/macros/draggableSubsets.pl
@@ -1,6 +1,6 @@
 ################################################################################
 # WeBWorK Online Homework Delivery System
-# Copyright © 2000-2021 The WeBWorK Project, https://github.com/openwebwork
+# Copyright © 2000-2022 The WeBWorK Project, https://github.com/openwebwork
 #
 # This program is free software; you can redistribute it and/or modify it under
 # the terms of either: (a) the GNU General Public License as published by the
diff --git a/macros/extraAnswerEvaluators.pl b/macros/extraAnswerEvaluators.pl
index 3c0c257d18..36a9329c5f 100644
--- a/macros/extraAnswerEvaluators.pl
+++ b/macros/extraAnswerEvaluators.pl
@@ -1,13 +1,12 @@
 ################################################################################
 # WeBWorK Online Homework Delivery System
-# Copyright © 2000-2018 The WeBWorK Project, http://openwebwork.sf.net/
-# $CVSHeader$
-# 
+# Copyright © 2000-2022 The WeBWorK Project, https://github.com/openwebwork
+#
 # This program is free software; you can redistribute it and/or modify it under
 # the terms of either: (a) the GNU General Public License as published by the
 # Free Software Foundation; either version 2, or (at your option) any later
 # version, or (b) the "Artistic License" which comes with this package.
-# 
+#
 # This program is distributed in the hope that it will be useful, but WITHOUT
 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 # FOR A PARTICULAR PURPOSE.  See either the GNU General Public License or the
diff --git a/macros/parserAssignment.pl b/macros/parserAssignment.pl
index 763f09e840..a0ef1089d2 100644
--- a/macros/parserAssignment.pl
+++ b/macros/parserAssignment.pl
@@ -1,13 +1,12 @@
 ################################################################################
 # WeBWorK Online Homework Delivery System
-# Copyright © 2000-2018 The WeBWorK Project, http://openwebwork.sf.net/
-# $CVSHeader$
-# 
+# Copyright © 2000-2022 The WeBWorK Project, https://github.com/openwebwork
+#
 # This program is free software; you can redistribute it and/or modify it under
 # the terms of either: (a) the GNU General Public License as published by the
 # Free Software Foundation; either version 2, or (at your option) any later
 # version, or (b) the "Artistic License" which comes with this package.
-# 
+#
 # This program is distributed in the hope that it will be useful, but WITHOUT
 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 # FOR A PARTICULAR PURPOSE.  See either the GNU General Public License or the
diff --git a/macros/parserAutoStrings.pl b/macros/parserAutoStrings.pl
index e260701d73..b5bd26b4e7 100644
--- a/macros/parserAutoStrings.pl
+++ b/macros/parserAutoStrings.pl
@@ -1,13 +1,12 @@
 ################################################################################
 # WeBWorK Online Homework Delivery System
-# Copyright © 2000-2018 The WeBWorK Project, http://openwebwork.sf.net/
-# $CVSHeader$
-# 
+# Copyright © 2000-2022 The WeBWorK Project, https://github.com/openwebwork
+#
 # This program is free software; you can redistribute it and/or modify it under
 # the terms of either: (a) the GNU General Public License as published by the
 # Free Software Foundation; either version 2, or (at your option) any later
 # version, or (b) the "Artistic License" which comes with this package.
-# 
+#
 # This program is distributed in the hope that it will be useful, but WITHOUT
 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 # FOR A PARTICULAR PURPOSE.  See either the GNU General Public License or the
diff --git a/macros/parserCustomization.pl b/macros/parserCustomization.pl
index e57172b3f3..f28e64528a 100644
--- a/macros/parserCustomization.pl
+++ b/macros/parserCustomization.pl
@@ -1,13 +1,12 @@
 ################################################################################
 # WeBWorK Online Homework Delivery System
-# Copyright © 2000-2018 The WeBWorK Project, http://openwebwork.sf.net/
-# $CVSHeader$
-# 
+# Copyright © 2000-2022 The WeBWorK Project, https://github.com/openwebwork
+#
 # This program is free software; you can redistribute it and/or modify it under
 # the terms of either: (a) the GNU General Public License as published by the
 # Free Software Foundation; either version 2, or (at your option) any later
 # version, or (b) the "Artistic License" which comes with this package.
-# 
+#
 # This program is distributed in the hope that it will be useful, but WITHOUT
 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 # FOR A PARTICULAR PURPOSE.  See either the GNU General Public License or the
diff --git a/macros/parserDifferenceQuotient.pl b/macros/parserDifferenceQuotient.pl
index 048c5f1371..7f0d4b4c48 100644
--- a/macros/parserDifferenceQuotient.pl
+++ b/macros/parserDifferenceQuotient.pl
@@ -1,13 +1,12 @@
 ################################################################################
 # WeBWorK Online Homework Delivery System
-# Copyright © 2000-2018 The WeBWorK Project, http://openwebwork.sf.net/
-# $CVSHeader$
-# 
+# Copyright © 2000-2022 The WeBWorK Project, https://github.com/openwebwork
+#
 # This program is free software; you can redistribute it and/or modify it under
 # the terms of either: (a) the GNU General Public License as published by the
 # Free Software Foundation; either version 2, or (at your option) any later
 # version, or (b) the "Artistic License" which comes with this package.
-# 
+#
 # This program is distributed in the hope that it will be useful, but WITHOUT
 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 # FOR A PARTICULAR PURPOSE.  See either the GNU General Public License or the
diff --git a/macros/parserFormulaAnyVar.pl b/macros/parserFormulaAnyVar.pl
index 049661be60..2ae71ded43 100644
--- a/macros/parserFormulaAnyVar.pl
+++ b/macros/parserFormulaAnyVar.pl
@@ -1,13 +1,12 @@
 ################################################################################
 # WeBWorK Online Homework Delivery System
-# Copyright © 2000-2012 The WeBWorK Project, http://openwebwork.sf.net/
-# $CVSHeader$
-# 
+# Copyright © 2000-2022 The WeBWorK Project, https://github.com/openwebwork
+#
 # This program is free software; you can redistribute it and/or modify it under
 # the terms of either: (a) the GNU General Public License as published by the
 # Free Software Foundation; either version 2, or (at your option) any later
 # version, or (b) the "Artistic License" which comes with this package.
-# 
+#
 # This program is distributed in the hope that it will be useful, but WITHOUT
 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 # FOR A PARTICULAR PURPOSE.  See either the GNU General Public License or the
diff --git a/macros/parserFormulaUpToConstant.pl b/macros/parserFormulaUpToConstant.pl
index f54e138c67..30db29374e 100644
--- a/macros/parserFormulaUpToConstant.pl
+++ b/macros/parserFormulaUpToConstant.pl
@@ -1,13 +1,12 @@
 ################################################################################
 # WeBWorK Online Homework Delivery System
-# Copyright © 2000-2018 The WeBWorK Project, http://openwebwork.sf.net/
-# $CVSHeader: pg/macros/parserFormulaUpToConstant.pl,v 1.23 2010/02/08 13:56:09 dpvc Exp $
-# 
+# Copyright © 2000-2022 The WeBWorK Project, https://github.com/openwebwork
+#
 # This program is free software; you can redistribute it and/or modify it under
 # the terms of either: (a) the GNU General Public License as published by the
 # Free Software Foundation; either version 2, or (at your option) any later
 # version, or (b) the "Artistic License" which comes with this package.
-# 
+#
 # This program is distributed in the hope that it will be useful, but WITHOUT
 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 # FOR A PARTICULAR PURPOSE.  See either the GNU General Public License or the
diff --git a/macros/parserFormulaWithUnits.pl b/macros/parserFormulaWithUnits.pl
index 556648c743..4eeba49335 100644
--- a/macros/parserFormulaWithUnits.pl
+++ b/macros/parserFormulaWithUnits.pl
@@ -1,13 +1,12 @@
 ################################################################################
 # WeBWorK Online Homework Delivery System
-# Copyright © 2000-2018 The WeBWorK Project, http://openwebwork.sf.net/
-# $CVSHeader$
-# 
+# Copyright © 2000-2022 The WeBWorK Project, https://github.com/openwebwork
+#
 # This program is free software; you can redistribute it and/or modify it under
 # the terms of either: (a) the GNU General Public License as published by the
 # Free Software Foundation; either version 2, or (at your option) any later
 # version, or (b) the "Artistic License" which comes with this package.
-# 
+#
 # This program is distributed in the hope that it will be useful, but WITHOUT
 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 # FOR A PARTICULAR PURPOSE.  See either the GNU General Public License or the
diff --git a/macros/parserFunction.pl b/macros/parserFunction.pl
index b407c11d4d..13458982a1 100644
--- a/macros/parserFunction.pl
+++ b/macros/parserFunction.pl
@@ -1,13 +1,12 @@
 ################################################################################
 # WeBWorK Online Homework Delivery System
-# Copyright © 2000-2018 The WeBWorK Project, http://openwebwork.sf.net/
-# $CVSHeader$
-# 
+# Copyright © 2000-2022 The WeBWorK Project, https://github.com/openwebwork
+#
 # This program is free software; you can redistribute it and/or modify it under
 # the terms of either: (a) the GNU General Public License as published by the
 # Free Software Foundation; either version 2, or (at your option) any later
 # version, or (b) the "Artistic License" which comes with this package.
-# 
+#
 # This program is distributed in the hope that it will be useful, but WITHOUT
 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 # FOR A PARTICULAR PURPOSE.  See either the GNU General Public License or the
diff --git a/macros/parserFunctionPrime.pl b/macros/parserFunctionPrime.pl
index 2382d183d6..a02183a4dc 100644
--- a/macros/parserFunctionPrime.pl
+++ b/macros/parserFunctionPrime.pl
@@ -1,7 +1,6 @@
 ################################################################################
 # WeBWorK Online Homework Delivery System
-# Copyright © 2000-2012 The WeBWorK Project, http://openwebwork.sf.net/
-# $CVSHeader$
+# Copyright © 2000-2022 The WeBWorK Project, https://github.com/openwebwork
 #
 # This program is free software; you can redistribute it and/or modify it under
 # the terms of either: (a) the GNU General Public License as published by the
diff --git a/macros/parserGraphTool.pl b/macros/parserGraphTool.pl
index 9741945c15..1edfd21dd0 100644
--- a/macros/parserGraphTool.pl
+++ b/macros/parserGraphTool.pl
@@ -1,6 +1,6 @@
 ################################################################################
 # WeBWorK Online Homework Delivery System
-# Copyright © 2000-2020 The WeBWorK Project, http://openwebwork.sf.net/
+# Copyright © 2000-2022 The WeBWorK Project, https://github.com/openwebwork
 #
 # This program is free software; you can redistribute it and/or modify it under
 # the terms of either: (a) the GNU General Public License as published by the
diff --git a/macros/parserImplicitEquation.pl b/macros/parserImplicitEquation.pl
index 269d8edad1..7e66a5c70a 100644
--- a/macros/parserImplicitEquation.pl
+++ b/macros/parserImplicitEquation.pl
@@ -1,13 +1,12 @@
 ################################################################################
 # WeBWorK Online Homework Delivery System
-# Copyright © 2000-2018 The WeBWorK Project, http://openwebwork.sf.net/
-# $CVSHeader: pg/macros/parserImplicitEquation.pl,v 1.14 2009/06/25 23:28:44 gage Exp $
-# 
+# Copyright © 2000-2022 The WeBWorK Project, https://github.com/openwebwork
+#
 # This program is free software; you can redistribute it and/or modify it under
 # the terms of either: (a) the GNU General Public License as published by the
 # Free Software Foundation; either version 2, or (at your option) any later
 # version, or (b) the "Artistic License" which comes with this package.
-# 
+#
 # This program is distributed in the hope that it will be useful, but WITHOUT
 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 # FOR A PARTICULAR PURPOSE.  See either the GNU General Public License or the
diff --git a/macros/parserImplicitPlane.pl b/macros/parserImplicitPlane.pl
index 50a8111c5f..f482f23b76 100644
--- a/macros/parserImplicitPlane.pl
+++ b/macros/parserImplicitPlane.pl
@@ -1,13 +1,12 @@
 ################################################################################
 # WeBWorK Online Homework Delivery System
-# Copyright © 2000-2018 The WeBWorK Project, http://openwebwork.sf.net/
-# $CVSHeader$
-# 
+# Copyright © 2000-2022 The WeBWorK Project, https://github.com/openwebwork
+#
 # This program is free software; you can redistribute it and/or modify it under
 # the terms of either: (a) the GNU General Public License as published by the
 # Free Software Foundation; either version 2, or (at your option) any later
 # version, or (b) the "Artistic License" which comes with this package.
-# 
+#
 # This program is distributed in the hope that it will be useful, but WITHOUT
 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 # FOR A PARTICULAR PURPOSE.  See either the GNU General Public License or the
diff --git a/macros/parserLinearInequality.pl b/macros/parserLinearInequality.pl
index 943edcf6dd..6bcd34b3e4 100644
--- a/macros/parserLinearInequality.pl
+++ b/macros/parserLinearInequality.pl
@@ -1,13 +1,12 @@
 ################################################################################
 # WeBWorK Online Homework Delivery System
-# Copyright © 2000-2018 The WeBWorK Project, http://openwebwork.sf.net/
-# $CVSHeader$
-# 
+# Copyright © 2000-2022 The WeBWorK Project, https://github.com/openwebwork
+#
 # This program is free software; you can redistribute it and/or modify it under
 # the terms of either: (a) the GNU General Public License as published by the
 # Free Software Foundation; either version 2, or (at your option) any later
 # version, or (b) the "Artistic License" which comes with this package.
-# 
+#
 # This program is distributed in the hope that it will be useful, but WITHOUT
 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 # FOR A PARTICULAR PURPOSE.  See either the GNU General Public License or the
diff --git a/macros/parserMultiAnswer.pl b/macros/parserMultiAnswer.pl
index 7d8670177a..b37a547ae0 100644
--- a/macros/parserMultiAnswer.pl
+++ b/macros/parserMultiAnswer.pl
@@ -1,13 +1,12 @@
 ################################################################################
 # WeBWorK Online Homework Delivery System
-# Copyright © 2000-2018 The WeBWorK Project, http://openwebwork.sf.net/
-# $CVSHeader: pg/macros/parserMultiAnswer.pl,v 1.11 2009/06/25 23:28:44 gage Exp $
-# 
+# Copyright © 2000-2022 The WeBWorK Project, https://github.com/openwebwork
+#
 # This program is free software; you can redistribute it and/or modify it under
 # the terms of either: (a) the GNU General Public License as published by the
 # Free Software Foundation; either version 2, or (at your option) any later
 # version, or (b) the "Artistic License" which comes with this package.
-# 
+#
 # This program is distributed in the hope that it will be useful, but WITHOUT
 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 # FOR A PARTICULAR PURPOSE.  See either the GNU General Public License or the
diff --git a/macros/parserMultiPart.pl b/macros/parserMultiPart.pl
index f5a1937e12..77b2196a76 100644
--- a/macros/parserMultiPart.pl
+++ b/macros/parserMultiPart.pl
@@ -1,13 +1,12 @@
 ################################################################################
 # WeBWorK Online Homework Delivery System
-# Copyright © 2000-2018 The WeBWorK Project, http://openwebwork.sf.net/
-# $CVSHeader$
-# 
+# Copyright © 2000-2022 The WeBWorK Project, https://github.com/openwebwork
+#
 # This program is free software; you can redistribute it and/or modify it under
 # the terms of either: (a) the GNU General Public License as published by the
 # Free Software Foundation; either version 2, or (at your option) any later
 # version, or (b) the "Artistic License" which comes with this package.
-# 
+#
 # This program is distributed in the hope that it will be useful, but WITHOUT
 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 # FOR A PARTICULAR PURPOSE.  See either the GNU General Public License or the
diff --git a/macros/parserNumberWithUnits.pl b/macros/parserNumberWithUnits.pl
index 3d58bae5b1..6c8169bbea 100644
--- a/macros/parserNumberWithUnits.pl
+++ b/macros/parserNumberWithUnits.pl
@@ -1,13 +1,12 @@
 ################################################################################
 # WeBWorK Online Homework Delivery System
-# Copyright © 2000-2018 The WeBWorK Project, http://openwebwork.sf.net/
-# $CVSHeader$
-# 
+# Copyright © 2000-2022 The WeBWorK Project, https://github.com/openwebwork
+#
 # This program is free software; you can redistribute it and/or modify it under
 # the terms of either: (a) the GNU General Public License as published by the
 # Free Software Foundation; either version 2, or (at your option) any later
 # version, or (b) the "Artistic License" which comes with this package.
-# 
+#
 # This program is distributed in the hope that it will be useful, but WITHOUT
 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 # FOR A PARTICULAR PURPOSE.  See either the GNU General Public License or the
diff --git a/macros/parserOneOf.pl b/macros/parserOneOf.pl
index 424d496d09..5033cce410 100644
--- a/macros/parserOneOf.pl
+++ b/macros/parserOneOf.pl
@@ -1,13 +1,12 @@
 ################################################################################
 # WeBWorK Online Homework Delivery System
-# Copyright © 2000-2012 The WeBWorK Project, http://openwebwork.sf.net/
-# $CVSHeader$
-# 
+# Copyright © 2000-2022 The WeBWorK Project, https://github.com/openwebwork
+#
 # This program is free software; you can redistribute it and/or modify it under
 # the terms of either: (a) the GNU General Public License as published by the
 # Free Software Foundation; either version 2, or (at your option) any later
 # version, or (b) the "Artistic License" which comes with this package.
-# 
+#
 # This program is distributed in the hope that it will be useful, but WITHOUT
 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 # FOR A PARTICULAR PURPOSE.  See either the GNU General Public License or the
diff --git a/macros/parserParametricLine.pl b/macros/parserParametricLine.pl
index 9cda736bc5..b903df6242 100644
--- a/macros/parserParametricLine.pl
+++ b/macros/parserParametricLine.pl
@@ -1,13 +1,12 @@
 ################################################################################
 # WeBWorK Online Homework Delivery System
-# Copyright © 2000-2018 The WeBWorK Project, http://openwebwork.sf.net/
-# $CVSHeader: pg/macros/parserParametricLine.pl,v 1.17 2009/06/25 23:28:44 gage Exp $
-# 
+# Copyright © 2000-2022 The WeBWorK Project, https://github.com/openwebwork
+#
 # This program is free software; you can redistribute it and/or modify it under
 # the terms of either: (a) the GNU General Public License as published by the
 # Free Software Foundation; either version 2, or (at your option) any later
 # version, or (b) the "Artistic License" which comes with this package.
-# 
+#
 # This program is distributed in the hope that it will be useful, but WITHOUT
 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 # FOR A PARTICULAR PURPOSE.  See either the GNU General Public License or the
diff --git a/macros/parserParametricPlane.pl b/macros/parserParametricPlane.pl
index 8c64772d31..ec6447221e 100644
--- a/macros/parserParametricPlane.pl
+++ b/macros/parserParametricPlane.pl
@@ -1,13 +1,12 @@
 ################################################################################
 # WeBWorK Online Homework Delivery System
-# Copyright © 2000-2013 The WeBWorK Project, http://openwebwork.sf.net/
-# $CVSHeader: pg/macros/parserParametricLine.pl,v 1.17 2009/06/25 23:28:44 gage Exp $
-# 
+# Copyright © 2000-2022 The WeBWorK Project, https://github.com/openwebwork
+#
 # This program is free software; you can redistribute it and/or modify it under
 # the terms of either: (a) the GNU General Public License as published by the
 # Free Software Foundation; either version 2, or (at your option) any later
 # version, or (b) the "Artistic License" which comes with this package.
-# 
+#
 # This program is distributed in the hope that it will be useful, but WITHOUT
 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 # FOR A PARTICULAR PURPOSE.  See either the GNU General Public License or the
diff --git a/macros/parserPopUp.pl b/macros/parserPopUp.pl
index f8781a6861..25aa271d9a 100644
--- a/macros/parserPopUp.pl
+++ b/macros/parserPopUp.pl
@@ -1,13 +1,12 @@
 ################################################################################
 # WeBWorK Online Homework Delivery System
-# Copyright © 2000-2018 The WeBWorK Project, http://openwebwork.sf.net/
-# $CVSHeader: pg/macros/parserPopUp.pl,v 1.10 2009/06/25 23:28:44 gage Exp $
-# 
+# Copyright © 2000-2022 The WeBWorK Project, https://github.com/openwebwork
+#
 # This program is free software; you can redistribute it and/or modify it under
 # the terms of either: (a) the GNU General Public License as published by the
 # Free Software Foundation; either version 2, or (at your option) any later
 # version, or (b) the "Artistic License" which comes with this package.
-# 
+#
 # This program is distributed in the hope that it will be useful, but WITHOUT
 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 # FOR A PARTICULAR PURPOSE.  See either the GNU General Public License or the
diff --git a/macros/parserPrime.pl b/macros/parserPrime.pl
index 089debb573..81deebfe05 100644
--- a/macros/parserPrime.pl
+++ b/macros/parserPrime.pl
@@ -1,13 +1,12 @@
 ################################################################################
 # WeBWorK Online Homework Delivery System
-# Copyright © 2000-2009 The WeBWorK Project, http://openwebwork.sf.net/
-# $CVSHeader: pg/macros/parserPrime.pl,v 1.2 2009/10/03 15:58:49 dpvc Exp $
-# 
+# Copyright © 2000-2022 The WeBWorK Project, https://github.com/openwebwork
+#
 # This program is free software; you can redistribute it and/or modify it under
 # the terms of either: (a) the GNU General Public License as published by the
 # Free Software Foundation; either version 2, or (at your option) any later
 # version, or (b) the "Artistic License" which comes with this package.
-# 
+#
 # This program is distributed in the hope that it will be useful, but WITHOUT
 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 # FOR A PARTICULAR PURPOSE.  See either the GNU General Public License or the
diff --git a/macros/parserRadioButtons.pl b/macros/parserRadioButtons.pl
index 751eb618b6..f3a9e90dad 100644
--- a/macros/parserRadioButtons.pl
+++ b/macros/parserRadioButtons.pl
@@ -1,7 +1,6 @@
 ################################################################################
 # WeBWorK Online Homework Delivery System
-# Copyright © 2000-2018 The WeBWorK Project, http://openwebwork.sf.net/
-# $CVSHeader$
+# Copyright © 2000-2022 The WeBWorK Project, https://github.com/openwebwork
 #
 # This program is free software; you can redistribute it and/or modify it under
 # the terms of either: (a) the GNU General Public License as published by the
diff --git a/macros/parserRoot.pl b/macros/parserRoot.pl
index 122beb9f01..30a7563e41 100644
--- a/macros/parserRoot.pl
+++ b/macros/parserRoot.pl
@@ -1,13 +1,12 @@
 ################################################################################
 # WeBWorK Online Homework Delivery System
-# Copyright © 2000-2013 The WeBWorK Project, http://openwebwork.sf.net/
-# $CVSHeader$
-# 
+# Copyright © 2000-2022 The WeBWorK Project, https://github.com/openwebwork
+#
 # This program is free software; you can redistribute it and/or modify it under
 # the terms of either: (a) the GNU General Public License as published by the
 # Free Software Foundation; either version 2, or (at your option) any later
 # version, or (b) the "Artistic License" which comes with this package.
-# 
+#
 # This program is distributed in the hope that it will be useful, but WITHOUT
 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 # FOR A PARTICULAR PURPOSE.  See either the GNU General Public License or the
diff --git a/macros/parserSolutionFor.pl b/macros/parserSolutionFor.pl
index 894058f09e..6cf8778831 100644
--- a/macros/parserSolutionFor.pl
+++ b/macros/parserSolutionFor.pl
@@ -1,13 +1,12 @@
 ################################################################################
 # WeBWorK Online Homework Delivery System
-# Copyright © 2000-2018 The WeBWorK Project, http://openwebwork.sf.net/
-# $CVSHeader$
-# 
+# Copyright © 2000-2022 The WeBWorK Project, https://github.com/openwebwork
+#
 # This program is free software; you can redistribute it and/or modify it under
 # the terms of either: (a) the GNU General Public License as published by the
 # Free Software Foundation; either version 2, or (at your option) any later
 # version, or (b) the "Artistic License" which comes with this package.
-# 
+#
 # This program is distributed in the hope that it will be useful, but WITHOUT
 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 # FOR A PARTICULAR PURPOSE.  See either the GNU General Public License or the
diff --git a/macros/parserVectorUtils.pl b/macros/parserVectorUtils.pl
index f43061561f..c554c81518 100644
--- a/macros/parserVectorUtils.pl
+++ b/macros/parserVectorUtils.pl
@@ -1,13 +1,12 @@
 ################################################################################
 # WeBWorK Online Homework Delivery System
-# Copyright © 2000-2018 The WeBWorK Project, http://openwebwork.sf.net/
-# $CVSHeader$
-# 
+# Copyright © 2000-2022 The WeBWorK Project, https://github.com/openwebwork
+#
 # This program is free software; you can redistribute it and/or modify it under
 # the terms of either: (a) the GNU General Public License as published by the
 # Free Software Foundation; either version 2, or (at your option) any later
 # version, or (b) the "Artistic License" which comes with this package.
-# 
+#
 # This program is distributed in the hope that it will be useful, but WITHOUT
 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 # FOR A PARTICULAR PURPOSE.  See either the GNU General Public License or the
diff --git a/macros/parserWordCompletion.pl b/macros/parserWordCompletion.pl
index d55ce6dbc0..5c556cbbc7 100644
--- a/macros/parserWordCompletion.pl
+++ b/macros/parserWordCompletion.pl
@@ -1,13 +1,12 @@
 ################################################################################
 # WeBWorK Online Homework Delivery System
-# Copyright � 2000-2015 The WeBWorK Project, http://openwebwork.sf.net/
-# $CVSHeader: pg/macros/parserWordCompletion.pl,v 1.0 2015/11/25 23:28:44 paultpearson Exp $
-# 
+# Copyright © 2000-2022 The WeBWorK Project, https://github.com/openwebwork
+#
 # This program is free software; you can redistribute it and/or modify it under
 # the terms of either: (a) the GNU General Public License as published by the
 # Free Software Foundation; either version 2, or (at your option) any later
 # version, or (b) the "Artistic License" which comes with this package.
-# 
+#
 # This program is distributed in the hope that it will be useful, but WITHOUT
 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 # FOR A PARTICULAR PURPOSE.  See either the GNU General Public License or the
diff --git a/macros/problemPanic.pl b/macros/problemPanic.pl
index 4a398a63ac..fe11f3544a 100644
--- a/macros/problemPanic.pl
+++ b/macros/problemPanic.pl
@@ -1,13 +1,12 @@
 ################################################################################
 # WeBWorK Online Homework Delivery System
-# Copyright © 2009 The WeBWorK Project, http://openwebwork.sf.net/
-# $CVSHeader: pg/macros/problemPanic.pl,v 1.6 2010/04/27 02:00:37 dpvc Exp $
-# 
+# Copyright © 2000-2022 The WeBWorK Project, https://github.com/openwebwork
+#
 # This program is free software; you can redistribute it and/or modify it under
 # the terms of either: (a) the GNU General Public License as published by the
 # Free Software Foundation; either version 2, or (at your option) any later
 # version, or (b) the "Artistic License" which comes with this package.
-# 
+#
 # This program is distributed in the hope that it will be useful, but WITHOUT
 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 # FOR A PARTICULAR PURPOSE.  See either the GNU General Public License or the
diff --git a/macros/problemPreserveAnswers.pl b/macros/problemPreserveAnswers.pl
index ad72195a2d..9ba7752c1a 100644
--- a/macros/problemPreserveAnswers.pl
+++ b/macros/problemPreserveAnswers.pl
@@ -1,13 +1,12 @@
 ################################################################################
 # WeBWorK Online Homework Delivery System
-# Copyright © 2000-2018 The WeBWorK Project, http://openwebwork.sf.net/
-# $CVSHeader$
-# 
+# Copyright © 2000-2022 The WeBWorK Project, https://github.com/openwebwork
+#
 # This program is free software; you can redistribute it and/or modify it under
 # the terms of either: (a) the GNU General Public License as published by the
 # Free Software Foundation; either version 2, or (at your option) any later
 # version, or (b) the "Artistic License" which comes with this package.
-# 
+#
 # This program is distributed in the hope that it will be useful, but WITHOUT
 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 # FOR A PARTICULAR PURPOSE.  See either the GNU General Public License or the
diff --git a/macros/problemRandomize.pl b/macros/problemRandomize.pl
index 092e391949..e996990d4b 100644
--- a/macros/problemRandomize.pl
+++ b/macros/problemRandomize.pl
@@ -1,13 +1,12 @@
 ################################################################################
 # WeBWorK Online Homework Delivery System
-# Copyright © 2000-2018 The WeBWorK Project, http://openwebwork.sf.net/
-# $CVSHeader: pg/macros/problemRandomize.pl,v 1.12 2009/06/25 23:28:44 gage Exp $
-# 
+# Copyright © 2000-2022 The WeBWorK Project, https://github.com/openwebwork
+#
 # This program is free software; you can redistribute it and/or modify it under
 # the terms of either: (a) the GNU General Public License as published by the
 # Free Software Foundation; either version 2, or (at your option) any later
 # version, or (b) the "Artistic License" which comes with this package.
-# 
+#
 # This program is distributed in the hope that it will be useful, but WITHOUT
 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 # FOR A PARTICULAR PURPOSE.  See either the GNU General Public License or the
diff --git a/macros/scaffold.pl b/macros/scaffold.pl
index 1b7d2b5cc7..54aba86773 100644
--- a/macros/scaffold.pl
+++ b/macros/scaffold.pl
@@ -1,6 +1,6 @@
 ################################################################################
 # WeBWorK Online Homework Delivery System
-# Copyright © 2000-2021 The WeBWorK Project, https://github.com/openwebwork
+# Copyright © 2000-2022 The WeBWorK Project, https://github.com/openwebwork
 #
 # This program is free software; you can redistribute it and/or modify it under
 # the terms of either: (a) the GNU General Public License as published by the