Andrew Cooke | Contents | Latest | RSS | Previous | Next

C[omp]ute

Welcome to my blog, which was once a mailing list of the same name and is still generated by mail. Please reply via the "comment" links.

Always interested in offers/projects/new ideas. Eclectic experience in fields like: numerical computing; Python web; Java enterprise; functional languages; GPGPU; SQL databases; etc. Based in Santiago, Chile; telecommute worldwide. CV; email.

Personal Projects

Choochoo Training Diary

Last 100 entries

=?UTF-8?B?VGhlIGJlc3QgY3VzdG9taXplZCBmcmVpZ2h0IHNvbHV0aW9uIGZyb20gRWFzZSBmcmVpZ2h0?=; =?UTF-8?B?RXhjbHVzaXZlIEVhc2VGcmVpZ2h0IEZyZWlnaHQgU2VydmljZXMgdGFpbG9yZWQganVzdCBmb3IgeW91?=; =?UTF-8?B?RXhjbHVzaXZlIEVhc2VGcmVpZ2h0IEZyZWlnaHQgU2VydmljZXMgdGFpbG9yZWQganVzdCBmb3IgeW91?=; =?UTF-8?B?RXhjbHVzaXZlIEVhc2VGcmVpZ2h0IEZyZWlnaHQgU2VydmljZXMgdGFpbG9yZWQganVzdCBmb3IgeW91?=; =?UTF-8?B?VGhlIGJlc3QgY3VzdG9taXplZCBmcmVpZ2h0IHNvbHV0aW9uIGZyb20gRWFzZSBmcmVpZ2h0?=; =?UTF-8?B?VGhlIGJlc3QgY3VzdG9taXplZCBmcmVpZ2h0IHNvbHV0aW9uIGZyb20gRWFzZSBmcmVpZ2h0?=; =?UTF-8?B?VGhlIGJlc3QgY3VzdG9taXplZCBmcmVpZ2h0IHNvbHV0aW9uIGZyb20gRWFzZSBmcmVpZ2h0?=; =?UTF-8?B?VGhlIGJlc3QgY3VzdG9taXplZCBmcmVpZ2h0IHNvbHV0aW9uIGZyb20gRWFzZSBmcmVpZ2h0?=; =?UTF-8?B?VGhlIGJlc3QgY3VzdG9taXplZCBmcmVpZ2h0IHNvbHV0aW9uIGZyb20gRWFzZSBmcmVpZ2h0?=; =?UTF-8?B?VGhlIGJlc3QgY3VzdG9taXplZCBmcmVpZ2h0IHNvbHV0aW9uIGZyb20gRWFzZSBmcmVpZ2h0?=; =?UTF-8?B?VGhlIGJlc3QgY3VzdG9taXplZCBmcmVpZ2h0IHNvbHV0aW9uIGZyb20gRWFzZSBmcmVpZ2h0?=; =?UTF-8?B?VGhlIGJlc3QgY3VzdG9taXplZCBmcmVpZ2h0IHNvbHV0aW9uIGZyb20gRWFzZSBmcmVpZ2h0?=; =?UTF-8?B?VGhlIGJlc3QgY3VzdG9taXplZCBmcmVpZ2h0IHNvbHV0aW9uIGZyb20gRWFzZSBmcmVpZ2h0?=; =?UTF-8?B?RXhjbHVzaXZlIEVhc2VGcmVpZ2h0IEZyZWlnaHQgU2VydmljZXMgdGFpbG9yZWQganVzdCBmb3IgeW91?=; =?UTF-8?B?RXhjbHVzaXZlIEVhc2VGcmVpZ2h0IEZyZWlnaHQgU2VydmljZXMgdGFpbG9yZWQganVzdCBmb3IgeW91?=; =?UTF-8?B?VGhlIGJlc3QgY3VzdG9taXplZCBmcmVpZ2h0IHNvbHV0aW9uIGZyb20gRWFzZSBmcmVpZ2h0?=; =?UTF-8?B?VGhlIGJlc3QgY3VzdG9taXplZCBmcmVpZ2h0IHNvbHV0aW9uIGZyb20gRWFzZSBmcmVpZ2h0?=; =?UTF-8?B?RXhjbHVzaXZlIEVhc2VGcmVpZ2h0IEZyZWlnaHQgU2VydmljZXMgdGFpbG9yZWQganVzdCBmb3IgeW91?=; =?UTF-8?B?RXhjbHVzaXZlIEVhc2VGcmVpZ2h0IEZyZWlnaHQgU2VydmljZXMgdGFpbG9yZWQganVzdCBmb3IgeW91?=; =?UTF-8?B?RXhjbHVzaXZlIEVhc2VGcmVpZ2h0IEZyZWlnaHQgU2VydmljZXMgdGFpbG9yZWQganVzdCBmb3IgeW91?=; =?UTF-8?B?RXhjbHVzaXZlIEVhc2VGcmVpZ2h0IEZyZWlnaHQgU2VydmljZXMgdGFpbG9yZWQganVzdCBmb3IgeW91?=; =?UTF-8?B?RXhjbHVzaXZlIEVhc2VGcmVpZ2h0IEZyZWlnaHQgU2VydmljZXMgdGFpbG9yZWQganVzdCBmb3IgeW91?=; =?UTF-8?B?VGhlIGJlc3QgY3VzdG9taXplZCBmcmVpZ2h0IHNvbHV0aW9uIGZyb20gRWFzZSBmcmVpZ2h0?=; =?UTF-8?B?VGhlIGJlc3QgY3VzdG9taXplZCBmcmVpZ2h0IHNvbHV0aW9uIGZyb20gRWFzZSBmcmVpZ2h0?=; =?UTF-8?B?RXhjbHVzaXZlIEVhc2VGcmVpZ2h0IEZyZWlnaHQgU2VydmljZXMgdGFpbG9yZWQganVzdCBmb3IgeW91?=; =?UTF-8?B?VGhlIGJlc3QgY3VzdG9taXplZCBmcmVpZ2h0IHNvbHV0aW9uIGZyb20gRWFzZSBmcmVpZ2h0?=; =?UTF-8?B?VGhlIGJlc3QgY3VzdG9taXplZCBmcmVpZ2h0IHNvbHV0aW9uIGZyb20gRWFzZSBmcmVpZ2h0?=; =?UTF-8?B?RXhjbHVzaXZlIEVhc2VGcmVpZ2h0IEZyZWlnaHQgU2VydmljZXMgdGFpbG9yZWQganVzdCBmb3IgeW91?=; =?UTF-8?B?RXhjbHVzaXZlIEVhc2VGcmVpZ2h0IEZyZWlnaHQgU2VydmljZXMgdGFpbG9yZWQganVzdCBmb3IgeW91?=; =?UTF-8?B?RXhjbHVzaXZlIEVhc2VGcmVpZ2h0IEZyZWlnaHQgU2VydmljZXMgdGFpbG9yZWQganVzdCBmb3IgeW91?=; =?UTF-8?B?VGhlIGJlc3QgY3VzdG9taXplZCBmcmVpZ2h0IHNvbHV0aW9uIGZyb20gRWFzZSBmcmVpZ2h0?=; =?UTF-8?B?VGhlIGJlc3QgY3VzdG9taXplZCBmcmVpZ2h0IHNvbHV0aW9uIGZyb20gRWFzZSBmcmVpZ2h0?=; =?UTF-8?B?RXhjbHVzaXZlIEVhc2VGcmVpZ2h0IEZyZWlnaHQgU2VydmljZXMgdGFpbG9yZWQganVzdCBmb3IgeW91?=; =?UTF-8?B?VGhlIGJlc3QgY3VzdG9taXplZCBmcmVpZ2h0IHNvbHV0aW9uIGZyb20gRWFzZSBmcmVpZ2h0?=; =?UTF-8?B?VGhlIGJlc3QgY3VzdG9taXplZCBmcmVpZ2h0IHNvbHV0aW9uIGZyb20gRWFzZSBmcmVpZ2h0?=; =?UTF-8?B?RXhjbHVzaXZlIEVhc2VGcmVpZ2h0IEZyZWlnaHQgU2VydmljZXMgdGFpbG9yZWQganVzdCBmb3IgeW91?=; =?UTF-8?B?VGhlIGJlc3QgY3VzdG9taXplZCBmcmVpZ2h0IHNvbHV0aW9uIGZyb20gRWFzZSBmcmVpZ2h0?=; =?UTF-8?B?RXhjbHVzaXZlIEVhc2VGcmVpZ2h0IEZyZWlnaHQgU2VydmljZXMgdGFpbG9yZWQganVzdCBmb3IgeW91?=; =?UTF-8?B?RXhjbHVzaXZlIEVhc2VGcmVpZ2h0IEZyZWlnaHQgU2VydmljZXMgdGFpbG9yZWQganVzdCBmb3IgeW91?=; =?UTF-8?B?VGhlIGJlc3QgY3VzdG9taXplZCBmcmVpZ2h0IHNvbHV0aW9uIGZyb20gRWFzZSBmcmVpZ2h0?=; =?UTF-8?B?VGhlIGJlc3QgY3VzdG9taXplZCBmcmVpZ2h0IHNvbHV0aW9uIGZyb20gRWFzZSBmcmVpZ2h0?=; =?UTF-8?B?VGhlIGJlc3QgY3VzdG9taXplZCBmcmVpZ2h0IHNvbHV0aW9uIGZyb20gRWFzZSBmcmVpZ2h0?=; =?UTF-8?B?VGhlIGJlc3QgY3VzdG9taXplZCBmcmVpZ2h0IHNvbHV0aW9uIGZyb20gRWFzZSBmcmVpZ2h0?=; =?UTF-8?B?VGhlIGJlc3QgY3VzdG9taXplZCBmcmVpZ2h0IHNvbHV0aW9uIGZyb20gRWFzZSBmcmVpZ2h0?=; =?UTF-8?B?RXhjbHVzaXZlIEVhc2VGcmVpZ2h0IEZyZWlnaHQgU2VydmljZXMgdGFpbG9yZWQganVzdCBmb3IgeW91?=; =?UTF-8?B?RXhjbHVzaXZlIEVhc2VGcmVpZ2h0IEZyZWlnaHQgU2VydmljZXMgdGFpbG9yZWQganVzdCBmb3IgeW91?=; =?UTF-8?B?RXhjbHVzaXZlIEVhc2VGcmVpZ2h0IEZyZWlnaHQgU2VydmljZXMgdGFpbG9yZWQganVzdCBmb3IgeW91?=; =?UTF-8?B?VGhlIGJlc3QgY3VzdG9taXplZCBmcmVpZ2h0IHNvbHV0aW9uIGZyb20gRWFzZSBmcmVpZ2h0?=; =?UTF-8?B?VGhlIGJlc3QgY3VzdG9taXplZCBmcmVpZ2h0IHNvbHV0aW9uIGZyb20gRWFzZSBmcmVpZ2h0?=; =?UTF-8?B?VGhlIGJlc3QgY3VzdG9taXplZCBmcmVpZ2h0IHNvbHV0aW9uIGZyb20gRWFzZSBmcmVpZ2h0?=; Surprise Paradox; [Books] Good Author List; [Computing] Efficient queries with grouping in Postgres; [Computing] Automatic Wake (Linux); [Computing] AWS CDK Aspects in Go; [Bike] Adidas Gravel Shoes; [Computing, Horror] Biological Chips; [Books] Weird Lit Recs; [Covid] Extended SIR Models; [Art] York-based Printmaker; [Physics] Quantum Transitions are not Instantaneous; [Computing] AI and Drum Machines; [Computing] Probabilities, Stopping Times, Martingales; bpftrace Intro Article; [Computing] Starlab Systems - Linux Laptops; [Computing] Extended Berkeley Packet Filter; [Green] Mainspring Linear Generator; Better Approach; Rummikub Solver; Chilean Poetry; Felicitations - Empowerment Grant; [Bike] Fixing Spyre Brakes (That Need Constant Adjustment); [Computing, Music] Raspberry Pi Media (Audio) Streamer; [Computing] Amazing Hack To Embed DSL In Python; [Bike] Ruta Del Condor (El Alfalfal); [Bike] Estimating Power On Climbs; [Computing] Applying Azure B2C Authentication To Function Apps; [Bike] Gearing On The Back Of An Envelope; [Computing] Okular and Postscript in OpenSuse; There's a fix!; [Computing] Fail2Ban on OpenSuse Leap 15.3 (NFTables); [Cycling, Computing] Power Calculation and Brakes; [Hardware, Computing] Amazing Pockit Computer; Bullying; How I Am - 3 Years Post Accident, 8+ Years With MS; [USA Politics] In America's Uncivil War Republicans Are The Aggressors; [Programming] Selenium and Python; Better Walking Data; [Bike] How Fast Before Walking More Efficient Than Cycling?; [COVID] Coronavirus And Cycling; [Programming] Docker on OpenSuse; Cadence v Speed; [Bike] Gearing For Real Cyclists; [Programming] React plotting - visx; [Programming] React Leaflet; AliExpress Independent Sellers; Applebaum - Twilight of Democracy; [Politics] Back + US Elections; [Programming,Exercise] Simple Timer Script; [News] 2019: The year revolt went global; [Politics] The world's most-surveilled cities

