From: Hugh Sasse Date: 2008-10-30T19:40:50+09:00 Subject: Re: automatic code conversion from Ruby to C ? ---476953799-42686698-1225363294=:29430 Content-Type: MULTIPART/MIXED; BOUNDARY="-476953799-42686698-1225363294=:29430" This message is in MIME format. The first part should be readable text, while the remaining parts are likely unreadable without MIME-aware tools. ---476953799-42686698-1225363294=:29430 Content-Type: TEXT/PLAIN; charset=US-ASCII On Thu, 30 Oct 2008, Axel Etzold wrote: > > Axel Etzold wrote: > I am not looking for swig or an extension of Ruby by C, but a way of producing > C/C++ code from a Ruby script containing some magical part that saves > me the trouble of declaring all the variables, assigning memory etc and all > these things that make writing C/C++ so tedious in comparison with Ruby ... The attached is "dirty washing": it can be used but it's not really fit for polite society, and, well, you get the gist. I'm not maintaining it at the moment, and it's rather tailored to what I needed at the time (so chop out references to fsv_common.h for example), but if your are wearing thick rubber gloves and a boiler suit you might like to poke around in it to see if there's stuff you can use. The concept behind it was to reduce declarations, by getting the function definitions to produce the prototypes, and thereby the associated header files, so I don't have to use the "What I tell you three times is true" approach of C. So it's essentially a macro processor, but more Rubyesque, and allows you to compute stuff in ruby to insert directly. See things like "Code Generation in Action" and the website http://www.codegeneration.net/ for things a lot less horrid than this. It is also based around the idea that a "class" in C works like FILE*, its a pointer to struct with associated functions that operate on that, without people having to know how (except those who write such functions). > > For the project I am working on right now, this is not so dramatic. > I just wanted to know if I had missed something that would spare me > all the troubles of C/C++ development ;-) > > > What's a "C hash"? Perhaps you mean glib, or STL, or a zillion other > > possible C/C++ libraries? > > Ruby doesn't use any of these, and Ruby's hashes don't map directly to > > any of them (for example, coders can subclass Hash, or override methods > > in it; and a Ruby Hash can contain mixed types for both keys and values) > > > > Even simple things like "Integer" don't map directly to C. > > I am of course aware that there are conceptual differences between languages ... > Maybe a conversion tool between programming languages would then need > to be able to capture some of these by analyzing a lot of parallel code from > detailed guidebooks explaining how to program task X "idiomatically" in both > languages. The only thing that gets near that is the fabled "decompiler", and I've not seen one myself. I think this translator between computer languages is going to be "Star Trek technology" for a while yet. > In automated translation between natural languages, results used to be poor > as long as individual words were translated -- there is the famous joke that > a 1950ies automated translation of "out of mind, out of sight" into Russian and back > gave "invisible idiot". I heard it was "invisible insane". :-) > On the other hand, it is possible to summarize texts automatically and return their > gist quite well using statistical methods, such as Latent Semantic Analysis (there's I've played with free software for this recently, and it seems to be extremely poor quality, usually missing the point entirely. I'd like to be shown something that works well in this area. > the classifier gem in Ruby implementing this for English texts). > This will map count word occurrences in each sentence or paragraph of a text > (after having removed the most frequent ones, that are likely to occur in any text), > and perform some operations on the resulting matrix, so that sentences can be > mapped to some object from linear algebra which allows to classify them and > introduce distances between them. > If you now have a long text, say, a novel in English, and its (human-made) translation > into Russian, it should be possible to extract some correspondence between word groups, words, > expressions in English to those in Russian from this training set, including several alternative > ways to express approximately the same idea in either language. > I am wondering whether it's possible to do something similar between programming languages > and what could be the connection between them (S-expressions?) Human languages only have to be portable across humans, which are basically the same platform, with the same types of IO, memory constraints and physical architecture. Computer languages can vary widely, FORTH, Haskell, Cobol... > That's of course more an academic question than a practical one, but if someone had done it already, > and I'd be able to write C in Ruby with an automatic translator, I'd still like to know ;-) > >From all the responses I got, this doesn't seem to be the case ... and I'd truly expect that to be > a huge undertaking as well. > > Thank you to all who responded to my question! > > Best regards, > > Axel > Hugh ---476953799-42686698-1225363294=:29430 Content-Type: TEXT/PLAIN; charset=UTF-8; name=cclass_creator.rb Content-Transfer-Encoding: BASE64 Content-ID: Content-Description: Content-Disposition: attachment; filename=cclass_creator.rb IyEvdXNyL2xvY2FsL2Jpbi9ydWJ5IC13DQpyZXF1aXJlICd5YW1sL3N0b3Jl Jw0KIyBVc2VkIGZvciBnZW5lcmF0ZWQgaW5kZW50YXRpb24uDQpJTkRFTlQg PSAyICMgc3BhY2VzLg0KDQojIENsYXNzIENUeXBlIGlzIHVzZWQgZm9yIGhh bmRsaW5nIHN0cmluZyByZXByZXNlbnRhdGlvbnMgb2YgQyB0eXBlcy4NCmNs YXNzIENUeXBlDQogIGRlZiBpbml0aWFsaXplKHN0cmluZykNCiAgICBpZiBz dHJpbmcubmlsPyBvciBzdHJpbmcuZW1wdHk/DQogICAgICByYWlzZSAiQ2Fu J3QgZm9ybSBhIEN0eXBlIGZyb20gbmlsIG9yIGVtcHR5IHN0cmluZyINCiAg ICBlbmQNCiAgICBAc3RyaW5nID0gc3RyaW5nDQogIGVuZA0KDQogICMgRGlz cGxheSB0aGUgdHlwZSBjb3JyZWN0bHkNCiAgIyBmb3IgcG9pbnRlciB0eXBl cywgd2UgZG9uJ3Qgd2FudCBhIHNwYWNlIGFmdGVyIHRoZSAqLg0KICBkZWYg dG9fcw0KICAgIEBzdHJpbmcgKyAoKEBzdHJpbmcgPX4gL1wqJC8pID8gIiIg OiAiICIpDQogIGVuZA0KDQplbmQNCg0KY2xhc3MgU3RyaW5nDQoNCiAgIyBJ bmRlbnRzIHRoZSBzdHJpbmcgYnkgdGhlIGdpdmVuICNpbmRlbnQsIGFuZCBy ZXR1cm5zIHRoZQ0KICAjIHJlc3VsdCB3aXRob3V0IG1vZGlmeWluZyB0aGUg b3JpZ2luYWwgc3RyaW5nLg0KICAjIFRvIERSWSBvdXQgaW5kZW50YXRpb24u ICBbRFJZID09ICJEb24ndCBSZXBlYXQgWW91cnNlbGYiIC0tIFtIdW50LCBU aG9tYXNdXQ0KICBkZWYgaW5kZW50KGluZGVudGxldmVsID0gMSkNCiAgICBz cGFjZXMgPSAiICIgKiAoSU5ERU5UICogaW5kZW50bGV2ZWwpDQogICAgc2Vs Zi5nc3ViKC9eL20sIHNwYWNlcykNCiAgZW5kDQoNCg0KICAjIEluZGVudHMg dGhlIHN0cmluZyBieSB0aGUgZ2l2ZW4gI2luZGVudCwgYW5kIHJldHVybnMg dGhlDQogICMgcmVzdWx0IG1vZGlmeWluZyB0aGUgb3JpZ2luYWwgc3RyaW5n Lg0KICAjIFRvIERSWSBvdXQgaW5kZW50YXRpb24uDQogIGRlZiBpbmRlbnQh KGluZGVudGxldmVsID0gMSkNCiAgICBzcGFjZXMgPSAiICIgKiAoSU5ERU5U ICogaW5kZW50bGV2ZWwpDQogICAgc2VsZi5nc3ViISgvXi9tLCBzcGFjZXMp DQogIGVuZA0KDQogICMgVGFrZW4gZnJvbSBmYWNldHMgYmVjYXVzZSBJIGdl dCBhIE5vTWV0aG9kRXJyb3IgZnJvbSBOaWwjW10uDQogICMgPWJlZ2luDQog IGRlZiBtYXJnaW4obj0wKQ0KICAgIGQgPSAvXEEuKlxuXHMqKC4pLy5tYXRj aCggc2VsZiApDQogICAgZCA9IC9cQVxzKiguKS8ubWF0Y2goIHNlbGYpIHVu bGVzcyBkDQogICAgZCA9IFJlZ2V4cC5xdW90ZShkWzBdKSB1bmxlc3MgZA0K ICAgIHJldHVybiAnJyB1bmxlc3MgZA0KICAgIGlmIG4gPT0gMA0KICAgICAg Z3N1YigvXG5ccypcWi8sJycpLmdzdWIoL15ccypbI3tkfV0vLCAnJykNCiAg ICBlbHNlDQogICAgICBnc3ViKC9cblxzKlxaLywnJykuZ3N1YigvXlxzKlsj e2R9XS8sICcgJyAqIG4pDQogICAgZW5kDQogIGVuZA0KICAjID1lbmQNCg0K ZW5kDQoNCiMgRXh0ZW5kIHRoZSBBcnJheSB0eXBlIChmb3IgYXJyYXlzIG9m IGFycmF5cykgc28gdGhhdCB3ZSBjYW4gbWVyZ2UNCiMgdGhlbSBsaWtlIGhh c2hlcy4NCmNsYXNzIEFycmF5DQogIGRlZiBtZXJnZShvdGhlcikNCiAgICBs aXN0ID0gb3RoZXIuY29sbGVjdCBkbyB8c3ViYXJyYXl8DQogICAgICBpZiBz ZWxmLmFzc29jKHN1YmFycmF5WzBdKQ0KICAgICAgICBuaWwNCiAgICAgIGVs c2UNCiAgICAgICAgc3ViYXJyYXkNCiAgICAgIGVuZA0KICAgIGVuZA0KICAg IHNlbGYuY29uY2F0KGxpc3QuY29tcGFjdCB8fCBbXSkNCiAgZW5kDQplbmQN Cg0KDQojIENyZWF0ZSB0aGUgQyBjb2RlIGZvciBhICJjbGFzcyIuDQojICJj bGFzcyIgaXMgaW4gcXVvdGVzIGJlY2F1c2UgQyBkb2Vzbid0IGhhdmUgdGhl bS4gVHVybnMNCiMgb3V0IHRoZXkgYXJlIGEgcm95YWwgcGFpbiB0byBpbXBs ZW1lbnQgd2hlbiBwb2x5bW9ycGhpc20NCiMgaXMgZGVzaXJlZC4NCiMNCiMg VGhpcyBpcyBiZWNhdXNlIG9mIEMncyBzdGF0aWMgdHlwaW5nLiAgVGhlcmVm b3JlIHdlIG5lZWQNCiMgc29tZSBtZWFucyB0byBhbGxvdyBzdWJjbGFzc2Vz IHRvIGFjY2VzcyB0aGUgYmFzZSBjbGFzcw0KIyBzdHJ1Y3R1cmUgd2l0aG91 dCBpbmRpcmVjdGlvbi4gIEluZGlyZWN0aW9uIHdvdWxkIGJlIE9LLA0KIyBl eGNlcHQgdGhhdCBvbmUgY2Fubm90IHVzZSBhIHR5cGUgdmFyaWFibGUgKGhv bGRpbmcgYQ0KIyBzdHJpbmcgb3Igc29tZXRoaW5nKSB0byBkZXRlcm1pbmUg d2hpY2ggZWxlbWVudCBvZiBhDQojIHN0cnVjdCB0byBzZWxlY3QsIGJlY2F1 c2UgdGhlIHN0cnVjdC5lbGVtZW50IGlzIGNvZGUsIG5vdA0KIyBkYXRhLCBz byB3aXRob3V0IGFueSByZWZsZWN0aW9uIGZhY2lsaXRpZXMgQyBjYW4ndCBo b2xkDQojIHRoYXQgaW5mb3JtYXRpb24gaW4gYSB2YXJpYWJsZS4gTWF5YmUg SSBzaG91bGQgaGF2ZSBzYWlkDQojICJzdHVmZiB0aGUgc3BlZWQsIEknbGwg ZG8gdGhlIHdob2xlIHRoaW5nIGluIFJ1YnkiLiAgWWVzLA0KIyB0aGVyZSdz IEMrKywgYnV0IEkgaGF2ZSBlbm91Z2ggcHJvYmxlbXMgZ2V0dGluZyBGU1Yg dG8NCiMgd29yayB3aXRob3V0IGZpZ3VyaW5nIG91dCB3aGV0aGVyIG1ldGhv ZHMgc2hvdWxkIGJlDQojIHZpcnR1YWwsIGV0Yy4NCiMNCiMgVGhlIGNvbmNl cHQgb2Ygb3BhcXVlIHBvaW50ZXJzIChTZWUgV2lraXBlZGlhLCBldGMsIGJ1 dA0KIyBJIGZpcnN0IHNhdyB0aGlzIGF0Og0KIyBodHRwOi8vd3d3LnFueC5j b20vZGV2ZWxvcGVycy9hcnRpY2xlcy9hcnRpY2xlXzMwMl8yLmh0bWwNCiMg YW5kIHdpbGwgbmVlZCB0byBzZWUgYm9va3MgYWJvdXQgdGhpcykgbWF5IGhl bHANCmNsYXNzIENDbGFzc0NyZWF0b3INCiAgYXR0cl9hY2Nlc3NvciA6ZGVi dWdfZmxhZw0KDQogIA0KICAjIEhhdmUgYSBjZW50cmFsIHJlcG9zaXRvcnkg b2YgYXR0cmlidXRlcyBmb3IgZWFjaCBjbGFzcyBhbmQgc3ViY2xhc3MNCiAg QVRUUklCVVRFX0RCID0gImNjbGFzc2VzLnltbCINCiAgQEBhdHRyaWJ1dGVz ID0gWUFNTDo6U3RvcmUubmV3KEFUVFJJQlVURV9EQikNCg0KICAjIFBhc3Nl cyB0aGUgYXR0cmlidXRlcyBmb3IgI2FjbGFzcywgdG8gdGhlIGJsb2NrIHNv IHRoYXQNCiAgIyBvcGVyYXRpb25zIGNhbiBiZSBwZXJmb3JtZWQgb24gdGhl bSB3aXRoaW4gYSB0cmFuc2FjdGlvbi4NCiAgIyBSZXR1cm5zIG5pbCBzbyB0 aGF0IGF0dHJpYnV0ZXMgZG9uJ3QgZ2V0IG1vZGlmaWVkIG91dHNpZGUgYQ0K ICAjIHRyYW5zYWN0aW9uLiAgSWYgbm8gYWNsYXNzIGlzIHByb3ZpZGVkLCB5 aWVsZCBhbGwgYXR0cmlidXRlcw0KICAjIDxGSVhNRT5UaGlzIHNlZW1zIHRv IHdvcmssIGJ1dCAjYWNsYXNzIGlzIG5vdCBkZWZpbmVkPC9GSVhNRT4NCiAg Iy0tDQogICMgdHNvcnQ6IG5ldyBhdHRyaWJ1dGVzDQogICMrKw0KICBkZWYg YXR0cmlidXRlcygmYmxvY2spDQogICAgQEBhdHRyaWJ1dGVzLnRyYW5zYWN0 aW9uIGRvDQogICAgICBpZiBibG9ja19naXZlbj8NCiAgICAgICAgeWllbGQg QEBhdHRyaWJ1dGVzDQogICAgICBlbmQNCiAgICBlbmQNCiAgICByZXR1cm4g bmlsDQogIGVuZA0KDQoNCiAgIyBFYWNoIGNsYXNzIG11c3QgaGF2ZSBpdHMg b3duIGF0dHJpYnV0ZXMsIGJ1dCBtdXN0IA0KICAjIGFsc28gaW5oZXJpdCBz b21lLg0KICAjLS0NCiAgIyB0c29ydDogbmV3IHNldHVwX2F0dHJpYnV0ZXMN CiAgIysrDQogIGRlZiBzZXR1cF9hdHRyaWJ1dGVzKGF0dHJzKQ0KICAgICMg a2xhc3MgPSBzZWxmLmNsYXNzLnRvX3MNCiAgICBrbGFzcyA9IEBjbGFzc25h bWUNCiAgICBhdHRyaWJzID0gbmlsDQogICAgYXR0cmlidXRlcyB7fGF0dHwg YXR0W2tsYXNzXSB8fD0gW119DQogICAgIyByZXR1cm4gaWYgYXR0cnMubmls PyAjIFdoeT8gIEkgdGhpbmsgd2UgbmVlZCBpbmhlcml0YW5jZS4NCiAgICAj IEkgdGhpbmsgdGhpcyB3YXMgYWRkZWQgdG8gc3RvcCBhIGNyYXNoLCBidXQg aW5oZXJpdGFuY2UNCiAgICAjIGlzbid0IHdvcmtpbmcuDQogICAgdW5sZXNz IGF0dHJzLm5pbD8NCiAgICAgIGlmIGF0dHJzLmFsbD97IHxhdHR8IGF0dHJp YnV0ZXMgeyB8YXRyc3wgYXRyc1trbGFzc10uaW5jbHVkZT8oYXR0KX19DQog ICAgICAgICMgT2J2aW91c2x5IGFscmVhZHkgc2V0dXAuDQogICAgICAgIHJl dHVybg0KICAgICAgZW5kDQogICAgZW5kDQogICAgcHJpbnQgImJlZm9yZSBt ZXJnZSAiDQogICAgYXR0cmlidXRlcyB7fGF0dHwgcHJpbnQgYXR0W2tsYXNz XS5pbnNwZWN0fQ0KICAgIHB1dHMgIiB0byBtZXJnZSB3aXRoICN7YXR0cnMu aW5zcGVjdH0iDQogICAgaWYgc2VsZi5jbGFzcyAhPSBzZWxmLmJhc2VjbGFz cw0KICAgICAgYXR0cmlidXRlc3t8YXR0fCBhdHRba2xhc3NdLm1lcmdlKGF0 dHJzKX0gaWYgYXR0cnMNCiAgICAgIGF0dHJpYnV0ZXN7fGF0dHwgYXR0W2ts YXNzXS5tZXJnZSggYXR0W3NlbGYuY2xhc3Muc3VwZXJjbGFzcy50b19zXSl9 DQogICAgZWxzZQ0KICAgICAgYXR0cmlidXRlc3t8YXR0fCBhdHRba2xhc3Nd Lm1lcmdlKGF0dHJzKX0gaWYgYXR0cnMNCiAgICBlbmQNCiAgICBhdHRyaWJ1 dGVzIHt8YXR0fCBhdHRyaWJzID0gYXR0W2tsYXNzXX0NCiAgICBwcmludCAi YWZ0ZXIgbWVyZ2UgIg0KICAgIGF0dHJpYnV0ZXMge3xhdHR8IHB1dHMgYXR0 W2tsYXNzXS5pbnNwZWN0fQ0KICBlbmQNCg0KICAjIFNvbWV0aW1lcyB3ZSBu ZWVkIGRlY2xhcmF0aW9ucyB0byBleGlzdCBiZWZvcmUgdGhlDQogICMgY29u c3RydWN0b3IgY2FuIGJlIGNhbGxlZCwgYnV0IHdlIGRvbid0IG5lZWQgYSB3 aG9sZQ0KICAjIGNsYXNzLiAgVGhpcyBpcyBhIG1ldGhvZCB0byBwcm92aWRl IHRoYXQga2luZCBvZiBzZXR1cC4NCiAgZGVmIHNlbGYucHJlcmVxdWlzaXRl KGZpbGVuYW1lLCBzdHJpbmcpDQogICAgb3BlbihmaWxlbmFtZSwgInciKSBk byB8ZnwNCiAgICAgIGYucHV0cyBzdHJpbmcNCiAgICBlbmQNCiAgZW5kDQoN CiAgIyBHZXQgdGhlIGJhc2UgImNsYXNzIiBzbyB3ZSBjYW4gZ2V0IHRoZSBz dHJ1Y3QgdG8gYWNjZXNzLg0KICBkZWYgYmFzZWNsYXNzKCkNCiAgICByZXR1 cm4gc2VsZi5jbGFzcy5iYXNlY2xhc3MoKQ0KICBlbmQNCg0KICAjIFRyeSB0 byBnZXQgdGhlIGNsYXNzIGF0IHRoZSByb290IG9mIHRoZSB0cmVlLg0KICBk ZWYgc2VsZi5iYXNlY2xhc3MoKQ0KICAgIHJlc3VsdCA9IG5pbA0KICAgIGdl bmVyYXRpb25zID0gYW5jZXN0b3JzLm1hcHt8eHwgeC50b19zfQ0KICAgIHJl c3VsdCA9IGdlbmVyYXRpb25zW2dlbmVyYXRpb25zLmluZGV4KCJDQ2xhc3ND cmVhdG9yIikgLTFdDQogICAgcmV0dXJuIEtlcm5lbC5jb25zdF9nZXQocmVz dWx0KQ0KICBlbmQNCg0KICAjIFNldHVwIGNsYXNzICNjbGFzc25hbWUsIHdp dGggdGhlIGNvbW1lbnQgI3B1cnBvc2UsDQogICMgZGVwZW5kaW5nIG9uICNk ZXBlbmRlbmNpZXMsIGFuZCBhdHRyaWJ1dGVzIHBhc3NlZCBpbiB0aGUNCiAg IyBoYXNoICNhdHRyaWJzLiAgSWYgYSBibG9jayBpcyBnaXZlbiBpdCBpcyBw YXNzZWQgdG8NCiAgIyBpbnN0YW5jZV9ldmFsLCBzbyB0aGF0IHRoZSBtZXRo b2RzIGNhbiBiZSBjcmVhdGVkIGluIHRoZQ0KICAjIGNvcnJlY3QgY29udGV4 dC4NCiAgZGVmIGluaXRpYWxpemUoY2xhc3NuYW1lLCBiYXNlX2NsYXNzX25h bWUsICBwdXJwb3NlLA0KICAgICAgICAgICAgICAgICBkZXBlbmRlbmNpZXMs IGhlYWRlcnMsIGF0dHJpYnMsICZibG9jaykNCiAgICBAZGVidWdfZmxhZyA9 IGZhbHNlICAjIGlmIHRydWUgd2UgZ2V0IGRlYnVnZ2luZyBvdXRwdXQNCiAg ICBAY2xhc3NuYW1lID0gY2xhc3NuYW1lDQogICAgQGNsYXNzZG93biA9IEBj bGFzc25hbWUuZG93bmNhc2UNCiAgICBAY2ZpbGVuYW1lID0gQGNsYXNzZG93 biArICIuYyINCiAgICBAaGZpbGVuYW1lID0gQGNsYXNzZG93biArICIuaCIN CiAgICBAaGNvbnN0YW50ID0gKEBjbGFzc25hbWUrJ19IJykudXBjYXNlDQog ICAgQGJjbGFzc25hbWUgPSBiYXNlX2NsYXNzX25hbWUNCiAgICBAYmNsYXNz ZG93biA9IEBiY2xhc3NuYW1lLmRvd25jYXNlDQogICAgQHB1cnBvc2UgPSAl UaMvKlxuI3twdXJwb3NlLmdzdWIoL14vbSwgIiAqICIpfVxuICovozsNCiAg ICByYWlzZSAiV2UgbmVlZCBhIGNsYXNzbmFtZSBiZWdpbm5pbmcgd2l0aCBh biB1cHBlciBjYXNlIGNoYXJhY3RlciIgaWYgQGNsYXNzZG93biA9PSBAY2xh c3NuYW1lOw0KICAgIEBkZXBlbmRlbmNpZXMgPSBkZXBlbmRlbmNpZXMNCiAg ICBAaGVhZGVycyA9IGhlYWRlcnMNCiAgICBzZXR1cF9hdHRyaWJ1dGVzKGF0 dHJpYnMpDQogICAgcHV0cyAiI3tzZWxmLmNsYXNzfSBpcyAhPSAje2Jhc2Vj bGFzc30/Ig0KICAgIHB1dHMgInNlbGYgaXMgI3tzZWxmfSwgc2VsZi5jbGFz cyBpcyAje3NlbGYuY2xhc3N9Ig0KICAgIGF0dHJpYnMgPSBuaWwNCiAgICBh dHRyaWJ1dGVzIGRvIHxhfA0KICAgICAgYXR0cmlicyA9IGFbc2VsZi5jbGFz cy50b19zXS5pbnNwZWN0DQogICAgZW5kDQogICAgcHV0cyAiIGF0dHJpYnV0 ZXMgaXMgI3thdHRyaWJzfSIgaWYgdHJ1ZSB8fCBAZGVidWdfZmxhZw0KDQog ICAgb3BlbihAaGZpbGVuYW1lLCAidyIpIGRvIHxoZnB8DQogICAgICBAaGZw ID0gaGZwDQogICAgICBAaGZwLnB1dHMgPDwtQ1NUUklORw0KI2lmbmRlZiAj e0BoY29uc3RhbnR9DQojZGVmaW5lICN7QGhjb25zdGFudH0gMQ0KI2luY2x1 ZGUgImZzdl9jb21tb24uaCINCiAgICAgIENTVFJJTkcNCiAgICAgIG9wZW4o QGNmaWxlbmFtZSwgInciKSBkbyB8Y2ZwfA0KICAgICAgICBAY2ZwID0gY2Zw DQogICAgICAgIGluc3RhbmNlX2V2YWwgeyBjcmVhdGVfY2xhc3M7IGNyZWF0 ZV9hY2Nlc3NvcnM7fQ0KICAgICAgICBpbnN0YW5jZV9ldmFsKCZibG9jaykg aWYgYmxvY2tfZ2l2ZW4/DQogICAgICBlbmQNCiAgICAgIEBoZnAucHV0cyA8 PC1DU1RSSU5HDQogICNlbmRpZg0KICAgICAgQ1NUUklORw0KICAgIGVuZA0K ICBlbmQNCg0KICBkZWYgYmFzZWNsYXNzX2NyZWF0b3IoKQ0KICAgICMgdGhp cyBpcyBub3QgdGhlIGJhc2UgY2xhc3MsIHNvIGNhbGwgaXRzIGNvbnN0cnVj dHVyLg0KICAgICMgPEZJWE1FPlRoaXMgbWVhbnMgd2UgZG9uJ3QgdGhlIG90 aGVyIHN0cnVjdHM8L0ZJWE1FPg0KICAgIHB1dHMgIiN7c2VsZi5iYXNlY2xh c3N9ICE9ICN7c2VsZi5jbGFzc30iDQogICAgQGNmcC5wdXRzIDw8LUNTVFJJ TkcNCiN7QGNsYXNzZG93bn0gPSAje0BiY2xhc3Nkb3dufV9jcmVhdGUoDQog ICAgQ1NUUklORw0KICAgIGNvbW1hID0gZmFsc2UNCiAgICBhdHRyaWJ1dGVz IGRvIHxhdHR8DQogICAgICBhdHRbc2VsZi5jbGFzcy50b19zXS5lYWNoIGRv IHx0cmlwbGV8DQogICAgICAgIG5hbWUsIHR5cGUsIGluY29uc3RydWN0b3Ig PSB0cmlwbGUNCiAgICAgICAgdW5sZXNzIGluY29uc3RydWN0b3INCiAgICAg ICAgICBuZXh0DQogICAgICAgIGVuZA0KICAgICAgICBpZiBjb21tYQ0KICAg ICAgICAgIEBjZnAucHJpbnQgIixcbiINCiAgICAgICAgZW5kDQogICAgICAg IGNvbW1hID0gdHJ1ZQ0KICAgICAgICBAY2ZwLnByaW50ICIgICN7bmFtZX0i DQogICAgICBlbmQNCiAgICBlbmQNCiAgICBAY2ZwLnB1dHMgIik7Ig0KICBl bmQNCg0KICAjIENyZWF0ZSB0aGUgQyBpbmZyYXN0cnVjdHVyZSBmb3IgdGhl IGNsYXNzLg0KICAjIFRoaXMgaW52b2x2ZXMgYWRkaW5nIHRoZSAjaW5jbHVk ZSBzdGF0ZW1lbnRzIHRvIHRoZSAuaCBmaWxlLA0KICAjIGNyZWF0aW5nIHRo ZSBmdW5jdGlvbiB0byBjb25zdHJ1Y3QgaXQsIGluY2x1ZGluZyBhbiBhcHBy b3ByaWF0ZQ0KICAjIG1hbGxvYyBjYWxsLiANCiAgZGVmIGNyZWF0ZV9jbGFz cygpDQogICAgJHN0ZGVyci5wdXRzICJwcm9jZXNzaW5nIGhlYWRlcnMgZm9y ICN7QGNsYXNzbmFtZX06Ig0KICAgIEBoZWFkZXJzLmVhY2ggZG8gfG5hbWV8 DQogICAgICAkc3RkZXJyLnB1dHMgIiAgI3tuYW1lfS4uLiINCiAgICAgIEBo ZnAucHV0cyA8PC1DU1RSSU5HDQojaW5jbHVkZSA8I3tuYW1lLmRvd25jYXNl fS5oPg0KICAgICAgQ1NUUklORw0KICAgIGVuZA0KICAgICRzdGRlcnIucHV0 cyAiRG9uZS4iDQogICAgJHN0ZGVyci5wdXRzICJwcm9jZXNzaW5nIGRlcGVu ZGVuY2llcyBmb3IgI3tAY2xhc3NuYW1lfToiDQogICAgQGRlcGVuZGVuY2ll cy5lYWNoIGRvIHxuYW1lfA0KICAgICAgJHN0ZGVyci5wdXRzICIgICN7bmFt ZX0uLi4iDQogICAgICBAaGZwLnB1dHMgPDwtQ1NUUklORw0KI2luY2x1ZGUg IiN7bmFtZS5kb3duY2FzZX0uaCINCiAgICAgIENTVFJJTkcNCiAgICBlbmQN CiAgICAkc3RkZXJyLnB1dHMgIkRvbmUuIg0KICAgIEBjZnAucHV0cyA8PC1D U1RSSU5HDQojaW5jbHVkZSAiI3tAaGZpbGVuYW1lfSINCiAgICAgIENTVFJJ TkcNCg0KICAgIGNyZWF0ZV9zdHJ1Y3RfZGVmDQoNCiAgICAjIENyZWF0ZSB0 aGUgY29uc3RydWN0b3INCiAgICBzdHIgPSA8PC1DU1RSSU5HDQovKiBDb25z dHJ1Y3RvciBmb3IgY2xhc3MgI3tAY2xhc3NuYW1lfSAqLw0KI3tiYXNlY2xh c3N9ICN7QGNsYXNzZG93bn1fY3JlYXRlKA0KICAgIENTVFJJTkcNCiAgICBh dHRyaWJzID0gW10NCiAgICBhdHRyaWJ1dGVzIGRvIHxhdHR8DQogICAgICBh dHRbc2VsZi5jbGFzcy50b19zXS5lYWNoIGRvIHx0cmlwbGV8DQogICAgICAg IG5hbWUsIHR5cGUsIGluY29uc3RydWN0b3IgPSB0cmlwbGUNCiAgICAgICAg dHlwZSA9IENUeXBlLm5ldyh0eXBlKQ0KICAgICAgICBhdHRyaWJzIDw8ICgi I3t0eXBlfSN7bmFtZX0iLmluZGVudCkgaWYgaW5jb25zdHJ1Y3Rvcg0KICAg ICAgZW5kDQogICAgZW5kDQogICAgbGlzdCA9IGF0dHJpYnMuam9pbigiLFxu Iik7DQogICAgc3RyICs9ICIje2xpc3R9KSINCiAgICBmc2lnIHN0cg0KICAg IEBjZnAucHV0cyA8PC1DU1RSSU5HDQp7DQogICN7YmFzZWNsYXNzfSAje0Bj bGFzc2Rvd259Ow0KICAgIENTVFJJTkcNCiAgICBpZiBzZWxmLmJhc2VjbGFz cyA9PSBzZWxmLmNsYXNzDQogICAgICAjIFRoaXMgaXMgdGhlIGJhc2VjbGFz cywgc28gd2Uga25vdyBob3cgYmlnIGl0IGlzLA0KICAgICAgIyBhbmQgY2Fu IHRoZXJlZm9yZSBjYWxsIG1hbGxvYyBkaXJlY3RseSB3aXRoIGEgc2l6ZQ0K ICAgICAgIyBwYXJhbWV0ZXIuICANCiAgICAgIHB1dHMgIiN7c2VsZi5iYXNl Y2xhc3N9ID09ICN7c2VsZi5jbGFzc30iDQogICAgICBAY2ZwLnB1dHMgcG1h bGxvY19ibG9jayhAY2xhc3Nkb3duLCAiI3tiYXNlY2xhc3N9IikNCiAgICAg IGF0dHJpYnV0ZXMgZG8gfGF0dHJpYnN8DQogICAgICAgIGF0dHJpYnNbc2Vs Zi5jbGFzcy50b19zXS5lYWNoIGRvIHx0cmlwbGV8DQogICAgICAgICAgbmFt ZSx0eXBlLGluY29uc3RydWN0b3IgPSB0cmlwbGUNCiAgICAgICAgICBAY2Zw LnB1dHMgPDwtQ1NUUklORyBpZiBpbmNvbnN0cnVjdG9yDQogICAgI3tAY2xh c3Nkb3dufS0+I3tuYW1lfSA9ICN7bmFtZX07DQogICAgICAgICAgQ1NUUklO Rw0KICAgICAgICBlbmQNCiAgICAgIGVuZA0KICAgIGVsc2UNCiAgICAgIGJh c2VjbGFzc19jcmVhdG9yKCkNCiAgICBlbmQNCiAgICBAY2ZwLnB1dHMgPDwt Q1NUUklORw0KICByZXR1cm4oI3tAY2xhc3Nkb3dufSk7XG59DQogICAgQ1NU UklORw0KICAgIHN0ciA9IDw8LUNTVFJJTkcNCg0KLyogRW1wdHkgQ29uc3Ry dWN0b3IgZm9yIGNsYXNzICN7QGNsYXNzbmFtZX0gKi8NCiN7YmFzZWNsYXNz fSAje0BjbGFzc2Rvd259X2NyZWF0ZV9lbXB0eSgpDQogICAgQ1NUUklORw0K ICAgIGZzaWcgc3RyDQogICAgQGNmcC5wdXRzIDw8LUNTVFJJTkcNCnsNCiAg I3tiYXNlY2xhc3N9ICN7QGNsYXNzZG93bn07DQogICAgQ1NUUklORw0KICAg IGlmIHNlbGYuYmFzZWNsYXNzID09IHNlbGYuY2xhc3MNCiAgICAgIEBjZnAu cHV0cyBwbWFsbG9jX2Jsb2NrKEBjbGFzc2Rvd24sICIje2Jhc2VjbGFzc30i KQ0KICAgIGVsc2UNCiAgICAgIEBjZnAucHV0cyAiICAje0BiY2xhc3Nkb3du fV9jcmVhdGVfZW1wdHkoKTsiDQogICAgZW5kDQogICAgQGNmcC5wdXRzIDw8 LUNTVFJJTkcNCiAgcmV0dXJuKCN7QGNsYXNzZG93bn0pOw0KfQ0KDQogICAg Q1NUUklORw0KICAgIGhjDQogIGVuZA0KDQogICMgQ3JlYXRlIHRoZSBhY2Nl c3NvcnMuICBXZSBtYXkgbm90IHdpc2ggdG8gdXNlIHRoZW0sIGJlY2F1c2UN CiAgIyBnZW5lcmFsbHkgb25lIGRvZXNuJ3QgZmlkZGxlIHdpdGggdGhlIGlu dGVybmFscyBvZiBhbiBvYmplY3QsIA0KICAjIGJ1dCBpdCBpcyBpcyBzaW1w bGVyIHRvIGNyZWF0ZSB0aGVtIGFuZCBub3QgdXNlIHRoZW0gdGhhbiANCiAg IyBmaWRkbGUgYWJvdXQgd29ya2luZyBvdXQgd2hpY2ggb25lcyB3ZSB3YW50 IHRvIGhhdmUgYWNjZXNzIHRvLA0KICAjIGluIHdoYXQgd2F5LCBldGMuICBJ J20gd3JpdGluZyB0aGlzIGNvZGUgZm9yIG15IG93biB1c2UsIHNvDQogICMg aG9wZWZ1bGx5IEkgY2FuIHRydXN0IG15IG9sZGVyIHNlbGYgdG8gYmUgYSBs aXR0bGUgd2lzZXIuDQogICMgV2UnbGwgdGFrZSB0aGUgcGhpbG9zb3BoaWNh bCByYW50IGFib3V0IEh1Z2htYW4gc3R1cGlkaXR5IGFzIHJlYWQuDQogIGRl ZiBjcmVhdGVfYWNjZXNzb3JzDQogICAgaGMgDQogICAgcHV0cyAiYmFzZWNs YXNzIGlzICN7YmFzZWNsYXNzfSBpbiBjcmVhdGVfYWNjZXNzb3JzIiBpZiBA ZGVidWdfZmxhZw0KICAgIHB1dHMgInNlbGYgaXMgI3tzZWxmfSIgaWYgQGRl YnVnX2ZsYWcNCiAgICBhdHRyaWJ1dGVzIGRvIHxhdHRyaWJzfA0KICAgICAg YXR0cmlic1tzZWxmLmNsYXNzLnRvX3NdLnNvcnRfYnl7fGF8IFthWzFdLGFb MF1dfS5lYWNoIGRvIHx0cmlwbGV8DQogICAgICAgIG5hbWUsIHR5cGUsIGlu Y29uc3RydWN0b3IgPSB0cmlwbGUNCiAgICAgICAgdHlwZSA9IENUeXBlLm5l dyh0eXBlKQ0KICAgICAgICBzdHIgPSA8PC1DU1RSSU5HDQp2b2lkICN7QGNs YXNzZG93bn1fc2V0XyN7bmFtZX0oI3tAYmNsYXNzbmFtZX0gc2VsZiwgI3t0 eXBlfSN7bmFtZX0pDQogICAgICAgIENTVFJJTkcNCiAgICAgICAgQGhmcC5w dXRzICIje3N0ci5jaG9tcH07Ig0KICAgICAgICBAY2ZwLnB1dHMgIiN7c3Ry LmNob21wfSINCiAgICAgICAgaWYgc2VsZi5iYXNlY2xhc3MgPT0gc2VsZi5j bGFzcw0KICAgICAgICAjIFdlIGNhbiBhY2Nlc3Mgb3VyIG93biBtZW1iZXJz Lg0KICAgICAgICAgIEBjZnAucHV0cyA8PC1DU1RSSU5HDQp7DQogIHNlbGYt PiN7bmFtZX0gPSAje25hbWV9Ow0KfQ0KDQogICAgICAgICAgQ1NUUklORw0K ICAgICAgICBlbHNlDQogICAgICAgICMgUGFyZW50IGlzIGFuIG9wYXF1ZSB0 eXBlLg0KICAgICAgICAgIEBjZnAucHV0cyA8PC1DU1RSSU5HDQp7DQogICN7 QGJjbGFzc2Rvd259X3NldF8je25hbWV9KHNlbGYsICN7bmFtZX0pOw0KfQ0K DQogICAgICAgICAgQ1NUUklORw0KICAgICAgICBlbmQNCiAgICAgICAgc3Ry ID0gPDwtQ1NUUklORw0KI3t0eXBlfSN7QGNsYXNzZG93bn1fZ2V0XyN7bmFt ZX0oI3tAYmNsYXNzbmFtZX0gc2VsZikNCiAgICAgICAgQ1NUUklORw0KICAg ICAgICBAaGZwLnB1dHMgIiN7c3RyLmNob21wfTsiDQogICAgICAgIEBjZnAu cHV0cyAiI3tzdHIuY2hvbXB9Ig0KICAgICAgICBpZiBzZWxmLmJhc2VjbGFz cyA9PSBzZWxmLmNsYXNzDQogICAgICAgICMgV2UgY2FuIGFjY2VzcyBvdXIg b3duIG1lbWJlcnMuDQogICAgICAgICAgQGNmcC5wdXRzIDw8LUNTVFJJTkcN CnsNCiAgcmV0dXJuKHNlbGYtPiN7bmFtZX0pOw0KfQ0KDQogICAgICAgICAg Q1NUUklORw0KICAgICAgICBlbHNlDQogICAgICAgICMgUGFyZW50IGlzIGFu IG9wYXF1ZSB0eXBlLg0KICAgICAgICAgIEBjZnAucHV0cyA8PC1DU1RSSU5H DQp7DQogIHJldHVybigje0BiY2xhc3Nkb3dufV9nZXRfI3tuYW1lfShzZWxm KSk7DQp9DQoNCiAgICAgICAgICBDU1RSSU5HDQogICAgICAgIGVuZA0KICAg ICAgICBAaGZwLnB1dHMgDQogICAgICBlbmQNCiAgICBlbmQNCiAgICBoYw0K ICBlbmQNCg0KICAjIGZzaWcoKSBwcm92aWRlcyBhIGZ1bmN0aW9uIHNpZ25h dHVyZSwgaW50byB0aGUgaGVhZGVyIGZpbGUNCiAgIyBhcyBhIHByb3RvdHlw ZSAodGVybWluYXRlZCB3aXRoIGEgJzsnKSBhbmQgaW50byAgdGhlIGNvZGUN CiAgIyBzbyB0aGF0IHRoZSBmdW5jdGlvbiBib2R5IHdpbGwgZm9sbG93LCBp LmUuLCB3aXRob3V0IHRoZSAnOycuDQogIGRlZiBmc2lnKHN0cikNCiAgICBA aGZwLnB1dHMgIiN7c3RyLmNob21wfTsiDQogICAgQGNmcC5wdXRzICIje3N0 cn0iDQogIGVuZA0KDQogICMgVG8gcmVkdWNlIHJlcGV0aXRpb24sIGhjIHB1 dHMgaXRzIGFyZ3VtZW50IG91dCB0byBib3RoIHRoZQ0KICAjIGhlYWRlciBh bmQgdGhlIEMgZmlsZS4NCiAgZGVmIGhjKCphcmdzKQ0KICAgIEBoZnAucHV0 cygqYXJncykNCiAgICBAY2ZwLnB1dHMoKmFyZ3MpDQogIGVuZA0KDQoNCiAg IyBDcmVhdGUgc3RydWN0dXJlIGRlZmluaXRpb24uDQogICMgQWxzbyB3ZSBu ZWVkIGEgc3RydWN0dXJlIHdpdGggYSB1bmlvbiBpbiBpdCBmb3IgcG9seW1v cnBoaXNtDQogICMgKFdlbGwsIHBvc3NpYmx5IG5vdC4pDQogIGRlZiBjcmVh dGVfc3RydWN0X2RlZg0KICAgIHJldHVybiBpZiBhdHRyaWJ1dGVze3xhdHRy c3wgYXR0cnNbc2VsZi5jbGFzcy50b19zXS5lbXB0eT99DQogICAgQGhmcC5w dXRzDQogICAgQGhmcC5wdXRzIEBwdXJwb3NlDQoNCiAgICBAY2ZwLnB1dHMg QHB1cnBvc2UNCiAgICBAY2ZwLnB1dHMgJVEoc3RydWN0ICN7QGNsYXNzbmFt ZX1fc3RydWN0IHspDQogICAgIyAoc2VsZi5jbGFzcykuDQogICAgYXR0cmli dXRlcyBkbyB8YXR0cmlic3wNCiAgICAgIGF0dHJpYnNbc2VsZi5jbGFzcy50 b19zXS5zb3J0X2J5e3xhfCBbYVsxXSxhWzBdXX0uZWFjaCBkbyB8dHJpcGxl fA0KICAgICAgICByYWlzZSAiI3tAY2xhc3NuYW1lfSA6ICN7dHJpcGxlfSBp bmNsdWRlcyBuaWwiIGlmIHRyaXBsZS5pbmNsdWRlPyhuaWwpDQogICAgICAg IGFfbmFtZSwgYV90eXBlLCBpbmNvbnN0cnVjdHVyID0gdHJpcGxlDQogICAg ICAgIGJlZ2luDQogICAgICAgIGNfdHlwZSA9IENUeXBlLm5ldyhhX3R5cGUp DQogICAgICAgIHJlc2N1ZQ0KICAgICAgICAgICRzdGRlcnIucHV0cyB0cmlw bGUuaW5zcGVjdA0KICAgICAgICAgIHJhaXNlDQogICAgICAgIGVuZA0KICAg ICAgICBpZiBjX3R5cGUgPX4gL1wqLyAgICMgSXQgaXMgYSBwb2ludGVyIA0K ICAgICAgICAgIEBjZnAucHV0cyAiICAje2NfdHlwZX0je2FfbmFtZX0gPSBO VUxMOyAiDQogICAgICAgICAgQGNmcC5wdXRzICIgICAgLy8gRG9uJ3Qgd2Fu dCB0byBwb2ludCB0byByYW5kb20gYWRkcnNzIg0KICAgICAgICBlbHNlDQog ICAgICAgICAgQGNmcC5wdXRzICIgICN7Y190eXBlfSN7YV9uYW1lfTsgIg0K ICAgICAgICBlbmQNCiAgICAgIGVuZA0KICAgIGVuZA0KICAgIEBoZnAucHV0 cyA8PC1DU1RSSU5HDQoNCi8qIFRoaXMgZ2V0cyBwYXNzZWQgYXJvdW5kIGFz IGFuIG9wYXF1ZSBwb2ludGVyICovDQp0eXBlZGVmIHN0cnVjdCAje0BjbGFz c25hbWV9X3N0cnVjdCAqI3tAY2xhc3NuYW1lfTsNCg0KICAgIENTVFJJTkcN CiAgICBAY2ZwLnB1dHMgPDwtQ1NUUklORw0KfTsNCiAgICBDU1RSSU5HDQoN Cg0KICBlbmQNCg0KICAjIENsYXNzIG1ldGhvZCB0byBjb25zdHJ1Y3QgbWFs bG9jIGNhbGxzIGNvcnJlY3RseSBhbmQNCiAgIyBjb25jaXNlbHkuDQogIGRl ZiBzZWxmLm1hbGxvY19ibG9jayhwdHIsIHR5cGUsIG9wdGlvbnMgPSB7fSAp DQogICAgb3B0cyA9IHs6aG93bWFueSA9PiAxLCA6aW5kZW50bGV2ZWwgPT4g MSwgOmNhc3QgPT4gdHJ1ZX0NCiAgICBvcHRzLm1lcmdlIShvcHRpb25zKQ0K ICAgIGNhc3QgPSBvcHRzWzpjYXN0XT8iKCN7dHlwZX0qKSI6IiI7DQogICAg aW5kZW50ID0gb3B0c1s6aW5kZW50bGV2ZWxdICogSU5ERU5UDQogICAgc3Ry ICA9IDw8LUNTVFJJTkcgDQoje3B0cn0gPSAje2Nhc3R9bWFsbG9jKHNpemVv Zigje3R5cGV9KSAjeygob3B0c1s6aG93bWFueV0gPT0gMSkgPyAiIiA6ICIg KiAje29wdHNbOmhvd21hbnldfSIpfSk7DQppZiAoI3twdHJ9ID09IE5VTEwp DQp7DQojeyIgIipJTkRFTlR9ZnByaW50ZihzdGRlcnIsICJVbmFibGUgdG8g YWxsb2NhdGUgc3BhY2UgZm9yICN7b3B0c1s6aG93bWFueV19ICN7dHlwZX0j eygob3B0c1s6aG93bWFueV0gPT0gMSkgPyAnJyA6ICdzJyl9Iik7DQojeyIg IipJTkRFTlR9ZXhpdCgtMSk7DQp9Ow0KICAgIENTVFJJTkcNCiAgICBzdHIu aW5kZW50IQ0KICAgIHJldHVybiBzdHINCiAgZW5kDQoNCiAgIyBDbGFzcyBt ZXRob2QgdG8gY29uc3RydWN0IG1hbGxvYyBjYWxscyBjb3JyZWN0bHkgZm9y DQogICMgcG9pbnRlcnMgdG8gdGhlIGNsYXNzIA0KICBkZWYgc2VsZi5wbWFs bG9jX2Jsb2NrKHB0ciwgdHlwZSwgb3B0aW9ucyA9IHt9ICkNCiAgICBvcHRz ID0gezpob3dtYW55ID0+IDEsIDppbmRlbnRsZXZlbCA9PiAxLCA6Y2FzdCA9 PiB0cnVlfQ0KICAgIG9wdHMubWVyZ2UhKG9wdGlvbnMpDQogICAgY2FzdCA9 IG9wdHNbOmNhc3RdPyIoI3t0eXBlfSkiOiIiOw0KICAgIGluZGVudCA9IG9w dHNbOmluZGVudGxldmVsXSAqIElOREVOVA0KICAgIHN0ciAgPSA8PC1DU1RS SU5HIA0KI3twdHJ9ID0gI3tjYXN0fW1hbGxvYyhzaXplb2Yoc3RydWN0ICN7 dHlwZX1fc3RydWN0KSAjeygob3B0c1s6aG93bWFueV0gPT0gMSkgPyAiIiA6 ICIgKiAje29wdHNbOmhvd21hbnldfSIpfSk7DQppZiAoI3twdHJ9ID09IE5V TEwpDQp7DQojeyIgIipJTkRFTlR9ZnByaW50ZihzdGRlcnIsICJVbmFibGUg dG8gYWxsb2NhdGUgc3BhY2UgZm9yICN7b3B0c1s6aG93bWFueV19ICN7dHlw ZX0jeygob3B0c1s6aG93bWFueV0gPT0gMSkgPyAnJyA6ICdzJyl9Iik7DQoj eyIgIipJTkRFTlR9ZXhpdCgtMSk7DQp9Ow0KICAgIENTVFJJTkcNCiAgICBz dHIuaW5kZW50IQ0KICAgIHJldHVybiBzdHINCiAgZW5kDQoNCiAgIyBtZXRo b2QgdG8gY29uc3RydWN0IG1hbGxvYyBjYWxscyBjb3JyZWN0bHkgYW5kIGNv bmNpc2VseS4NCiAgZGVmIG1hbGxvY19ibG9jayhwdHIsIHR5cGUsIG9wdGlv bnMgPSB7Omhvd21hbnkgPT4gMSwgOmluZGVudGxldmVsID0+IDEsDQogICAg ICAgICAgICAgICAgICAgICAgOmNhc3QgPT4gdHJ1ZX0pDQogICAgc2VsZi5j bGFzcy5tYWxsb2NfYmxvY2socHRyLCB0eXBlLCBvcHRpb25zKQ0KICBlbmQN Cg0KDQogICMgbWV0aG9kIHRvIGNvbnN0cnVjdCBtYWxsb2MgY2FsbHMgY29y cmVjdGx5IGZvciBwb2ludGVycw0KICBkZWYgcG1hbGxvY19ibG9jayhwdHIs IHR5cGUsIG9wdGlvbnMgPSB7Omhvd21hbnkgPT4gMSwgOmluZGVudGxldmVs ID0+IDEsDQogICAgICAgICAgICAgICAgICAgICAgOmNhc3QgPT4gdHJ1ZX0p DQogICAgc2VsZi5jbGFzcy5wbWFsbG9jX2Jsb2NrKHB0ciwgdHlwZSwgb3B0 aW9ucykNCiAgZW5kDQoNCiAgIyBHaXZlbiB0aGVzZSB0aHJlZSBzdHJpbmdz LCBjcmVhdGUgdGhlIG1ldGhvZCB3aXRoIGRlZmluaXRpb25zDQogICMgaW4g dGhlIGFwcHJvcHJpYXRlIGZpbGVzLiAgQ2FsbHMgdG8gdGhpcyBtZXRob2Qg aXMgd2hlcmUgYSBsb3QNCiAgIyBvZiB0aGUgcXVvdGluZyBjb21lcyBpbnRv IHBsYXkuDQogICMgV2UgcHV0IHRoZSBjb21tZW50cyBpbnRvIHRoZSBoZWFk ZXIgZmlsZSBhcyB3ZWxsIHNvIHRoZSBoZWFkZXJzDQogICMgYmVjb21lIEFQ SSBEb2NzLg0KICBkZWYgY3JlYXRlX21ldGhvZChjb21tZW50LCBzaWduYXR1 cmUsIGJvZHkpDQogICAgQGNmcC5wdXRzDQogICAgaGMgY29tbWVudCAgDQog ICAgZnNpZyhzaWduYXR1cmUpDQogICAgQGNmcC5wdXRzIGJvZHkNCiAgICBo Yw0KICBlbmQNCmVuZA0KDQo= ---476953799-42686698-1225363294=:29430-- ---476953799-42686698-1225363294=:29430--