Unfortunately there were a lot of changes in 2.4, many of which said they were 
to improve performance. We also switched from Java 6 to Java 7.

Did you try profiling with YourKit?

Ralph

> On Mar 20, 2016, at 11:07 PM, Remko Popma <remko.po...@gmail.com> wrote:
> 
> Quick update on the ongoing investigation in the performance regression:
> I tried running SimplePerfTest on linux with perf stat and got these results:
> <investigation20160319_23898_image002.png>
> ​How to read this: 
> * Throughput is number of messages logged per second (1.0 ~= 7 million 
> msg/sec)
> * Instr/cycle is instructions per clock cycle 
> * Branch miss% is the number of branch prediction misses as a percentage of 
> all branches
> 
> Analysis:
> Throughput of log4j 2.0-2.3 on this machine is about 5.3 million msg/sec on 
> average. 
> From 2.4, this suddenly gaps down to 3.9 million msg/sec.
> At the same time, the number of branch misses jump up from 0.27% to 0.63%, 
> correlating with a much less efficient execution: from 1.47 to 1.06 
> instructions per clock cycle.
> 
> Conclusion:
> It seems that one or more of the changes made in log4j 2.4 resulted in an 
> increase in branch misses during execution.
> This may not be the only problem but it may help to give some direction in 
> the search.
> 
> Remko
> 
> On Thu, Mar 10, 2016 at 3:06 AM, Remko Popma <remko.po...@gmail.com 
> <mailto:remko.po...@gmail.com>> wrote:
> I think you're right, that one should not leak.
> 
> On Thu, Mar 10, 2016 at 2:40 AM, Matt Sicker <boa...@gmail.com 
> <mailto:boa...@gmail.com>> wrote:
> I know it's Java 1.8+, but does ThreadLocal.withInitial(Supplier<S>) prevent 
> that memory leak? They use their own JDK class to subclass ThreadLocal, so 
> that shouldn't leak.
> 
> On 8 March 2016 at 22:43, Remko Popma <remko.po...@gmail.com 
> <mailto:remko.po...@gmail.com>> wrote:
> ThreadLocals containing JDK classes (StringBuilder, etc) are not a problem. 
> Their classloader is the system classloader, not the web app classloader, so 
> these ThreadLocals do not have a reference to the web app classes and do not 
> prevent web app classes from being garbage collected.
> 
> This idiom is safe:
> 
> class SafeClass {
>     // The type of this field is java.lang.ThreadLocal, and
>     // both the key (ThreadLocal) and the value (StringBuilder) are JDK 
> classes.
>     // This idiom is safe and will not cause memory leaks in web apps.
>     static ThreadLocal<StringBuilder> safe = new ThreadLocal<StringBuilder>();
> 
>     private StringBuilder getThreadLocalStringBuilder() {
>         StringBuilder value = safe.get();
>         if (value == null) {
>             value = new StringBuilder(1024);
>             safe.set(value);
>         }
>         return value;
>     }
> }
> However, as soon as we create an anonymous subclass like below we cause 
> memory leaks again:
> 
> class MemoryLeakingClass {
>     // The type of this field is MemoryLeakingClass$1, an anonymous subclass 
> of java.lang.ThreadLocal!
>     // In a web app, the classloader of this class is the web app class 
> loader: may cause memory leak...
>     static ThreadLocal<StringBuilder> anonymousSubclass = new 
> ThreadLocal<StringBuilder>() {
>         @Override
>         protected StringBuilder initialValue() {
>             return new StringBuilder(1024);
>         }
>     };
> }
> 
> 
> On Wed, Mar 9, 2016 at 11:32 AM, Ralph Goers <ralph.go...@dslextreme.com 
> <mailto:ralph.go...@dslextreme.com>> wrote:
> I still am unclear as to why you are thinking GC-free mode won’t work in web 
> apps.  What is the issue with ThreadLocals that causes the problem?  We are 
> using ThreadLocals for other things that seem to be working.
> 
> Ralph
> 
>> On Mar 8, 2016, at 3:05 PM, Remko Popma <remko.po...@gmail.com 
>> <mailto:remko.po...@gmail.com>> wrote:
>> 
>> Some of the recent changes were to fix issues introduced by the reusable 
>> message idea. It is good that we are not rushing this release, and thanks 
>> everyone for your patience.
>> 
>> I originally wanted to make GC-free mode the default to begin with, but it 
>> may be smart to initially require that users switch GC-free mode on 
>> explicitly, and only make it the default after it has gained a track record. 
>> (Even so, it would only be switched on automatically for non-web apps.)
>> 
>> The async logger performance investigation is still ongoing. I hope to be 
>> able to resolve it and do the GC-free write-up including performance test 
>> results in the next few weeks. I am currently on a business trip, working 
>> with people creating low latency trading systems, and they have good ideas 
>> on how to investigate the performance regression, so that is helpful.
>> 
>> On Wed, Mar 9, 2016 at 4:01 AM, Gary Gregory <garydgreg...@gmail.com 
>> <mailto:garydgreg...@gmail.com>> wrote:
>> I'm even more concerned now that more of the no-GC changes are coming in, 
>> still, fast and furious.
>> 
>> I see what smells like a lot of non-OO code fly by here and there: lots 
>> if-else-if-else-if-else, as opposed to subclassing or delegation if 
>> appropriate.
>> 
>> Are we rushing toward this no-GC goal without considering speed performance?
>> 
>> Where are we on the async logger slow down investigation?
>> 
>> Concerned and glad to see to much activity all at the same time,
>> Gary
>> 
>> On Thu, Mar 3, 2016 at 1:23 PM, Matt Sicker <boa...@gmail.com 
>> <mailto:boa...@gmail.com>> wrote:
>> Remko (and anyone else who wants to try and solve this regression):
>> 
>> https://www.jclarity.com/product/censum-free-trial/
>> 
>> Go ahead and get the trial and the guys at JClarity will give us licenses. 
>> I'd use your apache.org <http://apache.org/> email to be safe.
>> 
>> On 3 March 2016 at 11:27, Matt Sicker <boa...@gmail.com 
>> <mailto:boa...@gmail.com>> wrote:
>> So far, Remko's proposal is language-neutral since he defined endianness 
>> (big endian like java, but we could use either since ByteBuffer supports 
>> both) and field widths..
>> 
>> On 3 March 2016 at 03:15, Mikael Ståldal <mikael.stal...@magine.com 
>> <mailto:mikael.stal...@magine.com>> wrote:
>> If we are to design a new binary log event format, then I think that we 
>> should make sure that it is not Java / JVM specific, and that it will be 
>> reasonably easy to implement reading and writing of it on other platforms.
>> 
>> On Thu, Mar 3, 2016 at 5:14 AM, Remko Popma <remko.po...@gmail.com 
>> <mailto:remko.po...@gmail.com>> wrote:
>> I created https://issues.apache.org/jira/browse/LOG4J2-1305 
>> <https://issues.apache.org/jira/browse/LOG4J2-1305> as a write up of my 
>> current thinking on the topic and a place to discuss ideas. Still need to 
>> add some things we discussed here (tools, endianness, versioning etc).  
>> 
>> It's a fascinating topic but I still have a lot of work to do on the GC-free 
>> epic before I can start working on this one. 
>> 
>> 
>> On Thursday, 3 March 2016, Remko Popma <remko.po...@gmail.com 
>> <mailto:remko.po...@gmail.com>> wrote:
>> Not Java Serialization, I was thinking simple ByteBuffer.putLong, putInt, 
>> putBytes. This is much more performant 
>> (http://mechanical-sympathy.blogspot.jp/2012/07/native-cc-like-performance-for-java.html
>>  
>> <http://mechanical-sympathy.blogspot.jp/2012/07/native-cc-like-performance-for-java.html>).
>>  SBE (Simple Binary Encoding) seems overkill, but open to other opinions. 
>> 
>> The less conditional logic in there the better, so I'm not that interested 
>> in configurability. All log event fields, ok. ThreadContextMap/Stack keys 
>> and values: similarly to other repeating strings like logger names: write to 
>> separate mapping file & only write int values (for count as well as 
>> key/value indices) to the "main" log file. 
>> 
>> Two things we would need to decide is how to handle versioning, and what 
>> Endianness to use. 
>> 
>> Version information (possibly with schema info) could be written to the log 
>> file header. 
>> 
>> Endianness could also be written to the header, or we could simply say we 
>> use network byte order (big endian). Intel chips use little endian, but 
>> apparently swapping is implemented with an intrinsic and is very fast. 
>> 
>> On Thursday, 3 March 2016, Matt Sicker <boa...@gmail.com <>> wrote:
>> At that point, it would be nice if it were extensible. There are some neat 
>> binary formats we could use that would allow for that.
>> 
>> On 2 March 2016 at 12:09, Gary Gregory <garydgreg...@gmail.com <>> wrote:
>> I think we'd need to provide all LogEvent fields.
>> 
>> Gary
>> 
>> On Wed, Mar 2, 2016 at 9:13 AM, Remko Popma <remko.po...@gmail.com <>> wrote:
>> That's what I meant, I didn't make myself clear. For example, we could offer 
>> a simple binary layout:
>> time stamp (8 bytes)
>> level int (4 bytes)
>> thread ID (4 bytes) - Thread names in separate file
>> Logger ID (4 bytes) - Logger names in separate file. 
>> message length (4 bytes)
>> message type (2 bytes)
>> message data (variable length)
>> throwable length (4 bytes)
>> throwable data (variable length)
>> 
>> It's a very different approach to logging. On the plus side, this would be 
>> extremely compact and very fast to write. 
>> 
>> On the other hand it would require a separate tool to decode/display the 
>> data in human readable form. Such a tool should handle text messages out of 
>> the box, but for custom messages I image there could be some plugin 
>> mechanism for custom decoders. 
>> 
>> All very interesting...
>> :-)
>> 
>> Sent from my iPhone
>> 
>> On 2016/03/03, at 0:01, Matt Sicker <boa...@gmail.com <>> wrote:
>> 
>>> That's what I thought at first, but he means non-human readable formats 
>>> since we all use tools to parse logs as it is (Splunk and ELK are the big 
>>> two I know of).
>>> 
>>> On 2 March 2016 at 02:15, Remko Popma <remko.po...@gmail.com <>> wrote:
>>> Re: binary logging, I think he's talking about providing an API to log 
>>> objects directly into byte buffers without turning them into Strings first. 
>>> 
>>> https://issues.apache.org/jira/browse/LOG4J2-1274 
>>> <https://issues.apache.org/jira/browse/LOG4J2-1274> and 
>>> https://issues.apache.org/jira/browse/LOG4J2-506 
>>> <https://issues.apache.org/jira/browse/LOG4J2-506>
>>> 
>>> were created with that in mind and should be a good step in that direction. 
>>> 
>>> Sent from my iPhone
>>> 
>>> On 2016/03/02, at 15:11, Gary Gregory <garydgreg...@gmail.com <>> wrote:
>>> 
>>>> Well, I've often wondered about creating a binary format but it seems that 
>>>> you could use JSON+ZIP or BSON and get most of the advantages.
>>>> 
>>>> Gary
>>>> 
>>>> On Tue, Mar 1, 2016 at 9:12 PM, Matt Sicker <boa...@gmail.com <>> wrote:
>>>> One other interesting thing I learned is that improper use of logging is a 
>>>> huge source of performance problems. The GC-free parameterized message 
>>>> factory will help with one aspect of that (I suggested parameterized 
>>>> messages, but he countered with the Object[] that is created), and 
>>>> encouraging users to use a Supplier<String> instead of passing parameters 
>>>> should help as well (especially when those parameters have to be 
>>>> computed). He had some strong criticisms of logging APIs promoting bad 
>>>> practices which stems all the way back to log4j1 and affects pretty much 
>>>> every logging API in Java (some criticisms were actually outdated or 
>>>> didn't consider newer features of the API like markers and the huge amount 
>>>> of filters available).
>>>> 
>>>> His other big idea was promoting the use of binary logging formats because 
>>>> humans rarely read the raw log files as it is, but it's not like there's a 
>>>> standard way to do that.
>>>> 
>>>> Now I kinda wonder if he'll find this thread one day and tell me how I 
>>>> misinterpreted him or something. ;)
>>>> 
>>>> On 1 March 2016 at 22:28, Matt Sicker <boa...@gmail.com <>> wrote:
>>>> Alright, I learned some interesting things. I'm going to get us some tools 
>>>> we can use to try and profile this. Otherwise, he did suggest trying out 
>>>> this project:
>>>> https://github.com/RichardWarburton/honest-profiler 
>>>> <https://github.com/RichardWarburton/honest-profiler>
>>>> 
>>>> On 1 March 2016 at 19:31, Matt Sicker <boa...@gmail.com <>> wrote:
>>>> So far he's said something about using lambdas for lazy evaluation (though 
>>>> I don't think that would actually help us at all). I'll try to talk to him 
>>>> one-on-one afterward to delve more into this.
>>>> 
>>>> On 1 March 2016 at 18:13, Ralph Goers <ralph.go...@dslextreme.com <>> 
>>>> wrote:
>>>> Actually, most of the tests have the commands in the comments right in the 
>>>> class. Just cut and past.
>>>> 
>>>> Ralph
>>>> 
>>>>> On Mar 1, 2016, at 1:43 PM, Matt Sicker <boa...@gmail.com <>> wrote:
>>>>> 
>>>>> I can't even figure out how to execute the simple perf test class. 
>>>>> IntelliJ gives me some annotation processing error, and doing it from the 
>>>>> command line is turning into a classpath nightmare to figure out what 
>>>>> jars are needed to execute the test manually.
>>>>> 
>>>>> On 1 March 2016 at 11:34, Gary Gregory <garydgreg...@gmail.com <>> wrote:
>>>>> Before the talk: Hi, I'm Remko, I help on Apache Log4j, are you available 
>>>>> after the preso to talk about some issue we are seeing?
>>>>> 
>>>>> Gary
>>>>> 
>>>>> On Mar 1, 2016 8:29 AM, "Matt Sicker" <boa...@gmail.com <>> wrote:
>>>>> I'm attending a JUG meetup tonight with Kirk Pepperdine presenting. It's 
>>>>> supposed to be a Java performance workshop type of thing, so if you've 
>>>>> got a decent way to ask about it, I could see if he can help figure out 
>>>>> this regression. I can at least show off the SimplePerfTest and any 
>>>>> microbenchmarks we have.
>>>>> 
>>>>> On 28 February 2016 at 11:54, Matt Sicker <boa...@gmail.com <>> wrote:
>>>>> Take a look at the git bisect command. Might help you find which changes 
>>>>> caused the problem.
>>>>> 
>>>>> 
>>>>> On Sunday, 28 February 2016, Gary Gregory <garydgreg...@gmail.com <>> 
>>>>> wrote:
>>>>> Thank you for digging in Remko. This is will be a nice theme to publicize 
>>>>> when you get it figured out.
>>>>> 
>>>>> Gary
>>>>> 
>>>>> On Feb 28, 2016 4:08 AM, "Remko Popma" <remko.po...@gmail.com <>> wrote:
>>>>> After removing the potential impact of appenders and layouts by testing 
>>>>> with log4j-core\src\test\resources\perf-CountingNoOpAppender.xml and 
>>>>> org.apache.logging.log4j.core.async.perftest.SimplePerfTest, I've 
>>>>> confirmed my initial numbers:
>>>>> 
>>>>> 2.0: 7.5M ops/sec
>>>>> 2.1: 6M ops/sec
>>>>> 2.2: 6M ops/sec
>>>>> 2.3: 6M ops/sec
>>>>> 2.4: 4.5M ops/sec
>>>>> 2.5: 4M ops/sec
>>>>> 2.6: 2M ops/sec
>>>>> 
>>>>> I tried reverting various changes made to AsyncLogger since 2.0, 
>>>>> performance improves a little up to 4M ops/sec.
>>>>> However, when completely reverting AsyncLogger source to the 2.0 version, 
>>>>> performance is back to 7.5M ops/sec.
>>>>> 
>>>>> I'll try starting from the 2.0 source and getting back to 2.6 
>>>>> functionality without losing performance...
>>>>> (Lengthy process...)
>>>>> 
>>>>> 
>>>>> On Sat, Feb 27, 2016 at 12:18 PM, Remko Popma <remko.po...@gmail.com <>> 
>>>>> wrote:
>>>>> This is the PerfTestDriver test class (in log4j-core/test, package 
>>>>> ...async.perf). 
>>>>> Mainly perf3PlainNoLocation.xml:
>>>>> RollingRandomAccessFileAppender, PatternLayout, all loggers are 
>>>>> AsyncLoggers, logging a simple string without parameters. 
>>>>> 
>>>>> Profiling with YourKit did not tell me anything useful. 
>>>>> 
>>>>> I'm now eliminating the effect of Layouts/Appenders, using 
>>>>> CountingNoOpAppender, and seeing similar numbers. So this seems to be 
>>>>> mostly an issue in AsyncLogger. 
>>>>> 
>>>>> I'll let you know when I find out more. 
>>>>> There's a lot of trial and error here, so this may take a while...
>>>>> 
>>>>> Remko
>>>>> 
>>>>> Sent from my iPhone
>>>>> 
>>>>> On 2016/02/26, at 21:02, Mikael Ståldal <mikael.stal...@magine.com <>> 
>>>>> wrote:
>>>>> 
>>>>>> Which components (appenders, layouts) are involved in the tests? Would 
>>>>>> it be possible to do some profiling to see if there is any particular 
>>>>>> component which is to blame?
>>>>>> 
>>>>>> On Fri, Feb 26, 2016 at 12:51 PM, Remko Popma <remko.po...@gmail.com <>> 
>>>>>> wrote:
>>>>>> To give you some rough impression on concrete numbers for this trend:
>>>>>> 2.0: ~6M ops/sec
>>>>>> 2.1-2.2: ~5M ops/sec
>>>>>> 2.3-2.4: ~3-4M ops/sec
>>>>>> 2.5: ~3M ops/sec
>>>>>> 2.6: ~2M ops/sec
>>>>>> 
>>>>>> 
>>>>>> On Friday, 26 February 2016, Remko Popma <remko.po...@gmail.com <>> 
>>>>>> wrote:
>>>>>> You're absolutely right. I still have quite a few unit tests to add. 
>>>>>> 
>>>>>> Initial perf testing shows a downward trend in Async Logger performance 
>>>>>> with every release. (Logging simple string messages without params.) 
>>>>>> This is worrisome and I'm focusing on figuring that out first: this will 
>>>>>> likely involve additional code changes and I'll add more tests after 
>>>>>> that. 
>>>>>> 
>>>>>> Sent from my iPhone
>>>>>> 
>>>>>> On 2016/02/26, at 10:38, Gary Gregory <garydgreg...@gmail.com <>> wrote:
>>>>>> 
>>>>>>> Wow, I love the activity we are seeing toward 2.6! All the perf work on 
>>>>>>> top of an existing sizable change set. Very exciting indeed.
>>>>>>> 
>>>>>>> There sure are a lot of changes coming in. I hope that we all can pitch 
>>>>>>> in to make sure most if not all of these changes get code coverage from 
>>>>>>> unit tests. I've not checked closely, but it seems like we may not have 
>>>>>>> good coverage _yet_, or do I have the wrong impression?
>>>>>>> 
>>>>>>> I want to make sure we keep our stability in tip top shape :-) and that 
>>>>>>> we have no regression from previous releases.
>>>>>>> 
>>>>>>> Gary
>>>>>>> 
>>>>>>> -- 
>>>>>>> E-Mail: garydgreg...@gmail.com <> | ggreg...@apache.org  <>
>>>>>>> Java Persistence with Hibernate, Second Edition 
>>>>>>> <http://www.manning.com/bauer3/>
>>>>>>> JUnit in Action, Second Edition <http://www.manning.com/tahchiev/>
>>>>>>> Spring Batch in Action <http://www.manning.com/templier/>
>>>>>>> Blog: http://garygregory.wordpress.com 
>>>>>>> <http://garygregory.wordpress.com/> 
>>>>>>> Home: http://garygregory.com/ <http://garygregory.com/>
>>>>>>> Tweet! http://twitter.com/GaryGregory <http://twitter.com/GaryGregory>
>>>>>> 
>>>>>> 
>>>>>> -- 
>>>>>>  
>>>>>> 
>>>>>> Mikael Ståldal
>>>>>> Senior software developer 
>>>>>> 
>>>>>> Magine TV
>>>>>> mikael.stal...@magine.com <>    
>>>>>> Grev Turegatan 3  | 114 46 Stockholm, Sweden  |   www.magine.com  
>>>>>> <http://www.magine.com/>
>>>>>> 
>>>>>> Privileged and/or Confidential Information may be contained in this 
>>>>>> message. If you are not the addressee indicated in this message
>>>>>> (or responsible for delivery of the message to such a person), you may 
>>>>>> not copy or deliver this message to anyone. In such case, 
>>>>>> you should destroy this message and kindly notify the sender by reply 
>>>>>> email.   
>>>>> 
>>>>> 
>>>>> 
>>>>> -- 
>>>>> Matt Sicker <boa...@gmail.com <>>
>>>>> 
>>>>> 
>>>>> 
>>>>> -- 
>>>>> Matt Sicker <boa...@gmail.com <>>
>>>>> 
>>>>> 
>>>>> 
>>>>> -- 
>>>>> Matt Sicker <boa...@gmail.com <>>
>>>> 
>>>> 
>>>> 
>>>> 
>>>> -- 
>>>> Matt Sicker <boa...@gmail.com <>>
>>>> 
>>>> 
>>>> 
>>>> -- 
>>>> Matt Sicker <boa...@gmail.com <>>
>>>> 
>>>> 
>>>> 
>>>> -- 
>>>> Matt Sicker <boa...@gmail.com <>>
>>>> 
>>>> 
>>>> 
>>>> -- 
>>>> E-Mail: garydgreg...@gmail.com <> | ggreg...@apache.org  <>
>>>> Java Persistence with Hibernate, Second Edition 
>>>> <http://www.manning.com/bauer3/>
>>>> JUnit in Action, Second Edition <http://www.manning.com/tahchiev/>
>>>> Spring Batch in Action <http://www.manning.com/templier/>
>>>> Blog: http://garygregory.wordpress.com <http://garygregory.wordpress.com/> 
>>>> Home: http://garygregory.com/ <http://garygregory.com/>
>>>> Tweet! http://twitter.com/GaryGregory <http://twitter.com/GaryGregory>
>>> 
>>> 
>>> -- 
>>> Matt Sicker <boa...@gmail.com <>>
>> 
>> 
>> 
>> -- 
>> E-Mail: garydgreg...@gmail.com <> | ggreg...@apache.org  <>
>> Java Persistence with Hibernate, Second Edition 
>> <http://www.manning.com/bauer3/>
>> JUnit in Action, Second Edition <http://www.manning.com/tahchiev/>
>> Spring Batch in Action <http://www.manning.com/templier/>
>> Blog: http://garygregory.wordpress.com <http://garygregory.wordpress.com/> 
>> Home: http://garygregory.com/ <http://garygregory.com/>
>> Tweet! http://twitter.com/GaryGregory <http://twitter.com/GaryGregory>
>> 
>> 
>> -- 
>> Matt Sicker <boa...@gmail.com <>>
>> 
>> 
>> 
>> -- 
>>  
>> 
>> Mikael Ståldal
>> Senior software developer 
>> 
>> Magine TV
>> mikael.stal...@magine.com <mailto:mikael.stal...@magine.com>    
>> Grev Turegatan 3  | 114 46 Stockholm, Sweden  |   www.magine.com  
>> <http://www.magine.com/>
>> 
>> Privileged and/or Confidential Information may be contained in this message. 
>> If you are not the addressee indicated in this message
>> (or responsible for delivery of the message to such a person), you may not 
>> copy or deliver this message to anyone. In such case, 
>> you should destroy this message and kindly notify the sender by reply email. 
>>   
>> 
>> 
>> 
>> -- 
>> Matt Sicker <boa...@gmail.com <mailto:boa...@gmail.com>>
>> 
>> 
>> 
>> -- 
>> Matt Sicker <boa...@gmail.com <mailto:boa...@gmail.com>>
>> 
>> 
>> 
>> -- 
>> E-Mail: garydgreg...@gmail.com <mailto:garydgreg...@gmail.com> | 
>> ggreg...@apache.org  <mailto:ggreg...@apache.org>
>> Java Persistence with Hibernate, Second Edition 
>> <http://www.manning.com/bauer3/>
>> JUnit in Action, Second Edition <http://www.manning.com/tahchiev/>
>> Spring Batch in Action <http://www.manning.com/templier/>
>> Blog: http://garygregory.wordpress.com <http://garygregory.wordpress.com/> 
>> Home: http://garygregory.com/ <http://garygregory.com/>
>> Tweet! http://twitter.com/GaryGregory <http://twitter.com/GaryGregory>
> 
> 
> 
> 
> 
> -- 
> Matt Sicker <boa...@gmail.com <mailto:boa...@gmail.com>>
> 
> 

Reply via email to