© 2006-2017 Andrew Cooke (site) / post authors (content).

Debugging A Hung (Spinning) Python Process

From: andrew cooke <andrew@...>

Date: Mon, 31 May 2010 09:46:01 -0400

I left a Python script running at the client's, overnight, expecting
everything to be ready in the morning.  But when I checked next day the CPU
was pegged at 100% and the log indicated no progress since 1am.  Clearly the
Python code had a bug and was "spinning" in a tight loop.

The problem, then, was to find out what code was being executed.  Luckily
there's a very neat solution, that I've used before, that does exactly this.
It's described in an answer by "spiv" at
http://stackoverflow.com/questions/132058/getting-stack-trace-from-a-running-python-application

That describes how to connect gdb to the process ("gdb -p PID") and dump a
Python stack trace ("pystack").  All that you need to do is create a .gdbinit
file with the contents given here -
http://svn.python.org/projects/python/trunk/Misc/gdbinit

With a stack trace it was easy to see the error in my code - and it was a
tight loop, and it depended explicitly on the time of day, which is why I had
not seen it before. :o)

Andrew

Update

From: andrew cooke <andrew@...>

Date: Thu, 31 May 2018 21:16:09 -0400

This is now simpler.

You need to follow the instructions at
https://devguide.python.org/gdb/ - basically put

  add-auto-load-safe-path /path/to/checkout

