@hep.over('<STR_LIT>', '<STR_LIT>')<EOL>def public_notes(self, key, value):
def _means_not_curated(public_note):<EOL><INDENT>return public_note in [<EOL>'<STR_LIT>',<EOL>'<STR_LIT>',<EOL>'<STR_LIT>',<EOL>'<STR_LIT>',<EOL>'<STR_LIT>',<EOL>'<STR_LIT>',<EOL>]<EOL><DEDENT>public_notes = self.get('<STR_LIT>', [])<EOL>thesis_info = self.get('<STR_LIT>', {})<EOL>source = force_single_element(value.get('<STR_LIT>', '<STR_LIT>'))<EOL>for value in force_list(value):<EOL><INDENT>for public_note in force_list(value.get('<STR_LIT:a>')):<EOL><INDENT>match = IS_DEFENSE_DATE.match(public_note)<EOL>if match:<EOL><INDENT>try:<EOL><INDENT>thesis_info['<STR_LIT>'] = normalize_date(match.group('<STR_LIT>'))<EOL><DEDENT>except ValueError:<EOL><INDENT>public_notes.append({<EOL>'<STR_LIT:source>': source,<EOL>'<STR_LIT:value>': public_note,<EOL>})<EOL><DEDENT><DEDENT>elif _means_not_curated(public_note):<EOL><INDENT>self['<STR_LIT>'] = False<EOL><DEDENT>else:<EOL><INDENT>public_notes.append({<EOL>'<STR_LIT:source>': source,<EOL>'<STR_LIT:value>': public_note,<EOL>})<EOL><DEDENT><DEDENT><DEDENT>self['<STR_LIT>'] = thesis_info<EOL>return public_notes<EOL>
Populate the ``public_notes`` key.

    Also populates the ``curated`` and ``thesis_info`` keys through side effects.