--------------060208050503030106060900 Content-Type: text/plain; charset=ISO-2022-JP Content-Transfer-Encoding: 7bit ¤¿¤à¤é¤Ç¤¹¡£ ÃÙ¤¤»þ´Ö¤Ë¤Ê¤Ã¤Æ¤·¤Þ¤Ã¤¿¤Î¤Ç¤³¤Î¥á¡¼¥ë¤Ë smtp.rb ¤òźÉÕ¤·¤Þ¤¹¡£ Ãí°ÕÅÀ¡§ ¡¡ ê¤ò³Ð¤¨¤Æ¤¤¤Þ¤»¤ó¡¨Âòõâùôáì¤Â¤È¤«¤À¤Ã¤¿¤«¤âÃΤì¤Þ¤»¤ó¡£ ¡¡Revision 1.2¤ß¤¿¤¤¤Ç¤¹¡£¤Á¤Ê¤ß¤Ë¤Ï 1.8.5preview3¤Ç¤Ï 1.69.2.3 ¡¡¤è¤Ã¤Æ¡¢ºÇ¿·¤Þ¤Ç¤Ç µ¤µ¤ì¤Æ¤¤¤ë¥Ð¥°¤¬»Ä¤Ã¤Æ¤¤¤ë¤È»×¤ï¤ì¤Þ¤¹¡¨Â ¤¿¤à¤é¤¬¤³¤ì¤òư¤«¤·¤Æ¤¤¤ë´Ä¶¤Ï % ruby -v ruby 1.8.2 (2005-04-11) [i386-linux] ¤Ç¤¹¡£¤³¤ì¤Ç°Ê²¼¤Î Gmail¤Î¾ì¹ç¤ÈƱ¤¸¥Ñ¥é¥á¡¼¥¿¤Ç²ñ¼Ò¤Î smtp¥µ¡¼¥Ð¡¼¤È ¤Ä¤Ê¤¬¤Ã¤Æ¤¤¤Þ¤¹¡£ Hisashi Yahata wrote: > ¤¿¤à¤é¤±¤ó¤¤¤ÁÍÍ > ÅÏÊÕůÌéÍÍ > > ¡¡´ò¤·¤¤¾ðÊó¤ò¤¤¤¿¤À¤Í¤êÆñ¤¦¤´¤¶¤¤¤Þ¤¹¡£ >> ¿¦¾ì¤Ç SMTP over SSLÍÑ¤Ë 1.9¤Î smtp.rb¤ò»È¤Ã¤Æ 1.8·Ï¤«¤éÁ÷¿®¤·¤Æ¤Þ¤¹¡£ > ¤È >> 1.9 ·Ï¤Ç¤Î Gmail ¤Î¾ì¹ç¤Ç¤¹¤¬ >> Net::SMTP.enable_tls(nil) >> Net::SMTP.start(SMTP_server, 587, domain, user, password, :login) do > |smtp| >> ¤Ç¥á¡¼¥ë¤òÁ÷¤ì¤Þ¤¹¡£¡Ö:login¡×¤Ï¡Ö:plain¡×¤Ç¤âÁ÷¤ì¤ë¤è¤¦¤Ç¤¹¡£ > > ¤Ê¤ª¡¢¤³¤Á¤é¤Ç»ÈÍѤ¹¤ëRuby¤Î¥Ð¡¼¥¸¥ç¥ó¤Ï¡¢ > ruby 1.8.2 (2004-11-06) [i386-mswin32] > ¤Ç¤¹¡£ 1.9 ·Ï¤Ë¹¹¿·¤·¤Æ»î¤·¤Æ¤ß¤¿¤¤¤È»×¤¤¤Þ¤¹¡£ -- ¤¿¤à¤é¤±¤ó¤¤¤Á<URL:http://www.rubyist.net/~tamura/d/> Gmail¤·¤¿¤¤Êý¡¢¥á¡¼¥ë¤¯¤À¤µ¤¤(»Ä:50) --------------060208050503030106060900 Content-Type: text/plain; name mtp.rb" Content-Transfer-Encoding: base64 Content-Disposition: inline; filename mtp.rb" IyA9IG5ldC9zbXRwLnJiCiMgCiMgQ29weXJpZ2h0IChjKSAxOTk5LTIwMDMgWXVraWhpcm8g TWF0c3Vtb3RvLgojCiMgQ29weXJpZ2h0IChjKSAxOTk5LTIwMDMgTWluZXJvIEFva2kuCiMg CiMgV3JpdHRlbiAmIG1haW50YWluZWQgYnkgTWluZXJvIEFva2kgPGFhbWluZUBsb3ZlcnVi eS5uZXQ+LgojCiMgRG9jdW1lbnRlZCBieSBXaWxsaWFtIFdlYmJlciBhbmQgTWluZXJvIEFv a2kuCiMgCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmUuIFlvdSBjYW4gcmUtZGlz dHJpYnV0ZSBhbmQvb3IKIyBtb2RpZnkgdGhpcyBwcm9ncmFtIHVuZGVyIHRoZSBzYW1lIHRl cm1zIGFzIFJ1YnkgaXRzZWxmLAojIFJ1YnkgRGlzdHJpYnV0ZSBMaWNlbnNlIG9yIEdOVSBH ZW5lcmFsIFB1YmxpYyBMaWNlbnNlLgojIAojIE5PVEU6IFlvdSBjYW4gZmluZCBKYXBhbmVz ZSB2ZXJzaW9uIG9mIHRoaXMgZG9jdW1lbnQgaW4KIyB0aGUgZG9jL25ldCBkaXJlY3Rvcnkg b2YgdGhlIHN0YW5kYXJkIHJ1YnkgaW50ZXJwcmV0ZXIgcGFja2FnZS4KIyAKIyAkSWQ6IHNt dHAucmIsdiAxLjIgMjAwNC8wOC8wMiAxMTowNzozMCBrb21hMiBFeHAgJAojCiMgU2VlIE5l dDo6U01UUCBmb3IgZG9jdW1lbnRhdGlvbi4gCiMgCgpyZXF1aXJlICduZXQvcHJvdG9jb2xz JwpyZXF1aXJlICdkaWdlc3QvbWQ1JwpiZWdpbgogIHJlcXVpcmUgIm9wZW5zc2wiCnJlc2N1 ZSBMb2FkRXJyb3IKZW5kCgptb2R1bGUgTmV0CgogICMgTW9kdWxlIG1peGVkIGluIHRvIGFs bCBTTVRQIGVycm9yIGNsYXNzZXMKICBtb2R1bGUgU01UUEVycm9yCiAgICAjIFRoaXMgKmNs YXNzKiBpcyBtb2R1bGUgZm9yIHNvbWUgcmVhc29uLgogICAgIyBJbiBydWJ5IDEuOS54LCB0 aGlzIG1vZHVsZSBiZWNvbWVzIGEgY2xhc3MuCiAgZW5kCgogICMgUmVwcmVzZW50cyBhbiBT TVRQIGF1dGhlbnRpY2F0aW9uIGVycm9yLgogIGNsYXNzIFNNVFBBdXRoZW50aWNhdGlvbkVy cm9yIDwgUHJvdG9BdXRoRXJyb3IKICAgIGluY2x1ZGUgU01UUEVycm9yCiAgZW5kCgogICMg UmVwcmVzZW50cyBTTVRQIGVycm9yIGNvZGUgNDIwIG9yIDQ1MCwgYSB0ZW1wb3JhcnkgZXJy b3IuCiAgY2xhc3MgU01UUFNlcnZlckJ1c3kgPCBQcm90b1NlcnZlckVycm9yCiAgICBpbmNs dWRlIFNNVFBFcnJvcgogIGVuZAoKICAjIFJlcHJlc2VudHMgYW4gU01UUCBjb21tYW5kIHN5 bnRheCBlcnJvciAoZXJyb3IgY29kZSA1MDApCiAgY2xhc3MgU01UUFN5bnRheEVycm9yIDwg UHJvdG9TeW50YXhFcnJvcgogICAgaW5jbHVkZSBTTVRQRXJyb3IKICBlbmQKCiAgIyBSZXBy ZXNlbnRzIGEgZmF0YWwgU01UUCBlcnJvciAoZXJyb3IgY29kZSA1eHgsIGV4Y2VwdCBmb3Ig NTAwKQogIGNsYXNzIFNNVFBGYXRhbEVycm9yIDwgUHJvdG9GYXRhbEVycm9yCiAgICBpbmNs dWRlIFNNVFBFcnJvcgogIGVuZAoKICAjIFVuZXhwZWN0ZWQgcmVwbHkgY29kZSByZXR1cm5l ZCBmcm9tIHNlcnZlci4KICBjbGFzcyBTTVRQVW5rbm93bkVycm9yIDwgUHJvdG9Vbmtub3du RXJyb3IKICAgIGluY2x1ZGUgU01UUEVycm9yCiAgZW5kCgogICMKICAjID0gTmV0OjpTTVRQ CiAgIwogICMgPT0gV2hhdCBpcyBUaGlzIExpYnJhcnk/CiAgIyAKICAjIFRoaXMgbGlicmFy eSBwcm92aWRlcyBmdW5jdGlvbmFsaXR5IHRvIHNlbmQgaW50ZXJuZXQKICAjIG1haWwgdmlh IFNNVFAsIHRoZSBTaW1wbGUgTWFpbCBUcmFuc2ZlciBQcm90b2NvbC4gRm9yIGRldGFpbHMg b2YKICAjIFNNVFAgaXRzZWxmLCBzZWUgW1JGQzI4MjFdIChodHRwOi8vd3d3LmlldGYub3Jn L3JmYy9yZmMyODIxLnR4dCkuCiAgIyAKICAjID09IFdoYXQgaXMgVGhpcyBMaWJyYXJ5IE5P VD8KICAjIAogICMgVGhpcyBsaWJyYXJ5IGRvZXMgTk9UIHByb3ZpZGUgZnVuY3Rpb25zIHRv IGNvbXBvc2UgaW50ZXJuZXQgbWFpbHMuCiAgIyBZb3UgbXVzdCBjcmVhdGUgdGhlbSBieSB5 b3Vyc2VsZi4gSWYgeW91IHdhbnQgYmV0dGVyIG1haWwgc3VwcG9ydCwKICAjIHRyeSBSdWJ5 TWFpbCBvciBUTWFpbC4gWW91IGNhbiBnZXQgYm90aCBsaWJyYXJpZXMgZnJvbSBSQUEuCiAg IyAoaHR0cDovL3d3dy5ydWJ5LWxhbmcub3JnL2VuL3JhYS5odG1sKQogICMgCiAgIyBGWUk6 IHRoZSBvZmZpY2lhbCBkb2N1bWVudGF0aW9uIG9uIGludGVybmV0IG1haWwgaXM6IFtSRkMy ODIyXSAoaHR0cDovL3d3dy5pZXRmLm9yZy9yZmMvcmZjMjgyMi50eHQpLgogICMgCiAgIyA9 PSBFeGFtcGxlcwogICMgCiAgIyA9PT0gU2VuZGluZyBNZXNzYWdlcwogICMgCiAgIyBZb3Ug bXVzdCBvcGVuIGEgY29ubmVjdGlvbiB0byBhbiBTTVRQIHNlcnZlciBiZWZvcmUgc2VuZGlu ZyBtZXNzYWdlcy4KICAjIFRoZSBmaXJzdCBhcmd1bWVudCBpcyB0aGUgYWRkcmVzcyBvZiB5 b3VyIFNNVFAgc2VydmVyLCBhbmQgdGhlIHNlY29uZCAKICAjIGFyZ3VtZW50IGlzIHRoZSBw b3J0IG51bWJlci4gVXNpbmcgU01UUC5zdGFydCB3aXRoIGEgYmxvY2sgaXMgdGhlIHNpbXBs ZXN0IAogICMgd2F5IHRvIGRvIHRoaXMuIFRoaXMgd2F5LCB0aGUgU01UUCBjb25uZWN0aW9u IGlzIGNsb3NlZCBhdXRvbWF0aWNhbGx5IAogICMgYWZ0ZXIgdGhlIGJsb2NrIGlzIGV4ZWN1 dGVkLgogICMgCiAgIyAgICAgcmVxdWlyZSAnbmV0L3NtdHAnCiAgIyAgICAgTmV0OjpTTVRQ LnN0YXJ0KCd5b3VyLnNtdHAuc2VydmVyJywgMjUpIGRvIHxzbXRwfAogICMgICAgICAgIyBV c2UgdGhlIFNNVFAgb2JqZWN0IHNtdHAgb25seSBpbiB0aGlzIGJsb2NrLgogICMgICAgIGVu ZAogICMgCiAgIyBSZXBsYWNlICd5b3VyLnNtdHAuc2VydmVyJyB3aXRoIHlvdXIgU01UUCBz ZXJ2ZXIuIE5vcm1hbGx5CiAgIyB5b3VyIHN5c3RlbSBtYW5hZ2VyIG9yIGludGVybmV0IHBy b3ZpZGVyIHN1cHBsaWVzIGEgc2VydmVyCiAgIyBmb3IgeW91LgogICMgCiAgIyBUaGVuIHlv dSBjYW4gc2VuZCBtZXNzYWdlcy4KICAjIAogICMgICAgIG1zZ3N0ciA9IDw8RU5EX09GX01F U1NBR0UKICAjICAgICBGcm9tOiBZb3VyIE5hbWUgPHlvdXJAbWFpbC5hZGRyZXNzPgogICMg ICAgIFRvOiBEZXN0aW5hdGlvbiBBZGRyZXNzIDxzb21lb25lQGV4YW1wbGUuY29tPgogICMg ICAgIFN1YmplY3Q6IHRlc3QgbWVzc2FnZQogICMgICAgIERhdGU6IFNhdCwgMjMgSnVuIDIw MDEgMTY6MjY6NDMgKzA5MDAKICAjICAgICBNZXNzYWdlLUlkOiA8dW5pcXVlLm1lc3NhZ2Uu aWQuc3RyaW5nQGV4YW1wbGUuY29tPgogICMgCiAgIyAgICAgVGhpcyBpcyBhIHRlc3QgbWVz c2FnZS4KICAjICAgICBFTkRfT0ZfTUVTU0FHRQogICMgCiAgIyAgICAgcmVxdWlyZSAnbmV0 L3NtdHAnCiAgIyAgICAgTmV0OjpTTVRQLnN0YXJ0KCd5b3VyLnNtdHAuc2VydmVyJywgMjUp IGRvIHxzbXRwfAogICMgICAgICAgc210cC5zZW5kX21lc3NhZ2UgbXNnc3RyLAogICMgICAg ICAgICAgICAgICAgICAgICAgICAgJ3lvdXJAbWFpbC5hZGRyZXNzJywKICAjICAgICAgICAg ICAgICAgICAgICAgICAgICdoaXNfYWRkZXNzQGV4YW1wbGUuY29tJwogICMgICAgIGVuZAog ICMgCiAgIyA9PT0gQ2xvc2luZyB0aGUgU2Vzc2lvbgogICMgCiAgIyBZb3UgTVVTVCBjbG9z ZSB0aGUgU01UUCBzZXNzaW9uIGFmdGVyIHNlbmRpbmcgbWVzc2FnZXMsIGJ5IGNhbGxpbmcg CiAgIyB0aGUgI2ZpbmlzaCBtZXRob2Q6CiAgIyAKICAjICAgICAjIHVzaW5nIFNNVFAjZmlu aXNoCiAgIyAgICAgc210cCA9IE5ldDo6U01UUC5zdGFydCgneW91ci5zbXRwLnNlcnZlcics IDI1KQogICMgICAgIHNtdHAuc2VuZF9tZXNzYWdlIG1zZ3N0ciwgJ2Zyb21AYWRkcmVzcycs ICd0b0BhZGRyZXNzJwogICMgICAgIHNtdHAuZmluaXNoCiAgIyAKICAjIFlvdSBjYW4gYWxz byB1c2UgdGhlIGJsb2NrIGZvcm0gb2YgU01UUC5zdGFydC9TTVRQI3N0YXJ0LiAgVGhpcyBj bG9zZXMKICAjIHRoZSBTTVRQIHNlc3Npb24gYXV0b21hdGljYWxseToKICAjIAogICMgICAg ICMgdXNpbmcgYmxvY2sgZm9ybSBvZiBTTVRQLnN0YXJ0CiAgIyAgICAgTmV0OjpTTVRQLnN0 YXJ0KCd5b3VyLnNtdHAuc2VydmVyJywgMjUpIGRvIHxzbXRwfAogICMgICAgICAgc210cC5z ZW5kX21lc3NhZ2UgbXNnc3RyLCAnZnJvbUBhZGRyZXNzJywgJ3RvQGFkZHJlc3MnCiAgIyAg ICAgZW5kCiAgIyAKICAjIEkgc3Ryb25nbHkgcmVjb21tZW5kIHRoaXMgc2NoZW1lLiAgVGhp cyBmb3JtIGlzIHNpbXBsZXIgYW5kIG1vcmUgcm9idXN0LgogICMgCiAgIyA9PT0gSEVMTyBk b21haW4KICAjIAogICMgSW4gYWxtb3N0IGFsbCBzaXR1YXRpb25zLCB5b3UgbXVzdCBwcm92 aWRlIGEgdGhpcmQgYXJndW1lbnQKICAjIHRvIFNNVFAuc3RhcnQvU01UUCNzdGFydC4gVGhp cyBpcyB0aGUgZG9tYWluIG5hbWUgd2hpY2ggeW91IGFyZSBvbgogICMgKHRoZSBob3N0IHRv IHNlbmQgbWFpbCBmcm9tKS4gSXQgaXMgY2FsbGVkIHRoZSAiSEVMTyBkb21haW4iLgogICMg VGhlIFNNVFAgc2VydmVyIHdpbGwganVkZ2Ugd2hldGhlciBpdCBzaG91bGQgc2VuZCBvciBy ZWplY3QKICAjIHRoZSBTTVRQIHNlc3Npb24gYnkgaW5zcGVjdGluZyB0aGUgSEVMTyBkb21h aW4uCiAgIyAKICAjICAgICBOZXQ6OlNNVFAuc3RhcnQoJ3lvdXIuc210cC5zZXJ2ZXInLCAy NSwKICAjICAgICAgICAgICAgICAgICAgICAgJ21haWwuZnJvbS5kb21haW4nKSB7IHxzbXRw fCAuLi4gfQogICMgCiAgIyA9PT0gU01UUCBBdXRoZW50aWNhdGlvbgogICMgCiAgIyBUaGUg TmV0OjpTTVRQIGNsYXNzIHN1cHBvcnRzIHRocmVlIGF1dGhlbnRpY2F0aW9uIHNjaGVtZXM7 CiAgIyBQTEFJTiwgTE9HSU4gYW5kIENSQU0gTUQ1LiAgKFNNVFAgQXV0aGVudGljYXRpb246 IFtSRkMyNTU0XSkKICAjIFRvIHVzZSBTTVRQIGF1dGhlbnRpY2F0aW9uLCBwYXNzIGV4dHJh IGFyZ3VtZW50cyB0byAKICAjIFNNVFAuc3RhcnQvU01UUCNzdGFydC4KICAjIAogICMgICAg ICMgUExBSU4KICAjICAgICBOZXQ6OlNNVFAuc3RhcnQoJ3lvdXIuc210cC5zZXJ2ZXInLCAy NSwgJ21haWwuZnJvbS5kb21haW4nLAogICMgICAgICAgICAgICAgICAgICAgICAnWW91ciBB Y2NvdW50JywgJ1lvdXIgUGFzc3dvcmQnLCA6cGxhaW4pCiAgIyAgICAgIyBMT0dJTgogICMg ICAgIE5ldDo6U01UUC5zdGFydCgneW91ci5zbXRwLnNlcnZlcicsIDI1LCAnbWFpbC5mcm9t LmRvbWFpbicsCiAgIyAgICAgICAgICAgICAgICAgICAgICdZb3VyIEFjY291bnQnLCAnWW91 ciBQYXNzd29yZCcsIDpsb2dpbikKICAjIAogICMgICAgICMgQ1JBTSBNRDUKICAjICAgICBO ZXQ6OlNNVFAuc3RhcnQoJ3lvdXIuc210cC5zZXJ2ZXInLCAyNSwgJ21haWwuZnJvbS5kb21h aW4nLAogICMgICAgICAgICAgICAgICAgICAgICAnWW91ciBBY2NvdW50JywgJ1lvdXIgUGFz c3dvcmQnLCA6Y3JhbV9tZDUpCiAgIwogIGNsYXNzIFNNVFAKCiAgICBSZXZpc2lvbiA9ICVx JFJldmlzaW9uOiAxLjIgJC5zcGxpdFsxXQoKICAgICMgVGhlIGRlZmF1bHQgU01UUCBwb3J0 LCBwb3J0IDI1LgogICAgZGVmIFNNVFAuZGVmYXVsdF9wb3J0CiAgICAgIDI1CiAgICBlbmQK CiAgICBAdXNlX3RscyA9IGZhbHNlCiAgICBAdmVyaWZ5ID0gbmlsCiAgICBAY2VydHMgPSBu aWwKCiAgICAjIEVuYWJsZSBTU0wgZm9yIGFsbCBuZXcgaW5zdGFuY2VzLgogICAgIyArdmVy aWZ5KyBpcyB0aGUgdHlwZSBvZiB2ZXJpZmljYXRpb24gdG8gZG8gb24gdGhlIFNlcnZlciBD ZXJ0OyBEZWZhdWx0cwogICAgIyB0byBPcGVuU1NMOjpTU0w6OlZFUklGWV9QRUVSLgogICAg IyArY2VydHMrIGlzIGEgZmlsZSBvciBkaXJlY3RvcnkgaG9sZGluZyBDQSBjZXJ0cyB0byB1 c2UgdG8gdmVyaWZ5IHRoZSAKICAgICMgc2VydmVyIGNlcnQ7IERlZmF1bHRzIHRvIG5pbC4K ICAgIGRlZiBTTVRQLmVuYWJsZV90bHModmVyaWZ5ID0gT3BlblNTTDo6U1NMOjpWRVJJRllf UEVFUiwgY2VydHMgPSBuaWwpCiAgICAgIEB1c2VfdGxzID0gdHJ1ZQogICAgICBAdmVyaWZ5 ID0gdmVyaWZ5CiAgICAgIEBjZXJ0cyA9IGNlcnRzICAKICAgIGVuZAoKICAgICMgRGlzYWJs ZSBTU0wgZm9yIGFsbCBuZXcgaW5zdGFuY2VzLgogICAgZGVmIFNNVFAuZGlzYWJsZV90bHMK ICAgICAgQHVzZV90bHMgPSBuaWwKICAgICAgQHZlcmlmeSA9IG5pbAogICAgICBAY2VydHMg PSBuaWwKICAgIGVuZAoKICAgIGRlZiBTTVRQLnVzZV90bHM/CiAgICAgIEB1c2VfdGxzCiAg ICBlbmQKCiAgICBkZWYgU01UUC52ZXJpZnkKICAgICAgQHZlcmlmeQogICAgZW5kCgogICAg ZGVmIFNNVFAuY2VydHMKICAgICAgQGNlcnRzCiAgICBlbmQKICAgIAogICAgIwogICAgIyBD cmVhdGVzIGEgbmV3IE5ldDo6U01UUCBvYmplY3QuCiAgICAjCiAgICAjICthZGRyZXNzKyBp cyB0aGUgaG9zdG5hbWUgb3IgaXAgYWRkcmVzcyBvZiB5b3VyIFNNVFAKICAgICMgc2VydmVy LiAgK3BvcnQrIGlzIHRoZSBwb3J0IHRvIGNvbm5lY3QgdG87IGl0IGRlZmF1bHRzIHRvCiAg ICAjIHBvcnQgMjUuCiAgICAjCiAgICAjIFRoaXMgbWV0aG9kIGRvZXMgbm90IG9wZW4gdGhl IFRDUCBjb25uZWN0aW9uLiAgWW91IGNhbiB1c2UKICAgICMgU01UUC5zdGFydCBpbnN0ZWFk IG9mIFNNVFAubmV3IGlmIHlvdSB3YW50IHRvIGRvIGV2ZXJ5dGhpbmcKICAgICMgYXQgb25j ZS4gIE90aGVyd2lzZSwgZm9sbG93IFNNVFAubmV3IHdpdGggU01UUCNzdGFydC4KICAgICMK ICAgIGRlZiBpbml0aWFsaXplKGFkZHJlc3MsIHBvcnQgPSBuaWwpCiAgICAgIEBhZGRyZXNz ID0gYWRkcmVzcwogICAgICBAcG9ydCA9IChwb3J0IHx8IFNNVFAuZGVmYXVsdF9wb3J0KQog ICAgICBAZXNtdHAgPSB0cnVlCiAgICAgIEBzb2NrZXQgPSBuaWwKICAgICAgQHN0YXJ0ZWQg PSBmYWxzZQogICAgICBAb3Blbl90aW1lb3V0ID0gMzAKICAgICAgQHJlYWRfdGltZW91dCA9 IDYwCiAgICAgIEBlcnJvcl9vY2N1cmVkID0gZmFsc2UKICAgICAgQGRlYnVnX291dHB1dCA9 IG5pbAogICAgICBAdXNlX3RscyA9IFNNVFAudXNlX3Rscz8KICAgICAgQGNlcnRzID0gU01U UC5jZXJ0cwogICAgICBAdmVyaWZ5ID0gU01UUC52ZXJpZnkgICAgICAKICAgIGVuZAogICAg CiAgICAjIFByb3ZpZGUgaHVtYW4tcmVhZGFibGUgc3RyaW5naWZpY2F0aW9uIG9mIGNsYXNz IHN0YXRlLgogICAgZGVmIGluc3BlY3QKICAgICAgIiM8I3tzZWxmLmNsYXNzfSAje0BhZGRy ZXNzfToje0Bwb3J0fSBzdGFydGVkPSN7QHN0YXJ0ZWR9PiIKICAgIGVuZAoKICAgICMgK3Ry dWUrIGlmIHRoZSBTTVRQIG9iamVjdCB1c2VzIEVTTVRQICh3aGljaCBpdCBkb2VzIGJ5IGRl ZmF1bHQpLgogICAgZGVmIGVzbXRwPwogICAgICBAZXNtdHAKICAgIGVuZAoKICAgICMKICAg ICMgU2V0IHdoZXRoZXIgdG8gdXNlIEVTTVRQIG9yIG5vdC4gIFRoaXMgc2hvdWxkIGJlIGRv bmUgYmVmb3JlIAogICAgIyBjYWxsaW5nICNzdGFydC4gIE5vdGUgdGhhdCBpZiAjc3RhcnQg aXMgY2FsbGVkIGluIEVTTVRQIG1vZGUsCiAgICAjIGFuZCB0aGUgY29ubmVjdGlvbiBmYWls cyBkdWUgdG8gYSBQcm90b2NvbEVycm9yLCB0aGUgU01UUAogICAgIyBvYmplY3Qgd2lsbCBh dXRvbWF0aWNhbGx5IHN3aXRjaCB0byBwbGFpbiBTTVRQIG1vZGUgYW5kCiAgICAjIHJldHJ5 IChidXQgbm90IHZpY2UgdmVyc2EpLgogICAgIwogICAgZGVmIGVzbXRwPShib29sKQogICAg ICBAZXNtdHAgPSBib29sCiAgICBlbmQKCiAgICBhbGlhcyBlc210cCBlc210cD8KCiAgICAj IGRvZXMgdGhpcyBpbnN0YW5jZSB1c2UgU1NMPwogICAgZGVmIHVzZV90bHM/CiAgICAgIEB1 c2VfdGxzCiAgICBlbmQKICAgIAogICAgIyBFbmFibGVzIFNUQVJUVExTIGZvciB0aGlzIGlu c3RhbmNlLgogICAgIyArdmVyaWZ5KyBpcyB0aGUgdHlwZSBvZiB2ZXJpZmljYXRpb24gdG8g ZG8gb24gdGhlIFNlcnZlciBDZXJ0OyBEZWZhdWx0cwogICAgIyB0byBPcGVuU1NMOjpTU0w6 OlZFUklGWV9QRUVSLgogICAgIyArY2VydHMrIGlzIGEgZmlsZSBvciBkaXJlY3RvcnkgaG9s ZGluZyBDQSBjZXJ0cyB0byB1c2UgdG8gdmVyaWZ5IHRoZSAKICAgICMgc2VydmVyIGNlcnQ7 IERlZmF1bHRzIHRvIG5pbC4KICAgIGRlZiBlbmFibGVfdGxzKHZlcmlmeSA9IE9wZW5TU0w6 OlNTTDo6VkVSSUZZX1BFRVIsIGNlcnRzID0gbmlsKQogICAgICBAdXNlX3RscyA9IHRydWUK ICAgICAgQHZlcmlmeSA9IHZlcmlmeQogICAgICBAY2VydHMgPSBjZXJ0cwogICAgZW5kCiAg ICAKICAgIGRlZiBkaXNhYmxlX3RscwogICAgICBAdXNlX3RscyA9IGZhbHNlCiAgICAgIEB2 ZXJpZnkgPSBuaWwKICAgICAgQGNlcnRzID0gbmlsCiAgICBlbmQKCiAgICAjIFRoZSBhZGRy ZXNzIG9mIHRoZSBTTVRQIHNlcnZlciB0byBjb25uZWN0IHRvLgogICAgYXR0cl9yZWFkZXIg OmFkZHJlc3MKCiAgICAjIFRoZSBwb3J0IG51bWJlciBvZiB0aGUgU01UUCBzZXJ2ZXIgdG8g Y29ubmVjdCB0by4KICAgIGF0dHJfcmVhZGVyIDpwb3J0CgogICAgIyBTZWNvbmRzIHRvIHdh aXQgd2hpbGUgYXR0ZW1wdGluZyB0byBvcGVuIGEgY29ubmVjdGlvbi4KICAgICMgSWYgdGhl IGNvbm5lY3Rpb24gY2Fubm90IGJlIG9wZW5lZCB3aXRoaW4gdGhpcyB0aW1lLCBhCiAgICAj IFRpbWVvdXRFcnJvciBpcyByYWlzZWQuCiAgICBhdHRyX2FjY2Vzc29yIDpvcGVuX3RpbWVv dXQKCiAgICAjIFNlY29uZHMgdG8gd2FpdCB3aGlsZSByZWFkaW5nIG9uZSBibG9jayAoYnkg b25lIHJlYWQoMikgY2FsbCkuCiAgICAjIElmIHRoZSByZWFkKDIpIGNhbGwgZG9lcyBub3Qg Y29tcGxldGUgd2l0aGluIHRoaXMgdGltZSwgYQogICAgIyBUaW1lb3V0RXJyb3IgaXMgcmFp c2VkLgogICAgYXR0cl9yZWFkZXIgOnJlYWRfdGltZW91dAoKICAgICMgU2V0IHRoZSBudW1i ZXIgb2Ygc2Vjb25kcyB0byB3YWl0IHVudGlsIHRpbWluZy1vdXQgYSByZWFkKDIpCiAgICAj IGNhbGwuCiAgICBkZWYgcmVhZF90aW1lb3V0PShzZWMpCiAgICAgIEBzb2NrZXQucmVhZF90 aW1lb3V0ID0gc2VjIGlmIEBzb2NrZXQKICAgICAgQHJlYWRfdGltZW91dCA9IHNlYwogICAg ZW5kCgogICAgIwogICAgIyBXQVJOSU5HOiBUaGlzIG1ldGhvZCBjYXVzZXMgc2VyaW91cyBz ZWN1cml0eSBob2xlcy4KICAgICMgVXNlIHRoaXMgbWV0aG9kIGZvciBvbmx5IGRlYnVnZ2lu Zy4KICAgICMKICAgICMgU2V0IGFuIG91dHB1dCBzdHJlYW0gZm9yIGRlYnVnIGxvZ2dpbmcu CiAgICAjIFlvdSBtdXN0IGNhbGwgdGhpcyBiZWZvcmUgI3N0YXJ0LgogICAgIwogICAgIyAg ICMgZXhhbXBsZQogICAgIyAgIHNtdHAgPSBOZXQ6OlNNVFAubmV3KGFkZHIsIHBvcnQpCiAg ICAjICAgc210cC5zZXRfZGVidWdfb3V0cHV0ICRzdGRlcnIKICAgICMgICBzbXRwLnN0YXJ0 IGRvIHxzbXRwfAogICAgIyAgICAgLi4uLgogICAgIyAgIGVuZAogICAgIwogICAgZGVmIHNl dF9kZWJ1Z19vdXRwdXQoYXJnKQogICAgICBAZGVidWdfb3V0cHV0ID0gYXJnCiAgICBlbmQK CiAgICAjCiAgICAjIFNNVFAgc2Vzc2lvbiBjb250cm9sCiAgICAjCgogICAgIwogICAgIyBD cmVhdGVzIGEgbmV3IE5ldDo6U01UUCBvYmplY3QgYW5kIGNvbm5lY3RzIHRvIHRoZSBzZXJ2 ZXIuCiAgICAjCiAgICAjIFRoaXMgbWV0aG9kIGlzIGVxdWl2YWxlbnQgdG86CiAgICAjIAog ICAgIyAgIE5ldDo6U01UUC5uZXcoYWRkcmVzcywgcG9ydCkuc3RhcnQoaGVsb19kb21haW4s IGFjY291bnQsIHBhc3N3b3JkLCBhdXRodHlwZSkKICAgICMKICAgICMgPT09IEV4YW1wbGUK ICAgICMKICAgICMgICAgIE5ldDo6U01UUC5zdGFydCgneW91ci5zbXRwLnNlcnZlcicpIGRv IHxzbXRwfAogICAgIyAgICAgICBzbXRwLnNlbmRfbWVzc2FnZSBtc2dzdHIsICdmcm9tQGV4 YW1wbGUuY29tJywgWydkZXN0QGV4YW1wbGUuY29tJ10KICAgICMgICAgIGVuZAogICAgIwog ICAgIyA9PT0gQmxvY2sgVXNhZ2UKICAgICMKICAgICMgSWYgY2FsbGVkIHdpdGggYSBibG9j aywgdGhlIG5ld2x5LW9wZW5lZCBOZXQ6OlNNVFAgb2JqZWN0IGlzIHlpZWxkZWQKICAgICMg dG8gdGhlIGJsb2NrLCBhbmQgYXV0b21hdGljYWxseSBjbG9zZWQgd2hlbiB0aGUgYmxvY2sg ZmluaXNoZXMuICBJZiBjYWxsZWQKICAgICMgd2l0aG91dCBhIGJsb2NrLCB0aGUgbmV3bHkt b3BlbmVkIE5ldDo6U01UUCBvYmplY3QgaXMgcmV0dXJuZWQgdG8KICAgICMgdGhlIGNhbGxl ciwgYW5kIGl0IGlzIHRoZSBjYWxsZXIncyByZXNwb25zaWJpbGl0eSB0byBjbG9zZSBpdCB3 aGVuCiAgICAjIGZpbmlzaGVkLgogICAgIwogICAgIyA9PT0gUGFyYW1ldGVycwogICAgIwog ICAgIyArYWRkcmVzcysgaXMgdGhlIGhvc3RuYW1lIG9yIGlwIGFkZHJlc3Mgb2YgeW91ciBz bXRwIHNlcnZlci4KICAgICMKICAgICMgK3BvcnQrIGlzIHRoZSBwb3J0IHRvIGNvbm5lY3Qg dG87IGl0IGRlZmF1bHRzIHRvIHBvcnQgMjUuCiAgICAjCiAgICAjICtoZWxvKyBpcyB0aGUg X0hFTE9fIF9kb21haW5fIHByb3ZpZGVkIGJ5IHRoZSBjbGllbnQgdG8gdGhlCiAgICAjIHNl cnZlciAoc2VlIG92ZXJ2aWV3IGNvbW1lbnRzKTsgaXQgZGVmYXVsdHMgdG8gJ2xvY2FsaG9z dC5sb2NhbGRvbWFpbicuIAogICAgIwogICAgIyBUaGUgcmVtYWluaW5nIGFyZ3VtZW50cyBh cmUgdXNlZCBmb3IgU01UUCBhdXRoZW50aWNhdGlvbiwgaWYgcmVxdWlyZWQKICAgICMgb3Ig ZGVzaXJlZC4gICt1c2VyKyBpcyB0aGUgYWNjb3VudCBuYW1lOyArc2VjcmV0KyBpcyB5b3Vy IHBhc3N3b3JkCiAgICAjIG9yIG90aGVyIGF1dGhlbnRpY2F0aW9uIHRva2VuOyBhbmQgK2F1 dGh0eXBlKyBpcyB0aGUgYXV0aGVudGljYXRpb24KICAgICMgdHlwZSwgb25lIG9mIDpwbGFp biwgOmxvZ2luLCBvciA6Y3JhbV9tZDUuICBTZWUgdGhlIGRpc2N1c3Npb24gb2YKICAgICMg U01UUCBBdXRoZW50aWNhdGlvbiBpbiB0aGUgb3ZlcnZpZXcgbm90ZXMuCiAgICAjCiAgICAj ID09PSBFcnJvcnMKICAgICMKICAgICMgVGhpcyBtZXRob2QgbWF5IHJhaXNlOgogICAgIwog ICAgIyAqIE5ldDo6U01UUEF1dGhlbnRpY2F0aW9uRXJyb3IKICAgICMgKiBOZXQ6OlNNVFBT ZXJ2ZXJCdXN5CiAgICAjICogTmV0OjpTTVRQU3ludGF4RXJyb3IKICAgICMgKiBOZXQ6OlNN VFBGYXRhbEVycm9yCiAgICAjICogTmV0OjpTTVRQVW5rbm93bkVycm9yCiAgICAjICogSU9F cnJvcgogICAgIyAqIFRpbWVvdXRFcnJvcgogICAgIwogICAgZGVmIFNNVFAuc3RhcnQoYWRk cmVzcywgcG9ydCA9IG5pbCwgaGVsbyA9ICdsb2NhbGhvc3QubG9jYWxkb21haW4nLAogICAg ICAgICAgICAgICAgICAgdXNlciA9IG5pbCwgc2VjcmV0ID0gbmlsLCBhdXRodHlwZSA9IG5p bCwKICAgICAgICAgICAgICAgICAgICZibG9jaykgICAjIDp5aWVsZDogc210cAogICAgICBu ZXcoYWRkcmVzcywgcG9ydCkuc3RhcnQoaGVsbywgdXNlciwgc2VjcmV0LCBhdXRodHlwZSwg JmJsb2NrKQogICAgZW5kCgogICAgIyArdHJ1ZSsgaWYgdGhlIFNNVFAgc2Vzc2lvbiBoYXMg YmVlbiBzdGFydGVkLgogICAgZGVmIHN0YXJ0ZWQ/CiAgICAgIEBzdGFydGVkCiAgICBlbmQK CiAgICAjCiAgICAjIE9wZW5zIGEgVENQIGNvbm5lY3Rpb24gYW5kIHN0YXJ0cyB0aGUgU01U UCBzZXNzaW9uLgogICAgIwogICAgIyA9PT0gUGFyYW1ldGVycwogICAgIwogICAgIyAraGVs bysgaXMgdGhlIF9IRUxPXyBfZG9tYWluXyB0aGF0IHlvdSdsbCBkaXNwYXRjaCBtYWlscyBm cm9tOyBzZWUKICAgICMgdGhlIGRpc2N1c3Npb24gaW4gdGhlIG92ZXJ2aWV3IG5vdGVzLgog ICAgIwogICAgIyBJZiBib3RoIG9mICt1c2VyKyBhbmQgK3NlY3JldCsgYXJlIGdpdmVuLCBT TVRQIGF1dGhlbnRpY2F0aW9uIAogICAgIyB3aWxsIGJlIGF0dGVtcHRlZCB1c2luZyB0aGUg QVVUSCBjb21tYW5kLiAgK2F1dGh0eXBlKyBzcGVjaWZpZXMgCiAgICAjIHRoZSB0eXBlIG9m IGF1dGhlbnRpY2F0aW9uIHRvIGF0dGVtcHQ7IGl0IG11c3QgYmUgb25lIG9mCiAgICAjIDps b2dpbiwgOnBsYWluLCBhbmQgOmNyYW1fbWQ1LiAgU2VlIHRoZSBub3RlcyBvbiBTTVRQIEF1 dGhlbnRpY2F0aW9uCiAgICAjIGluIHRoZSBvdmVydmlldy4gCiAgICAjCiAgICAjID09PSBC bG9jayBVc2FnZQogICAgIwogICAgIyBXaGVuIHRoaXMgbWV0aG9kcyBpcyBjYWxsZWQgd2l0 aCBhIGJsb2NrLCB0aGUgbmV3bHktc3RhcnRlZCBTTVRQCiAgICAjIG9iamVjdCBpcyB5aWVs ZGVkIHRvIHRoZSBibG9jaywgYW5kIGF1dG9tYXRpY2FsbHkgY2xvc2VkIGFmdGVyCiAgICAj IHRoZSBibG9jayBjYWxsIGZpbmlzaGVzLiAgT3RoZXJ3aXNlLCBpdCBpcyB0aGUgY2FsbGVy J3MgCiAgICAjIHJlc3BvbnNpYmlsaXR5IHRvIGNsb3NlIHRoZSBzZXNzaW9uIHdoZW4gZmlu aXNoZWQuCiAgICAjCiAgICAjID09PSBFeGFtcGxlCiAgICAjCiAgICAjIFRoaXMgaXMgdmVy eSBzaW1pbGFyIHRvIHRoZSBjbGFzcyBtZXRob2QgU01UUC5zdGFydC4KICAgICMKICAgICMg ICAgIHJlcXVpcmUgJ25ldC9zbXRwJyAKICAgICMgICAgIHNtdHAgPSBOZXQ6OlNNVFAubmV3 KCdzbXRwLm1haWwuc2VydmVyJywgMjUpCiAgICAjICAgICBzbXRwLnN0YXJ0KGhlbG9fZG9t YWluLCBhY2NvdW50LCBwYXNzd29yZCwgYXV0aHR5cGUpIGRvIHxzbXRwfAogICAgIyAgICAg ICBzbXRwLnNlbmRfbWVzc2FnZSBtc2dzdHIsICdmcm9tQGV4YW1wbGUuY29tJywgWydkZXN0 QGV4YW1wbGUuY29tJ10KICAgICMgICAgIGVuZCAKICAgICMKICAgICMgVGhlIHByaW1hcnkg dXNlIG9mIHRoaXMgbWV0aG9kIChhcyBvcHBvc2VkIHRvIFNNVFAuc3RhcnQpCiAgICAjIGlz IHByb2JhYmx5IHRvIHNldCBkZWJ1Z2dpbmcgKCNzZXRfZGVidWdfb3V0cHV0KSBvciBFU01U UAogICAgIyAoI2VzbXRwPSksIHdoaWNoIG11c3QgYmUgZG9uZSBiZWZvcmUgdGhlIHNlc3Np b24gaXMKICAgICMgc3RhcnRlZC4gIAogICAgIwogICAgIyA9PT0gRXJyb3JzCiAgICAjCiAg ICAjIElmIHNlc3Npb24gaGFzIGFscmVhZHkgYmVlbiBzdGFydGVkLCBhbiBJT0Vycm9yIHdp bGwgYmUgcmFpc2VkLgogICAgIwogICAgIyBUaGlzIG1ldGhvZCBtYXkgcmFpc2U6CiAgICAj CiAgICAjICogTmV0OjpTTVRQQXV0aGVudGljYXRpb25FcnJvcgogICAgIyAqIE5ldDo6U01U UFNlcnZlckJ1c3kKICAgICMgKiBOZXQ6OlNNVFBTeW50YXhFcnJvcgogICAgIyAqIE5ldDo6 U01UUEZhdGFsRXJyb3IKICAgICMgKiBOZXQ6OlNNVFBVbmtub3duRXJyb3IKICAgICMgKiBJ T0Vycm9yCiAgICAjICogVGltZW91dEVycm9yCiAgICAjCiAgICBkZWYgc3RhcnQoaGVsbyA9 ICdsb2NhbGhvc3QubG9jYWxkb21haW4nLAogICAgICAgICAgICAgIHVzZXIgPSBuaWwsIHNl Y3JldCA9IG5pbCwgYXV0aHR5cGUgPSBuaWwpICAgIyA6eWllbGQ6IHNtdHAKICAgICAgaWYg YmxvY2tfZ2l2ZW4/CiAgICAgICAgYmVnaW4KICAgICAgICAgIGRvX3N0YXJ0KGhlbG8sIHVz ZXIsIHNlY3JldCwgYXV0aHR5cGUpCiAgICAgICAgICByZXR1cm4geWllbGQoc2VsZikKICAg ICAgICBlbnN1cmUKICAgICAgICAgIGRvX2ZpbmlzaAogICAgICAgIGVuZAogICAgICBlbHNl CiAgICAgICAgZG9fc3RhcnQoaGVsbywgdXNlciwgc2VjcmV0LCBhdXRodHlwZSkKICAgICAg ICByZXR1cm4gc2VsZgogICAgICBlbmQKICAgIGVuZAoKICAgIGRlZiBkb19zdGFydChoZWxv ZG9tYWluLCB1c2VyLCBzZWNyZXQsIGF1dGh0eXBlKQogICAgICByYWlzZSBJT0Vycm9yLCAn U01UUCBzZXNzaW9uIGFscmVhZHkgc3RhcnRlZCcgaWYgQHN0YXJ0ZWQKICAgICAgY2hlY2tf YXV0aF9hcmdzIHVzZXIsIHNlY3JldCwgYXV0aHR5cGUgaWYgdXNlciBvciBzZWNyZXQKCiAg ICAgIEBzb2NrZXQgPSBTU0xJTy5vcGVuKEBhZGRyZXNzLCBAcG9ydCwKICAgICAgICAgICAg ICAgICAgICAgICAgICAgQG9wZW5fdGltZW91dCwgQHJlYWRfdGltZW91dCwKICAgICAgICAg ICAgICAgICAgICAgICAgICAgQGRlYnVnX291dHB1dCkKICAgICAgbG9nZ2luZyAiU01UUCBz ZXNzaW9uIG9wZW5lZDogI3tAYWRkcmVzc306I3tAcG9ydH0iCiAgICAgIGNoZWNrX3Jlc3Bv bnNlKGNyaXRpY2FsIHsgcmVjdl9yZXNwb25zZSgpIH0pCiAgICAgIGRvX2hlbG8oaGVsb2Rv bWFpbikKICAgICAgCiAgICAgIGlmIEB1c2VfdGxzCiAgICAgICAgcmFpc2UgJ29wZW5zc2wg bGlicmFyeSBub3QgaW5zdGFsbGVkJyB1bmxlc3MgZGVmaW5lZD8oT3BlblNTTCkKICAgICAg ICBjb250ZXh0ID0gT3BlblNTTDo6U1NMOjpTU0xDb250ZXh0Lm5ldwogICAgICAgIGNvbnRl eHQudmVyaWZ5X21vZGUgPSBAdmVyaWZ5CiAgICAgICAgaWYgQGNlcnRzCiAgICAgICAgICBp ZiBGaWxlLmZpbGU/KEBjZXJ0cykKICAgICAgICAgICAgY29udGV4dC5jYV9maWxlID0gQGNl cnRzCiAgICAgICAgICBlbHNpZiBGaWxlLmRpcmVjdG9yeT8oQGNlcnRzKQogICAgICAgICAg ICBjb250ZXh0LmNhX3BhdGggPSBAY2VydHMKICAgICAgICAgIGVsc2UKICAgICAgICAgICAg cmFpc2UgQXJndW1lbnRFcnJvciwgImNlcnRzIGdpdmVuIGJ1dCBpcyBub3QgZmlsZSBvciBk aXJlY3Rvcnk6ICN7QGNlcnRzfSIKICAgICAgICAgIGVuZAogICAgICAgIGVuZAogICAgICAg IHN0YXJ0dGxzCiAgICAgICAgbG9nZ2luZyAnVExTIHN0YXJ0ZWQnCglAc29ja2V0LnNzbF9j b25uZWN0KCkKICAgICAgICBkb19oZWxvKGhlbG9kb21haW4pCiAgICAgIGVuZAoKICAgICAg YXV0aGVudGljYXRlIHVzZXIsIHNlY3JldCwgYXV0aHR5cGUgaWYgdXNlcgogICAgICBAc3Rh cnRlZCA9IHRydWUKICAgIGVuc3VyZQogICAgICB1bmxlc3MgQHN0YXJ0ZWQKICAgICAgICAj IGF1dGhlbnRpY2F0aW9uIGZhaWxlZCwgY2FuY2VsIGNvbm5lY3Rpb24uCglAc29ja2V0LmNs b3NlIGlmIG5vdCBAc3RhcnRlZCBhbmQgQHNvY2tldCBhbmQgbm90IEBzb2NrZXQuY2xvc2Vk PwogICAgICAgIEBzb2NrZXQgPSBuaWwKICAgICAgZW5kCiAgICBlbmQKICAgIHByaXZhdGUg OmRvX3N0YXJ0CgogICAgIyBtZXRob2QgdG8gc2VuZCBoZWxvIG9yIGVobG8gYmFzZWQgb24g ZGVmYXVsdHMgYW5kIHRvCiAgICAjIHJldHJ5IHdpdGggaGVsbyBpZiBzZXJ2ZXIgZG9lc24n dCBsaWtlIGVobG8uCiAgICAjIAogICAgZGVmIGRvX2hlbG8oaGVsb2RvbWFpbikKICAgICAg IGJlZ2luCiAgICAgICAgaWYgQGVzbXRwCiAgICAgICAgICBlaGxvIGhlbG9kb21haW4KICAg ICAgICBlbHNlCiAgICAgICAgICBoZWxvIGhlbG9kb21haW4KICAgICAgICBlbmQKICAgICAg cmVzY3VlIFByb3RvY29sRXJyb3IKICAgICAgICBpZiBAZXNtdHAKICAgICAgICAgIEBlc210 cCA9IGZhbHNlCiAgICAgICAgICBAZXJyb3Jfb2NjdXJlZCA9IGZhbHNlCiAgICAgICAgICBy ZXRyeQogICAgICAgIGVuZAogICAgICAgIHJhaXNlCiAgICAgIGVuZAogICAgZW5kCiAgICAg IAoKICAgICMgRmluaXNoZXMgdGhlIFNNVFAgc2Vzc2lvbiBhbmQgY2xvc2VzIFRDUCBjb25u ZWN0aW9uLgogICAgIyBSYWlzZXMgSU9FcnJvciBpZiBub3Qgc3RhcnRlZC4KICAgIGRlZiBm aW5pc2gKICAgICAgcmFpc2UgSU9FcnJvciwgJ25vdCB5ZXQgc3RhcnRlZCcgdW5sZXNzIHN0 YXJ0ZWQ/CiAgICAgIGRvX2ZpbmlzaAogICAgZW5kCgogICAgZGVmIGRvX2ZpbmlzaAogICAg ICBxdWl0IGlmIEBzb2NrZXQgYW5kIG5vdCBAc29ja2V0LmNsb3NlZD8gYW5kIG5vdCBAZXJy b3Jfb2NjdXJlZAogICAgZW5zdXJlCiAgICAgIEBzdGFydGVkID0gZmFsc2UKICAgICAgQGVy cm9yX29jY3VyZWQgPSBmYWxzZQogICAgICBAc29ja2V0LmNsb3NlIGlmIEBzb2NrZXQgYW5k IG5vdCBAc29ja2V0LmNsb3NlZD8KICAgICAgQHNvY2tldCA9IG5pbAogICAgZW5kCiAgICBw cml2YXRlIDpkb19maW5pc2gKCiAgICAjCiAgICAjIG1lc3NhZ2Ugc2VuZAogICAgIwoKICAg IHB1YmxpYwoKICAgICMKICAgICMgU2VuZHMgK21zZ3N0cisgYXMgYSBtZXNzYWdlLiAgU2lu Z2xlIENSICgiXHIiKSBhbmQgTEYgKCJcbiIpIGZvdW5kCiAgICAjIGluIHRoZSArbXNnc3Ry KywgYXJlIGNvbnZlcnRlZCBpbnRvIHRoZSBDUiBMRiBwYWlyLiAgWW91IGNhbm5vdCBzZW5k IGEKICAgICMgYmluYXJ5IG1lc3NhZ2Ugd2l0aCB0aGlzIG1ldGhvZC4gK21zZ3N0cisgc2hv dWxkIGluY2x1ZGUgYm90aCAKICAgICMgdGhlIG1lc3NhZ2UgaGVhZGVycyBhbmQgYm9keS4K ICAgICMKICAgICMgK2Zyb21fYWRkcisgaXMgYSBTdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBz b3VyY2UgbWFpbCBhZGRyZXNzLgogICAgIwogICAgIyArdG9fYWRkcisgaXMgYSBTdHJpbmcg b3IgU3RyaW5ncyBvciBBcnJheSBvZiBTdHJpbmdzLCByZXByZXNlbnRpbmcKICAgICMgdGhl IGRlc3RpbmF0aW9uIG1haWwgYWRkcmVzcyBvciBhZGRyZXNzZXMuCiAgICAjCiAgICAjID09 PSBFeGFtcGxlCiAgICAjCiAgICAjICAgICBOZXQ6OlNNVFAuc3RhcnQoJ3NtdHAuZXhhbXBs ZS5jb20nKSBkbyB8c210cHwKICAgICMgICAgICAgc210cC5zZW5kX21lc3NhZ2UgbXNnc3Ry LAogICAgIyAgICAgICAgICAgICAgICAgICAgICAgICAnZnJvbUBleGFtcGxlLmNvbScsCiAg ICAjICAgICAgICAgICAgICAgICAgICAgICAgIFsnZGVzdEBleGFtcGxlLmNvbScsICdkZXN0 MkBleGFtcGxlLmNvbSddCiAgICAjICAgICBlbmQKICAgICMKICAgICMgPT09IEVycm9ycwog ICAgIwogICAgIyBUaGlzIG1ldGhvZCBtYXkgcmFpc2U6CiAgICAjCiAgICAjICogTmV0OjpT TVRQU2VydmVyQnVzeQogICAgIyAqIE5ldDo6U01UUFN5bnRheEVycm9yCiAgICAjICogTmV0 OjpTTVRQRmF0YWxFcnJvcgogICAgIyAqIE5ldDo6U01UUFVua25vd25FcnJvcgogICAgIyAq IElPRXJyb3IKICAgICMgKiBUaW1lb3V0RXJyb3IKICAgICMKICAgIGRlZiBzZW5kX21lc3Nh Z2UobXNnc3RyLCBmcm9tX2FkZHIsICp0b19hZGRycykKICAgICAgc2VuZDAoZnJvbV9hZGRy LCB0b19hZGRycy5mbGF0dGVuKSB7CiAgICAgICAgQHNvY2tldC53cml0ZV9tZXNzYWdlIG1z Z3N0cgogICAgICB9CiAgICBlbmQKCiAgICBhbGlhcyBzZW5kX21haWwgc2VuZF9tZXNzYWdl CiAgICBhbGlhcyBzZW5kbWFpbCBzZW5kX21lc3NhZ2UgICAjIG9ic29sZXRlCgogICAgIwog ICAgIyBPcGVucyBhIG1lc3NhZ2Ugd3JpdGVyIHN0cmVhbSBhbmQgZ2l2ZXMgaXQgdG8gdGhl IGJsb2NrLgogICAgIyBUaGUgc3RyZWFtIGlzIHZhbGlkIG9ubHkgaW4gdGhlIGJsb2NrLCBh bmQgaGFzIHRoZXNlIG1ldGhvZHM6CiAgICAjCiAgICAjIHB1dHMoc3RyID0gJycpOjogICAg ICAgb3V0cHV0cyBTVFIgYW5kIENSIExGLgogICAgIyBwcmludChzdHIpOjogICAgICAgICAg IG91dHB1dHMgU1RSLgogICAgIyBwcmludGYoZm10LCAqYXJncyk6OiAgIG91dHB1dHMgc3By aW50ZihmbXQsKmFyZ3MpLgogICAgIyB3cml0ZShzdHIpOjogICAgICAgICAgIG91dHB1dHMg U1RSIGFuZCByZXR1cm5zIHRoZSBsZW5ndGggb2Ygd3JpdHRlbiBieXRlcy4KICAgICMgPDwo c3RyKTo6ICAgICAgICAgICAgICBvdXRwdXRzIFNUUiBhbmQgcmV0dXJucyBzZWxmLgogICAg IwogICAgIyBJZiBhIHNpbmdsZSBDUiAoIlxyIikgb3IgTEYgKCJcbiIpIGlzIGZvdW5kIGlu IHRoZSBtZXNzYWdlLAogICAgIyBpdCBpcyBjb252ZXJ0ZWQgdG8gdGhlIENSIExGIHBhaXIu ICBZb3UgY2Fubm90IHNlbmQgYSBiaW5hcnkKICAgICMgbWVzc2FnZSB3aXRoIHRoaXMgbWV0 aG9kLgogICAgIwogICAgIyA9PT0gUGFyYW1ldGVycwogICAgIwogICAgIyArZnJvbV9hZGRy KyBpcyBhIFN0cmluZyByZXByZXNlbnRpbmcgdGhlIHNvdXJjZSBtYWlsIGFkZHJlc3MuCiAg ICAjCiAgICAjICt0b19hZGRyKyBpcyBhIFN0cmluZyBvciBTdHJpbmdzIG9yIEFycmF5IG9m IFN0cmluZ3MsIHJlcHJlc2VudGluZwogICAgIyB0aGUgZGVzdGluYXRpb24gbWFpbCBhZGRy ZXNzIG9yIGFkZHJlc3Nlcy4KICAgICMKICAgICMgPT09IEV4YW1wbGUKICAgICMKICAgICMg ICAgIE5ldDo6U01UUC5zdGFydCgnc210cC5leGFtcGxlLmNvbScsIDI1KSBkbyB8c210cHwK ICAgICMgICAgICAgc210cC5vcGVuX21lc3NhZ2Vfc3RyZWFtKCdmcm9tQGV4YW1wbGUuY29t JywgWydkZXN0QGV4YW1wbGUuY29tJ10pIGRvIHxmfAogICAgIyAgICAgICAgIGYucHV0cyAn RnJvbTogZnJvbUBleGFtcGxlLmNvbScKICAgICMgICAgICAgICBmLnB1dHMgJ1RvOiBkZXN0 QGV4YW1wbGUuY29tJwogICAgIyAgICAgICAgIGYucHV0cyAnU3ViamVjdDogdGVzdCBtZXNz YWdlJwogICAgIyAgICAgICAgIGYucHV0cwogICAgIyAgICAgICAgIGYucHV0cyAnVGhpcyBp cyBhIHRlc3QgbWVzc2FnZS4nCiAgICAjICAgICAgIGVuZAogICAgIyAgICAgZW5kCiAgICAj CiAgICAjID09PSBFcnJvcnMKICAgICMKICAgICMgVGhpcyBtZXRob2QgbWF5IHJhaXNlOgog ICAgIwogICAgIyAqIE5ldDo6U01UUFNlcnZlckJ1c3kKICAgICMgKiBOZXQ6OlNNVFBTeW50 YXhFcnJvcgogICAgIyAqIE5ldDo6U01UUEZhdGFsRXJyb3IKICAgICMgKiBOZXQ6OlNNVFBV bmtub3duRXJyb3IKICAgICMgKiBJT0Vycm9yCiAgICAjICogVGltZW91dEVycm9yCiAgICAj CiAgICBkZWYgb3Blbl9tZXNzYWdlX3N0cmVhbShmcm9tX2FkZHIsICp0b19hZGRycywgJmJs b2NrKSAgICMgOnlpZWxkOiBzdHJlYW0KICAgICAgc2VuZDAoZnJvbV9hZGRyLCB0b19hZGRy cy5mbGF0dGVuKSB7CiAgICAgICAgQHNvY2tldC53cml0ZV9tZXNzYWdlX2J5X2Jsb2NrKCZi bG9jaykKICAgICAgfQogICAgZW5kCgogICAgYWxpYXMgcmVhZHkgb3Blbl9tZXNzYWdlX3N0 cmVhbSAgICMgb2Jzb2xldGUKCiAgICBwcml2YXRlCgogICAgZGVmIHNlbmQwKGZyb21fYWRk ciwgdG9fYWRkcnMpCiAgICAgIHJhaXNlIElPRXJyb3IsICdjbG9zZWQgc2Vzc2lvbicgdW5s ZXNzIEBzb2NrZXQKICAgICAgcmFpc2UgQXJndW1lbnRFcnJvciwgJ21haWwgZGVzdGluYXRp b24gbm90IGdpdmVuJyBpZiB0b19hZGRycy5lbXB0eT8KICAgICAgaWYgJFNBRkUgPiAwCiAg ICAgICAgcmFpc2UgU2VjdXJpdHlFcnJvciwgJ3RhaW50ZWQgZnJvbV9hZGRyJyBpZiBmcm9t X2FkZHIudGFpbnRlZD8KICAgICAgICB0b19hZGRycy5lYWNoIGRvIHx0b3wgCiAgICAgICAg ICByYWlzZSBTZWN1cml0eUVycm9yLCAndGFpbnRlZCB0b19hZGRyJyBpZiB0by50YWludGVk PwogICAgICAgIGVuZAogICAgICBlbmQKCiAgICAgIG1haWxmcm9tIGZyb21fYWRkcgogICAg ICB0b19hZGRycy5lYWNoIGRvIHx0b3wKICAgICAgICByY3B0dG8gdG8KICAgICAgZW5kCiAg ICAgIHJlcyA9IGNyaXRpY2FsIHsKICAgICAgICBjaGVja19yZXNwb25zZShnZXRfcmVzcG9u c2UoJ0RBVEEnKSwgdHJ1ZSkKICAgICAgICB5aWVsZAogICAgICAgIHJlY3ZfcmVzcG9uc2Uo KQogICAgICB9CiAgICAgIGNoZWNrX3Jlc3BvbnNlKHJlcykKICAgIGVuZAoKICAgICMKICAg ICMgYXV0aAogICAgIwoKICAgIHByaXZhdGUKCiAgICBkZWYgY2hlY2tfYXV0aF9hcmdzKHVz ZXIsIHNlY3JldCwgYXV0aHR5cGUpCiAgICAgIHJhaXNlIEFyZ3VtZW50RXJyb3IsICdib3Ro IHVzZXIgYW5kIHNlY3JldCBhcmUgcmVxdWlyZWQnXAogICAgICAgICAgICAgICAgICAgICAg dW5sZXNzIHVzZXIgYW5kIHNlY3JldAogICAgICBhdXRoX21ldGhvZCA9ICJhdXRoXyN7YXV0 aHR5cGUgfHwgJ2NyYW1fbWQ1J30iCiAgICAgIHJhaXNlIEFyZ3VtZW50RXJyb3IsICJ3cm9u ZyBhdXRoIHR5cGUgI3thdXRodHlwZX0iXAogICAgICAgICAgICAgICAgICAgICAgdW5sZXNz IHJlc3BvbmRfdG8/KGF1dGhfbWV0aG9kLCB0cnVlKQogICAgZW5kCgogICAgZGVmIGF1dGhl bnRpY2F0ZSh1c2VyLCBzZWNyZXQsIGF1dGh0eXBlKQogICAgICBfX3NlbmRfXygiYXV0aF8j e2F1dGh0eXBlIHx8ICdjcmFtX21kNSd9IiwgdXNlciwgc2VjcmV0KQogICAgZW5kCgogICAg ZGVmIGF1dGhfcGxhaW4odXNlciwgc2VjcmV0KQogICAgICByZXMgPSBjcml0aWNhbCB7IGdl dF9yZXNwb25zZSgnQVVUSCBQTEFJTiAlcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIGJhc2U2NF9lbmNvZGUoIlwwI3t1c2VyfVwwI3tzZWNyZXR9IikpIH0KICAg ICAgcmFpc2UgU01UUEF1dGhlbnRpY2F0aW9uRXJyb3IsIHJlcyB1bmxlc3MgL1xBMi4uLyA9 PT0gcmVzCiAgICBlbmQKCiAgICBkZWYgYXV0aF9sb2dpbih1c2VyLCBzZWNyZXQpCiAgICAg IHJlcyA9IGNyaXRpY2FsIHsKICAgICAgICBjaGVja19yZXNwb25zZShnZXRfcmVzcG9uc2Uo J0FVVEggTE9HSU4nKSwgdHJ1ZSkKICAgICAgICBjaGVja19yZXNwb25zZShnZXRfcmVzcG9u c2UoYmFzZTY0X2VuY29kZSh1c2VyKSksIHRydWUpCiAgICAgICAgZ2V0X3Jlc3BvbnNlKGJh c2U2NF9lbmNvZGUoc2VjcmV0KSkKICAgICAgfQogICAgICByYWlzZSBTTVRQQXV0aGVudGlj YXRpb25FcnJvciwgcmVzIHVubGVzcyAvXEEyLi4vID09PSByZXMKICAgIGVuZAoKICAgIGRl ZiBhdXRoX2NyYW1fbWQ1KHVzZXIsIHNlY3JldCkKICAgICAgIyBDUkFNLU1ENTogW1JGQzIx OTVdCiAgICAgIHJlcyA9IG5pbAogICAgICBjcml0aWNhbCB7CiAgICAgICAgcmVzID0gY2hl Y2tfcmVzcG9uc2UoZ2V0X3Jlc3BvbnNlKCdBVVRIIENSQU0tTUQ1JyksIHRydWUpCiAgICAg ICAgY2hhbGxlbmdlID0gcmVzLnNwbGl0KC8gLylbMV0udW5wYWNrKCdtJylbMF0KICAgICAg ICBzZWNyZXQgPSBEaWdlc3Q6Ok1ENS5kaWdlc3Qoc2VjcmV0KSBpZiBzZWNyZXQuc2l6ZSA+ IDY0CgogICAgICAgIGlzZWNyZXQgPSBzZWNyZXQgKyAiXDAiICogKDY0IC0gc2VjcmV0LnNp emUpCiAgICAgICAgb3NlY3JldCA9IGlzZWNyZXQuZHVwCiAgICAgICAgMC51cHRvKDYzKSBk byB8aXwKICAgICAgICAgIGlzZWNyZXRbaV0gXj0gMHgzNgogICAgICAgICAgb3NlY3JldFtp XSBePSAweDVjCiAgICAgICAgZW5kCiAgICAgICAgdG1wID0gRGlnZXN0OjpNRDUuZGlnZXN0 KGlzZWNyZXQgKyBjaGFsbGVuZ2UpCiAgICAgICAgdG1wID0gRGlnZXN0OjpNRDUuaGV4ZGln ZXN0KG9zZWNyZXQgKyB0bXApCgogICAgICAgIHJlcyA9IGdldF9yZXNwb25zZShiYXNlNjRf ZW5jb2RlKHVzZXIgKyAnICcgKyB0bXApKQogICAgICB9CiAgICAgIHJhaXNlIFNNVFBBdXRo ZW50aWNhdGlvbkVycm9yLCByZXMgdW5sZXNzIC9cQTIuLi8gPT09IHJlcwogICAgZW5kCgog ICAgZGVmIGJhc2U2NF9lbmNvZGUoc3RyKQogICAgICAjIGV4cGVjdHMgInN0ciIgbWF5IG5v dCBiZWNvbWUgdG9vIGxvbmcKICAgICAgW3N0cl0ucGFjaygnbScpLmdzdWIoL1xzKy8sICcn KQogICAgZW5kCgogICAgIwogICAgIyBTTVRQIGNvbW1hbmQgZGlzcGF0Y2hlcgogICAgIwoK ICAgIHByaXZhdGUKCiAgICBkZWYgaGVsbyhkb21haW4pCiAgICAgIGdldG9rKCdIRUxPICVz JywgZG9tYWluKQogICAgZW5kCgogICAgZGVmIGVobG8oZG9tYWluKQogICAgICBnZXRvaygn RUhMTyAlcycsIGRvbWFpbikKICAgIGVuZAoKICAgIGRlZiBtYWlsZnJvbShmcm9tYWRkcikK ICAgICAgZ2V0b2soJ01BSUwgRlJPTTo8JXM+JywgZnJvbWFkZHIpCiAgICBlbmQKCiAgICBk ZWYgcmNwdHRvKHRvKQogICAgICBnZXRvaygnUkNQVCBUTzo8JXM+JywgdG8pCiAgICBlbmQK CiAgICBkZWYgcXVpdAogICAgICBnZXRvaygnUVVJVCcpCiAgICBlbmQKCiAgICBkZWYgc3Rh cnR0bHMKICAgICAgZ2V0b2soJ1NUQVJUVExTJykKICAgIGVuZAogICAgIwogICAgIyByb3cg bGV2ZWwgbGlicmFyeQogICAgIwoKICAgIHByaXZhdGUKCiAgICBkZWYgZ2V0b2soZm10LCAq YXJncykKICAgICAgcmVzID0gY3JpdGljYWwgewogICAgICAgIEBzb2NrZXQud3JpdGVsaW5l IHNwcmludGYoZm10LCAqYXJncykKICAgICAgICByZWN2X3Jlc3BvbnNlKCkKICAgICAgfQog ICAgICByZXR1cm4gY2hlY2tfcmVzcG9uc2UocmVzKQogICAgZW5kCgogICAgZGVmIGdldF9y ZXNwb25zZShmbXQsICphcmdzKQogICAgICBAc29ja2V0LndyaXRlbGluZSBzcHJpbnRmKGZt dCwgKmFyZ3MpCiAgICAgIHJlY3ZfcmVzcG9uc2UoKQogICAgZW5kCgogICAgZGVmIHJlY3Zf cmVzcG9uc2UKICAgICAgcmVzID0gJycKICAgICAgd2hpbGUgdHJ1ZQogICAgICAgIGxpbmUg PSBAc29ja2V0LnJlYWRsaW5lCiAgICAgICAgcmVzIDw8IGxpbmUgPDwgIlxuIgogICAgICAg IGJyZWFrIHVubGVzcyBsaW5lWzNdID09ID8tICAgIyAiMjEwLVBJUEVMSU5JTkciCiAgICAg IGVuZAogICAgICByZXMKICAgIGVuZAoKICAgIGRlZiBjaGVja19yZXNwb25zZShyZXMsIGFs bG93X2NvbnRpbnVlID0gZmFsc2UpCiAgICAgIHJldHVybiByZXMgaWYgL1xBMi8gPT09IHJl cwogICAgICByZXR1cm4gcmVzIGlmIGFsbG93X2NvbnRpbnVlIGFuZCAvXEEzLyA9PT0gcmVz CiAgICAgIGVyciA9IGNhc2UgcmVzCiAgICAgICAgICAgIHdoZW4gL1xBNC8gIHRoZW4gU01U UFNlcnZlckJ1c3kKICAgICAgICAgICAgd2hlbiAvXEE1MC8gdGhlbiBTTVRQU3ludGF4RXJy b3IKICAgICAgICAgICAgd2hlbiAvXEE1NS8gdGhlbiBTTVRQRmF0YWxFcnJvcgogICAgICAg ICAgICBlbHNlIFNNVFBVbmtub3duRXJyb3IKICAgICAgICAgICAgZW5kCiAgICAgIHJhaXNl IGVyciwgcmVzCiAgICBlbmQKCiAgICBkZWYgY3JpdGljYWwoJmJsb2NrKQogICAgICByZXR1 cm4gJzIwMCBkdW1teSByZXBseSBjb2RlJyBpZiBAZXJyb3Jfb2NjdXJlZAogICAgICBiZWdp bgogICAgICAgIHJldHVybiB5aWVsZCgpCiAgICAgIHJlc2N1ZSBFeGNlcHRpb24KICAgICAg ICBAZXJyb3Jfb2NjdXJlZCA9IHRydWUKICAgICAgICByYWlzZQogICAgICBlbmQKICAgIGVu ZAoKICAgIGRlZiBsb2dnaW5nKG1zZykKICAgICAgQGRlYnVnX291dHB1dCA8PCBtc2cgKyAi XG4iIGlmIEBkZWJ1Z19vdXRwdXQKICAgIGVuZAoKICBlbmQgICAjIGNsYXNzIFNNVFAKCiAg U01UUFNlc3Npb24gPSBTTVRQCgplbmQgICAjIG1vZHVsZSBOZXQK --------------060208050503030106060900--