in ~/.gdbinit

Then connect with gdb -p PID and use the commands described in the
link.

There is one extra step for VMs.  You need to link the python-dgb.py
in the checkout directory to the bin directory for the virtualenv, and
the name MUST MATCH the python in use (so python-3.5, if used, not
simply python)

For example, ths worked for me:

  ln -s /home/andrew/pkg/Python-3.5.1/python-gdb.py env/bin/python3.5-gdb.py

Andrew

=?UTF-8?B?VGhlIGJlc3QgY3VzdG9taXplZCBmcmVpZ2h0IHNvbHV0aW9uIGZyb20gRWFzZSBmcmVpZ2h0?=

From: Tina <freight@...>

Date: Fri, 5 Jul 2024 10:43:55 +0800 (GMT+08:00)

CkhpCgoKCgpHcmVldGluZ3MgZnJvbSBFYXNlRnJlaWdodCEgSSdtIFRpbmEsIHRoZSBGcmVpZ2h0
IE1hbmFnZXIgYXQgRWFzZUZyZWlnaHQsIGFuIEFJIGZyZWlnaHQgYWdlbnQgbmV0d29yayBlc3Rh
Ymxpc2hlZCB1bmRlciBOZXRlYXNlLCBhIENoaW5lc2UgcHVibGljbHkgbGlzdGVkIGNvbXBhbnkg
aW4gMjAwMS4gV2l0aCAxNSB5ZWFycyBvZiBleHBlcmllbmNlIGluIHRoZSBpbXBvcnQgYW5kIGV4
cG9ydCBpbmR1c3RyeSwgd2UgaGF2ZSBnYXRoZXJlZCBvdmVyIDEwLDAwMCBDaGluZXNlIGZyZWln
aHQgYWdlbnRzIHRvIGVuc3VyZSBvdXIgY3VzdG9tZXJzIHJlY2VpdmUgZWZmaWNpZW50IGFuZCBj
b3N0LWVmZmVjdGl2ZSBmcmVpZ2h0IHNlcnZpY2VzLgoKCldlIHN1cHBvcnQgeW91OgoxLk11bHRp
cGxlIGZyZWlnaHQgcXVvdGF0aW9ucyB0byBlbnN1cmUgeW91IGNob29zZSB0aGUgYmVzdCBzb2x1
dGlvbi4KMi5UaGUgcXVvdGF0aW9uIGRldGFpbHMgYXJlIHNwZWNpZmljIGFuZCBjb21wcmVoZW5z
aXZlLCBwcm92aWRpbmcgYSBjbGVhciB1bmRlcnN0YW5kaW5nIG9mIGVhY2ggY29zdCBpbnZvbHZl
ZC4KMy5UcmFuc3BhcmVudCBwcmljaW5nLCBubyBtaWRkbGVtYW4gbWFya3Vwcy4KNC5PZmZlcmlu
ZyBhIHZhcmlldHkgb2Ygc2hpcHBpbmcgbWV0aG9kcyBmb3IgZmxleGlibGUgc2VsZWN0aW9uIGJh
c2VkIG9uIHNwZWNpZmljIG5lZWRzLgoKCgoKCldlIGJlbGlldmUgaW4gb3VyIGFiaWxpdHkgdG8g
cHJvdmlkZSB5b3Ugd2l0aCBjdXN0b21pemVkIHNlcnZpY2VzLCBlYXJuaW5nIHlvdXIgcmVjb2du
aXRpb24gdGhyb3VnaCBvdXIgcHJvZmVzc2lvbmFsaXNtLCBjYXBhYmlsaXRpZXMsIHNwZWVkLCBh
bmQgZWZmaWNpZW5jeSwgZW5zdXJpbmcgeW91IGVuam95IHRoZSBiZXN0IHNoaXBwaW5nIHNvbHV0
aW9ucy5QbGVhc2Uga2luZGx5IGNvbnRhY3QgdXMgbm93IGZvciBmcmVlIGNvbnRhaW5lciBzaGlw
cGluZyBxdW90ZSEKCgoKCkJlc3QgcmVnYXJkcywKVGluYSBYaWUKQ3VzdG9tZXIgUmVwcmVzZW50
YXRpdmUKCkVhc2VGcmVpZ2h0IChTdWJzaWRpYXJ5IG9mIE5ldEVhc2UpCgpXZWJzaXRlOiBlYXNl
LWZyZWlnaHQuY29tCkUtbWFpbDogdGluYUBlYXNlZnJlaWdodGluYy5jb20KCgoKQWRkcmVzczog
TmV0ZWFzZcKt4oCUMzk5IFdhbmdzaGFuZyBSb2FkLCBCaW5qaWFuZyBEaXN0cmljdCwgSGFuZ3po
b3UKCgoKCgoKCgoKCgpJZiB5b3UgZG9uJ3Qgd2FudCB0byByZWNlaXZlIG91ciBlbWFpbHMsIHlv
dSBjYW4gZWFzaWx5IHVuc3Vic2NyaWJlIGhlcmUuCgoKDQoNCg==

