From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.io!.POSTED.blaine.gmane.org!not-for-mail From: Yuan Fu Newsgroups: gmane.emacs.bugs Subject: bug#64830: 30.0.50 C++ treesitter mode no coloration Date: Tue, 27 Aug 2024 22:36:46 -0700 Message-ID: <29FFAE70-8B01-47CF-A45A-D01C82C56247@gmail.com> References: <86h6bk5nnu.fsf@gnu.org> <3C502C2B-829D-42C3-A74A-2A783F5880CE@gmail.com> <868qwjjhq3.fsf@gnu.org> <78DD1528-A12B-4199-9822-157852080027@gmail.com> <86wmk2i2vp.fsf@gnu.org> Mime-Version: 1.0 (Mac OS X Mail 16.0 \(3776.700.51\)) Content-Type: multipart/mixed; boundary="Apple-Mail=_FB2050F0-2426-4505-98DF-FBF849D5E9CD" Injection-Info: ciao.gmane.io; posting-host="blaine.gmane.org:116.202.254.214"; logging-data="37307"; mail-complaints-to="usenet@ciao.gmane.io" Cc: 64830@debbugs.gnu.org, Alan Mackenzie , Stefan Kangas To: Eli Zaretskii Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Wed Aug 28 07:39:29 2024 Return-path: Envelope-to: geb-bug-gnu-emacs@m.gmane-mx.org Original-Received: from lists.gnu.org ([209.51.188.17]) by ciao.gmane.io with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1sjBOz-0009XK-7y for geb-bug-gnu-emacs@m.gmane-mx.org; Wed, 28 Aug 2024 07:39:29 +0200 Original-Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1sjBOi-000250-7a; Wed, 28 Aug 2024 01:39:12 -0400 Original-Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1sjBOe-00024W-Va for bug-gnu-emacs@gnu.org; Wed, 28 Aug 2024 01:39:09 -0400 Original-Received: from debbugs.gnu.org ([2001:470:142:5::43]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1sjBOe-0000e0-JH for bug-gnu-emacs@gnu.org; Wed, 28 Aug 2024 01:39:08 -0400 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=debbugs.gnu.org; s=debbugs-gnu-org; h=References:In-Reply-To:Date:Mime-Version:From:To:Subject; bh=+ttDfpdoKtFgYaQzueD4HDhu0PULQgyH02m01LXtXC0=; b=YQ/QwVJNtVwp/3sTVyOt/1iQeg5ki4EAORlTYUrYE6cC3vXsf5BuyBDIZTWFn4UmbvU8WWRyc7wkyuVeFlgTdhNlftge3bD52CmEwiiyuPdpCZH9QVl+GCJgj9ej8y0WrgKtFsFp9w+B2k8mhh2/QMMUzQqQy/vUQbhZHG0qc/hq50dGWxI5qIqT2BGb7qjVvxlBb72pQBcY74Uak0Y+zlfmtAKjyWGKLCwNY9hqFtgk2c20vH7X2mmQ4rrUOY94h0a9ExXCjEoEJmQb9Y+uF/DyXaeiAJkM1bQ6nooqMQsgbD9IotwyW6v71fGtAKrAi8o6zEwla2cyd3X82mk9rg==; Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1sjBPV-0007PL-Sk for bug-gnu-emacs@gnu.org; Wed, 28 Aug 2024 01:40:01 -0400 X-Loop: help-debbugs@gnu.org Resent-From: Yuan Fu Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Wed, 28 Aug 2024 05:40:01 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 64830 X-GNU-PR-Package: emacs Original-Received: via spool by 64830-submit@debbugs.gnu.org id=B64830.172482354328396 (code B ref 64830); Wed, 28 Aug 2024 05:40:01 +0000 Original-Received: (at 64830) by debbugs.gnu.org; 28 Aug 2024 05:39:03 +0000 Original-Received: from localhost ([127.0.0.1]:48038 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1sjBOZ-0007Nw-Gl for submit@debbugs.gnu.org; Wed, 28 Aug 2024 01:39:03 -0400 Original-Received: from mail-pf1-f175.google.com ([209.85.210.175]:44492) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1sjBOV-0007NM-Sr for 64830@debbugs.gnu.org; Wed, 28 Aug 2024 01:39:02 -0400 Original-Received: by mail-pf1-f175.google.com with SMTP id d2e1a72fcca58-714226888dfso5676761b3a.1 for <64830@debbugs.gnu.org>; Tue, 27 Aug 2024 22:38:06 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1724823420; x=1725428220; darn=debbugs.gnu.org; h=references:to:cc:in-reply-to:date:subject:mime-version:message-id :from:from:to:cc:subject:date:message-id:reply-to; bh=+ttDfpdoKtFgYaQzueD4HDhu0PULQgyH02m01LXtXC0=; b=IbI1oWEmu5fFCCa8mSWXhkMQYmXUnUFA4YQ1b/IJJLtqOZkp5cbU/60EoX8J8JuUDk jvBu+7hs43liBtabrWgrdDwVrSQQHbVIob4JrHzeAXe+PTpCSnA4w8AMZK5wLknF3pqc T/u67uaf3RNkNhzohuocaJiUqtgZ+xivMsSC5iOARM+GLCQ203Vx6PktHRDfbXisMJ0q c2UYkZkBUch7ep0DpUnU0RWv9bgodAQ4PaLcahIo6/g3ywoV2NlcthzER1M+6dQyJEhS Ltz2+7bDz7xqLPLjxY1kQItAhtZZ1YrbASrEGADvXP14b+kFmc5w3tHiXa1f6Arq2pSu PRVA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1724823420; x=1725428220; h=references:to:cc:in-reply-to:date:subject:mime-version:message-id :from:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=+ttDfpdoKtFgYaQzueD4HDhu0PULQgyH02m01LXtXC0=; b=Wu2XRdmqRSeMnFUn3PIYp9vcYbzuUgdMYC90MP7Ym1zvLdvF2hrquDrqPTOe1JSoaX J/kthqQF01ZpdsMqkxWMWAwsUM9bR2dHAVHeQMjLTsyH/ZLyzwvrtAfKM0gWGsjfIR2i hrU5GEW5/5LFFALm4GCCovdT28eGTIJfBp/k8et/eLFTzx1PIPQIKWNVElCRwN9AKM+h 9FMbjc/5dQFnTfPow5a2zDFnp+J0Ig+5cl8hSo7UxL2n/VVgC9WLGVKfWmBgnrS5vi1C 9+/iTv1ZquCbb+tRsEuFSYkaWt/g+/ssO7lg152MW0JyhcJcH/1LN+LJzFB6SslE2wm/ DHiA== X-Forwarded-Encrypted: i=1; AJvYcCU9h/cMSqkF5b3j9OZG3SMoTxjC6jHfFkynrQ7gfO4hlg3hF++MLyHRnsQ0n2pznNgF+FZvlA==@debbugs.gnu.org X-Gm-Message-State: AOJu0Yzm6OaFyAWp2+XK1WjFo2H1J5sas53uHLFVjxgHo31zvLn2M4Gl Wx0GeaOFCtBi7Ah6pa3/48jnXhMkg7ZmQ8zpoQAGvvKaDV+MSI7X X-Google-Smtp-Source: AGHT+IE5Tg6YG9S3aQwXqybaBH9Px8mYrVCrqQqVS41Tzh7sbgFKopcrZ6Kq414Yz7MaKpyyfJtn5g== X-Received: by 2002:a05:6a21:a34c:b0:1c4:e0d3:9637 with SMTP id adf61e73a8af0-1cc8a084843mr19893631637.52.1724823420071; Tue, 27 Aug 2024 22:37:00 -0700 (PDT) Original-Received: from smtpclient.apple ([2601:646:8f81:6120:fd58:c8a8:ed8f:39fa]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-2d844619910sm622531a91.29.2024.08.27.22.36.57 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Tue, 27 Aug 2024 22:36:58 -0700 (PDT) In-Reply-To: <86wmk2i2vp.fsf@gnu.org> X-Mailer: Apple Mail (2.3776.700.51) X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list X-BeenThere: bug-gnu-emacs@gnu.org List-Id: "Bug reports for GNU Emacs, the Swiss army knife of text editors" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Original-Sender: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Xref: news.gmane.io gmane.emacs.bugs:290848 Archived-At: --Apple-Mail=_FB2050F0-2426-4505-98DF-FBF849D5E9CD Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset=utf-8 > On Aug 27, 2024, at 5:09=E2=80=AFAM, Eli Zaretskii = wrote: >=20 >> From: Yuan Fu >> Date: Mon, 26 Aug 2024 18:58:13 -0700 >> Cc: Alan Mackenzie , >> Eli Zaretskii , >> 64830@debbugs.gnu.org >>=20 >> I also want a lisp function that can return the location of a loaded = grammar file, would that be an overkill if we have the aforementioned = printing? >=20 > Where/when would such a function be used? For debugging. Eg, to verify that Emacs loaded the grammar file I think = it loaded. Something like (treesit-grammar-location 'c) ; =3D> = =E2=80=9C/opt/local/lib/libtree-sitter-c.dylib=E2=80=9D. Yuan --Apple-Mail=_FB2050F0-2426-4505-98DF-FBF849D5E9CD Content-Disposition: attachment; filename=show-location.patch Content-Type: application/octet-stream; x-unix-mode=0644; name="show-location.patch" Content-Transfer-Encoding: quoted-printable =46rom=20c64dc3e287e3db009589fb27d07d658baca9fe66=20Mon=20Sep=2017=20= 00:00:00=202001=0AFrom:=20Yuan=20Fu=20=0ADate:=20Tue,=20= 27=20Aug=202024=2022:31:42=20-0700=0ASubject:=20[PATCH]=20Add=20= Ftreesit_grammar_location=0A=0A*=20src/treesit.c=20= (treesit_loaded_lang):=20New=20struct.=0A(treesit_load_language):=20= Return=20a=20struct=20instead=20of=20just=20the=20language=0Aobject.=20=20= The=20struct=20contains=20both=20the=20language=20object=20and=20the=20= path=20to=0Athe=20shared=20library.=0A(Ftreesit_language_available_p,=20= Ftreesit_language_abi_version)=0A(treesit_ensure_query_compiled,=20= Ftreesit_parser_create):=20Update=0Acall=20of=20treesit_load_language.=0A= (Ftreesit_grammar_location):=20New=20function.=0A---=0A=20src/treesit.c=20= |=2068=20+++++++++++++++++++++++++++++++++++++++++----------=0A=201=20= file=20changed,=2055=20insertions(+),=2013=20deletions(-)=0A=0Adiff=20= --git=20a/src/treesit.c=20b/src/treesit.c=0Aindex=20= 5aedca44489..56cf8a1075a=20100644=0A---=20a/src/treesit.c=0A+++=20= b/src/treesit.c=0A@@=20-19,6=20+19,7=20@@=20Copyright=20(C)=202021-2024=20= Free=20Software=20Foundation,=20Inc.=0A=20You=20should=20have=20received=20= a=20copy=20of=20the=20GNU=20General=20Public=20License=0A=20along=20with=20= GNU=20Emacs.=20=20If=20not,=20see=20.=20=20= */=0A=20=0A+#include=20=0A=20#include=20=0A=20= #include=20"lisp.h"=0A=20#include=20"buffer.h"=0A@@=20-491,6=20+492,14=20= @@=20treesit_initialize=20(void)=0A=20=0C=0A=20/***=20Loading=20language=20= library=20=20*/=0A=20=0A+struct=20treesit_loaded_lang=0A+{=0A+=20=20/*=20= The=20language=20object.=20=20*/=0A+=20=20TSLanguage=20*lang;=0A+=20=20= /*=20The=20path=20of=20the=20shared=20library.=20=20*/=0A+=20=20const=20= char=20*path;=0A+};=0A+=0A=20/*=20Translate=20a=20symbol=20= treesit-=20to=20a=20C=20name=20treesit_.=20=20*/=0A=20static=20= void=0A=20treesit_symbol_to_c_name=20(char=20*symbol_name)=0A@@=20-575,7=20= +584,7=20@@=20treesit_load_language_push_for_each_suffix=20(Lisp_Object=20= lib_base_name,=0A=20=0A=20=20=20=20If=20error=20occurs,=20return=20NULL=20= and=20fill=20SIGNAL_SYMBOL=20and=20SIGNAL_DATA=0A=20=20=20=20with=20= values=20suitable=20for=20xsignal.=20=20*/=0A-static=20TSLanguage=20*=0A= +static=20struct=20treesit_loaded_lang=0A=20treesit_load_language=20= (Lisp_Object=20language_symbol,=0A=20=09=09=20=20=20=20=20=20=20= Lisp_Object=20*signal_symbol,=20Lisp_Object=20*signal_data)=0A=20{=0A@@=20= -626,6=20+635,7=20@@=20treesit_load_language=20(Lisp_Object=20= language_symbol,=0A=20=20=20dynlib_handle_ptr=20handle;=0A=20=20=20const=20= char=20*error;=0A=20=20=20Lisp_Object=20error_list=20=3D=20Qnil;=0A+=20=20= struct=20treesit_loaded_lang=20loaded_lang=20=3D=20{=20NULL,=20NULL=20};=0A= =20=0A=20=20=20tail=20=3D=20path_candidates;=0A=20=20=20error=20=3D=20= NULL;=0A@@=20-650,7=20+660,7=20@@=20treesit_load_language=20(Lisp_Object=20= language_symbol,=0A=20=20=20=20=20=20=20=20=20=20mismatch.=20=20*/=0A=20=20= =20=20=20=20=20*signal_symbol=20=3D=20Qtreesit_load_language_error;=0A=20= =20=20=20=20=20=20*signal_data=20=3D=20Fcons=20(Qnot_found,=20Fnreverse=20= (error_list));=0A-=20=20=20=20=20=20return=20NULL;=0A+=20=20=20=20=20=20= return=20loaded_lang;=0A=20=20=20=20=20}=0A=20=0A=20=20=20/*=20Load=20= TSLanguage.=20=20*/=0A@@=20-672,7=20+682,7=20@@=20treesit_load_language=20= (Lisp_Object=20language_symbol,=0A=20=20=20=20=20{=0A=20=20=20=20=20=20=20= *signal_symbol=20=3D=20Qtreesit_load_language_error;=0A=20=20=20=20=20=20= =20*signal_data=20=3D=20list2=20(Qsymbol_error,=20build_string=20= (error));=0A-=20=20=20=20=20=20return=20NULL;=0A+=20=20=20=20=20=20= return=20loaded_lang;=0A=20=20=20=20=20}=0A=20=20=20TSLanguage=20*lang=20= =3D=20(*langfn)=20();=0A=20=0A@@=20-685,9=20+695,15=20@@=20= treesit_load_language=20(Lisp_Object=20language_symbol,=0A=20=20=20=20=20= =20=20*signal_symbol=20=3D=20Qtreesit_load_language_error;=0A=20=20=20=20= =20=20=20*signal_data=20=3D=20list2=20(Qversion_mismatch,=0A=20=09=09=09=20= =20=20=20make_fixnum=20(ts_language_version=20(lang)));=0A-=20=20=20=20=20= =20return=20NULL;=0A+=20=20=20=20=20=20return=20loaded_lang;=0A=20=20=20=20= =20}=0A-=20=20return=20lang;=0A+=0A+=20=20Dl_info=20info;=0A+=20=20if=20= (dladdr(langfn,=20&info))=0A+=20=20=20=20loaded_lang.path=20=3D=20= info.dli_fname;=0A+=0A+=20=20loaded_lang.lang=20=3D=20lang;=0A+=20=20= return=20loaded_lang;=0A=20}=0A=20=0A=20DEFUN=20= ("treesit-language-available-p",=20Ftreesit_language_available_p,=0A@@=20= -704,7=20+720,9=20@@=20DEFUN=20("treesit-language-available-p",=20= Ftreesit_language_available_p,=0A=20=20=20treesit_initialize=20();=0A=20=20= =20Lisp_Object=20signal_symbol=20=3D=20Qnil;=0A=20=20=20Lisp_Object=20= signal_data=20=3D=20Qnil;=0A-=20=20if=20(treesit_load_language=20= (language,=20&signal_symbol,=20&signal_data)=20=3D=3D=20NULL)=0A+=20=20= struct=20treesit_loaded_lang=20loaded_lang=0A+=20=20=20=20=3D=20= treesit_load_language=20(language,=20&signal_symbol,=20&signal_data);=0A= +=20=20if=20(loaded_lang.lang=20=3D=3D=20NULL)=0A=20=20=20=20=20{=0A=20=20= =20=20=20=20=20if=20(NILP=20(detail))=0A=20=09return=20Qnil;=0A@@=20= -750,9=20+768,9=20@@=20DEFUN=20("treesit-language-abi-version",=20= Ftreesit_language_abi_version,=0A=20=20=20=20=20{=0A=20=20=20=20=20=20=20= Lisp_Object=20signal_symbol=20=3D=20Qnil;=0A=20=20=20=20=20=20=20= Lisp_Object=20signal_data=20=3D=20Qnil;=0A-=20=20=20=20=20=20TSLanguage=20= *ts_language=20=3D=20treesit_load_language=20(language,=0A-=09=09=09=09=09= =09=20=20=20=20=20=20=20&signal_symbol,=0A-=09=09=09=09=09=09=20=20=20=20= =20=20=20&signal_data);=0A+=20=20=20=20=20=20struct=20= treesit_loaded_lang=20lang=0A+=09=3D=20treesit_load_language=20= (language,=20&signal_symbol,=20&signal_data);=0A+=20=20=20=20=20=20= TSLanguage=20*ts_language=20=3D=20lang.lang;=0A=20=20=20=20=20=20=20if=20= (ts_language=20=3D=3D=20NULL)=0A=20=09return=20Qnil;=0A=20=20=20=20=20=20= =20uint32_t=20version=20=3D=20=20ts_language_version=20(ts_language);=0A= @@=20-760,6=20+778,27=20@@=20DEFUN=20("treesit-language-abi-version",=20= Ftreesit_language_abi_version,=0A=20=20=20=20=20}=0A=20}=0A=20=0A+DEFUN=20= ("treesit-grammar-location",=20Ftreesit_grammar_location,=0A+=20=20=20=20= =20=20=20Streesit_grammar_location,=0A+=20=20=20=20=20=20=201,=201,=200,=0A= +=20=20=20=20=20=20=20doc:=20/*=20Return=20the=20path=20to=20the=20= grammar=20file=20for=20LANGUAGE.=0A+=0A+If=20LANGUAGE=20isn't=20loaded=20= yet,=20load=20it=20first.=20=20If=20the=20langauge=20can't=20be=0A= +loaded=20or=20the=20path=20couldn't=20be=20found,=20return=20nil.=20=20= */)=0A+=20=20(Lisp_Object=20language)=0A+{=0A+=20=20CHECK_SYMBOL=20= (language);=0A+=0A+=20=20Lisp_Object=20signal_symbol=20=3D=20Qnil;=0A+=20= =20Lisp_Object=20signal_data=20=3D=20Qnil;=0A+=20=20struct=20= treesit_loaded_lang=20lang=0A+=20=20=20=20=3D=20treesit_load_language=20= (language,=20&signal_symbol,=20&signal_data);=0A+=0A+=20=20if=20= (!lang.lang=20||=20!lang.path)=20return=20Qnil;=0A+=0A+=20=20return=20= build_string=20(lang.path);=0A+}=0A+=0A=20=0C=0A=20/***=20Parsing=20= functions=20=20*/=0A=20=0A@@=20-1305,8=20+1344,9=20@@=20= treesit_ensure_query_compiled=20(Lisp_Object=20query,=20Lisp_Object=20= *signal_symbol,=0A=20=20=20Lisp_Object=20language=20=3D=20= XTS_COMPILED_QUERY=20(query)->language;=0A=20=20=20/*=20This=20is=20the=20= main=20reason=20why=20we=20compile=20query=20lazily:=20to=20avoid=0A=20=20= =20=20=20=20loading=20languages=20early.=20=20*/=0A-=20=20TSLanguage=20= *treesit_lang=20=3D=20treesit_load_language=20(language,=20= signal_symbol,=0A-=09=09=09=09=09=09=20=20=20=20signal_data);=0A+=20=20= struct=20treesit_loaded_lang=20lang=0A+=20=20=20=20=3D=20= treesit_load_language=20(language,=20signal_symbol,=20signal_data);=0A+=20= =20TSLanguage=20*treesit_lang=20=3D=20lang.lang;=0A=20=20=20if=20= (treesit_lang=20=3D=3D=20NULL)=0A=20=20=20=20=20return=20NULL;=0A=20=0A= @@=20-1477,8=20+1517,9=20@@=20DEFUN=20("treesit-parser-create",=0A=20=20=20= Lisp_Object=20signal_symbol=20=3D=20Qnil;=0A=20=20=20Lisp_Object=20= signal_data=20=3D=20Qnil;=0A=20=20=20TSParser=20*parser=20=3D=20= ts_parser_new=20();=0A-=20=20TSLanguage=20*lang=20=3D=20= treesit_load_language=20(language,=20&signal_symbol,=0A-=09=09=09=09=09=20= =20=20=20&signal_data);=0A+=20=20struct=20treesit_loaded_lang=20= loaded_lang=0A+=20=20=20=20=3D=20treesit_load_language=20(language,=20= &signal_symbol,=20&signal_data);=0A+=20=20TSLanguage=20*lang=20=3D=20= loaded_lang.lang;=0A=20=20=20if=20(lang=20=3D=3D=20NULL)=0A=20=20=20=20=20= xsignal=20(signal_symbol,=20signal_data);=0A=20=20=20/*=20We=20check=20= language=20version=20when=20loading=20a=20language,=20so=20this=20should=0A= @@=20-4275,6=20+4316,7=20@@=20cons=20(REGEXP=20.=20FN),=20which=20is=20a=20= combination=20of=20a=20regexp=20and=20a=20predicate=0A=20=20=20defsubr=20= (&Streesit_language_available_p);=0A=20=20=20defsubr=20= (&Streesit_library_abi_version);=0A=20=20=20defsubr=20= (&Streesit_language_abi_version);=0A+=20=20defsubr=20= (&Streesit_grammar_location);=0A=20=0A=20=20=20defsubr=20= (&Streesit_parser_p);=0A=20=20=20defsubr=20(&Streesit_node_p);=0A--=20=0A= 2.39.5=20(Apple=20Git-151)=0A=0A= --Apple-Mail=_FB2050F0-2426-4505-98DF-FBF849D5E9CD--