From: "M. Edward (Ed) Borasky" Date: 2007-10-07T09:58:02+09:00 Subject: Re: Ruby vs. PHP --------------090700090302050407010606 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit M. Edward (Ed) Borasky wrote: > Now I could look at the benchmarks themselves and throw out those that > were obviously orthogonal to web servers when comparing languages for > implementing web servers. But I don't think I need to go that far -- > it's easier to just throw out the statistical outliers and come up with > a set of numbers that's a general characterization of the relative > performance of the languages. That's why I asked for the raw data (which > I received, by the way). [snip] > Of course. I'm still in the process of crunching the numbers, but what > I've seen so far is that MRI Ruby is *not* in the general neighborhood > of Perl, Python or PHP, but YARV *is* in that neighborhood. I do need to > tighten up the calculations slightly and get rid of some bogus points, > but I'm not expecting a major change in that. [snip] > Well ... let me finish with the numbers, but I think you'll be surprised > at how close Perl and Python are to each other and how far away MRI is > from the two of them. It's not a "petty microsecond dispute" for MRI. [snip] OK ... here's the analysis. The attached PDF is what's known as a box and whisker plot, usually shortened to "boxplot". The raw numbers that went into this are from the Alioth shootout page, and what I *haven't* done is checked out which versions of Perl, Python, YARV, Ruby, jRuby and PHP these tests used. They could be years old or they could have been run yesterday morning. :) I discarded all the tests for which there were any missing values. The value plotted is the ratio of seconds for the benchmark on the dynamic language to the seconds for the benchmark with gcc. Thus, gcc equals 1.0 across the board and lower is better/faster. How do you interpret these plots? First of all, the bar across the middle is the median. Half the values are above the median and half below it. I sorted them by increasing median, so gcc, being the fastest, is on the left. Next comes YARV, then Python, Perl, PHP, Ruby and jRuby. The whisker on the bottom is approximately the 5th percentile. In other words, only five percent of the time is your performance going to be that good or better. And the whisker on the top is approximately the 95th percentile -- only five percent of the time is it going to be that bad or worse. The bottom of the box is the 25th percentile. 25 percent of the time, the performance will be that good or better. The top of the box is the 75th percentile. 25 percent of the time it will be that bad or worse. So now we can make more precise Chad Perrin's notion of "general neighborhoods of performance". We do this by looking at the height of the median and the width of the box. And we see that relative to gcc, YARV, Python, Perl and PHP have fairly close medians and the boxes are about the same width. So they are all "in the same neighborhood" and gcc is faster. Ruby and jRuby are *not* in the same neighborhood. Now suppose your boss comes to you, as bosses do, and says, "well, all them high-falutin' box plots are dandy, but the board of directors wants one number for each language!" It turns out (and I'll let Google and Wikipedia fill in the blanks for you) that the one number you want to give your boss, aside from your cell phone number, is the *geometric mean* of all the benchmark ratios. Again, smaller is better. So here's how the languages stack up: gcc 1.0 yarv 13.2 perl 14.0 python 14.2 php 15.5 ruby 29.9 jruby 55.0 So yes, you can pretty much expect the same performance from YARV, Perl, Python and PHP. And you can pretty much expect something like a 13 - 16 to one speed improvement if you decide to rewrite your application in C. It's pretty clear to me from these numbers is that the only reason that deploying web applications on the LAMP stack and its cousins using PostgreSQL, Perl, Python and Ruby is economically viable is that they spend most of their time either in the database or on the network. The bad news is that for an application with 100 percent dynamic language code -- no C libraries for the intensive calculations, no highly-tuned web servers, databases or other components -- you're going to end up throwing twice as much hardware at scaling problems in Ruby as you will in PHP, Perl or Python. The good news is that YARV will level the playing field. One final note to implementers and language designers ... Python gets an extra little pat on the back from me for having such a low spread. YARV and other Ruby implementations need to pay attention to the fact that their boxes are wider than Perl's and PHP's and a *lot* wider than Python's. In other words, look at the benchmarks where you really suck first. :) In case you want the numbers that go with the boxplots, here they are: gcc yarv python perl php ruby jruby Low 1 1.2 1.4 0.93 1.4 1.5 3.4 Q1 1 4.8 4.6 2.90 3.1 6.3 12.0 Median 1 8.7 14.0 26.00 31.0 34.0 50.0 Q3 1 68.0 45.0 55.00 55.0 170.0 340.0 High 1 150.0 98.0 67.00 110.0 380.0 410.0 --------------090700090302050407010606 Content-Type: application/pdf; name="shootout.pdf" Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="shootout.pdf" JVBERi0xLjEKJYHigeOBz4HTXHIKMSAwIG9iago8PAovQ3JlYXRpb25EYXRlIChEOjIwMDcx MDA2MTY1MzA0KQovTW9kRGF0ZSAoRDoyMDA3MTAwNjE2NTMwNCkKL1RpdGxlIChSIEdyYXBo aWNzIE91dHB1dCkKL1Byb2R1Y2VyIChSIDIuNi4wKQovQ3JlYXRvciAoUikKPj4KZW5kb2Jq CjIgMCBvYmoKPDwKL1R5cGUgL0NhdGFsb2cKL1BhZ2VzIDMgMCBSCj4+CmVuZG9iago1IDAg b2JqCjw8Ci9UeXBlIC9Gb250Ci9TdWJ0eXBlIC9UeXBlMQovTmFtZSAvRjEKL0Jhc2VGb250 IC9aYXBmRGluZ2JhdHMKPj4KZW5kb2JqCjYgMCBvYmoKPDwKL1R5cGUgL1BhZ2UKL1BhcmVu dCAzIDAgUgovQ29udGVudHMgNyAwIFIKL1Jlc291cmNlcyA0IDAgUgo+PgplbmRvYmoKNyAw IG9iago8PAovTGVuZ3RoIDggMCBSCj4+CnN0cmVhbQ0KcQpRIHEgNTkuMDQgNzMuNDQgNjMw LjcyIDQwNy41MiByZSBXIG4KMC4wMDAgMC4wMDAgMC4wMDAgUkcKMi4yNSB3CltdIDAgZAox IEoKMSBqCjEwLjAwIE0KOTAuNzQgODkuMjkgbSAxNTcuNDkgODkuMjkgbCBTCjAuNzUgdwpb IDMuMDAgNS4wMF0gMCBkCjEyNC4xMSA4OS4yOSBtIDEyNC4xMSA4OS4yOSBsIFMKMTI0LjEx IDg5LjI5IG0gMTI0LjExIDg5LjI5IGwgUwowLjc1IHcKW10gMCBkCjEwNy40MyA4OS4yOSBt IDE0MC44MCA4OS4yOSBsIFMKMTA3LjQzIDg5LjI5IG0gMTQwLjgwIDg5LjI5IGwgUwoxMDcu NDMgODkuMjkgbSAxNDAuODAgODkuMjkgbCBTCjEwNy40MyA4OS4yOSBtIDE0MC44MCA4OS4y OSBsIFMKMTA3LjQzIDg5LjI5IG0gMTQwLjgwIDg5LjI5IGwgUwoxMDcuNDMgODkuMjkgbSAx NDAuODAgODkuMjkgbCBTCjEwNy40MyA4OS4yOSBtIDE0MC44MCA4OS4yOSBsIFMKMTA3LjQz IDg5LjI5IG0gMTQwLjgwIDg5LjI5IGwgUwoxMDcuNDMgODkuMjkgbSAxNDAuODAgODkuMjkg bCBTCjEwNy40MyA4OS4yOSBtIDE0MC44MCA4OS4yOSBsIFMKMTA3LjQzIDg5LjI5IG0gMTQw LjgwIDg5LjI5IGwgUwoxMDcuNDMgODkuMjkgbSAxNDAuODAgODkuMjkgbCBTCjEwNy40MyA4 OS4yOSBtIDE0MC44MCA4OS4yOSBsIFMKMTA3LjQzIDg5LjI5IG0gMTQwLjgwIDg5LjI5IGwg Uwo5MC43NCA4OS4yOSBtCjE1Ny40OSA4OS4yOSBsCjE1Ny40OSA4OS4yOSBsCjkwLjc0IDg5 LjI5IGwKOTAuNzQgODkuMjkgbApTCjIuMjUgdwpbXSAwIGQKMTc0LjE3IDk1LjEyIG0gMjQw LjkxIDk1LjEyIGwgUwowLjc1IHcKWyAzLjAwIDUuMDBdIDAgZAoyMDcuNTQgODkuNDggbSAy MDcuNTQgOTIuMTQgbCBTCjIwNy41NCAyMDAuODAgbSAyMDcuNTQgMTM5Ljk4IGwgUwowLjc1 IHcKW10gMCBkCjE5MC44NiA4OS40OCBtIDIyNC4yMyA4OS40OCBsIFMKMTkwLjg2IDIwMC44 MCBtIDIyNC4yMyAyMDAuODAgbCBTCjE5MC44NiA4OS40OCBtIDIyNC4yMyA4OS40OCBsIFMK MTkwLjg2IDIwMC44MCBtIDIyNC4yMyAyMDAuODAgbCBTCjE5MC44NiA4OS40OCBtIDIyNC4y MyA4OS40OCBsIFMKMTkwLjg2IDIwMC44MCBtIDIyNC4yMyAyMDAuODAgbCBTCjE5MC44NiA4 OS40OCBtIDIyNC4yMyA4OS40OCBsIFMKMTkwLjg2IDIwMC44MCBtIDIyNC4yMyAyMDAuODAg bCBTCjE5MC44NiA4OS40OCBtIDIyNC4yMyA4OS40OCBsIFMKMTkwLjg2IDIwMC44MCBtIDIy NC4yMyAyMDAuODAgbCBTCjE5MC44NiA4OS40OCBtIDIyNC4yMyA4OS40OCBsIFMKMTkwLjg2 IDIwMC44MCBtIDIyNC4yMyAyMDAuODAgbCBTCjE5MC44NiA4OS40OCBtIDIyNC4yMyA4OS40 OCBsIFMKMTkwLjg2IDIwMC44MCBtIDIyNC4yMyAyMDAuODAgbCBTCjE3NC4xNyA5Mi4xNCBt CjI0MC45MSA5Mi4xNCBsCjI0MC45MSAxMzkuOTggbAoxNzQuMTcgMTM5Ljk4IGwKMTc0LjE3 IDkyLjE0IGwKUwoyLjI1IHcKW10gMCBkCjI1Ny42MCA5OS4wMSBtIDMyNC4zNCA5OS4wMSBs IFMKMC43NSB3ClsgMy4wMCA1LjAwXSAwIGQKMjkwLjk3IDg5LjYxIG0gMjkwLjk3IDkxLjk4 IGwgUwoyOTAuOTcgMTYyLjQwIG0gMjkwLjk3IDEyMi4yMCBsIFMKMC43NSB3CltdIDAgZAoy NzQuMjkgODkuNjEgbSAzMDcuNjYgODkuNjEgbCBTCjI3NC4yOSAxNjIuNDAgbSAzMDcuNjYg MTYyLjQwIGwgUwoyNzQuMjkgODkuNjEgbSAzMDcuNjYgODkuNjEgbCBTCjI3NC4yOSAxNjIu NDAgbSAzMDcuNjYgMTYyLjQwIGwgUwoyNzQuMjkgODkuNjEgbSAzMDcuNjYgODkuNjEgbCBT CjI3NC4yOSAxNjIuNDAgbSAzMDcuNjYgMTYyLjQwIGwgUwoyNzQuMjkgODkuNjEgbSAzMDcu NjYgODkuNjEgbCBTCjI3NC4yOSAxNjIuNDAgbSAzMDcuNjYgMTYyLjQwIGwgUwoyNzQuMjkg ODkuNjEgbSAzMDcuNjYgODkuNjEgbCBTCjI3NC4yOSAxNjIuNDAgbSAzMDcuNjYgMTYyLjQw IGwgUwoyNzQuMjkgODkuNjEgbSAzMDcuNjYgODkuNjEgbCBTCjI3NC4yOSAxNjIuNDAgbSAz MDcuNjYgMTYyLjQwIGwgUwoyNzQuMjkgODkuNjEgbSAzMDcuNjYgODkuNjEgbCBTCjI3NC4y OSAxNjIuNDAgbSAzMDcuNjYgMTYyLjQwIGwgUwoyNTcuNjAgOTEuOTggbQozMjQuMzQgOTEu OTggbAozMjQuMzQgMTIyLjIwIGwKMjU3LjYwIDEyMi4yMCBsCjI1Ny42MCA5MS45OCBsClMK Mi4yNSB3CltdIDAgZAozNDEuMDMgMTA4LjI4IG0gNDA3Ljc3IDEwOC4yOCBsIFMKMC43NSB3 ClsgMy4wMCA1LjAwXSAwIGQKMzc0LjQwIDg5LjIzIG0gMzc0LjQwIDkwLjcwIGwgUwozNzQu NDAgMTM5LjI5IG0gMzc0LjQwIDEzMC4xNCBsIFMKMC43NSB3CltdIDAgZAozNTcuNzEgODku MjMgbSAzOTEuMDkgODkuMjMgbCBTCjM1Ny43MSAxMzkuMjkgbSAzOTEuMDkgMTM5LjI5IGwg UwozNTcuNzEgODkuMjMgbSAzOTEuMDkgODkuMjMgbCBTCjM1Ny43MSAxMzkuMjkgbSAzOTEu MDkgMTM5LjI5IGwgUwozNTcuNzEgODkuMjMgbSAzOTEuMDkgODkuMjMgbCBTCjM1Ny43MSAx MzkuMjkgbSAzOTEuMDkgMTM5LjI5IGwgUwozNTcuNzEgODkuMjMgbSAzOTEuMDkgODkuMjMg bCBTCjM1Ny43MSAxMzkuMjkgbSAzOTEuMDkgMTM5LjI5IGwgUwozNTcuNzEgODkuMjMgbSAz OTEuMDkgODkuMjMgbCBTCjM1Ny43MSAxMzkuMjkgbSAzOTEuMDkgMTM5LjI5IGwgUwozNTcu NzEgODkuMjMgbSAzOTEuMDkgODkuMjMgbCBTCjM1Ny43MSAxMzkuMjkgbSAzOTEuMDkgMTM5 LjI5IGwgUwozNTcuNzEgODkuMjMgbSAzOTEuMDkgODkuMjMgbCBTCjM1Ny43MSAxMzkuMjkg bSAzOTEuMDkgMTM5LjI5IGwgUwozNDEuMDMgOTAuNzAgbQo0MDcuNzcgOTAuNzAgbAo0MDcu NzcgMTMwLjE0IGwKMzQxLjAzIDEzMC4xNCBsCjM0MS4wMyA5MC43MCBsClMKMi4yNSB3Cltd IDAgZAo0MjQuNDYgMTExLjc1IG0gNDkxLjIwIDExMS43NSBsIFMKMC43NSB3ClsgMy4wMCA1 LjAwXSAwIGQKNDU3LjgzIDg5LjYxIG0gNDU3LjgzIDkwLjg0IGwgUwo0NTcuODMgMTcxLjY0 IG0gNDU3LjgzIDEyOS43NCBsIFMKMC43NSB3CltdIDAgZAo0NDEuMTQgODkuNjEgbSA0NzQu NTEgODkuNjEgbCBTCjQ0MS4xNCAxNzEuNjQgbSA0NzQuNTEgMTcxLjY0IGwgUwo0NDEuMTQg ODkuNjEgbSA0NzQuNTEgODkuNjEgbCBTCjQ0MS4xNCAxNzEuNjQgbSA0NzQuNTEgMTcxLjY0 IGwgUwo0NDEuMTQgODkuNjEgbSA0NzQuNTEgODkuNjEgbCBTCjQ0MS4xNCAxNzEuNjQgbSA0 NzQuNTEgMTcxLjY0IGwgUwo0NDEuMTQgODkuNjEgbSA0NzQuNTEgODkuNjEgbCBTCjQ0MS4x NCAxNzEuNjQgbSA0NzQuNTEgMTcxLjY0IGwgUwo0NDEuMTQgODkuNjEgbSA0NzQuNTEgODku NjEgbCBTCjQ0MS4xNCAxNzEuNjQgbSA0NzQuNTEgMTcxLjY0IGwgUwo0NDEuMTQgODkuNjEg bSA0NzQuNTEgODkuNjEgbCBTCjQ0MS4xNCAxNzEuNjQgbSA0NzQuNTEgMTcxLjY0IGwgUwo0 NDEuMTQgODkuNjEgbSA0NzQuNTEgODkuNjEgbCBTCjQ0MS4xNCAxNzEuNjQgbSA0NzQuNTEg MTcxLjY0IGwgUwo0MjQuNDYgOTAuODQgbQo0OTEuMjAgOTAuODQgbAo0OTEuMjAgMTI5Ljc0 IGwKNDI0LjQ2IDEyOS43NCBsCjQyNC40NiA5MC44NCBsClMKMi4yNSB3CltdIDAgZAo1MDcu ODkgMTEzLjkwIG0gNTc0LjYzIDExMy45MCBsIFMKMC43NSB3ClsgMy4wMCA1LjAwXSAwIGQK NTQxLjI2IDg5LjYzIG0gNTQxLjI2IDkzLjMwIGwgUwo1NDEuMjYgMzc1LjA3IG0gNTQxLjI2 IDIxNC44OCBsIFMKMC43NSB3CltdIDAgZAo1MjQuNTcgODkuNjMgbSA1NTcuOTQgODkuNjMg bCBTCjUyNC41NyAzNzUuMDcgbSA1NTcuOTQgMzc1LjA3IGwgUwo1MjQuNTcgODkuNjMgbSA1 NTcuOTQgODkuNjMgbCBTCjUyNC41NyAzNzUuMDcgbSA1NTcuOTQgMzc1LjA3IGwgUwo1MjQu NTcgODkuNjMgbSA1NTcuOTQgODkuNjMgbCBTCjUyNC41NyAzNzUuMDcgbSA1NTcuOTQgMzc1 LjA3IGwgUwo1MjQuNTcgODkuNjMgbSA1NTcuOTQgODkuNjMgbCBTCjUyNC41NyAzNzUuMDcg bSA1NTcuOTQgMzc1LjA3IGwgUwo1MjQuNTcgODkuNjMgbSA1NTcuOTQgODkuNjMgbCBTCjUy NC41NyAzNzUuMDcgbSA1NTcuOTQgMzc1LjA3IGwgUwo1MjQuNTcgODkuNjMgbSA1NTcuOTQg ODkuNjMgbCBTCjUyNC41NyAzNzUuMDcgbSA1NTcuOTQgMzc1LjA3IGwgUwo1MjQuNTcgODku NjMgbSA1NTcuOTQgODkuNjMgbCBTCjUyNC41NyAzNzUuMDcgbSA1NTcuOTQgMzc1LjA3IGwg Uwo1MDcuODkgOTMuMzAgbQo1NzQuNjMgOTMuMzAgbAo1NzQuNjMgMjE0Ljg4IGwKNTA3Ljg5 IDIxNC44OCBsCjUwNy44OSA5My4zMCBsClMKMi4yNSB3CltdIDAgZAo1OTEuMzEgMTI2LjAw IG0gNjU4LjA2IDEyNi4wMCBsIFMKMC43NSB3ClsgMy4wMCA1LjAwXSAwIGQKNjI0LjY5IDkx LjA4IG0gNjI0LjY5IDk3LjgzIGwgUwo2MjQuNjkgNDAxLjcxIG0gNjI0LjY5IDM0MS45NiBs IFMKMC43NSB3CltdIDAgZAo2MDguMDAgOTEuMDggbSA2NDEuMzcgOTEuMDggbCBTCjYwOC4w MCA0MDEuNzEgbSA2NDEuMzcgNDAxLjcxIGwgUwo2MDguMDAgOTEuMDggbSA2NDEuMzcgOTEu MDggbCBTCjYwOC4wMCA0MDEuNzEgbSA2NDEuMzcgNDAxLjcxIGwgUwo2MDguMDAgOTEuMDgg bSA2NDEuMzcgOTEuMDggbCBTCjYwOC4wMCA0MDEuNzEgbSA2NDEuMzcgNDAxLjcxIGwgUwo2 MDguMDAgOTEuMDggbSA2NDEuMzcgOTEuMDggbCBTCjYwOC4wMCA0MDEuNzEgbSA2NDEuMzcg NDAxLjcxIGwgUwo2MDguMDAgOTEuMDggbSA2NDEuMzcgOTEuMDggbCBTCjYwOC4wMCA0MDEu NzEgbSA2NDEuMzcgNDAxLjcxIGwgUwo2MDguMDAgOTEuMDggbSA2NDEuMzcgOTEuMDggbCBT CjYwOC4wMCA0MDEuNzEgbSA2NDEuMzcgNDAxLjcxIGwgUwo2MDguMDAgOTEuMDggbSA2NDEu MzcgOTEuMDggbCBTCjYwOC4wMCA0MDEuNzEgbSA2NDEuMzcgNDAxLjcxIGwgUwo1OTEuMzEg OTcuODMgbQo2NTguMDYgOTcuODMgbAo2NTguMDYgMzQxLjk2IGwKNTkxLjMxIDM0MS45NiBs CjU5MS4zMSA5Ny44MyBsClMKUSBxCjAuMDAwIDAuMDAwIDAuMDAwIFJHCjAuNzUgdwpbXSAw IGQKMSBKCjEgagoxMC4wMCBNCjEyNC4xMSA3My40NCBtIDYyNC42OSA3My40NCBsIFMKMTI0 LjExIDczLjQ0IG0gMTI0LjExIDY2LjI0IGwgUwoyMDcuNTQgNzMuNDQgbSAyMDcuNTQgNjYu MjQgbCBTCjI5MC45NyA3My40NCBtIDI5MC45NyA2Ni4yNCBsIFMKMzc0LjQwIDczLjQ0IG0g Mzc0LjQwIDY2LjI0IGwgUwo0NTcuODMgNzMuNDQgbSA0NTcuODMgNjYuMjQgbCBTCjU0MS4y NiA3My40NCBtIDU0MS4yNiA2Ni4yNCBsIFMKNjI0LjY5IDczLjQ0IG0gNjI0LjY5IDY2LjI0 IGwgUwpCVAowLjAwMCAwLjAwMCAwLjAwMCByZwovRjIgMSBUZiAxMi4wMCAwLjAwIC0wLjAw IDEyLjAwIDExNC43OCA0Ny41MiBUbSAoZ2NjKSBUagovRjIgMSBUZiAxMi4wMCAwLjAwIC0w LjAwIDEyLjAwIDE5Ni4xNSA0Ny41MiBUbSAoeWFydikgVGoKL0YyIDEgVGYgMTIuMDAgMC4w MCAtMC4wMCAxMi4wMCAyNzMuMTQgNDcuNTIgVG0gKHB5dGhvbikgVGoKL0YyIDEgVGYgMTIu MDAgMC4wMCAtMC4wMCAxMi4wMCAzNjQuMzEgNDcuNTIgVG0gKHBlcmwpIFRqCi9GMiAxIFRm IDEyLjAwIDAuMDAgLTAuMDAgMTIuMDAgNDQ3LjgyIDQ3LjUyIFRtIChwaHApIFRqCi9GMiAx IFRmIDEyLjAwIDAuMDAgLTAuMDAgMTIuMDAgNTI5LjYyIDQ3LjUyIFRtIChydWJ5KSBUagov RjIgMSBUZiAxMi4wMCAwLjAwIC0wLjAwIDEyLjAwIDYxMS43MSA0Ny41MiBUbSAoanJ1Ynkp IFRqCkVUCjU5LjA0IDg4LjUzIG0gNTkuMDQgNDY1Ljg3IGwgUwo1OS4wNCA4OC41MyBtIDUx Ljg0IDg4LjUzIGwgUwo1OS4wNCAxNjQuMDAgbSA1MS44NCAxNjQuMDAgbCBTCjU5LjA0IDIz OS40NyBtIDUxLjg0IDIzOS40NyBsIFMKNTkuMDQgMzE0LjkzIG0gNTEuODQgMzE0LjkzIGwg Uwo1OS4wNCAzOTAuNDAgbSA1MS44NCAzOTAuNDAgbCBTCjU5LjA0IDQ2NS44NyBtIDUxLjg0 IDQ2NS44NyBsIFMKQlQKL0YyIDEgVGYgMC4wMCAxMi4wMCAtMTIuMDAgMC4wMCA0MS43NiA4 NS4yMCBUbSAoMCkgVGoKL0YyIDEgVGYgMC4wMCAxMi4wMCAtMTIuMDAgMC4wMCA0MS43NiAx NTMuOTkgVG0gKDEwMCkgVGoKL0YyIDEgVGYgMC4wMCAxMi4wMCAtMTIuMDAgMC4wMCA0MS43 NiAyMjkuNDYgVG0gKDIwMCkgVGoKL0YyIDEgVGYgMC4wMCAxMi4wMCAtMTIuMDAgMC4wMCA0 MS43NiAzMDQuOTMgVG0gKDMwMCkgVGoKL0YyIDEgVGYgMC4wMCAxMi4wMCAtMTIuMDAgMC4w MCA0MS43NiAzODAuMzkgVG0gKDQwMCkgVGoKL0YyIDEgVGYgMC4wMCAxMi4wMCAtMTIuMDAg MC4wMCA0MS43NiA0NTUuODYgVG0gKDUwMCkgVGoKRVQKNTkuMDQgNzMuNDQgbQo2ODkuNzYg NzMuNDQgbAo2ODkuNzYgNDgwLjk2IGwKNTkuMDQgNDgwLjk2IGwKNTkuMDQgNzMuNDQgbApT ClEKZW5kc3RyZWFtCmVuZG9iago4IDAgb2JqCjYyODgKZW5kb2JqCjMgMCBvYmoKPDwKL1R5 cGUgL1BhZ2VzCi9LaWRzIFsKNiAwIFIKXQovQ291bnQgMQovTWVkaWFCb3ggWzAgMCA3MjAg NTQwXQo+PgplbmRvYmoKNCAwIG9iago8PAovUHJvY1NldCBbL1BERiAvVGV4dF0KL0ZvbnQg PDwgL0YxIDUgMCBSIC9GMiAxMCAwIFIgPj4KL0V4dEdTdGF0ZSA8PCA+Pgo+PgplbmRvYmoK OSAwIG9iago8PAovVHlwZSAvRW5jb2RpbmcKL0Jhc2VFbmNvZGluZyAvV2luQW5zaUVuY29k aW5nCi9EaWZmZXJlbmNlcyBbIDQ1L21pbnVzIDk2L3F1b3RlbGVmdAoxNDQvZG90bGVzc2kg L2dyYXZlIC9hY3V0ZSAvY2lyY3VtZmxleCAvdGlsZGUgL21hY3JvbiAvYnJldmUgL2RvdGFj Y2VudAovZGllcmVzaXMgLy5ub3RkZWYgL3JpbmcgL2NlZGlsbGEgLy5ub3RkZWYgL2h1bmdh cnVtbGF1dCAvb2dvbmVrIC9jYXJvbiAvc3BhY2VdCj4+CmVuZG9iagoxMCAwIG9iaiA8PAov VHlwZSAvRm9udAovU3VidHlwZSAvVHlwZTEKL05hbWUgL0YyCi9CYXNlRm9udCAvSGVsdmV0 aWNhCi9FbmNvZGluZyA5IDAgUgo+PiBlbmRvYmoKeHJlZgowIDExCjAwMDAwMDAwMDAgNjU1 MzUgZiAKMDAwMDAwMDAyMSAwMDAwMCBuIAowMDAwMDAwMTYzIDAwMDAwIG4gCjAwMDAwMDY3 MzYgMDAwMDAgbiAKMDAwMDAwNjgxOSAwMDAwMCBuIAowMDAwMDAwMjEyIDAwMDAwIG4gCjAw MDAwMDAyOTUgMDAwMDAgbiAKMDAwMDAwMDM3NSAwMDAwMCBuIAowMDAwMDA2NzE2IDAwMDAw IG4gCjAwMDAwMDY5MTIgMDAwMDAgbiAKMDAwMDAwNzE2OSAwMDAwMCBuIAp0cmFpbGVyCjw8 Ci9TaXplIDExCi9JbmZvIDEgMCBSCi9Sb290IDIgMCBSCj4+CnN0YXJ0eHJlZgo3MjY2CiUl RU9GCg== --------------090700090302050407010606--