=?UTF-8?B?RXhjbHVzaXZlIEVhc2VGcmVpZ2h0IEZyZWlnaHQgU2VydmljZXMgdGFpbG9yZWQganVzdCBmb3IgeW91?=

From: Tina <freight@...>

Date: Tue, 9 Jul 2024 11:47:55 +0800 (GMT+08:00)

CkhpCgoKCgpIaSxuaWNlIHRvIGNvbnRhY3QgeW91IGFnYWluISBJJ20gVGluYSwgZnJlaWdodCBt
YW5hZ2VyIG9mIEVhc2VmcmVpZ2h0LCBmcm9tIHRoZSBBSSBmcmVpZ2h0IGFnZW50IG5ldHdvcmsg
b2YgTmV0RWFzZSwgYSBsaXN0ZWQgY29tcGFueSBpbiBDaGluYS5XZSBhcmUgbm90IGp1c3QgeW91
ciBwb2ludCBvZiBjb250YWN0IHdpdGggZnJlaWdodCBhZ2VudHMsIGJ1dCB5b3VyIGdsb2JhbCB0
cmFkZSBwYXJ0bmVyLCBvZmZlcmluZyBpbnNpZ2h0cyBhbmQgYWR2aWNlIHRvIG5hdmlnYXRlIHRo
ZSBjb21wbGV4aXRpZXMgb2YgaW50ZXJuYXRpb25hbCBzaGlwcGluZy4KCgpXZSBzdXBwb3J0IHlv
dToKIDEuT2ZmZXJzIGRlZGljYXRlZCBvbmUtb24tb25lIGN1c3RvbWVyIHNlcnZpY2UgcmVwcmVz
ZW50YXRpdmVzIGFuZCBwcm9tcHQgcXVvdGF0aW9ucwogMi5PZmZlciB0YWlsb3JlZCBmcmVpZ2h0
IHNvbHV0aW9ucyB0byBtZWV0IHRoZSB1bmlxdWUgcmVxdWlyZW1lbnRzIG9mIG91ciBjbGllbnRz
LgogMy5Qcm92aWRpbmcgcmVsaWFibGUgZnJlaWdodCBwYXJ0bmVycyBhbmQgaGF2ZSBvZmZpY2Vz
IGluIG1ham9yIHBvcnRzIGZvciBvbi1zaXRlIGF1ZGl0cwoKCk91ciBjdXN0b21lciBzdXBwb3J0
IHRlYW0gaXMgYWx3YXlzIHJlYWR5IHRvIGFzc2lzdCB3aXRoIGFueSBpbnF1aXJpZXMsIGVuc3Vy
aW5nIGEgc21vb3RoIGFuZCB3b3JyeS1mcmVlIGV4cGVyaWVuY2UuUGxlYXNlIGtpbmRseSByZXBs
eSB0byBnZXQgdGhlIGxhdGVzdCBmcmVlIG9mIGNoYXJnZSBDaGluYSBzaGlwcGluZyBxdW90ZXMh
CgoKCgoKQmVzdCByZWdhcmRzLApUaW5hIFhpZQpDdXN0b21lciBSZXByZXNlbnRhdGl2ZQoKRWFz
ZUZyZWlnaHQgKFN1YnNpZGlhcnkgb2YgTmV0RWFzZSkKCldlYnNpdGU6IGVhc2UtZnJlaWdodC5j
b20KRS1tYWlsOiB0aW5hQGVhc2VmcmVpZ2h0aW5jLmNvbQoKCgpBZGRyZXNzOiBOZXRlYXNlwq3i
gJQzOTkgV2FuZ3NoYW5nIFJvYWQsIEJpbmppYW5nIERpc3RyaWN0LCBIYW5nemhvdQoKCgoKCgoK
CgoKCklmIHlvdSBkb24ndCB3YW50IHRvIHJlY2VpdmUgb3VyIGVtYWlscywgeW91IGNhbiBlYXNp
bHkgdW5zdWJzY3JpYmUgaGVyZS4KCgoK5ZyoMjAyNC0wNy0wNe+8jFRpbmEgPGZyZWlnaHRAbG9n
aXN0aWNzZGlzdHJpYnV0aW9uY28uY29tPiDlhpnpgZM6LS0tLS3ljp/lp4vpgq7ku7YtLS0tLQog
5Y+R5Lu25Lq677yaIFRpbmEgPGZyZWlnaHRAbG9naXN0aWNzZGlzdHJpYnV0aW9uY28uY29tPgog
5Y+R5Lu25pe26Ze0OiAyMDI05bm0MDfmnIgwNeaXpSDlkajkupQKIOaUtuS7tuS6uu+8miBbY29t
cHV0ZStkZWJ1Z2dpbmdhMEBhY29va2Uub3JnXQog5Li76aKY77yaIFRoZSBiZXN0IGN1c3RvbWl6
ZWQgZnJlaWdodCBzb2x1dGlvbiBmcm9tIEVhc2UgZnJlaWdodAoKCkhpCgoKCgpHcmVldGluZ3Mg
ZnJvbSBFYXNlRnJlaWdodCEgSSdtIFRpbmEsIHRoZSBGcmVpZ2h0IE1hbmFnZXIgYXQgRWFzZUZy
ZWlnaHQsIGFuIEFJIGZyZWlnaHQgYWdlbnQgbmV0d29yayBlc3RhYmxpc2hlZCB1bmRlciBOZXRl
YXNlLCBhIENoaW5lc2UgcHVibGljbHkgbGlzdGVkIGNvbXBhbnkgaW4gMjAwMS4gV2l0aCAxNSB5
ZWFycyBvZiBleHBlcmllbmNlIGluIHRoZSBpbXBvcnQgYW5kIGV4cG9ydCBpbmR1c3RyeSwgd2Ug
aGF2ZSBnYXRoZXJlZCBvdmVyIDEwLDAwMCBDaGluZXNlIGZyZWlnaHQgYWdlbnRzIHRvIGVuc3Vy
ZSBvdXIgY3VzdG9tZXJzIHJlY2VpdmUgZWZmaWNpZW50IGFuZCBjb3N0LWVmZmVjdGl2ZSBmcmVp
Z2h0IHNlcnZpY2VzLgoKCldlIHN1cHBvcnQgeW91OgogMS5NdWx0aXBsZSBmcmVpZ2h0IHF1b3Rh
dGlvbnMgdG8gZW5zdXJlIHlvdSBjaG9vc2UgdGhlIGJlc3Qgc29sdXRpb24uCiAyLlRoZSBxdW90
YXRpb24gZGV0YWlscyBhcmUgc3BlY2lmaWMgYW5kIGNvbXByZWhlbnNpdmUsIHByb3ZpZGluZyBh
IGNsZWFyIHVuZGVyc3RhbmRpbmcgb2YgZWFjaCBjb3N0IGludm9sdmVkLgogMy5UcmFuc3BhcmVu
dCBwcmljaW5nLCBubyBtaWRkbGVtYW4gbWFya3Vwcy4KIDQuT2ZmZXJpbmcgYSB2YXJpZXR5IG9m
IHNoaXBwaW5nIG1ldGhvZHMgZm9yIGZsZXhpYmxlIHNlbGVjdGlvbiBiYXNlZCBvbiBzcGVjaWZp
YyBuZWVkcy4KCgoKCgpXZSBiZWxpZXZlIGluIG91ciBhYmlsaXR5IHRvIHByb3ZpZGUgeW91IHdp
dGggY3VzdG9taXplZCBzZXJ2aWNlcywgZWFybmluZyB5b3VyIHJlY29nbml0aW9uIHRocm91Z2gg
b3VyIHByb2Zlc3Npb25hbGlzbSwgY2FwYWJpbGl0aWVzLCBzcGVlZCwgYW5kIGVmZmljaWVuY3ks
IGVuc3VyaW5nIHlvdSBlbmpveSB0aGUgYmVzdCBzaGlwcGluZyBzb2x1dGlvbnMuUGxlYXNlIGtp
bmRseSBjb250YWN0IHVzIG5vdyBmb3IgZnJlZSBjb250YWluZXIgc2hpcHBpbmcgcXVvdGUhCgoK
CgpCZXN0IHJlZ2FyZHMsClRpbmEgWGllCkN1c3RvbWVyIFJlcHJlc2VudGF0aXZlCgpFYXNlRnJl
aWdodCAoU3Vic2lkaWFyeSBvZiBOZXRFYXNlKQoKV2Vic2l0ZTogZWFzZS1mcmVpZ2h0LmNvbQpF
LW1haWw6IHRpbmFAZWFzZWZyZWlnaHRpbmMuY29tCgoKCkFkZHJlc3M6IE5ldGVhc2XCreKAlDM5
OSBXYW5nc2hhbmcgUm9hZCwgQmluamlhbmcgRGlzdHJpY3QsIEhhbmd6aG91CgoKCgoKCgoKCgoK
SWYgeW91IGRvbid0IHdhbnQgdG8gcmVjZWl2ZSBvdXIgZW1haWxzLCB5b3UgY2FuIGVhc2lseSB1
bnN1YnNjcmliZSBoZXJlLgoKCgoKDQoNCg==

Comment on this post