The attached patch adds a command named "send2-hook". send2-hook is executed even when recalling or resending messages, and is triggered by any change to the message that can be done from the compose menu. Use case: Set the $sendmail or $envelope_from variables according to the sender of the message, even when that sender is changed from the compose screen. I would welcome suggestions for a better name; other comments are, of course, also welcome. Greetings from the mid-Atlantic, -- Thomas Roessler · Personal soap box at <http://log.does-not-exist.org/>.
Binary files /tmp/mutt-dev/account.o and mutt-dev/account.o differ Binary files /tmp/mutt-dev/addrbook.o and mutt-dev/addrbook.o differ Binary files /tmp/mutt-dev/alias.o and mutt-dev/alias.o differ Binary files /tmp/mutt-dev/attach.o and mutt-dev/attach.o differ Binary files /tmp/mutt-dev/base64.o and mutt-dev/base64.o differ Binary files /tmp/mutt-dev/browser.o and mutt-dev/browser.o differ Binary files /tmp/mutt-dev/buffy.o and mutt-dev/buffy.o differ Binary files /tmp/mutt-dev/charset.o and mutt-dev/charset.o differ Binary files /tmp/mutt-dev/color.o and mutt-dev/color.o differ Binary files /tmp/mutt-dev/commands.o and mutt-dev/commands.o differ Binary files /tmp/mutt-dev/complete.o and mutt-dev/complete.o differ diff -ur /tmp/mutt-dev/compose.c mutt-dev/compose.c --- /tmp/mutt-dev/compose.c 2004-08-30 16:12:15.000000000 -0400 +++ mutt-dev/compose.c 2004-11-29 10:12:45.693224915 -0500 @@ -527,16 +527,20 @@ break; case OP_COMPOSE_EDIT_FROM: menu->redraw = edit_address_list (HDR_FROM, &msg->env->from); + mutt_message_hook (NULL, msg, M_SEND2HOOK); break; case OP_COMPOSE_EDIT_TO: menu->redraw = edit_address_list (HDR_TO, &msg->env->to); - break; + mutt_message_hook (NULL, msg, M_SEND2HOOK); + break; case OP_COMPOSE_EDIT_BCC: menu->redraw = edit_address_list (HDR_BCC, &msg->env->bcc); + mutt_message_hook (NULL, msg, M_SEND2HOOK); break; case OP_COMPOSE_EDIT_CC: menu->redraw = edit_address_list (HDR_CC, &msg->env->cc); - break; + mutt_message_hook (NULL, msg, M_SEND2HOOK); + break; case OP_COMPOSE_EDIT_SUBJECT: if (msg->env->subject) strfcpy (buf, msg->env->subject, sizeof (buf)); @@ -550,9 +554,11 @@ if (msg->env->subject) mutt_paddstr (W, msg->env->subject); } - break; + mutt_message_hook (NULL, msg, M_SEND2HOOK); + break; case OP_COMPOSE_EDIT_REPLY_TO: menu->redraw = edit_address_list (HDR_REPLYTO, &msg->env->reply_to); + mutt_message_hook (NULL, msg, M_SEND2HOOK); break; case OP_COMPOSE_EDIT_FCC: strfcpy (buf, fcc, sizeof (buf)); @@ -565,13 +571,15 @@ fccSet = 1; } MAYBE_REDRAW (menu->redraw); - break; + mutt_message_hook (NULL, msg, M_SEND2HOOK); + break; case OP_COMPOSE_EDIT_MESSAGE: if (Editor && (mutt_strcmp ("builtin", Editor) != 0) && !option (OPTEDITHDRS)) { mutt_edit_file (Editor, msg->content->filename); mutt_update_encoding (msg->content); menu->redraw = REDRAW_CURRENT | REDRAW_STATUS; + mutt_message_hook (NULL, msg, M_SEND2HOOK); break; } /* fall through */ @@ -611,7 +619,8 @@ menu->max = idxlen; } - menu->redraw = REDRAW_FULL; + menu->redraw = REDRAW_FULL; + mutt_message_hook (NULL, msg, M_SEND2HOOK); break; @@ -642,7 +651,8 @@ unset_option(OPTNEEDREDRAW); } - break; + mutt_message_hook (NULL, msg, M_SEND2HOOK); + break; case OP_COMPOSE_ATTACH_FILE: @@ -688,7 +698,8 @@ menu->redraw |= REDRAW_INDEX | REDRAW_STATUS; } - break; + mutt_message_hook (NULL, msg, M_SEND2HOOK); + break; case OP_COMPOSE_ATTACH_MESSAGE: { @@ -794,7 +805,8 @@ Sort = oldSort; SortAux = oldSortAux; } - break; + mutt_message_hook (NULL, msg, M_SEND2HOOK); + break; case OP_DELETE: CHECK_COUNT; @@ -813,7 +825,8 @@ msg->content = idx[0]->content; menu->redraw |= REDRAW_STATUS; - break; + mutt_message_hook (NULL, msg, M_SEND2HOOK); + break; #define CURRENT idx[menu->current]->content @@ -831,6 +844,7 @@ else mutt_message (_("The current attachment will be converted.")); menu->redraw = REDRAW_CURRENT; + mutt_message_hook (NULL, msg, M_SEND2HOOK); break; } #undef CURRENT @@ -847,7 +861,8 @@ mutt_str_replace (&idx[menu->current]->content->description, buf); menu->redraw = REDRAW_CURRENT; } - break; + mutt_message_hook (NULL, msg, M_SEND2HOOK); + break; case OP_COMPOSE_UPDATE_ENCODING: CHECK_COUNT; @@ -866,6 +881,7 @@ mutt_update_encoding(idx[menu->current]->content); menu->redraw = REDRAW_CURRENT | REDRAW_STATUS; } + mutt_message_hook (NULL, msg, M_SEND2HOOK); break; case OP_COMPOSE_TOGGLE_DISPOSITION: @@ -884,7 +900,8 @@ menu->redraw = REDRAW_CURRENT; } - break; + mutt_message_hook (NULL, msg, M_SEND2HOOK); + break; case OP_COMPOSE_EDIT_ENCODING: CHECK_COUNT; @@ -902,9 +919,14 @@ else mutt_error _("Invalid encoding."); } - break; + mutt_message_hook (NULL, msg, M_SEND2HOOK); + break; case OP_COMPOSE_SEND_MESSAGE: + + /* Note: We don't invoke send2-hook here, since we want to leave + * users an opportunity to change settings from the ":" prompt. + */ if(check_attachments(idx, idxlen) != 0) { @@ -936,6 +958,7 @@ mutt_edit_file (NONULL(Editor), idx[menu->current]->content->filename); mutt_update_encoding (idx[menu->current]->content); menu->redraw = REDRAW_CURRENT | REDRAW_STATUS; + mutt_message_hook (NULL, msg, M_SEND2HOOK); break; case OP_COMPOSE_TOGGLE_UNLINK: @@ -951,6 +974,7 @@ menu->current++; # endif menu->redraw = REDRAW_INDEX; + /* No send2hook since this doesn't change the message. */ break; case OP_COMPOSE_GET_ATTACHMENT: @@ -968,6 +992,7 @@ else if (mutt_get_tmp_attachment(idx[menu->current]->content) == 0) menu->redraw = REDRAW_CURRENT; + /* No send2hook since this doesn't change the message. */ break; case OP_COMPOSE_RENAME_FILE: @@ -994,7 +1019,8 @@ mutt_stamp_attachment(idx[menu->current]->content); } - break; + mutt_message_hook (NULL, msg, M_SEND2HOOK); + break; case OP_COMPOSE_NEW_MIME: { @@ -1061,7 +1087,8 @@ menu->redraw = REDRAW_FULL; } } - break; + mutt_message_hook (NULL, msg, M_SEND2HOOK); + break; case OP_COMPOSE_EDIT_MIME: CHECK_COUNT; @@ -1070,24 +1097,28 @@ mutt_update_encoding (idx[menu->current]->content); menu->redraw = REDRAW_FULL; } - break; + mutt_message_hook (NULL, msg, M_SEND2HOOK); + break; case OP_VIEW_ATTACH: case OP_DISPLAY_HEADERS: CHECK_COUNT; mutt_attach_display_loop (menu, op, NULL, NULL, NULL, &idx, &idxlen, NULL, 0); menu->redraw = REDRAW_FULL; + /* no send2hook, since this doesn't modify the message */ break; case OP_SAVE: CHECK_COUNT; mutt_save_attachment_list (NULL, menu->tagprefix, menu->tagprefix ? msg->content : idx[menu->current]->content, NULL, menu); MAYBE_REDRAW (menu->redraw); + /* no send2hook, since this doesn't modify the message */ break; case OP_PRINT: CHECK_COUNT; mutt_print_attachment_list (NULL, menu->tagprefix, menu->tagprefix ? msg->content : idx[menu->current]->content); + /* no send2hook, since this doesn't modify the message */ break; case OP_PIPE: @@ -1095,8 +1126,9 @@ CHECK_COUNT; mutt_pipe_attachment_list (NULL, menu->tagprefix, menu->tagprefix ? msg->content : idx[menu->current]->content, op == OP_FILTER); if (op == OP_FILTER) /* cte might have changed */ - menu->redraw = menu->tagprefix ? REDRAW_FULL : REDRAW_CURRENT; + menu->redraw = menu->tagprefix ? REDRAW_FULL : REDRAW_CURRENT; menu->redraw |= REDRAW_STATUS; + mutt_message_hook (NULL, msg, M_SEND2HOOK); break; case OP_EXIT: @@ -1191,7 +1223,8 @@ } msg->security = crypt_pgp_send_menu (msg, &menu->redraw); redraw_crypt_lines (msg); - break; + mutt_message_hook (NULL, msg, M_SEND2HOOK); + break; case OP_FORGET_PASSPHRASE: @@ -1216,13 +1249,15 @@ } msg->security = crypt_smime_send_menu(msg, &menu->redraw); redraw_crypt_lines (msg); - break; + mutt_message_hook (NULL, msg, M_SEND2HOOK); + break; #ifdef MIXMASTER case OP_COMPOSE_MIX: mix_make_chain (&msg->chain, &menu->redraw); + mutt_message_hook (NULL, msg, M_SEND2HOOK); break; #endif Binary files /tmp/mutt-dev/compose.o and mutt-dev/compose.o differ Binary files /tmp/mutt-dev/copy.o and mutt-dev/copy.o differ Binary files /tmp/mutt-dev/cryptglue.o and mutt-dev/cryptglue.o differ Binary files /tmp/mutt-dev/crypt-mod.o and mutt-dev/crypt-mod.o differ Binary files /tmp/mutt-dev/crypt-mod-pgp-classic.o and mutt-dev/crypt-mod-pgp-classic.o differ Binary files /tmp/mutt-dev/crypt-mod-smime-classic.o and mutt-dev/crypt-mod-smime-classic.o differ Binary files /tmp/mutt-dev/crypt.o and mutt-dev/crypt.o differ Binary files /tmp/mutt-dev/curs_lib.o and mutt-dev/curs_lib.o differ Binary files /tmp/mutt-dev/curs_main.o and mutt-dev/curs_main.o differ Binary files /tmp/mutt-dev/date.o and mutt-dev/date.o differ diff -ur /tmp/mutt-dev/doc/manual-4.html mutt-dev/doc/manual-4.html --- /tmp/mutt-dev/doc/manual-4.html 2004-11-08 03:47:51.000000000 -0500 +++ mutt-dev/doc/manual-4.html 2004-11-29 10:13:06.282829388 -0500 @@ -372,6 +372,14 @@ <A HREF="manual-6.html#auto_tag">$auto_tag</A> variable is set, the next operation applies to the tagged messages automatically, without requiring the ``tag-prefix''.</P> +<P>In +<A HREF="manual-3.html#macro">macros</A> or +<A HREF="manual-3.html#push">push</A> commands, +you can use the ``tag-prefix-cond'' operator. If there are no tagged +messages, mutt will "eat" the rest of the macro to abort it's execution. +Mutt will stop "eating" the macro when it encounters the ``end-cond'' +operator; after this operator the rest of the macro will be executed as +normal.</P> <H2><A NAME="hooks"></A> <A NAME="ss4.4">4.4</A> <A HREF="manual.html#toc4.4">Using Hooks</A> </H2> diff -ur /tmp/mutt-dev/doc/manual-6.html mutt-dev/doc/manual-6.html --- /tmp/mutt-dev/doc/manual-6.html 2004-11-08 03:47:54.000000000 -0500 +++ mutt-dev/doc/manual-6.html 2004-11-29 10:13:08.729425908 -0500 @@ -3709,6 +3709,7 @@ shell-escape ! run a program in a subshell tag-entry t toggle the tag on the current entry tag-prefix ; apply next command to tagged entries +tag-prefix-cond not bound apply next function ONLY to tagged messages top-page H move to the top of the page </PRE> </P> diff -ur /tmp/mutt-dev/doc/manual.sgml mutt-dev/doc/manual.sgml --- /tmp/mutt-dev/doc/manual.sgml 2004-11-08 03:47:45.000000000 -0500 +++ mutt-dev/doc/manual.sgml 2004-11-29 10:13:01.222663883 -0500 @@ -2061,6 +2061,13 @@ variable is set, the next operation applies to the tagged messages automatically, without requiring the ``tag-prefix''. +In <ref id="macro" name="macros"> or <ref id="push" name="push"> commands, +you can use the ``tag-prefix-cond'' operator. If there are no tagged +messages, mutt will "eat" the rest of the macro to abort it's execution. +Mutt will stop "eating" the macro when it encounters the ``end-cond'' +operator; after this operator the rest of the macro will be executed as +normal. + <sect1>Using Hooks<label id="hooks"> <p> A <em/hook/ is a concept borrowed from the EMACS editor which allows you to @@ -6915,6 +6922,7 @@ shell-escape ! run a program in a subshell tag-entry t toggle the tag on the current entry tag-prefix ; apply next command to tagged entries +tag-prefix-cond not bound apply next function ONLY to tagged messages top-page H move to the top of the page </verb> <sect2>index Binary files /tmp/mutt-dev/editmsg.o and mutt-dev/editmsg.o differ Binary files /tmp/mutt-dev/edit.o and mutt-dev/edit.o differ Binary files /tmp/mutt-dev/enter.o and mutt-dev/enter.o differ Binary files /tmp/mutt-dev/extlib.o and mutt-dev/extlib.o differ Binary files /tmp/mutt-dev/filter.o and mutt-dev/filter.o differ Binary files /tmp/mutt-dev/flags.o and mutt-dev/flags.o differ Binary files /tmp/mutt-dev/from.o and mutt-dev/from.o differ Binary files /tmp/mutt-dev/getdomain.o and mutt-dev/getdomain.o differ Binary files /tmp/mutt-dev/gnupgparse.o and mutt-dev/gnupgparse.o differ Binary files /tmp/mutt-dev/handler.o and mutt-dev/handler.o differ Binary files /tmp/mutt-dev/hash.o and mutt-dev/hash.o differ Binary files /tmp/mutt-dev/hdrline.o and mutt-dev/hdrline.o differ Binary files /tmp/mutt-dev/headers.o and mutt-dev/headers.o differ Binary files /tmp/mutt-dev/help.o and mutt-dev/help.o differ Binary files /tmp/mutt-dev/history.o and mutt-dev/history.o differ diff -ur /tmp/mutt-dev/hook.c mutt-dev/hook.c --- /tmp/mutt-dev/hook.c 2004-01-04 04:55:04.000000000 -0500 +++ mutt-dev/hook.c 2004-11-29 10:05:04.174336138 -0500 @@ -66,7 +66,7 @@ goto error; } - mutt_extract_token (&command, s, (data & (M_FOLDERHOOK | M_SENDHOOK | M_ACCOUNTHOOK | M_REPLYHOOK)) ? M_TOKEN_SPACE : 0); + mutt_extract_token (&command, s, (data & (M_FOLDERHOOK | M_SENDHOOK | M_SEND2HOOK | M_ACCOUNTHOOK | M_REPLYHOOK)) ? M_TOKEN_SPACE : 0); if (!command.data) { @@ -117,7 +117,7 @@ ptr->rx.not == not && !mutt_strcmp (pattern.data, ptr->rx.pattern)) { - if (data & (M_FOLDERHOOK | M_SENDHOOK | M_MESSAGEHOOK | M_ACCOUNTHOOK | M_REPLYHOOK)) + if (data & (M_FOLDERHOOK | M_SENDHOOK | M_SEND2HOOK | M_MESSAGEHOOK | M_ACCOUNTHOOK | M_REPLYHOOK)) { /* these hooks allow multiple commands with the same * pattern, so if we've already seen this pattern/command pair, just @@ -146,10 +146,10 @@ break; } - if (data & (M_SENDHOOK | M_SAVEHOOK | M_FCCHOOK | M_MESSAGEHOOK | M_REPLYHOOK)) + if (data & (M_SENDHOOK | M_SEND2HOOK | M_SAVEHOOK | M_FCCHOOK | M_MESSAGEHOOK | M_REPLYHOOK)) { if ((pat = mutt_pattern_comp (pattern.data, - (data & (M_SENDHOOK | M_FCCHOOK)) ? 0 : M_FULL_MSG, + (data & (M_SENDHOOK | M_SEND2HOOK | M_FCCHOOK)) ? 0 : M_FULL_MSG, err)) == NULL) goto error; } Binary files /tmp/mutt-dev/hook.o and mutt-dev/hook.o differ Binary files /tmp/mutt-dev/imap/auth_anon.o and mutt-dev/imap/auth_anon.o differ Binary files /tmp/mutt-dev/imap/auth_cram.o and mutt-dev/imap/auth_cram.o differ Binary files /tmp/mutt-dev/imap/auth_login.o and mutt-dev/imap/auth_login.o differ Binary files /tmp/mutt-dev/imap/auth.o and mutt-dev/imap/auth.o differ Binary files /tmp/mutt-dev/imap/browse.o and mutt-dev/imap/browse.o differ Binary files /tmp/mutt-dev/imap/command.o and mutt-dev/imap/command.o differ Binary files /tmp/mutt-dev/imap/imap.o and mutt-dev/imap/imap.o differ Binary files /tmp/mutt-dev/imap/libimap.a and mutt-dev/imap/libimap.a differ Binary files /tmp/mutt-dev/imap/message.o and mutt-dev/imap/message.o differ Binary files /tmp/mutt-dev/imap/utf7.o and mutt-dev/imap/utf7.o differ Binary files /tmp/mutt-dev/imap/util.o and mutt-dev/imap/util.o differ diff -ur /tmp/mutt-dev/init.h mutt-dev/init.h --- /tmp/mutt-dev/init.h 2004-11-29 10:17:28.609567867 -0500 +++ mutt-dev/init.h 2004-11-29 10:04:01.335699150 -0500 @@ -2876,6 +2876,7 @@ { "save-hook", mutt_parse_hook, M_SAVEHOOK }, { "score", mutt_parse_score, 0 }, { "send-hook", mutt_parse_hook, M_SENDHOOK }, + { "send2-hook", mutt_parse_hook, M_SEND2HOOK }, { "set", parse_set, 0 }, { "source", parse_source, 0 }, { "spam", parse_spam_list, M_SPAM }, Binary files /tmp/mutt-dev/init.o and mutt-dev/init.o differ Binary files /tmp/mutt-dev/keymap.o and mutt-dev/keymap.o differ Binary files /tmp/mutt-dev/lib.o and mutt-dev/lib.o differ Binary files /tmp/mutt-dev/main.o and mutt-dev/main.o differ Binary files /tmp/mutt-dev/mbox.o and mutt-dev/mbox.o differ Binary files /tmp/mutt-dev/mbyte.o and mutt-dev/mbyte.o differ Binary files /tmp/mutt-dev/menu.o and mutt-dev/menu.o differ Binary files /tmp/mutt-dev/mh.o and mutt-dev/mh.o differ Binary files /tmp/mutt-dev/mutt and mutt-dev/mutt differ diff -ur /tmp/mutt-dev/mutt.h mutt-dev/mutt.h --- /tmp/mutt-dev/mutt.h 2004-07-19 18:09:01.000000000 -0400 +++ mutt-dev/mutt.h 2004-11-29 10:04:25.094780929 -0500 @@ -160,6 +160,7 @@ #define M_CRYPTHOOK (1<<8) #define M_ACCOUNTHOOK (1<<9) #define M_REPLYHOOK (1<<10) +#define M_SEND2HOOK (1<<11) /* tree characters for linearize_tree and print_enriched_string */ #define M_TREE_LLCORNER 1 Binary files /tmp/mutt-dev/mutt_idna.o and mutt-dev/mutt_idna.o differ Binary files /tmp/mutt-dev/muttlib.o and mutt-dev/muttlib.o differ Binary files /tmp/mutt-dev/mutt_socket.o and mutt-dev/mutt_socket.o differ Binary files /tmp/mutt-dev/mutt_tunnel.o and mutt-dev/mutt_tunnel.o differ Binary files /tmp/mutt-dev/mx.o and mutt-dev/mx.o differ Binary files /tmp/mutt-dev/pager.o and mutt-dev/pager.o differ Binary files /tmp/mutt-dev/parse.o and mutt-dev/parse.o differ Binary files /tmp/mutt-dev/patchlist.o and mutt-dev/patchlist.o differ Binary files /tmp/mutt-dev/pattern.o and mutt-dev/pattern.o differ Binary files /tmp/mutt-dev/pgpewrap and mutt-dev/pgpewrap differ Binary files /tmp/mutt-dev/pgpinvoke.o and mutt-dev/pgpinvoke.o differ Binary files /tmp/mutt-dev/pgpkey.o and mutt-dev/pgpkey.o differ Binary files /tmp/mutt-dev/pgplib.o and mutt-dev/pgplib.o differ Binary files /tmp/mutt-dev/pgpmicalg.o and mutt-dev/pgpmicalg.o differ Binary files /tmp/mutt-dev/pgp.o and mutt-dev/pgp.o differ Binary files /tmp/mutt-dev/pgppacket.o and mutt-dev/pgppacket.o differ Binary files /tmp/mutt-dev/pgppubring.o and mutt-dev/pgppubring.o differ Binary files /tmp/mutt-dev/pgpring and mutt-dev/pgpring differ Binary files /tmp/mutt-dev/pop_auth.o and mutt-dev/pop_auth.o differ Binary files /tmp/mutt-dev/pop_lib.o and mutt-dev/pop_lib.o differ Binary files /tmp/mutt-dev/pop.o and mutt-dev/pop.o differ Binary files /tmp/mutt-dev/postpone.o and mutt-dev/postpone.o differ Binary files /tmp/mutt-dev/query.o and mutt-dev/query.o differ Binary files /tmp/mutt-dev/recvattach.o and mutt-dev/recvattach.o differ Binary files /tmp/mutt-dev/recvcmd.o and mutt-dev/recvcmd.o differ Binary files /tmp/mutt-dev/resize.o and mutt-dev/resize.o differ Binary files /tmp/mutt-dev/rfc1524.o and mutt-dev/rfc1524.o differ Binary files /tmp/mutt-dev/rfc2047.o and mutt-dev/rfc2047.o differ Binary files /tmp/mutt-dev/rfc2231.o and mutt-dev/rfc2231.o differ Binary files /tmp/mutt-dev/rfc822.o and mutt-dev/rfc822.o differ Binary files /tmp/mutt-dev/score.o and mutt-dev/score.o differ diff -ur /tmp/mutt-dev/send.c mutt-dev/send.c --- /tmp/mutt-dev/send.c 2004-07-19 18:28:58.000000000 -0400 +++ mutt-dev/send.c 2004-11-29 10:15:33.123613192 -0500 @@ -1320,6 +1320,14 @@ if (!(msg->security & (APPLICATION_SMIME|APPLICATION_PGP))) msg->security = 0; } + + /* + * This hook is even called for postponed messages, and can, e.g., be + * used for setting the editor, the sendmail path, or the + * envelope sender. + */ + mutt_message_hook (NULL, msg, M_SEND2HOOK); + /* wait until now to set the real name portion of our return address so that $realname can be set in a send-hook */ if (msg->env->from && !msg->env->from->personal Binary files /tmp/mutt-dev/sendlib.o and mutt-dev/sendlib.o differ Binary files /tmp/mutt-dev/send.o and mutt-dev/send.o differ Binary files /tmp/mutt-dev/signal.o and mutt-dev/signal.o differ Binary files /tmp/mutt-dev/smime.o and mutt-dev/smime.o differ Binary files /tmp/mutt-dev/sort.o and mutt-dev/sort.o differ Binary files /tmp/mutt-dev/status.o and mutt-dev/status.o differ Binary files /tmp/mutt-dev/system.o and mutt-dev/system.o differ Binary files /tmp/mutt-dev/thread.o and mutt-dev/thread.o differ Binary files /tmp/mutt-dev/url.o and mutt-dev/url.o differ Binary files /tmp/mutt-dev/wcwidth.o and mutt-dev/wcwidth.o differ
Attachment:
pgpxIcQlCnDQj.pgp
Description: PGP signature