From: John Maclean Date: 2006-02-24T22:00:25+09:00 Subject: Comments on gtk-ruby/main.rb appreciated --MP_Wf9exnx6_qbJ1Xear+07Uy_ Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit Content-Disposition: inline I've been using ruby-gtk for a few weeks now. Please find attached comments I've made about one of the sripts. In order to get me up to speed I've looked at the main script for the gtk-demo and boated it with comments. I find it under /usr/local/src/ruby-gtk2-0.14.1/gtk/sample/gtk-demo/ and /usr/local/src/ruby-gtk2-0.14.1/gtk/sample/gtk-demo/main.rb contains the file to get the whole demo going. Comments appreciated on my comments so that I can rally get a better understanding of Ruby and gtk. (Note that I've called it jx-main.rb in order to protect the original file) Hope this may help fellow novices. -- John Maclean MSc (DIC) 07739 171 531 --MP_Wf9exnx6_qbJ1Xear+07Uy_ Content-Type: application/octet-stream; name=jx-main.rb Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename=jx-main.rb IyEgL3Vzci9iaW4vZW52IHJ1YnkKPWJlZ2luCiAgbWFpbi5yYiAtIE1haW4gY2xhc3Mgb2YgZ3Rr LWRlbW8uClR1ZSBGZWIgMjEgMTk6MzQ6NDIgR01UIDIwMDYKYXMgY29tZW50ZWQgYnkgam9obiBt YWNsZWFuIC0gaW5mbyBcYXRcIGpheWVvbGEgXGRvdFwgL29yZy9pZQoKICBDb3B5cmlnaHQgKGMp IDIwMDMtMjAwNSBSdWJ5LUdOT01FMiBQcm9qZWN0IFRlYW0KICBUaGlzIHByb2dyYW0gaXMgbGlj ZW5jZWQgdW5kZXIgdGhlIHNhbWUgbGljZW5jZSBhcyBSdWJ5LUdOT01FMi4KCiAgJElkOiBtYWlu LnJiLHYgMS4xNyAyMDA1LzEwLzE2IDEyOjA3OjMyIG11dG9oIEV4cCAkCj1lbmQgCgojIHdlIGlu aXRpYWxpemUgZ3RrIGFzIGFsd2F5cwpyZXF1aXJlICdndGsyJwpHdGsuaW5pdAoKIyBtYWtlIGEg bW9kdWxlIHNvIHRoYXQgd2UgY2FuIGhhdmUgYSBjb2xsZWN0aW9uIG9mIG1ldGhvZHMgYW5kIGNs YXNzZXMuCiMgdGhpcyBhdm9pZHMgbmFtZSBzcGFjZSBjbGFzaGluZy4gc2VlICIgcmkgTW9kdWxl Igptb2R1bGUgRGVtbwoKICAjIHRoaXMgY2xhc3MgaXMgYSBjaGlsZCBvZiB0aGUgbWFpbiB3aW5k b3cKICBjbGFzcyBNYWluIDwgR3RrOjpXaW5kb3cKICAgICMgd2Ugc2V0IGdsb2JhbCAoY29uc3Rh bnQpIHBhcmFtZXRlcnMgZm9yIHRoZSBtYWluIHdpbmRvdwogICAgIyBub3RlIGZvciBwYXJhbWV0 ZXJzIC0+IGZvdXIgaW50ZWdlcnMKICAgICMgVElUTEVfQ09MVU1OID0gMAogICAgIyBGSUxFTkFN RV9DT0xVTU4gPSAxCiAgICAjIENMQVNTX0NPTFVNTiA9IDIKICAgICMgSVRBTElDX0NPTFVNTiA9 IDMKICAgIAogICAgVElUTEVfQ09MVU1OLCBGSUxFTkFNRV9DT0xVTU4sIENMQVNTX0NPTFVNTiwg SVRBTElDX0NPTFVNTiA9IDAsIDEsIDIsIDMKCiAgICAjIHdlIGhhdmUgYSBtZXRob2QgaGVyZQog ICAgZGVmIGluaXRpYWxpemUKICAgICAgIyBkdW5ubyAtIHRoZXNlIHZhcmlhYmxlcyBhcmUgaW5o ZXJpdGVkIGZyb20gdGhlIG1haW4gd2luZG93Pz8KICAgICAgc3VwZXIoKQoKICAgICAgIyB3YXRj aCBvdXQgZm9yIHRoZXNlIGluc3RhbmNlIHZhcmlhYmxlcyAtIHRoZXkgYXJlIHVzZSBhbG90Lgog ICAgICAjIHF1aXRlIGNsZXZlciB1c2Ugb2YgdGhlbSB0b28uLi4uLgoKICAgICAgIyB0aGUgbmFt ZSBvZiB0aGUgY3VycmVudCBmaWxlIHBlcmhhcHM/CiAgICAgICMgbWF5YmUgdGhpcyBpcyB0aGUg ZmlsZSB0aGF0IGlzIGFjdGl2YXRlZCB3aGVuIHRoZSB1c2VyIGNsaWNzIG9uIGEgZGVtbyBuYW1l LgogICAgICAjIGFueXdheSwgaXQgaXMgaW5pdGlhbGx5IHNldCB0byB6ZXJvCiAgICAgIEBjdXJy ZW50X2ZpbGUgPSBuaWwKCiAgICAgICMgdHdvIHRleHQgYnVmZmVycyBhcmUgY3JlYXRlZC4gVGhl eSBhcmUgc2hvd24gaW4gbm90ZWJvb2sgdGFicyB0aGF0IGFyZSBjcmVhdGVkIGJlbG93CgogICAg ICAjIG9uZSB0ZXh0IGJ1ZmZlciB0byB2aWV3IHRoZSBpbmZvLiB0aGUgcmkgZG9jIGluZm8gYXQg dGhlIHRvcCBvZiBlYWNoIGZpbGUgCiAgICAgICMgYW5vdGhlciBidWZmZXIgdG8gdmlldyB0aGUg c291cmNlLiBkaXNwbGF5cyB0aGUgZmlsZSdzIHNvdXJjZSBjb2RlIAogICAgICBAaW5mb19idWZm ZXIgPSBHdGs6OlRleHRCdWZmZXIubmV3CiAgICAgIEBzb3VyY2VfYnVmZmVyID0gR3RrOjpUZXh0 QnVmZmVyLm5ldwoKICAgICAgIyBzZXQgdGhlIHRpdGxlIGZvciAibWFpbiBzaG93Y2FzZSIgd2lu ZG93IAogICAgICBzZXRfdGl0bGUoJ1J1YnkvR1RLKyBDb2RlIERlbW9zJykKICAgICAgCiAgICAg ICMgd2hhdCBoYXBwZW5zIHdoZW4gd2Uga2lsbCB0aGlzIHdpbmRvdz8KICAgICAgc2lnbmFsX2Nv bm5lY3QoJ2Rlc3Ryb3knKSBkbwoKICAgICAgICAjIGl0IGlzIGtpbGxlZCBpbnN0YW50bHkKCUd0 ay5tYWluX3F1aXQKICAgICAgZW5kCgogICAgICAjIGhvdyBkbyB3ZSBraWxsIHRoaXMgd2luZG93 PwogICAgICAjIG1hcCBhIHNpZ25hbCB0byBhIGtleSBwcmVzcyBldmVudC4uLi4KICAgICAgc2ln bmFsX2Nvbm5lY3QoImtleV9wcmVzc19ldmVudCIpIGRvIHx3aWRnZXQsIGV2ZW50fAoKICAgICAg ICAjIHdlIGFyZSBsb29raW5nIGZvciA8Y3RybD48cT4KICAgICAgICBpZiBldmVudC5zdGF0ZS5j b250cm9sX21hc2s/IGFuZCBldmVudC5rZXl2YWwgPT0gR2RrOjpLZXl2YWw6OkdES19xCiAgICAg ICAgICAjIHdoZW4gd2Ugc2VlIHRoYXQga2V5IHNlcXVlbmNlIHdlIGtpbGwgdGhlIHdpbmRvdwog ICAgICAgICAgZGVzdHJveQogICAgICAgICAgdHJ1ZQogICAgICAgIGVsc2UKICAgICAgICAgIGZh bHNlCiAgICAgICAgZW5kCiAgICAgIGVuZAoKICAgICAgIyBjcmVhdGUgYW5kIGFkZCBhIGhvcml6 b250YWwgYm94CiAgICAgIGhib3ggPSBHdGs6OkhCb3gubmV3CiAgICAgIGFkZChoYm94KQoKICAg ICAgIyBjcmVhdGUgYSB0cmVlIHdpZGdldAogICAgICB0cmVlID0gY3JlYXRlX3RyZWUKCiAgICAg ICMgYSBzY3JvbGxlZCB3aW5kb3cgaXMgYWRkZWQgdG8gdGhlIHRyZWUgd2lkZ2V0CiAgICAgIHNj cm9sbGVkX3dpbmRvdyA9IEd0azo6U2Nyb2xsZWRXaW5kb3cubmV3CiAgICAgIHNjcm9sbGVkX3dp bmRvdy5hZGQodHJlZSkKCiAgICAgICMgcGFjayB0aGUgaG9yaXpvbnRhbCBib3ggdG8gdGhlIHNj cm9sbGVkIHdpbmRvdwogICAgICAjIHRoZSBwYXJhbWV0ZXJzIGFyZS4uLi4uCiAgICAgICMgaGJv eCA9IHRoZSB3aWRnZXQgCiAgICAgICMgLnBhY2tfc3RhcnQgPSB0aGUgbWV0aG9kCiAgICAgICMg c2Nyb2xsZWRfd2luZG93ICA9IGhib3ggaXMgcGFja2VkIHRvIHRoaXMKICAgICAgIyAgZmFsc2Ug PSBkdW5ubwogICAgICAjICBmYWxzZSA9IGR1bm5vCiAgICAgICMgIDAgPSBkdW5ubwogICAgICBo Ym94LnBhY2tfc3RhcnQoc2Nyb2xsZWRfd2luZG93LCBmYWxzZSwgZmFsc2UsIDApCgogICAgICAj IGEgbmV3IG5vdGVib29rIHdpZGdldCAKICAgICAgbm90ZWJvb2sgPSBHdGs6Ok5vdGVib29rLm5l dwoKICAgICAgIyBwYWNrIHRoZSBob3Jpem9udGFsIGJveCB0byB0aGUgbm90ZWJvb2sKICAgICAg IyB0aGUgcGFyYW1ldGVycyBhcmUuLi4uLgogICAgICAjIGhib3ggPSB0aGUgd2lkZ2V0IAogICAg ICAjIC5wYWNrX3N0YXJ0ID0gdGhlIG1ldGhvZAogICAgICAjIG5vdGVub29rICA9IGhib3ggaXMg cGFja2VkIHRvIHRoaXMKICAgICAgIyAgdHJ1ZSA9IGR1bm5vCiAgICAgICMgIHRydWUgPSBkdW5u bwogICAgICAjICAwIC0gZHVubm8KICAgICAgaGJveC5wYWNrX3N0YXJ0KG5vdGVib29rLCB0cnVl LCB0cnVlLCAwKQoKICAgICAgIyBhIG5ldyBwYWdlIGZvciB0aGUgbm90ZWJvb2suIHRoaXMgaXMg Zm9yIHRoZSAiaW5mbyIgdGV4dCBhcmVhCiAgICAgICMgdGhlIHBhcmFtZXRlcnMgYXJlOi0gCiAg ICAgICMgbm90ZWJvb2sgPSB0aGUgd2lkZ2V0CiAgICAgICMgLmFwcGVuZF9wYWdlID0gdGhlIG1l dGhvZAogICAgICAjIChjcmVhdGVfdGV4dCA9IGR1bm5vCiAgICAgICMgQGluZm9fYnVmZmVyID0g aW5zdGFuY2UgdmFyaWFibGUgCiAgICAgICMgQGZhbHNlID0gIGFub3RoZXIgaW5zdGFuY2UgdmFy aWFibGUgLCB1c2VkIGZvciBkdW5ubwogICAgICBub3RlYm9vay5hcHBlbmRfcGFnZShjcmVhdGVf dGV4dChAaW5mb19idWZmZXIsIGZhbHNlKSwKCiAgICAgICMgbmV3IGxhYmVsIGZvciBpbmZvIHBh Z2UgaW4gbm90ZWJvb2sKCQkJICAgR3RrOjpMYWJlbC5uZXcoJ19JbmZvJywgdHJ1ZSkpCgogICAg ICAjIGEgbmV3IHBhZ2UgZm9yIHRoZSBub3RlYm9vay4gdGhpcyBpcyBmb3IgdGhlICJzb3VyY2Ui IHRleHQgYXJlYQogICAgICAjIHRoZSBwYXJhbWV0ZXJzIGFyZTotIAogICAgICAjIG5vdGVib29r ID0gdGhlIHdpZGdldAogICAgICAjIC5hcHBlbmRfcGFnZSA9IHRoZSBtZXRob2QKICAgICAgIyAo Y3JlYXRlX3RleHQgPSBkdW5ubwogICAgICAjIEBpbmZvX2J1ZmZlciA9IGluc3RhbmNlIHZhcmlh YmxlIAogICAgICAjIEB0cnVlID0gIGFub3RoZXIgaW5zdGFuY2UgdmFyaWFibGUgLCB1c2VkIGZv ciBkdW5ubwogICAgICAKICAgICAgCiAgICAgICNub3RlYm9vay5hcHBlbmRfcGFnZShjcmVhdGVf dGV4dChAc291cmNlX2J1ZmZlciwgdHJ1ZSksCgogICAgICAjIG5ldyBsYWJlbCBmb3Igc291cmNl IHBhZ2UgaW4gbm90ZWJvb2sKICAgICAgIyAgIEd0azo6TGFiZWwubmV3KCdfU291cmNlJywgdHJ1 ZSkpCgogICAgICAjIHRhZ3MgZm9yIHRoZSBpbmZvIGFuZCBzb3VyY2UgYnVmZmVycy4geW91IGNh biBzZWUgdGhhdCBmb3IgZWFjaCB0YWcKCiAgICAgICMgLSBzZXQgdGhlIHRpdGxlCiAgICAgICMg LSBzZXQgdGhlIGZvbnQKICAgICAgQGluZm9fYnVmZmVyLmNyZWF0ZV90YWcoJ3RpdGxlJywKICAg ICAgICAgICAgICAgICAgICAgICAgICAgICB7J2ZvbnQnID0+ICdTYW5zIDE4J30pCgogICAgICBA c291cmNlX2J1ZmZlci5jcmVhdGVfdGFnKCdjb21tZW50JywKCiAgICAgICMgLSBzZXQgdGhlIGZv cmdyb3VuZCBjb2xvdXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsnZm9yZWdyb3Vu ZCcgPT4gJ3JlZCd9KQoKICAgICAgIyAtIGNyZWF0ZSAgYSB0YWcgZm9yIGEgcnVieSBjb25zdGFu dCBpbiB0aGUgc291cmNlIGJ1ZmZlcgogICAgICBAc291cmNlX2J1ZmZlci5jcmVhdGVfdGFnKCdj b25zdCcsCgogICAgICAjIC0gc2V0IHRoZSBmb3Jncm91bmQgY29sb3VyIGluIHRoZSBzb3VyY2Ug YnVmZmVyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7J2ZvcmVncm91bmQnID0+ICdG b3Jlc3RHcmVlbid9KQoKICAgICAgIyAtIGNyZWF0ZSBhIHRhZyBmb3IgYSBydWJ5IHN0cmluZy4g dGhpcyBzdHJpbmcgaXMgdXNlZCB0byBkaXNwbGF5IGNvZGUgaW4gdGhlIHNvdXJjZSBidWZmZXI/ PwogICAgICBAc291cmNlX2J1ZmZlci5jcmVhdGVfdGFnKCdzdHJpbmcnLAogICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgewogICAgICAjIC0gc2V0IHRoZSBmb3Jncm91bmQgY29sb3VyCiAg ICAgICMgLSBzZXQgdGhlIHdlaWdodCBvZiB0aGUgZm9udAoJCQkJICAnZm9yZWdyb3VuZCcgPT4g J1Jvc3lCcm93bicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnd2VpZ2h0JyA9 PiBQYW5nbzo6Rm9udERlc2NyaXB0aW9uOjpXRUlHSFRfQk9MRAoJCQkJfSkKICAgICAgIyAtIHNl dCB0aGUgYSB0YWcgZm9yIGEgcnVieSByZXNlcnZlZC9rZXl3b3JkCiAgICAgICMgLSBzZXQgdGhl IGZvcmdyb3VuZCBjb2xvdXIKICAgICAgQHNvdXJjZV9idWZmZXIuY3JlYXRlX3RhZygncmVzZXJ2 ZWQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeydmb3JlZ3JvdW5kJyA9PiAncHVy cGxlJ30pCiAgICBlbmQgIyA8LS0gb2YgZGVmIGluaXRpYWx6ZSBtZXRob2QKCiAgICAjIGEgbWV0 aG9kIGFib3V0IHRoZSBzY3JpcHRzIChjYWxsZWQgYnkgdGhlIHVzZXIgcHJlc3NlcykgCiAgICAj IHdhdGNoIG91dCBmb3IgdGhlIHBhcmFtZXRlciAocGF0aCkgLSBsZXRzJ3Mgc2VlIGhvdyBpdCBp cyB1c2VkLi4uCiAgICBkZWYgc2NyaXB0X2luZm8ocGF0aCkKICAgICAgIyB0aHJlZSBwYXJhbWV0 ZXJzIHdpdGggbm8gaW5pdGlhbCB2YWx1ZQogICAgICB0aXRsZSA9IG5pbCAKICAgICAga2xhc3Mg PSBuaWwgCiAgICAgIGRlcGVuZCA9IG5pbAoKICAgICAgIyB3ZSBvcGVuIGEgZmlsZQogICAgICBm aWxlID0gRmlsZS5vcGVuKHBhdGgpCiAgICAgICMgYW5kIHJlYWQgaXQgbGluZSBieSBsaW5lCiAg ICAgIGZpbGUuZWFjaCBkbyB8bG58CiAgICAgICAgIyBpZiB5b3UgZG9udCBzZWUgInRpdGxlIiBz dHJpbmcgYW5kIGEgbGluZSB0aGF0Oi0gCiAgICAgICAgIyAxKSBzdGFydHMgd2l0aCAiPSIsIAog ICAgICAgICMgMikgZm9sbG93ZWQgYnkgMSBvciBtb3JlIHdoaXRlc3BhY2UgY2hhcmFjdGVycywg CiAgICAgICAgIyAzKSBmb2xsb3dlZCBieSAwIG9yIG1vcmUgb2YgYW55IGNoYXJhY3RlcgogICAg ICAgICMgCiAgICAgICAgIyBmb3IgbW9yZSBpbmZvIG9uIHJlZ2V4ZXMsIGNoZWNrIG91dCBodHRw Oi8vcmVndWxhcmV4cHJlc3Npb25zLmluZm8KICAgICAgICAjIGFuZCByaSBSZWdleAogICAgICAg ICMgCiAgICAgICAgaWYgbm90IHRpdGxlIGFuZCBsbiA9fiAvXj1ccysoLiopJC8KICAgICAgICAg ICMgdGl0bGUgYmVjb21lcyAuLi4KICAgICAgICAgICMgJDEgaXMgdGhlIGZpcnN0IGdyb3VwIG1h dGNoIGZyb20gdGhlIGxhc3QgcmVnZXhwCiAgICAgICAgICB0aXRsZSA9ICQxCiAgICAgICAgICAj ICBzZWFyY2ggZm9yIC4uLgogICAgICAgICAgIyBhIGxpbmUgY29udGFpbmluZyBhIHBhcmVudGhl c2l6ZWQgc3RyZXRjaCBvZiB0ZXh0IGF0IHRoZSB2ZXJ5IGVuZAogICAgICAgICAgIyB5b3UgZG9u dCBhY3R1YWxseSBuZWVkIHRoZSBxdXN0aW9uIG1hcmsgYnV0IHdlJ2xsIGtlZXAgaXQgaW4gdGhl cmUKICAgICAgICAgIGlmIHRpdGxlID1+IC9eKC4qKVwoKC4rPylcKSQvCiAgICAgICAgICAgIHRp dGxlID0gJDEKICAgICAgICAgICMgJDIgaXMgdGhlIHNlY29uZCBncm91cCBtYXRjaCBmcm9tIHRo ZSBsYXN0IHJlZ2V4cAogICAgICAgICAgIyBhbmQgdGhpcyBpcyBob3cgd2Ugc2V0IHRoZSBkZXBl bmRhbmN5CiAgICAgICAgICAgIGRlcGVuZCA9ICQyCiAgICAgICAgICBlbmQKICAgICAgICBlbHNp ZiBub3Qga2xhc3MgYW5kIGxuID1+IC9ccypjbGFzc1xzKyhbQS1aXVtBLVphLXowLTlfXSopLwog ICAgICAgICAgIyBpZiB0aGUgdHdvIGNhc2VzIGFib3ZlIGFyZSBub3QgbWV0IHRoZW4gbGV0IGts YXNzIGJlIAogICAgICAgICAgIyAkMSAgLSB0aGUgZmlyc3QgZ3JvdXAgbWF0Y2ggZnJvbSB0aGUg bGFzdCByZWdleHAKICAgICAgICAgIGtsYXNzID0gJDEKICAgICAgICBlbmQKCiAgICAgICAgaWYg dGl0bGUgYW5kIGtsYXNzCiAgICAgICAgICAjICBkdW5ubyBoZXJlIGJ1dCB0aGluayB0aGlzIG1l YW5zIGlmIGJvdGggY2FzZXMgYXJlIG1ldCB0aGUgInF1aXQiCiAgICAgICAgICAjIHRoZSBtZXRo b2QgdGhhdCBkZWZpbmVzIHRoZSB0aXRsZSwgY2xhc3MgYW5kIGRlcGVuZGFuY3kgZm9yIGVhY2gg c2NyaXB0PwogICAgICAgICAgYnJlYWsKICAgICAgICBlbmQKICAgICAgZW5kCgogICAgICByZXR1 cm4gdGl0bGUsIGtsYXNzLmludGVybiwgZGVwZW5kCiAgICAgICMgdGhlIGludGVybiBtZXRob2Qg aXMgdXNlZCBmb3Igc3ltYm9scy4gc2VlICByaSBTdHJpbmcuaW50ZXJuCiAgICBlbmQKCiAgICAg ICMgaSBndWVzcyB0aGF0IHRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIHRyZWUg dmlldyBpbiB0aGUgbGVmdCBoYW5kIHNpZGUgb2YgdGhlIHNjcm9sbGVkIHdpbmRvdwogICAgICAj IG5vdGUgdGhhdCBvbmx5IGZpbGVzIGVuZGluZyBpbiAucmIgd2lsbCBiZSBpbmNsdWRlZAogICAg ICAjIGhhdmUgYSBsb29rIGluIHRoaXMgZGlyLCB5b3UnbGwgc2VlIG90aGVyIGZpbGVzIGxpa2Ug aW1hZ2VzLiB5b3Ugd2lsbCBub3Qgc2VlIHRoZW0gb24gdGhpcyB0cmVlIGxpc3QgCiAgICBkZWYg Z2VuZXJhdGVfaW5kZXgKCiAgICAgICMgVGFyZ2V0IHNjcmlwdHMgPC0tIG5vdCBteSBjb21tZW50 cwoKICAgICAgIyBsb29rIGZvciBydWJ5IGZpbGVzIGluIHRoaXMgZGlyIGJ1dCBkbyBub3QgaW5j bHVkZSB0aG9zZSBpbiB0aGUgYXJyYXkgKCB0aGlzIGZpbGUgYW5kIGNvbW1vbi5yYikKICAgICAg IyBpIHNob3VsZCBleHBsb3JlIHdoYXQgY2xhc3MgRGlyLmdsb2IgY3JlYXRlcy4uLiBndWVzcyBp dCdzIGFuIGFycmF5IDspCiAgICAgIHNjcmlwdHMgPSBEaXIuZ2xvYignKi5yYicpIC0gJXcoY29t bW9uLnJiIG1haW4ucmIpCgogICAgICAjIEdlbmVyYXRlIGluZGV4IHRyZWUgPC0tIG5vdCBteSBj b21tZW50cwoKICAgICAgIyBjcmVhdGUgYW4gZW1wdHkgaGFzaCBhbmQgYW4gZW1wdHkgYXJyYXkK ICAgICAgY2hpbGRyZW4gPSB7fQogICAgICBpbmRleCA9IFtdCgogICAgICAjIGluIGVhY2ggb2Yg dGhlIHNjcmlwdHMuLi4gZG8gdGhpcyBzdHVmZgogICAgICBzY3JpcHRzLmVhY2ggZG8gfGZufAoK ICAgICAgICAjIHRoaXMgYXNzaWdubWVudCBkb250IG1ha2Ugc2Vuc2UgdG8gbWUKICAgICAgICAj IGZvciBleGFtcGxlLi4uIAogICAgICAgICMgamF5ZSA9MwogICAgICAgICMgYSwgYiwgYyA9IGph eWUKICAgICAgICAjIGR1bm5vCiAgICAgICAgdGl0bGUsIGtsYXNzLCBkZXBlbmQgPSBzY3JpcHRf aW5mbyhmbikKCiAgICAgICAgIyBjaGVjayB0aGUgZGVwZW5kYW5jeSBvZiB0aGUgc2NyaXB0cwog ICAgICAgICMgdGhlc2UgcmVsYXRlIHRvIHRoZSB3aWRnZXRzIHRoYXQgdGhleSB1c2UuLi4uIGxp a2UgR3RrIHZlcnNpb25zCiAgICAgICAgIyB5b3UgbWF5IG9yIG1heSBub3QgaGF2ZSBwYW5nbyBv ciBjYWlybyBpbnN0YWxsZWQKICAgICAgICBpZiBkZXBlbmQgYW5kIG5vdCBHdGsuY29uc3RfZGVm aW5lZD8oZGVwZW5kKQogICAgICAgICAgIyBtb3ZlIGFsb25nLi4uLiBidXQgbmV4dCB3aGF0Pwog ICAgICAgICAgbmV4dAogICAgICAgIGVuZAoKICAgICAgICAjICBjaGVjayB0aGUgdGl0bGUgb2Yg dGhlIHJ1Ynkgc3JpcHQKICAgICAgICBpZiB0aXRsZSA9fiAlcnteKC4rPykvKC4rKSR9CiAgICAg ICAgICAjICQxICAtIHRoZSBmaXJzdCBncm91cCBtYXRjaCBmcm9tIHRoZSBsYXN0IHJlZ2V4cAog ICAgICAgICAgcGFyZW50ID0gJDEKICAgICAgICAgICMgJDIgaXMgdGhlIHNlY29uZCBncm91cCBt YXRjaCBmcm9tIHRoZSBsYXN0IHJlZ2V4cAogICAgICAgICAgY2hpbGQgPSAkMgoKICAgICAgICAg ICMgZHVubm8uIHdoYXQncyBnb2luZyBvbiBoZXJlCiAgICAgICAgICAjdGhpcyBpcyBhbiBpbmRl eGluZyB0aGluZyBmb3IgYXJheXMKICAgICAgICAgICMgd2UgY3JlYXRlZCB0aGlzIGFycmF5IGVh bGllciBhYm92ZQogICAgICAgICAgdW5sZXNzIGNoaWxkcmVuW3BhcmVudF0KICAgICAgICAgICAg Y2hpbGRyZW5bcGFyZW50XSA9IFtdCiAgICAgICAgICAgIGluZGV4ICs9IFtbcGFyZW50LCBuaWws IG5pbCwgW11dXQogICAgICAgICAgZW5kCgogICAgICAgICAgIyBkdW5uby4gd2hhdCdzIGdvaW5n IG9uIGhlcmUKICAgICAgICAgIGNoaWxkcmVuW3BhcmVudF0gKz0gW1tjaGlsZCwgZm4sIGtsYXNz XV0KICAgICAgICBlbHNlCiAgICAgICAgICAjIGR1bm5vLiB3aGF0J3MgZ29pbmcgb24gaGVyZQog ICAgICAgICAgaW5kZXggKz0gW1t0aXRsZSwgZm4sIGtsYXNzXV0KICAgICAgICBlbmQKICAgICAg ZW5kCgogICAgICAjIFNvcnQgY2hpbGRyZW4gPC0tIG5vdCBteSBjb21tZW50cwogICAgICBjaGls ZHJlbi5lYWNoX2tleSBkbyB8cGFyZW50fAogICAgICAgIGNoaWxkcmVuW3BhcmVudF0uc29ydCEg ZG8gfGEsIGJ8CiAgICAgICAgICBhWzBdIDw9PiBiWzBdCiAgICAgICAgZW5kCiAgICAgIGVuZAoK ICAgICAgIyBFeHBhbmQgY2hpbGRyZW4gPC0tIG5vdCBteSBjb21tZW50cwogICAgICAjIGkgZ3Vl c3MgdGhhdCB0aGlzIGlzIGhvdyBhIHJvdyBpcyBleHBhbmRlZCB3aGVuIHRoZSB1c2VyIGNsaWNr cyBvbiBpdAogICAgICBpbmRleC5jb2xsZWN0ISBkbyB8cm93fAogICAgICAgIGlmIHJvd1szXQog ICAgICAgICAgcm93WzNdID0gY2hpbGRyZW5bcm93WzBdXQogICAgICAgIGVuZAoKICAgICAgICBy b3cKICAgICAgZW5kCgogICAgICAgICAgIyBkdW5uby4gd2hhdCdzIGdvaW5nIG9uIGhlcmUgLSBn dWVzcwogICAgICAgICAgIyBzb3J0IHRoZSBuYW1lcyBvZiB0aGUgc2NyaXB0cyBhbmQgdGhpZXIg Y2hpbGRyZW4gaW50byBhbiBhcnJ5CiAgICAgICAgICAjIHRoaXMgaXMgdGhlIHRyZWUgbGlzdCB2 aWV3IC0gaSB0aGluayA6UAogICAgICBpbmRleC5zb3J0ISBkbyB8YSwgYnwKICAgICAgICBhWzBd IDw9PiBiWzBdCiAgICAgIGVuZAoKICAgICAgaW5kZXgKICAgIGVuZAoKICAgIGRlZiBjcmVhdGVf dHJlZQogICAgICAjIGEgdHJlZSB2aWV3IG5lZWRzIGEgbW9kZWwKICAgICAgbW9kZWwgPSBHdGs6 OlRyZWVTdG9yZS5uZXcoU3RyaW5nLCBTdHJpbmcsIFN0cmluZywgVHJ1ZUNsYXNzKQoKICAgICAg IyBjcmVhdGUgYSBuZXcgdmlldywgbW9kZWwgYW5kIHNlbGVjdGlvbgogICAgICB0cmVlX3ZpZXcg PSBHdGs6OlRyZWVWaWV3Lm5ldwogICAgICB0cmVlX3ZpZXcuc2V0X21vZGVsKG1vZGVsKQogICAg ICBzZWxlY3Rpb24gPSB0cmVlX3ZpZXcuc2VsZWN0aW9uCgogICAgICAjIG1heWJlIHRoaXMgaXMg dGhlIHdpZHRoIG90IHRoZSBjb2x1bSBmb3IgdGhlIGxpc3Q/CiAgICAgIHNlbGVjdGlvbi5zZXRf bW9kZShHdGs6OlNFTEVDVElPTl9CUk9XU0UpCiAgICAgIHRyZWVfdmlldy5zZXRfc2l6ZV9yZXF1 ZXN0KDIwMCwgLTEpCgogICAgICAjIGZpdCB0aGUgbW9kZWwgYW5kIGluZGV4IHRvIHRoZSBsaXN0 IG9yIHZpZXcKICAgICAgYXBwZW5kX2NoaWxkcmVuKG1vZGVsLCBnZW5lcmF0ZV9pbmRleCkKCiAg ICAgICMgZGV0YWlscyBvZiB0aGUgY2VsbHMuIGVhY2ggY2VsbCB3aWxsIGNvcnJlc3BvbmQgdG8g YSBzY3JpcHQKICAgICAgIyB0aGUgZm9sbG93aW5nIGNvbnRhaW5zIGZvcm1hdGluZmcgZGV0YWls cwogICAgICBjZWxsID0gR3RrOjpDZWxsUmVuZGVyZXJUZXh0Lm5ldwogICAgICBjZWxsLnN0eWxl ID0gUGFuZ286OkZvbnREZXNjcmlwdGlvbjo6U1RZTEVfSVRBTElDCiAgICAgIGNvbHVtbiA9IEd0 azo6VHJlZVZpZXdDb2x1bW4ubmV3KCJXaWRnZXQgKGRvdWJsZSBjbGljayBmb3IgZGVtbykiLCBj ZWxsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGV4dCcgPT4gVElUTEVfQ09MVU1OLAogICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzdHlsZV9zZXQnID0+IElUQUxJ Q19DT0xVTU4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pCgogICAg ICAjIGZpeCB0aGUgdHJlZSB0byB0aGUgY29sdW0KICAgICAgdHJlZV92aWV3LmFwcGVuZF9jb2x1 bW4oY29sdW1uKQoKICAgICAgIyBzZXQgdXAgdGhlIHNpZ25hbHMgc28gdGhhdCB3aWRnZXRzIGtu b3cgd2hhdCB0byBkbyB3aGVuIHRoZXkgYXJlIGNsaWNrZWQKICAgICAgc2VsZWN0aW9uLnNpZ25h bF9jb25uZWN0KCdjaGFuZ2VkJykgZG8gfHNlbGVjdGlvbnwKICAgICAgICAjIGl0ZXJhdGUvIHNl YXJjaCB0aHJvdWdoIHRoZSBmaWxlcyBvciBuYW1lcyBpbiB0aGUgYXJyYXkKCiAgICAgICAgIyB3 aGVuIHRoZSBjZWxsIGluIHRoZSB0cmVlIGlzIHNlbGVjdGVkCglpdGVyID0gc2VsZWN0aW9uLnNl bGVjdGVkCgogICMgbG9hZCB0aGUgY29ycmVzcG9uZGluZyBydWJ5IGRlbW8gc2NyaXB0Cglsb2Fk X2ZpbGUoaXRlci5nZXRfdmFsdWUoRklMRU5BTUVfQ09MVU1OKSkgaWYgaXRlcgogICAgICBlbmQK ICAgICAgIyBhIHJvdyBpbiBhIGNlbGwgaXMgY2xpY2tlZCAuLi4KICAgICAgdHJlZV92aWV3LnNp Z25hbF9jb25uZWN0KCdyb3dfYWN0aXZhdGVkJykgZG8gfHRyZWVfdmlldywgcGF0aCwgY29sdW1u fAogICAgICAgIHJvd19hY3RpdmF0ZWRfY2IodHJlZV92aWV3Lm1vZGVsLCBwYXRoKQogICAgICBl bmQKCiAgICAgICMgaG93IHRvIGV4cGFuZCB0aGUgImFycm93IiB0aGF0IGNvbnRhaW5zIGNoaWxk cmVuIGluIHRoZSB0cmVlCiAgICAgIHRyZWVfdmlldy5leHBhbmRfYWxsCiAgICAgIHJldHVybiB0 cmVlX3ZpZXcKICAgIGVuZAoKICAgICMgdGhpcyBtZWhvZCBjb3ZlcnMgdGhlIHNhbWUgZmlsZSwg Y2xhc3MgZGVwZW5kYW5jeSBpc3N1ZXMgYXMgZGVzY2liZWQgYWJvdmUKICAgICAgIyBob3cgdG8g ZXhwYW5kIHRoZSAiYXJyb3ciIHRoYXQgY29udGFpbnMgY2hpbGRyZW4gaW4gdGhlIHRyZWUKICAg IGRlZiBhcHBlbmRfY2hpbGRyZW4obW9kZWwsIHNvdXJjZSwgcGFyZW50ID0gbmlsKQogICAgICBz b3VyY2UuZWFjaCBkbyB8dGl0bGUsIGZpbGVuYW1lLCBrbGFzcywgY2hpbGRyZW58CglpdGVyID0g bW9kZWwuYXBwZW5kKHBhcmVudCkKCglbdGl0bGUsIGZpbGVuYW1lLCBrbGFzc10uZWFjaF93aXRo X2luZGV4IGRvIHx2YWx1ZSwgaXwKCSAgaWYgdmFsdWUKCSAgICBpdGVyLnNldF92YWx1ZShpLCB2 YWx1ZSkKCSAgZW5kCgllbmQKICAgICAgICBpdGVyLnNldF92YWx1ZShJVEFMSUNfQ09MVU1OLCBm YWxzZSkKCiAgICAgICAgaWYgY2hpbGRyZW4KICAgICAgICAgIGFwcGVuZF9jaGlsZHJlbihtb2Rl bCwgY2hpbGRyZW4sIGl0ZXIpCiAgICAgICAgZW5kCiAgICAgIGVuZAogICAgZW5kCgogICAgZGVm IHJvd19hY3RpdmF0ZWRfY2IobW9kZWwsIHBhdGgpCiAgICAgIGl0ZXIgPSBtb2RlbC5nZXRfaXRl cihwYXRoKQogICAgICBpdGVyLnNldF92YWx1ZShJVEFMSUNfQ09MVU1OLCB0cnVlKQoKICAgICAg IyB0aGUgZmlsZW5hbWVzIGFyZSBub3QgZmlsZW5hbWVzIC0gdGhleSBhcmUgaW4gdGhlIHJpIGRv YwogICAgICAjIGFuZCB0aGV5IGFyZSB1c2VkIHRvIGZpbGwgdGhlIGxpc3QgaW4gdGhlIHRyZWUK ICAgICAgbGliID0gaXRlci5nZXRfdmFsdWUoRklMRU5BTUVfQ09MVU1OKQoKICAgICAgaWYgbGli CiAgICAgICAgIyBob3cgdG8gbG9hZCB0aGUgZmlsZSBjYWxsZWQgYnkgYSB1c2VyIGNsaWNrCiAg ICAgICAgcmVxdWlyZShsaWIpCiAKICAgICAgICBrbGFzcyA9IERlbW8uY29uc3RfZ2V0KGl0ZXIu Z2V0X3ZhbHVlKENMQVNTX0NPTFVNTikpCiAgICAgICAgd2luZG93ID0ga2xhc3MubmV3CiAgICAg ICAgIyBob3cgdG8ga2lsbCB0aGUgc2NyaXB0cyBjYWxsZWQgYnkgdXNlciBzZWxlY3Rpb24KICAg ICAgICAjIGtpbGwgdGhlIHdpbmRvdyBpbW1lZGlhdGVsbHkKICAgICAgICB3aW5kb3cuc2lnbmFs X2Nvbm5lY3QoJ2Rlc3Ryb3knKSBkbwogICAgICAgICAgaXRlci5zZXRfdmFsdWUoSVRBTElDX0NP TFVNTiwgZmFsc2UpCiAgICAgICAgZW5kCiAgICAgICAgd2luZG93LnNob3dfYWxsCiAgICAgIGVu ZAogICAgZW5kCgogICAgIyB0aGlzIGp1c3QgInByZXR0eSIgcHJpbnRzIHRoZSBzb3VyY2UgYnVm ZmVyCiAgICAjIGRlYWxzIHdpdGggdGhpbmdzIGxpa2UgZm9udHMsIHNwYWNpbmdzIGFuZCBjb2xv cmlzYXRpb24gb2Yga2V5d29yZHMKICAgIGRlZiBjcmVhdGVfdGV4dChidWZmZXIsIGlzX3NvdXJj ZSkKCiAgICAgIHNjcm9sbGVkX3dpbmRvdyA9IEd0azo6U2Nyb2xsZWRXaW5kb3cubmV3CiAgICAg IHNjcm9sbGVkX3dpbmRvdy5zZXRfcG9saWN5KEd0azo6UE9MSUNZX0FVVE9NQVRJQywKCQkJCSBH dGs6OlBPTElDWV9BVVRPTUFUSUMpCiAgICAgIHNjcm9sbGVkX3dpbmRvdy5zZXRfc2hhZG93X3R5 cGUoR3RrOjpTSEFET1dfSU4pCgogICAgICB0ZXh0X3ZpZXcgPSBHdGs6OlRleHRWaWV3Lm5ldwoK ICAgICAgdGV4dF92aWV3LnNldF9idWZmZXIoYnVmZmVyKQogICAgICB0ZXh0X3ZpZXcuc2V0X2Vk aXRhYmxlKGZhbHNlKQogICAgICB0ZXh0X3ZpZXcuc2V0X2N1cnNvcl92aXNpYmxlKGZhbHNlKQoK ICAgICAgc2Nyb2xsZWRfd2luZG93LmFkZCh0ZXh0X3ZpZXcpCgogICAgICBpZiBpc19zb3VyY2UK ICAgICAgICAjIGZvbnQgc2V0dGluZ3MgdXNlZCB0byBkaXNwbGF5IHRoZSBzb3VyY2UgY29kZQoJ Zm9udF9kZXNjID0gUGFuZ286OkZvbnREZXNjcmlwdGlvbi5uZXcoJ01vbm9zcGFjZSAxMicpCgl0 ZXh0X3ZpZXcubW9kaWZ5X2ZvbnQoZm9udF9kZXNjKQoKCXRleHRfdmlldy5zZXRfd3JhcF9tb2Rl KEd0azo6VGV4dFRhZzo6V1JBUF9OT05FKQogICAgICBlbHNlCiAgICAgICAgIyBob3cgdG8gdHJl YXQgbG9uZyBsaW5lcywgYXJlIHRoZXkgd3JhcHBlZD8geWVhaCEKCXRleHRfdmlldy5zZXRfd3Jh cF9tb2RlKEd0azo6VGV4dFRhZzo6V1JBUF9XT1JEKQogICMgaSB0aGluayB0aGF0IHdlIHVzZSBs aW5lIHNwYWNpbmdzIG9mIGV4YWN0bHkgMiBwaXhlbHMKCXRleHRfdmlldy5zZXRfcGl4ZWxzX2Fi b3ZlX2xpbmVzKDIpCgl0ZXh0X3ZpZXcuc2V0X3BpeGVsc19iZWxvd19saW5lcygyKQogICAgICBl bmQKCiAgICAgICMgd2hlbiBhbGwgb2YgdGhlIHNldHRpbmdzIGhhdmUgYmVlbiBkb25lIHBhc3Mg dGhlc2UgdmFyaWFibGVzIHRvIHRoZSBzY3JvbGxlZCB3aW5kb3cKICAgICAgcmV0dXJuIHNjcm9s bGVkX3dpbmRvdwogICAgZW5kCgogICAgIyBkdW5ubyB3aGF0J3MgZ29pbmcgb24gaGVyZSBidXQg aSdtIHN1cmUgdGhhdCB0aGlzIGlzIHRvIGRvIHdpdGggdGhlIHRleHQgdGhhdCdzIAogICAgIyBk aXNwbGF5ZWQgaW4gdGhlIHNvdXJjZSBhbmQgaW5mbyBwYWdlcyBvZiB0aGUgbm90ZWJvb2sKICAg IGRlZiBmb250aWZ5KHN0YXJ0X2l0ZXIgPSBAc291cmNlX2J1ZmZlci5zdGFydF9pdGVyLAoJCWVu ZF9pdGVyID0gQHNvdXJjZV9idWZmZXIuZW5kX2l0ZXIpCiAgICAgIHN0ciA9IEBzb3VyY2VfYnVm ZmVyLmdldF90ZXh0KHN0YXJ0X2l0ZXIsIGVuZF9pdGVyLCB0cnVlKQoKICAgICAgdG9rZW5pemVy ID0gUnVieVRva29uaXplci5uZXcKICAgICAgdG9rZW5pemVyLnRva2VuaXplKHN0ciwgc3RhcnRf aXRlci5vZmZzZXQpIGRvIHx0YWcsIHN0YXJ0LCBsYXN0fAoJQHNvdXJjZV9idWZmZXIuYXBwbHlf dGFnKHRhZy50b19zLAoJCQkJIEBzb3VyY2VfYnVmZmVyLmdldF9pdGVyX2F0X29mZnNldChzdGFy dCksCgkJCQkgQHNvdXJjZV9idWZmZXIuZ2V0X2l0ZXJfYXRfb2Zmc2V0KGxhc3QpKQogICAgICBl bmQKICAgIGVuZAoKCiAgICAjIGhvdyB0byBsb2FkIHRoZSBmaWxlcy4gbm90ZSB0aGF0IGFsbCBv ZiB0aGUgZmlsZXMgaW4gdGhlIHdvcmtpbmcgZGlyZWN0b3J5CiAgICAjICptdXN0KiBlbmQgd2l0 aCAucmIgYW5kIHN0YXJ0IHdpdGggYW4gcmkgZG9jCiAgICBkZWYgbG9hZF9maWxlKGZpbGVuYW1l KQogICAgICBpZiBmaWxlbmFtZSA9PSBAY3VycmVudF9maWxlCglyZXR1cm4KICAgICAgZW5kCgog ICAgICAjIGR1bm5vIHdoYXQncyBnb2luZyBvbiBoZXJlIC0gdGhpcyBpcyBhIG1ldGhvZCB0byBy ZW1vdmUgdGV4dCBiZXR3ZWVuIGJvdW5kcmllcyBtYXJrZWQgYnkgdGhlIHJpIGRvYwogICAgICBA aW5mb19idWZmZXIuZGVsZXRlKCpAaW5mb19idWZmZXIuYm91bmRzKQogICAgICBAc291cmNlX2J1 ZmZlci5kZWxldGUoKkBzb3VyY2VfYnVmZmVyLmJvdW5kcykKCiAgICAgIGZpbGUgPSBiZWdpbgog ICAgICAjIGR1bm5vIHdoYXQncyBnb2luZyBvbiBoZXJlCgkgICAgICAgRmlsZS5vcGVuKGZpbGVu YW1lKQoJICAgICByZXNjdWUKCSAgICAgICAkc3RkZXJyLnB1dHMgIkNhbm5vdCBvcGVuOiAjeyQh fSIgaWYgJERFQlVHCgkgICAgICAgcmV0dXJuCgkgICAgIGVuZAogICAgICBzdGFydCA9IEBpbmZv X2J1ZmZlci5nZXRfaXRlcl9hdF9vZmZzZXQoMCkKICAgICAgc3RhdGUgPSA6YmVmb3JlX2hlYWRl cgoKICAgICAgZmlsZS5lYWNoIGRvIHxsaW5lfAogICAgICAjIGR1bm5vIHdoYXQncyBnb2luZyBv biBoZXJlCgljYXNlIHN0YXRlCgl3aGVuIDpiZWZvcmVfaGVhZGVyCgkgIGlmIGxpbmUgPX4gL149 YmVnaW4kLwoJICAgIHN0YXRlID0gOmluX2hlYWRlcgoJICBlbmQKICAgICAgIyBkdW5ubyB3aGF0 J3MgZ29pbmcgb24gaGVyZQoJd2hlbiA6aW5faGVhZGVyCgkgIGlmIGxpbmUgPX4gL149ZW5kJC8K CSAgICBzdGF0ZSA9IDpib2R5CgkgICAgc3RhcnQgPSBAc291cmNlX2J1ZmZlci5nZXRfaXRlcl9h dF9vZmZzZXQoMCkKCSAgZWxzaWYgbGluZSA9fiAvXj1ccysoLiopJC8KCSAgICB0aXRsZSA9ICQx CiAgICAgICAgICAgIHRpdGxlLmdzdWIhKC9ccypcKC4qXCkkLywgJycpICMgRGVsZXRlIGRlcGVu ZCBmaWVsZCA8LS0gbm90IG15IGNvbW1lbnRzCgoJICAgIGxhc3QgPSBzdGFydAoKCSAgICBAaW5m b19idWZmZXIuaW5zZXJ0KGxhc3QsIHRpdGxlKQoJICAgIHN0YXJ0ID0gbGFzdC5jbG9uZQoKCSAg ICBzdGFydC5iYWNrd2FyZF9jaGFycyh0aXRsZS5sZW5ndGgpCgkgICAgQGluZm9fYnVmZmVyLmFw cGx5X3RhZygndGl0bGUnLCBzdGFydCwgbGFzdCkKCgkgICAgc3RhcnQgPSBsYXN0CgkgIGVsc2UK CSAgICBAaW5mb19idWZmZXIuaW5zZXJ0KHN0YXJ0LCBsaW5lKQoJICBlbmQKCXdoZW4gOmJvZHkg ICMgUmVhZGluZyBwcm9ncmFtIGJvZHkgPC0tIG5vdCBteSBjb21tZW50cwoJICBAc291cmNlX2J1 ZmZlci5pbnNlcnQoc3RhcnQsIGxpbmUpCgllbmQKICAgICAgZW5kCgogICAgICBmb250aWZ5Cgog ICAgICBAY3VycmVudF9maWxlID0gZmlsZW5hbWUKICAgIGVuZCAjIDwtLSBvZiBkZWYgbG9hZF9m aWxlKGZpbGVuYW1lKQogICAgICAjIHRoYXQgbWV0aG9kIHdhcyBvdmVyIG15IGhlYWQhCiAgICAg ICMgbmVlZCBoZWxwIGV4cGxhbmluZyB0aGlzCiAgZW5kCgogICMgYSBuZXcgY2xhc3MgdG8gZGVm aW5lIHdoYXQga2V5d29yZHMgdG8gbG9vayBvdXQgZm9yLi4uCiAgIyByZXF1aXJlZCBmb3IgInBy ZXR0eSBwcmludGluZyIgb2Ygc291cmNlIGJ1ZmZlciBzbyB0aGF0IHRoZXkgYXJlIHNob3duIGlu IGRpZmZlcmVudCBjb2xvdXJzCiAgY2xhc3MgUnVieVRva29uaXplcgogICAgUkVTRVJWRURfV09S RFMgPSAldyhiZWdpbiBlbmQgbW9kdWxlIGNsYXNzIGRlZiBpZiB0aGVuIGVsc2Ugd2hpbGUgdW5s ZXNzIGRvIGNhc2Ugd2hlbiByZXF1aXJlIHlpZWxkKQogICAgUkVTRVJWRURfV09SRFNfUEFUVEVS TiA9IFJlZ2V4cC5jb21waWxlKC8oXnxccyspKCN7UkVTRVJWRURfV09SRFMuY29sbGVjdCBkbyB8 cGF0fCBSZWdleHAucXVvdGUocGF0KSBlbmQuam9pbignfCcpfSkoXHMrfCQpLykKCiAgICAjIGFu b3RoZXIgbWV0aG9kIGZvciBwcmV0dHkgcHJpbnRpbmcgdGhlIGtleXdvcmRzLiBJIGRvbnQga25v dyB3aHkgd2UgbmVlZCB0d28KICAgIGRlZiB0b2tlbml6ZShzdHIsIGluZGV4ID0gMCkKICAgICAg dW50aWwgc3RyLmVtcHR5PwoJdGFnID0gbmlsCgoJY2FzZSBzdHIKCXdoZW4gLyIuKz8iLywgLycu Kz8nLwoJICB0YWcgPSA6c3RyaW5nCgl3aGVuIC8jLiokLwoJICB0YWcgPSA6Y29tbWVudAoJd2hl biBSRVNFUlZFRF9XT1JEU19QQVRURVJOCgkgIHRhZyA9IDpyZXNlcnZlZAoJd2hlbiAvW0EtWl1b QS1aYS16MC05X10rLwoJICB0YWcgPSA6Y29uc3QKCWVuZAoKCWlmIHRhZwoJICB0b2tlbml6ZSgk fi5wcmVfbWF0Y2gsIGluZGV4KSBkbyB8KmFyZ3N8CiAgICAgICAgICAgIHlpZWxkKCphcmdzKQoJ ICBlbmQKCSAgeWllbGQodGFnLCBpbmRleCArICR+LmJlZ2luKDApLCBpbmRleCArICR+LmVuZCgw KSkKCSAgaW5kZXggKz0gKHN0ci5sZW5ndGggLSAkfi5wb3N0X21hdGNoLmxlbmd0aCkKCSAgc3Ry ID0gJH4ucG9zdF9tYXRjaAoJZWxzZQoJICBpbmRleCArPSBzdHIubGVuZ3RoCgkgIHN0ciA9ICcn CgllbmQKICAgICAgZW5kCiAgICBlbmQgIyA8LS0gb2YgdG9rZW5pemUgbWV0aG9kCiAgZW5kICMg PC0tIG9mIFJ1YnlUb2tvbml6ZXIgY2xhc3MKZW5kICMgPCBvZiBtb2R1bGUgRGVtbwoKCiMgZHVu bm8KIyBzeW1ib2xzIGFyZSBpbiB1c2UgaGVyZS4gZHVubm8gd2hhdCBmb3IgdGhvdWdoCiMgaXMg dGhpcyB0byAKIyAgLSBjb2xsZWN0IGFueSBhcmdzIHBhc3NlZCB0byBtYWluLnJiIG9uIHRoZSBj b21hbmQgbGluZT8KIyAgLSBjb2xsZWN0IHRoZSBmaWxlbmFtZSwgdGl0bGUsIHJpIGRvYyBpbmZv IGFuZCBkZXBlbmRhbmNpZXMgaW4gdGhlIHNjcmlwdHMgY2FsbGVkIGJ5IHRoZSBkZW1vPwojICAg ICAtIGkgdGhvdWdodCB0aGF0IHRoaXMgaGFzIGFsZWFkeSBiZWVuIHRha2VuIGNhcmUgb2YgYWJv dmUuLi4uPwoKdGFyZ2V0ID0gQVJHVi5zaGlmdAppZiB0YXJnZXQKICBEZW1vOjpJTkRFWC5lYWNo IGRvIHx0aXRsZSwgZmlsZW5hbWUsIGtsYXNzX3N5bWJvbCwgY2hpbGRyZW58CiAgICBpZiB0YXJn ZXQgPT0gZmlsZW5hbWUgb3IgdGFyZ2V0ID09IGtsYXNzX3N5bWJvbC5pZDJuYW1lCiAgICAgIHJl cXVpcmUgZmlsZW5hbWUKCiAgICAgIHdpbmRvdyA9IERlbW8uY29uc3RfZ2V0KGtsYXNzX3N5bWJv bCkubmV3CiAgICAgIHdpbmRvdy5zaG93X2FsbAoKICAgICAgY2xhc3MgPDwgd2luZG93CglkZWYg cXVpdAoJICBHdGsubWFpbl9xdWl0CgllbmQKICAgICAgZW5kCgogICAgICBicmVhawogICAgZW5k CiAgZW5kCiAgIyBhbnl3YXkgY3JlYXRlIGFuZCBzaG93IG1haW4gImRlbW8gd2luZG93IiB3aXRo IHNpemUgYXMgc2hvd24KZWxzZQogIG1haW4gPSBEZW1vOjpNYWluLm5ldwogIG1haW4uc2V0X2Rl ZmF1bHRfc2l6ZSg2MDAsIDQwMCkKICBtYWluLnNob3dfYWxsCmVuZAoKIyAgdGhlIG1haW4gbG9v cApHdGsubWFpbgo= --MP_Wf9exnx6_qbJ1Xear+07Uy_--