------ art_28_28939322.1125353190237 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable Content-Disposition: inline Here comes my solution. It relies on the priority queue posted in another mail and is really fast. It includes an intelligent neighbour finder and features the A* algorithm in "starring" role. regards, Brian -- http://ruby.brian-schroeder.de/ Stringed instrument chords: http://chordlist.brian-schroeder.de/ ------ art_28_28939322.1125353190237 Content-Type: application/x-ruby; name="wordchain.rb" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="wordchain.rb" IyEvdXNyL2Jpbi9ydWJ5IC13IC1LdQoKIyBCdWlsZCBhIGNoYWluIG9mIHdvcmRzLCB3aGVyZSBl YWNoIG5leHQgd29yZCBpbiB0aGUgY2hhaW4gY2hhbmdlcyBvbmx5IG9uZSBsZXR0ZXIgYWdhaW5z dCB0aGUgZm9ybWVyLgojCiMgV2h5IGlzIG15IHNvbHV0aW9uIGZhc3Q6CiMgMSkgSSB1c2UgdGhl IEEqIGFsZ29yaXRobQojIDIpIEkgdXNlIGEgcmVhbCBwcmlvcml0eSBxdWV1ZSBpbXBsZW1lbnRl ZCBpbiBDIHdpdGg6CiMgICAgICBhbW9ydGl6ZWQgTygxKSBpbnNlcnQsIGRlY3JlYXNlX3ByaW9y aXR5CiMgICAgICBhbW9ydGl6ZWQgTyhsb2cgbikgZGVsZXRlX21pbiAgCiMKIyBJIGNhbGN1bGF0 ZSB0aGUgbmVpZ2hib3VycyBsYXppbHkgd2hlbiBuZWVkZWQuCiMgSSB1c2UgYSBuaWZ0eSBwYXJ0 aXRpb25pbmcgb2YgdGhlIHdvcmRzIHRoYXQgbWFrZXMgbmVpZ2hib3VyIGNhbGN1bGF0aW9uCiMg YSB1bmlvbiBvZiBvbmx5IHdvcmQtbGVuZ3RoIHNldC4KCiMgVE9ETzogUmVmYWt0b3IgU2VhcmNo IEFsZ29yaXRobXMgaW50byBvd24gdW5pdApyZXF1aXJlICdwcmlvcml0eV9xdWV1ZScKcmVxdWly ZSAnc2V0JwoKIyMjIFRIRSBXT1JLRVIgIyMjCgojIFRoZSB3b3JkLWdyYXBoCmNsYXNzIFdvcmRO ZXQKCiAgIyBMb2FkIHRoZSB3b3JkcyBwYXJ0aXRpb25lZCBieSBsZW5ndGguIE5laWdoYm91ciBj YWxjdWxhdGlvbiBpcyBkb25lIG9uIGRlbWFuZC4KICBkZWYgaW5pdGlhbGl6ZSgqd29yZHMpCiAg ICBAd29yZHNfYnlfbGVuZ3RoID0gSGFzaC5uZXcgeyB8IGgsIGsgfCBoW2tdID0gU2V0Lm5ldyB9 CiAgICBAc2ltaWxhcl93b3JkcyA9IEhhc2gubmV3IHsgfCBoLCBrIHwgaFtrXSA9IFNldC5uZXcg fQogICAgQHNpbWlsYXJfd29yZHNfYnVpbGQgPSBIYXNoLm5ldwogICAgQG5laWdoYm91cnMgPSBI YXNoLm5ldwogICAgd29yZHMuZmxhdHRlbi5lYWNoIGRvIHwgd29yZCB8ICAgICAgCiAgICAgIG5l eHQgaWYgL1stJz8hK1wvXy46LF0vID1+IHdvcmQKICAgICAgQHdvcmRzX2J5X2xlbmd0aFt3b3Jk Lmxlbmd0aF0gPDwgd29yZAogICAgZW5kCiAgZW5kCgogICMgTG9hZCBkaWN0aW9uYXJ5IGludG8g d29yZGdyYXBoCiAgZGVmIHNlbGYubG9hZChmaWxlKQogICAgd29yZHMgPSBGaWxlLnJlYWQoZmls ZSkuc3BsaXQoJC8pCiAgICB3b3Jkcy5lYWNoIGRvIHwgdyB8IHcuZG93bmNhc2UhIGVuZAogICAg c2VsZi5uZXcoIHdvcmRzICkKICBlbmQKCiAgIyBDYWxjdWxhdGUgdGhlIG5laWdoYm91cnMuIFRo aXMgbGF6aWx5IGNhbGN1bGF0ZXMgbmVpZ2hib3VyaG9vZCBzZXRzIGFuZCBzYXZlcyByZXN1bHRz IGZvciBsYXRlciBsb29rdXAuCiAgZGVmIG5laWdoYm91cnMod29yZCkKICAgIHVubGVzcyBAc2lt aWxhcl93b3Jkc19idWlsZFt3b3JkLmxlbmd0aF0KICAgICAgQHdvcmRzX2J5X2xlbmd0aFt3b3Jk Lmxlbmd0aF0uZWFjaCBkbyB8IHcgfAoJd29yZC5sZW5ndGgudGltZXMgZG8gfCBsIHwKCSAgQHNp bWlsYXJfd29yZHNbd1swLGxdIDw8ICdfJyA8PCB3W2wrMS4uLTFdXSA8PCB3IAoJZW5kCiAgICAg IGVuZAogICAgICBAc2ltaWxhcl93b3Jkc19idWlsZFt3b3JkLmxlbmd0aF0gPSB0cnVlCiAgICBl bmQKCiAgICAjcHV0cyAiU2VhcmNoaW5nIG5laWdoYm91cnMgZm9yICN7d29yZH0iCiAgICBAbmVp Z2hib3Vyc1t3b3JkXSB8fD0gKDAuLi53b3JkLmxlbmd0aCkuaW5qZWN0KFNldC5uZXcpIHsgfCBy LCBsIHwgci5tZXJnZShAc2ltaWxhcl93b3Jkc1t3b3JkWzAsbF0gKyAnXycgKyB3b3JkW2wrMS4u LTFdXSkgfS5kZWxldGUod29yZCkKICBlbmQKCiAgIyBBcHBlbmQgYW4gYWRkaXRpb25hbCB3b3Jk IHRvIHRoZSBkaWN0aW9uYXJ5LgogIGRlZiA8PCh3b3JkKQogICAgQHdvcmRzX2J5X2xlbmd0aFt3 b3JkLmxlbmd0aF0gPDwgd29yZAogICAgQHNpbWlsYXJfd29yZHNfYnVpbGRbd29yZC5sZW5ndGhd ID0gZmFsc2UKICAgIEBuZWlnaGJvdXJzW3dvcmRdID0gbmlsCiAgICBzZWxmCiAgZW5kCgogIHBy aXZhdGUKICAjIEhlbHBlciBmdW5jdGlvbiB0byByZXRyaWV2ZSBhIHBhdGggZnJvbSBhIHBhcmVu dC1oYXNoIChNZWFud2hpbGUgc3RyaXBwaW5nIHRoZSBwYXRoIHRvIG9ubHkgY29udGFpbiB0aGUg d29yZHMpCiAgZGVmIGdhdGhlcl9wYXJlbnRzKG5vZGUsIHBhcmVudHMpCiAgICBpZiBwYXJlbnRz W25vZGVdCiAgICAgIFtub2RlXS5jb25jYXQoZ2F0aGVyX3BhcmVudHMocGFyZW50c1tub2RlXSwg cGFyZW50cykpCiAgICBlbHNlCiAgICAgIFtub2RlXQogICAgZW5kCiAgZW5kCgogIHB1YmxpYwog IElORklOSVRZID0gMS4wLzAuMAoKICAjIFRoZSBBKiBBbGdvcml0aG0KICBkZWYgZmluZF9jaGFp bih3b3JkMSwgd29yZDIpCiAgICBxdWV1ZSA9IFByaW9yaXR5UXVldWUubmV3CiAgICBwYXJlbnQg ICA9IEhhc2gubmV3CiAgICBkaXN0YW5jZSA9IEhhc2gubmV3e3xoLGt8IElORklOSVRZfQogICAg Y2xvc2VkICAgPSBIYXNoLm5ld3t8aCxrfCBJTkZJTklUWX0KCiAgICBxdWV1ZS5wdXNoKHdvcmQx LCAwKQogICAgZGlzdGFuY2Vbd29yZDFdID0gMAoKICAgIHdvcmQyX2xldHRlcnMgPSB3b3JkMi5z cGxpdCgvLykKCiAgICB3aGlsZSB3b3JkID0gcXVldWUucG9wX21pbgogICAgICBjbG9zZWRbd29y ZF0gPSBkaXN0YW5jZVt3b3JkXQogICAgICBzZWxmLm5laWdoYm91cnMod29yZCkuZWFjaCBkbyB8 IG4xIHwKCW4xX2Rpc3RhbmNlID0gZGlzdGFuY2Vbd29yZF0gKyAxCgluZXh0IGlmIGRpc3RhbmNl W24xXSA8PSBuMV9kaXN0YW5jZSBvciBjbG9zZWRbbjFdIDw9IG4xX2Rpc3RhbmNlCglkaXN0YW5j ZVtuMV0gPSBuMV9kaXN0YW5jZQoJcGFyZW50W24xXSA9IHdvcmQKCWggPSB3b3JkMl9sZXR0ZXJz LnppcCh3b3JkLnNwbGl0KC8vKSkuaW5qZWN0KDApIHsgfCBkLCAoYSwgYikgfCBhID09IGIgPyBk IDogZCArIDEgfQoJcXVldWUucHVzaChuMSwgbjFfZGlzdGFuY2UgKyBoKQogICAgICBlbmQKICAg IGVuZAoKICAgIGdhdGhlcl9wYXJlbnRzKHdvcmQyLCBwYXJlbnQpIGlmIHBhcmVudFt3b3JkMl0K ICBlbmQKZW5kCgppZiBfX0ZJTEVfXyA9PSAkMAogICMjIyBPcHRpb24gUGFyc2luZyAjIyMKICBy ZXF1aXJlICdvcHRwYXJzZScKCiAgY2xhc3MgV29yZENoYWluT3B0aW9ucyA8IE9wdGlvblBhcnNl cgogICAgYXR0cl9yZWFkZXIgOmRhdGFiYXNlLCA6aGVscAoKICAgIGRlZiBpbml0aWFsaXplCiAg ICAgIHN1cGVyKCkKICAgICAgQGRhdGFiYXNlID0gJy91c3Ivc2hhcmUvZGljdC93b3JkcycKICAg ICAgc2VsZi5iYW5uZXIgPSAiVXNhZ2U6IHdvcmRjaGFpbiBbLWQgRElDVF0gRlJPTSBUTyIKICAg ICAgc2VsZi5vbigiLWQgRklMRU5BTUUiLCAiLS1kaWN0IEZJTEVOQU1FIiwgU3RyaW5nKSAgeyB8 IHYgfCBAZGF0YWJhc2UgICA9IHYgfQogICAgICBzZWxmLm9uKCItPyIsICItLWhlbHAiKSAgICAg ICAgICAgICAgICAgICB7ICAgICAgIEBoZWxwICAgICAgID0gdHJ1ZSB9CiAgICBlbmQKCiAgICBk ZWYgc2VsZi5wYXJzZQogICAgICBvcHRpb25zID0gc2VsZi5uZXcKICAgICAgYmVnaW4KCW9wdGlv bnMucGFyc2UhKEFSR1YpCiAgICAgIHJlc2N1ZSA9PiBlCglwdXRzICJJbnZhbGlkIENvbW1hbmRs aW5lIEFyZ3VtZW50cyIKCXB1dHMgZQoJcHV0cyBvcHRpb25zCglleGl0CiAgICAgIGVuZAogICAg ICBvcHRpb25zCiAgICBlbmQKCiAgZW5kCgogIG9wdGlvbnMgPSBXb3JkQ2hhaW5PcHRpb25zLnBh cnNlCgogIGlmIG9wdGlvbnMuaGVscCBvciBBUkdWLmxlbmd0aCAhPSAyCiAgICBwdXRzIG9wdGlv bnMKICAgIGV4aXQKICBlbmQKCiAgIyMjIE1ha2UgaGltIHdvcmsgIyMjCgogIHdhcm4gIkxvYWRp bmcgZGF0YWJhc2UiCiAgd29yZG5ldCA9IFdvcmROZXQubG9hZChvcHRpb25zLmRhdGFiYXNlKQoK ICB3YXJuICJTZWFyY2hpbmcgd29yZCIKICBwdXRzIHdvcmRuZXQuZmluZF9jaGFpbigqQVJHVikK ZW5kCg ------ art_28_28939322.1125353190237 Content-Type: application/octet-stream; name="README" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="README" IyBSdWJ5IGV4dGVuc2lvbiBpbXBsZW1lbnRpbmcgYSBwcmlvcml0eSBxdWV1ZQoKIyMgRGVzY3Jp cHRpb24KVGhpcyBpcyBhIGZpYm9uYWN5IGhlYXAgcHJpb3JpdHkgcXVldWUgaW1wbGVtZW50YXRp b24uIFRoYXQgbWVhbnMKCmluc2VydDogICAgICAgICAgICAgICAgICAgICAgTygxKQpkZWNyZWFz ZV9wcmlvcml0eTogQW1vcnRpemVkIE8oMSkKZGVsZXRlX21pbjogICAgICAgIEFtb3J0aXplZCBP KGxvZyBuKQoKIyMgTGVnYWwgc3R1ZmYKKGMpIDIwMDUgQnJpYW4gU2NocvZkZXIKClBsZWFzZSBz dWJtaXQgYnVncmVwb3J0cyB0byBwcmlvcml0eV9xdWV1ZUBicmlhbi1zY2hyb2VkZXIuZGUKClRo aXMgZXh0ZW5zaW9uIGlzIHVuZGVyIHRoZSBzYW1lIGxpY2Vuc2UgYXMgcnVieS4KCkRvIG5vdCBo b2xkIG1lIHJlbGlhYmxlIGZvciBhbnl0aGluZyB0aGF0IGhhcHBlbnMgdG8geW91LCB5b3VyIHBy b2dyYW1zIG9yCmFueXRoaW5nIGVsc2UgYmVjYXVzZSBvZiB0aGlzIGV4dGVuc2lvbi4gSXQgd29y a2VkIGZvciBtZSwgYnV0IHRoZXJlIGlzIG5vCmd1YXJhbnRlZSBpdCB3aWxsIHdvcmsgZm9yIHlv dS4KCiMjIEluc3RhbGxhdGlvbgokIHJ1YnkgZXh0Y29uZi5yYgokIG1ha2UKCnB1dCBwcmlvcml0 eV9xdWV1ZS5zbyBzb21ld2hlcmUgd2hlcmUgeW91ciBwcm9ncmFtIGNhbiBmaW5kIGl0LiBFLmcu IC91c3IvbG9jYWwvbGliL3J1YnkvMS44L3ByaW9yaXR5X3F1ZXVlLnNvCgojIyBVc2FnZQoKICAg IHJlcXVpcmUgJ3ByaW9yaXR5X3F1ZXVlJwoKICAgIHEgPSBQcmlvcml0eVF1ZXVlLm5ldwogICAg cS5wdXNoICJub2RlMSIsIDAgCiAgICBxLnB1dHMgIm5vZGUyIiwgMQoKICAgIHEubWluICM9PiAi bm9kZTEiCgogICAgcS5kZWNyZWFzZV9wcmlvcml0eSgibm9kZTIiLCAtMSkKCiAgICBxLnBvcF9t aW4gIz0+ICJub2RlMiIKICAgIHEubWluICAgICAjPT4gIm5vZGUxIgo------ art_28_28939322.1125353190237 Content-Type: text/x-csrc; name="priority_queue.c" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="priority_queue.c" Ly8KLy8gUnVieSBleHRlbnNpb24gaW1wbGVtZW50aW5nIGEgcHJpb3JpdHkgcXVldWUKLy8gCi8v IFRoaXMgaXMgYSBmaWJvbmFjeSBoZWFwIHByaW9yaXR5IHF1ZXVlIGltcGxlbWVudGF0aW9uLgov LwovLyAoYykgMjAwNSBCcmlhbiBTY2hy9mRlcgovLwovLyBQbGVhc2Ugc3VibWl0IGJ1Z3JlcG9y dHMgdG8gcHJpb3JpdHlfcXVldWVAYnJpYW4tc2Nocm9lZGVyLmRlCi8vCi8vIFRoaXMgZXh0ZW5z aW9uIGlzIHVuZGVyIHRoZSBzYW1lIGxpY2Vuc2UgYXMgcnVieS4KLy8gCi8vIERvIG5vdCBob2xk IG1lIHJlbGlhYmxlIGZvciBhbnl0aGluZyB0aGF0IGhhcHBlbnMgdG8geW91LCB5b3VyIHByb2dy YW1zIG9yCi8vIGFueXRoaW5nIGVsc2UgYmVjYXVzZSBvZiB0aGlzIGV4dGVuc2lvbi4gSXQgd29y a2VkIGZvciBtZSwgYnV0IHRoZXJlIGlzIG5vCi8vIGd1YXJhbnRlZSBpdCB3aWxsIHdvcmsgZm9y IHlvdS4KLy8KLy8gRXhjZXB0IGZvciB1c2luZyBhIHZhbHVlIGV4Y2VwdCBvZiBhIHZvaWQqIHRo ZSBwcmlvcml0eSBxdWV1ZSBjLWNvZGUgaXMgcnVieQovLyBhZ25vc3RpYy4KLy8KI2luY2x1ZGUg PHN0ZGxpYi5oPgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgInJ1YnkuaCIKI2luY2x1ZGUg PG1hdGguaD4KCnR5cGVkZWYgX0Jvb2wgYm9vbDsKCiNkZWZpbmUgZmFsc2UgMDsKI2RlZmluZSB0 cnVlIDE7Cgp0eXBlZGVmIHN0cnVjdCBzdHJ1Y3RfcHJpb3JpdHlfbm9kZSB7CiAgdW5zaWduZWQg aW50IGRlZ3JlZTsKICBWQUxVRSBwcmlvcml0eTsKICBWQUxVRSBvYmplY3Q7CiAgc3RydWN0IHN0 cnVjdF9wcmlvcml0eV9ub2RlKiBwYXJlbnQ7CiAgc3RydWN0IHN0cnVjdF9wcmlvcml0eV9ub2Rl KiBjaGlsZDsKICBzdHJ1Y3Qgc3RydWN0X3ByaW9yaXR5X25vZGUqIGxlZnQ7CiAgc3RydWN0IHN0 cnVjdF9wcmlvcml0eV9ub2RlKiByaWdodDsKICBib29sIG1hcms7Cn0gcHJpb3JpdHlfbm9kZTsK CnR5cGVkZWYgc3RydWN0IHsKICBwcmlvcml0eV9ub2RlKiByb290bGlzdDsKICBwcmlvcml0eV9u b2RlKiBtaW47CiAgdW5zaWduZWQgaW50IGxlbmd0aDsKICBpbnQgKCpjb21wYXJlX2Z1bmN0aW9u KShWQUxVRSBwMSwgVkFMVUUgcDIpOyAvLyBTaG91bGQgcmV0dXJuIDwgMCBmb3IgYSA8IGIsIDAg Zm9yIGEgPT0gYiwgPiAwIGZvciBhID4gYgp9IHByaW9yaXR5X3F1ZXVlOwoKLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8KLy8gTm9kZSBNYW5pcHVsYXRpb24gRnVuY3Rpb25zCi8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vCgovLyBDcmVhdGUgYSBwcmlvcml0eSBub2RlIHN0cnVjdHVyZQpwcmlvcml0eV9u b2RlKiBjcmVhdGVfcHJpb3JpdHlfbm9kZShWQUxVRSBvYmplY3QsIFZBTFVFIHByaW9yaXR5KSB7 CiAgcHJpb3JpdHlfbm9kZSogcmVzdWx0ID0gQUxMT0MocHJpb3JpdHlfbm9kZSk7CiAgcmVzdWx0 LT5kZWdyZWUgICA9IDA7CiAgcmVzdWx0LT5wcmlvcml0eSA9IHByaW9yaXR5OwogIHJlc3VsdC0+ b2JqZWN0ID0gb2JqZWN0OwogIHJlc3VsdC0+cGFyZW50ID0gTlVMTDsKICByZXN1bHQtPmNoaWxk ID0gTlVMTDsKICByZXN1bHQtPmxlZnQgPSByZXN1bHQ7CiAgcmVzdWx0LT5yaWdodCA9IHJlc3Vs dDsKICByZXN1bHQtPm1hcmsgPSBmYWxzZTsgIAogIHJldHVybiByZXN1bHQ7Cn0KCi8vIFVzZSB0 aGlzIHRvIGZyZWUgYSBub2RlIHN0cnVjdAp2b2lkIHByaW9yaXR5X25vZGVfZnJlZShwcmlvcml0 eV9ub2RlKiBuKSB7CiAgZnJlZShuKTsKfQoKc3RhdGljCiAgdm9pZCBwcmlvcml0eV9ub2RlX2Zy ZWVfcmVjdXJzaXZlbHkocHJpb3JpdHlfbm9kZSogbikgewogICAgaWYgKCFuKQogICAgICByZXR1 cm47CgogICAgcHJpb3JpdHlfbm9kZSogbjEgPSBuOwogICAgZG8gewogICAgICBwcmlvcml0eV9u b2RlICpuMiA9IG4xLT5yaWdodDsKICAgICAgcHJpb3JpdHlfbm9kZV9mcmVlX3JlY3Vyc2l2ZWx5 KG4xLT5jaGlsZCk7CiAgICAgIHByaW9yaXR5X25vZGVfZnJlZShuMSk7CiAgICAgIG4xID0gbjI7 CiAgICB9IHdoaWxlKG4xICE9IG4pOwogIH0KCi8vIGxpbmsgdHdvIGJpbm9taWFsIGhlYXBzCnN0 YXRpYyAKICBwcmlvcml0eV9ub2RlKiBsaW5rX25vZGVzKHByaW9yaXR5X3F1ZXVlKiBxLCBwcmlv cml0eV9ub2RlKiBiMSwgcHJpb3JpdHlfbm9kZSogYjIpIHsKICAgIGlmIChxLT5jb21wYXJlX2Z1 bmN0aW9uKGIyLT5wcmlvcml0eSwgYjEtPnByaW9yaXR5KSA8IDApCiAgICAgIHJldHVybiBsaW5r X25vZGVzKHEsIGIyLCBiMSk7CiAgICBiMi0+cGFyZW50ID0gYjE7CiAgICBwcmlvcml0eV9ub2Rl KiBjaGlsZCA9IGIxLT5jaGlsZDsKICAgIGIxLT5jaGlsZCA9IGIyOwogICAgaWYgKGNoaWxkKSB7 CiAgICAgIGIyLT5sZWZ0ICA9IGNoaWxkLT5sZWZ0OwogICAgICBiMi0+bGVmdC0+cmlnaHQgPSBi MjsKICAgICAgYjItPnJpZ2h0ID0gY2hpbGQ7CiAgICAgIGIyLT5yaWdodC0+bGVmdCA9IGIyOwog ICAgfSBlbHNlIHsKICAgICAgYjItPmxlZnQgPSBiMjsKICAgICAgYjItPnJpZ2h0ID0gYjI7CiAg ICB9CiAgICBiMS0+ZGVncmVlKys7CiAgICBiMi0+bWFyayA9IGZhbHNlOwogICAgcmV0dXJuIGIx OwogIH0KCi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi8vIFF1ZXVlIE1hbmlwdWxhdGlvbiBGdW5j dGlvbnMKLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCi8vIENyZWF0ZSBhbiBlbXB0eSBwcmlvcml0 eSBxdWV1ZQpwcmlvcml0eV9xdWV1ZSogY3JlYXRlX3ByaW9yaXR5X3F1ZXVlKGludCAoKmNvbXBh cmVfZnVuY3Rpb24pKFZBTFVFLCBWQUxVRSkpIHsKICBwcmlvcml0eV9xdWV1ZSAqcmVzdWx0ID0g QUxMT0MocHJpb3JpdHlfcXVldWUpOwogIHJlc3VsdC0+bWluID0gTlVMTDsKICByZXN1bHQtPnJv b3RsaXN0ID0gTlVMTDsKICByZXN1bHQtPmxlbmd0aCA9IDA7CiAgcmVzdWx0LT5jb21wYXJlX2Z1 bmN0aW9uID0gY29tcGFyZV9mdW5jdGlvbjsKICByZXR1cm4gcmVzdWx0Owp9CgovLyBGcmVlIGEg cHJpb3JpdHkgcXVldWUgYW5kIGFsbCB0aGUgbm9kZXMgaXQgY29udGFpbnMKdm9pZCBwcmlvcml0 eV9xdWV1ZV9mcmVlKHByaW9yaXR5X3F1ZXVlKiBxKSB7CiAgcHJpb3JpdHlfbm9kZV9mcmVlX3Jl Y3Vyc2l2ZWx5KHEtPnJvb3RsaXN0KTsKICBmcmVlKHEpOwp9CgovLyBNZWxkIHR3byBxdWV1ZXMg aW50byBvbmUgbmV3IHF1ZXVlLiBXZSB0YWtlIHRoZSBmaXJzdCBxdWV1ZSBhbmQgdGhlIHJvb3Ru b2RlIG9mIHRoZSBzZWNvbmQgcXVldWUuCnN0YXRpYwpwcmlvcml0eV9xdWV1ZSogbWVsZF9xdWV1 ZShwcmlvcml0eV9xdWV1ZSogcTEsIHByaW9yaXR5X25vZGUqIHEyLCB1bnNpZ25lZCBpbnQgbGVu Z3RoX3EyKSB7CiAgaWYgKCFxMS0+cm9vdGxpc3QpIHsKICAgIHExLT5yb290bGlzdCA9IHEyOwog ICAgcTEtPm1pbiA9IHEyOwogICAgcTEtPmxlbmd0aCA9IGxlbmd0aF9xMjsKICB9IGVsc2Ugewog ICAgcHJpb3JpdHlfbm9kZSogcjEgPSBxMS0+cm9vdGxpc3QtPmxlZnQ7CiAgICBwcmlvcml0eV9u b2RlKiByMiA9IHEyLT5sZWZ0OyAgCgogICAgcTEtPnJvb3RsaXN0LT5sZWZ0ID0gcjI7CiAgICBy Mi0+cmlnaHQgPSBxMS0+cm9vdGxpc3Q7CgogICAgcTItPmxlZnQgPSByMTsKICAgIHIxLT5yaWdo dCA9IHEyOwoKICAgIHExLT5sZW5ndGggPSBxMS0+bGVuZ3RoICsgbGVuZ3RoX3EyOwoKICAgIGlm IChxMS0+Y29tcGFyZV9mdW5jdGlvbihxMi0+cHJpb3JpdHksIHExLT5taW4tPnByaW9yaXR5KSA8 IDApCiAgICAgIHExLT5taW4gPSBxMjsKICB9CgogIHJldHVybiBxMTsKfQoKLy8gQWRkIGFuIG9i amVjdCBhbmQgYSBwcmlvcml0eSB0byBhIHByaW9yaXR5IHF1ZXVlLiBSZXR1cm5zIGEgcG9pbnRl ciB0byBhCi8vIHByaW9yaXR5X25vZGUgc3RydWN0dXJlLCB3aGljaCBjYW4gYmUgdXNlZCBpbiBk ZWxldGVfbm9kZSBhbmQgcHJpb3JpdHlfcXVldWVfZGVjcmVhc2VfcHJpb3JpdHkKLy8gb3BlcmF0 aW9ucy4KcHJpb3JpdHlfbm9kZSogcHJpb3JpdHlfcXVldWVfYWRkX25vZGUocHJpb3JpdHlfcXVl dWUqIHEsIFZBTFVFIG9iamVjdCwgVkFMVUUgcHJpb3JpdHkpIHsKICBwcmlvcml0eV9ub2RlKiBy ZXN1bHQgPSBjcmVhdGVfcHJpb3JpdHlfbm9kZShvYmplY3QsIHByaW9yaXR5KTsKICBtZWxkX3F1 ZXVlKHEsIHJlc3VsdCwgMSk7CiAgcmV0dXJuIHJlc3VsdDsKfQoKc3RhdGljIApwcmlvcml0eV9u b2RlKiBkZWxldGVfZmlyc3QocHJpb3JpdHlfcXVldWUqIHEpIHsKICBpZiAocS0+cm9vdGxpc3Qp IHsKICAgIHByaW9yaXR5X25vZGUqIHJlc3VsdCA9IHEtPnJvb3RsaXN0OwogICAgaWYgKHJlc3Vs dCA9PSByZXN1bHQtPnJpZ2h0KQogICAgICBxLT5yb290bGlzdCA9IE5VTEw7CiAgICBlbHNlIHsK ICAgICAgcS0+cm9vdGxpc3QgPSByZXN1bHQtPnJpZ2h0OwogICAgICByZXN1bHQtPmxlZnQtPnJp Z2h0ID0gcmVzdWx0LT5yaWdodDsKICAgICAgcmVzdWx0LT5yaWdodC0+bGVmdCA9IHJlc3VsdC0+ bGVmdDsKICAgICAgcmVzdWx0LT5yaWdodCA9IHJlc3VsdDsKICAgICAgcmVzdWx0LT5sZWZ0ID0g cmVzdWx0OwogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKICB9IGVsc2UgewogICAgcmV0dXJuIE5V TEw7CiAgfQp9CgpzdGF0aWMKdm9pZCBhc3NlcnRfcG9pbnRlcnNfY29ycmVjdChwcmlvcml0eV9u b2RlKiBuKSB7CiAgaWYgKCFuKSByZXR1cm47CgogIHByaW9yaXR5X25vZGUgKm4xID0gbi0+cmln aHQ7CiAgd2hpbGUobiAhPSBuMSkgewogICAgaWYgKG4xLT5jaGlsZCAmJiAobjEgIT0gbjEtPmNo aWxkLT5wYXJlbnQpKSAKICAgICAgcHJpbnRmKCJFbHRlcm4tS2luZCBaZWlnZXIgaW5rb3JyZWt0 OiAlcFxuIiwgbik7CgogICAgaWYgKG4xICE9IG4xLT5yaWdodC0+bGVmdCkKICAgICAgcHJpbnRm KCJSZWNodHMtbGlua3MgaW5rb3JyZWt0OiAlcFxuIiwgbik7CgogICAgaWYgKG4xICE9IG4xLT5s ZWZ0LT5yaWdodCkKICAgICAgcHJpbnRmKCJsaW5rcy1SZWNodHMgaW5rb3JyZWt0OiAlcFxuIiwg bik7CgogICAgYXNzZXJ0X3BvaW50ZXJzX2NvcnJlY3QobjEtPmNoaWxkKTsKICAgIG4xID0gbjEt PnJpZ2h0OwogIH0KfQoKLy8gQ29uc29saWRhdGUgYSBxdWV1ZSBpbiBhbW9ydGl6ZWQgTyhsb2cg bikKc3RhdGljIAp2b2lkIGNvbnNvbGlkYXRlX3F1ZXVlKHByaW9yaXR5X3F1ZXVlKiBxKSB7CiAg dW5zaWduZWQgaW50IGxlbmd0aCA9IHEtPmxlbmd0aDsKICAKICB1bnNpZ25lZCBpbnQgYXJyYXlf c2l6ZSA9IDIgKiBsb2cobGVuZ3RoKSAvIGxvZygyKSArIDE7CiAgcHJpb3JpdHlfbm9kZSogdHJl ZV9ieV9kZWdyZWVbYXJyYXlfc2l6ZV07IC8vIFRPRE86IFdlIG5lZWQgb25seSAybG9nIG4gZW50 cmllcwogIHVuc2lnbmVkIGludCBpOwogIGZvciAoaT0wOyBpPGFycmF5X3NpemU7IGkrKykKICAg IHRyZWVfYnlfZGVncmVlW2ldID0gTlVMTDsKCiAgcHJpb3JpdHlfbm9kZSogbiA9IE5VTEw7CiAg d2hpbGUgKCgobiA9IGRlbGV0ZV9maXJzdChxKSkpKSB7CiAgICBwcmlvcml0eV9ub2RlKiBuMSA9 IE5VTEw7CiAgICB3aGlsZSAoKChuMSA9IHRyZWVfYnlfZGVncmVlW24tPmRlZ3JlZV0pKSkgewog ICAgICB0cmVlX2J5X2RlZ3JlZVtuLT5kZWdyZWVdID0gTlVMTDsKICAgICAgbiA9IGxpbmtfbm9k ZXMocSwgbiwgbjEpOwogICAgfQogICAgdHJlZV9ieV9kZWdyZWVbbi0+ZGVncmVlXSA9IG47CiAg fQoKICAvLyBGaW5kIG1pbmltdW0gdmFsdWUgaW4gTyhsb2cgbikgLy8gT25seSBpZiB3ZSBzaG9y dGVuIHRoZSBhcnJheQogIHEtPnJvb3RsaXN0ID0gTlVMTDsKICBxLT5taW4gPSBOVUxMOwogIGZv ciAoaT0wOyBpPGFycmF5X3NpemU7IGkrKykgeyAgICAKICAgIGlmICh0cmVlX2J5X2RlZ3JlZVtp XSAhPSBOVUxMKSB7CiAgICAgIG1lbGRfcXVldWUocSwgdHJlZV9ieV9kZWdyZWVbaV0sIDApOwog ICAgfQogIH0KCiAgcS0+bGVuZ3RoID0gbGVuZ3RoOwp9CgovLyBEZWxldGUgYW5kIGV4dHJhY3Qg cHJpb3JpdHlfbm9kZSB3aXRoIG1pbmltYWwgcHJpb3JpdHkgTyhsb2cgbikKcHJpb3JpdHlfbm9k ZSogcHJpb3JpdHlfcXVldWVfcG9wX21pbihwcmlvcml0eV9xdWV1ZSogcSkgewogIGlmICghcS0+ cm9vdGxpc3QpIHJldHVybiBOVUxMOwogIHByaW9yaXR5X25vZGUqIG1pbiA9IHEtPm1pbjsKCiAg aWYgKHEtPmxlbmd0aCA9PSAxKXsgLy8gbGVuZ3RoID09IDEKICAgIHEtPnJvb3RsaXN0ID0gTlVM TDsKICAgIHEtPm1pbiA9IE5VTEw7CiAgICBxLT5sZW5ndGggPSAwOwogIH0gZWxzZSB7CiAgICB1 bnNpZ25lZCBpbnQgbGVuZ3RoID0gcS0+bGVuZ3RoOwogICAgLy8gQWJ0cmVubmVuLgogICAgaWYg KHEtPm1pbiA9PSBxLT5yb290bGlzdCkgewogICAgICBpZiAocS0+bWluID09IHEtPm1pbi0+cmln aHQpIHsKCXEtPnJvb3RsaXN0ID0gTlVMTDsKCXEtPm1pbiA9IE5VTEw7CiAgICAgIH0gZWxzZSB7 CglxLT5yb290bGlzdCA9IHEtPm1pbi0+cmlnaHQ7CiAgICAgIH0KICAgIH0KICAgIG1pbi0+bGVm dC0+cmlnaHQgPSBtaW4tPnJpZ2h0OwogICAgbWluLT5yaWdodC0+bGVmdCA9IG1pbi0+bGVmdDsK ICAgIG1pbi0+bGVmdCA9IG1pbjsKICAgIG1pbi0+cmlnaHQgPSBtaW47CiAgICBpZiAobWluLT5j aGlsZCkgewogICAgICAvLyBLaW5kZXIgdW5kIEVsdGVybiB0cmVubmVuLCBNYXJraWVydW5nIGF1 ZmhlYmVuLCB1bmQga2xlaW5zdGVzIEtpbmQgYmVzdGltbWVuLgogICAgICBwcmlvcml0eV9ub2Rl KiBuID0gbWluLT5jaGlsZDsKICAgICAgcHJpb3JpdHlfbm9kZSogbWluMiA9IG47CiAgICAgIGRv IHsKCW4tPnBhcmVudCA9IE5VTEw7CgluLT5tYXJrID0gZmFsc2U7CgluID0gbi0+cmlnaHQ7Cglp ZiAocS0+Y29tcGFyZV9mdW5jdGlvbihuLT5wcmlvcml0eSwgbWluMi0+cHJpb3JpdHkpIDwgMCkK CSAgbWluMiA9IG47CiAgICAgIH0gd2hpbGUgKG4hPW1pbi0+Y2hpbGQpOwoKICAgICAgLy8gS2lu ZGVyIGVpbmb8Z2VuCiAgICAgIG1lbGRfcXVldWUocSwgbWluMiwgMCk7CiAgICB9CgogICAgLy8g R3L232UgYW5wYXNzZW4KICAgIHEtPmxlbmd0aCA9IGxlbmd0aC0xOwoKICAgIC8vIFdpZWRlciBh dWZo/GJzY2hlbgogICAgY29uc29saWRhdGVfcXVldWUocSk7CiAgfQoKICByZXR1cm4gbWluOwp9 CgpzdGF0aWMKICBwcmlvcml0eV9xdWV1ZSogY3V0X25vZGUocHJpb3JpdHlfcXVldWUqIHEsIHBy aW9yaXR5X25vZGUqIG4pIHsKICAgIGlmICghbi0+cGFyZW50KQogICAgICByZXR1cm4gcTsgIAog ICAgbi0+cGFyZW50LT5kZWdyZWUtLTsKICAgIGlmIChuLT5wYXJlbnQtPmNoaWxkID09IG4pIHsK ICAgICAgaWYgKG4tPnJpZ2h0ID09IG4pCgluLT5wYXJlbnQtPmNoaWxkID0gTlVMTDsKICAgICAg ZWxzZQoJbi0+cGFyZW50LT5jaGlsZCA9IG4tPnJpZ2h0OyAgCiAgICB9CiAgICBuLT5wYXJlbnQg PSBOVUxMOwogICAgbi0+cmlnaHQtPmxlZnQgPSBuLT5sZWZ0OwogICAgbi0+bGVmdC0+cmlnaHQg PSBuLT5yaWdodDsKCiAgICBuLT5yaWdodCA9IHEtPnJvb3RsaXN0OwogICAgbi0+bGVmdCAgPSBx LT5yb290bGlzdC0+bGVmdDsKICAgIHEtPnJvb3RsaXN0LT5sZWZ0LT5yaWdodCA9IG47CiAgICBx LT5yb290bGlzdC0+bGVmdCA9IG47CiAgICBxLT5yb290bGlzdCA9IG47CgogICAgbi0+bWFyayA9 IGZhbHNlOwoKICAgIHJldHVybiBxOwogIH0KCi8vIERlY3JlYXNlIHRoZSBwcmlvcml0eSBvZiBh IHByaW9yaXR5X25vZGUgYW5kIHJlc3RydWN0dXJlIHRoZSBxdWV1ZQogIHByaW9yaXR5X3F1ZXVl KiBwcmlvcml0eV9xdWV1ZV9kZWNyZWFzZV9wcmlvcml0eShwcmlvcml0eV9xdWV1ZSogcSwgcHJp b3JpdHlfbm9kZSogbiwgVkFMVUUgcHJpb3JpdHkpIHsKICAgIGlmIChxLT5jb21wYXJlX2Z1bmN0 aW9uKG4tPnByaW9yaXR5LCBwcmlvcml0eSkgPD0gMCkgLy8gVG9kbzogVmVyc2lja2VybiBlcmxh dWJlbgogICAgICByZXR1cm4gcTsKICAgIG4tPnByaW9yaXR5ID0gcHJpb3JpdHk7CiAgICBpZiAo cS0+Y29tcGFyZV9mdW5jdGlvbihuLT5wcmlvcml0eSwgcS0+bWluLT5wcmlvcml0eSkgPCAwKQog ICAgICBxLT5taW4gPSBuOwogICAgaWYgKCEobi0+cGFyZW50KSB8fCAocS0+Y29tcGFyZV9mdW5j dGlvbihuLT5wYXJlbnQtPnByaW9yaXR5LCBuLT5wcmlvcml0eSkgPD0gMCkpCiAgICAgIHJldHVy biBxOwogICAgZG8gewogICAgICBwcmlvcml0eV9ub2RlKiBwID0gbi0+cGFyZW50OwogICAgICBj dXRfbm9kZShxLCBuKTsKICAgICAgbiA9IHA7CiAgICB9IHdoaWxlIChuLT5tYXJrICYmIG4tPnBh cmVudCk7CiAgICBpZiAobi0+cGFyZW50KQogICAgICBuLT5tYXJrID0gdHJ1ZTsKICAgIHJldHVy biBxOwogIH0KCi8vIEdldCB0aGUgcHJpb3JpdHlfbm9kZSB3aXRoIHRoZSBtaW5pbXVtIHByaW9y aXR5IGZyb20gYSBxdWV1ZQpwcmlvcml0eV9ub2RlKiBwcmlvcml0eV9xdWV1ZV9taW4ocHJpb3Jp dHlfcXVldWUgKnEpIHsKICByZXR1cm4gcS0+bWluOwp9CgovLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v LwovLyBEZWZpbmUgdGhlIHJ1YnkgY2xhc3NlcwovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoKc3Rh dGljIGludCBpZF9jb21wYXJlX29wZXJhdG9yOwpzdGF0aWMgaW50IGlkX2Zvcm1hdDsKCnByaW9y aXR5X3F1ZXVlKiBnZXRfcHFfZnJvbV92YWx1ZShWQUxVRSBzZWxmKSB7CiAgcHJpb3JpdHlfcXVl dWUgKnE7IAogIERhdGFfR2V0X1N0cnVjdChzZWxmLCBwcmlvcml0eV9xdWV1ZSwgcSk7CiAgcmV0 dXJuIHE7Cn0KCnN0YXRpYwppbnQgdmFsdWVfY29tcGFyZV9mdW5jdGlvbihWQUxVRSBhLCBWQUxV RSBiKSB7CiAgcmV0dXJuIEZJWDJJTlQocmJfZnVuY2FsbCgoVkFMVUUpIGEsIGlkX2NvbXBhcmVf b3BlcmF0b3IsIDEsIChWQUxVRSkgYikpOwp9CgpzdGF0aWMKdm9pZCBwcV9mcmVlKHZvaWQgKnAp IHsKICBwcmlvcml0eV9xdWV1ZV9mcmVlKHApOyAgCn0KCnN0YXRpYwp2b2lkIHBxX21hcmtfcmVj dXJzaXZlKHByaW9yaXR5X25vZGUqIG4pIHsKICBpZiAoIW4pIHJldHVybjsKICByYl9nY19tYXJr KChWQUxVRSkgbi0+b2JqZWN0KTsKICByYl9nY19tYXJrKChWQUxVRSkgbi0+cHJpb3JpdHkpOwog IHByaW9yaXR5X25vZGUqIG4xID0gbi0+Y2hpbGQ7CiAgaWYgKCFuMSkgcmV0dXJuOwogIGRvIHsK ICAgIHBxX21hcmtfcmVjdXJzaXZlKG4xKTsKICAgIG4xID0gbjEtPnJpZ2h0OwogIH0gd2hpbGUg KG4xICE9IG4tPmNoaWxkKTsKfQoKc3RhdGljCnZvaWQgcHFfbWFyayh2b2lkICpxKSB7ICAKICBw cmlvcml0eV9ub2RlKiBuMSA9ICgocHJpb3JpdHlfcXVldWUqKSBxKS0+cm9vdGxpc3Q7CiAgaWYg KCFuMSkKICAgIHJldHVybjsKICBwcmlvcml0eV9ub2RlKiBuMiA9IG4xOwogIGRvIHsKICAgIHBx X21hcmtfcmVjdXJzaXZlKG4xKTsKICAgIG4xID0gbjEtPnJpZ2h0OwogIH0gd2hpbGUgKG4xICE9 IG4yKTsKfQoKc3RhdGljIApWQUxVRSBwcV9hbGxvYyhWQUxVRSBrbGFzcykgewogIHByaW9yaXR5 X3F1ZXVlICpxOwogIFZBTFVFIG9iamVjdDsKCiAgcSA9IGNyZWF0ZV9wcmlvcml0eV9xdWV1ZSgm dmFsdWVfY29tcGFyZV9mdW5jdGlvbik7CgogIG9iamVjdCA9IERhdGFfV3JhcF9TdHJ1Y3Qoa2xh c3MsIHBxX21hcmssIHBxX2ZyZWUsIHEpOwoKICByZXR1cm4gb2JqZWN0Owp9CgpzdGF0aWMKVkFM VUUgcHFfaW5pdChWQUxVRSBzZWxmKSB7CiAgcmJfaXZfc2V0KHNlbGYsICJAX19ub2RlX2J5X29i amVjdF9fIiwgcmJfaGFzaF9uZXcoKSk7CgogIHJldHVybiBzZWxmOwp9CgpzdGF0aWMKVkFMVUUg cHFfcHVzaChWQUxVRSBzZWxmLCBWQUxVRSBvYmplY3QsIFZBTFVFIHByaW9yaXR5KSB7CiAgVkFM VUUgaGFzaCA9IHJiX2l2X2dldChzZWxmLCAiQF9fbm9kZV9ieV9vYmplY3RfXyIpOwoKICBwcmlv cml0eV9xdWV1ZSogcSA9IGdldF9wcV9mcm9tX3ZhbHVlKHNlbGYpOwoKICBwcmlvcml0eV9ub2Rl KiBuID0gcHJpb3JpdHlfcXVldWVfYWRkX25vZGUocSwgb2JqZWN0LCBwcmlvcml0eSk7CgogIHJi X2hhc2hfYXNldChoYXNoLCBvYmplY3QsIFVMT05HMk5VTSgodW5zaWduZWQgbG9uZykgbikpOyAv LyBUT0RPOiBUaGlzIGlzIGhhY2tpc2gsIG1heWJlIGl0cyBiZXR0ZXIgdG8gYWxzbyB3cmFwIHRo ZSBub2Rlcy4KCiAgcmV0dXJuIHNlbGY7Cn0KCnN0YXRpYwpWQUxVRSBwcV9taW4oVkFMVUUgc2Vs ZikgewogIHByaW9yaXR5X3F1ZXVlKiBxID0gZ2V0X3BxX2Zyb21fdmFsdWUoc2VsZik7CgogIHBy aW9yaXR5X25vZGUqIG4gPSBwcmlvcml0eV9xdWV1ZV9taW4ocSk7CiAgaWYgKG4pCiAgICByZXR1 cm4gKFZBTFVFKSBuLT5vYmplY3Q7CiAgZWxzZQogICAgcmV0dXJuIFFuaWw7Cn0KCnN0YXRpYwpW QUxVRSBwcV9wb3BfbWluKFZBTFVFIHNlbGYpIHsKICBWQUxVRSBoYXNoID0gcmJfaXZfZ2V0KHNl bGYsICJAX19ub2RlX2J5X29iamVjdF9fIik7CiAgcHJpb3JpdHlfcXVldWUqIHEgPSBnZXRfcHFf ZnJvbV92YWx1ZShzZWxmKTsKCiAgcHJpb3JpdHlfbm9kZSogbiA9IHByaW9yaXR5X3F1ZXVlX3Bv cF9taW4ocSk7CgogIGlmIChuKSB7CiAgICByYl9oYXNoX2RlbGV0ZShoYXNoLCAoVkFMVUUpIG4t Pm9iamVjdCk7IC8vIFRPRE86IE1heWJlIHdlIGhhdmUgYSBwcm9ibGVtIGhlcmUgd2l0aCBnYXJi YWdlIGNvbGxlY3Rpb24gb2Ygbi0+b2JqZWN0PwogICAgcmV0dXJuIChWQUxVRSkgbi0+b2JqZWN0 OyAgCiAgfSBlbHNlIHsKICAgIHJldHVybiBRbmlsOwogIH0KfQoKc3RhdGljClZBTFVFIHBxX2Rl Y3JlYXNlX3ByaW9yaXR5KFZBTFVFIHNlbGYsIFZBTFVFIG9iamVjdCwgVkFMVUUgcHJpb3JpdHkp IHsKICBWQUxVRSBoYXNoID0gcmJfaXZfZ2V0KHNlbGYsICJAX19ub2RlX2J5X29iamVjdF9fIik7 CiAgcHJpb3JpdHlfcXVldWUqIHEgPSBnZXRfcHFfZnJvbV92YWx1ZShzZWxmKTsKCiAgcHJpb3Jp dHlfcXVldWVfZGVjcmVhc2VfcHJpb3JpdHkocSwgKHByaW9yaXR5X25vZGUqKSBOVU0yVUxPTkco cmJfaGFzaF9hcmVmKGhhc2gsIG9iamVjdCkpLCBwcmlvcml0eSk7CgogIHJldHVybiBzZWxmOwp9 CgpzdGF0aWMKVkFMVUUgcHFfbGVuZ3RoKFZBTFVFIHNlbGYpIHsKICBwcmlvcml0eV9xdWV1ZSog cSA9IGdldF9wcV9mcm9tX3ZhbHVlKHNlbGYpOwoKICByZXR1cm4gSU5UMk5VTShxLT5sZW5ndGgp Owp9CgoKLy8gRG90IGEgc2luZ2xlIG5vZGUgb2YgYSBwcmlvcml0eSBxdWV1ZS4gQ2FsbGVkIGJ5 IHBxX3RvX2RvdCB0byBkbyB0aGUgaW5uZXIgd29yay4KLy8gKEknbSBub3QgcHJvdWQgb2YgdGhp cyBmdW5jdGlvbiA7LSggKQpzdGF0aWMKdm9pZCBwcV9ub2RlMmRvdChWQUxVRSByZXN1bHRfc3Ry aW5nLCBwcmlvcml0eV9ub2RlKiBuLCB1bnNpZ25lZCBpbnQgbGV2ZWwpIHsKICBpZiAobiA9PSBO VUxMKSByZXR1cm47ICAKICB1bnNpZ25lZCBpbnQgaTsKICBmb3IgKGk9MDsgaTxsZXZlbDsgaSsr KSByYl9zdHJfY2F0MihyZXN1bHRfc3RyaW5nLCAiICAiKTsgIAogIGlmIChuLT5tYXJrKQogICAg cmJfc3RyX2NvbmNhdChyZXN1bHRfc3RyaW5nLAoJcmJfZnVuY2FsbChRbmlsLCBpZF9mb3JtYXQs IDQsIHJiX3N0cl9uZXcyKCJOT0RFJWkgW2xhYmVsPVwiJXMgKCVzKVwiXTtcbiIpLCAKCSAgVUxP TkcyTlVNKCh1bnNpZ25lZCBsb25nKSBuKSwgbi0+b2JqZWN0LCBuLT5wcmlvcml0eSkpOwogIGVs c2UKICAgIHJiX3N0cl9jb25jYXQocmVzdWx0X3N0cmluZywKCXJiX2Z1bmNhbGwoUW5pbCwgaWRf Zm9ybWF0LCA0LCByYl9zdHJfbmV3MigiTk9ERSVpIFtsYWJlbD1cIiVzICglcylcIixzaGFwZT1i b3hdO1xuIiksIAoJICBVTE9ORzJOVU0oKHVuc2lnbmVkIGxvbmcpIG4pLCBuLT5vYmplY3QsIG4t PnByaW9yaXR5KSk7CiAgaWYgKG4tPmNoaWxkICE9IE5VTEwpIHsKICAgIHByaW9yaXR5X25vZGUq IG4xID0gbi0+Y2hpbGQ7CiAgICBkbyB7CiAgICAgIHBxX25vZGUyZG90KHJlc3VsdF9zdHJpbmcs IG4xLCBsZXZlbCArIDEpOwogICAgICBmb3IgKGk9MDsgaTxsZXZlbDsgaSsrKSByYl9zdHJfY2F0 MihyZXN1bHRfc3RyaW5nLCAiICAiKTsgIAogICAgICByYl9zdHJfY29uY2F0KHJlc3VsdF9zdHJp bmcsCgkgIHJiX2Z1bmNhbGwoUW5pbCwgaWRfZm9ybWF0LCA0LCByYl9zdHJfbmV3MigiTk9ERSVp IC0+IE5PREUlaTtcbiIpLCAKCSAgICBVTE9ORzJOVU0oKHVuc2lnbmVkIGxvbmcpIG4pLCBVTE9O RzJOVU0oKHVuc2lnbmVkIGxvbmcpIG4xKSkpOwogICAgICBuMSA9IG4xLT5yaWdodDsKICAgIH0g d2hpbGUobjEgIT0gbi0+Y2hpbGQpOwogIH0KfQoKLy8gUHJpbnQgYSBwcmlvcml0eSBxdWV1ZSBh cyBhIGRvdC1ncmFwaAovLyAoSSdtIG5vdCBwcm91ZCBvZiB0aGlzIGZ1bmN0aW9uIDstKCApCnN0 YXRpYwpWQUxVRSBwcV90b19kb3QoVkFMVUUgc2VsZikgewogIHByaW9yaXR5X3F1ZXVlKiBxID0g Z2V0X3BxX2Zyb21fdmFsdWUoc2VsZik7CgogIFZBTFVFIHJlc3VsdF9zdHJpbmcgPSByYl9zdHJf bmV3MigiZGlncmFwaCBmaWJvbmFjY3lfaGVhcCB7XG4iKTsKICBpZiAocS0+cm9vdGxpc3QpIHsK ICAgIHByaW9yaXR5X25vZGUqIG4xID0gcS0+cm9vdGxpc3Q7CiAgICBkbyB7ICAgIAogICAgICBw cV9ub2RlMmRvdChyZXN1bHRfc3RyaW5nLCBuMSwgMSk7CiAgICAgIG4xID0gbjEtPnJpZ2h0Owog ICAgfSB3aGlsZShuMSAhPSBxLT5yb290bGlzdCk7CiAgfQogIHJiX3N0cl9jYXQyKHJlc3VsdF9z dHJpbmcsICJ9XG4iKTsKICByZXR1cm4gcmVzdWx0X3N0cmluZzsKfQoKVkFMVUUgY1ByaW9yaXR5 UXVldWU7CnZvaWQgSW5pdF9wcmlvcml0eV9xdWV1ZSgpIHsKICBpZF9jb21wYXJlX29wZXJhdG9y ID0gcmJfaW50ZXJuKCI8PT4iKTsKICBpZF9mb3JtYXQgPSByYl9pbnRlcm4oImZvcm1hdCIpOwoK ICBjUHJpb3JpdHlRdWV1ZSA9IHJiX2RlZmluZV9jbGFzcygiUHJpb3JpdHlRdWV1ZSIsIHJiX2NP YmplY3QpOwoKICByYl9kZWZpbmVfYWxsb2NfZnVuYyhjUHJpb3JpdHlRdWV1ZSwgcHFfYWxsb2Mp OwogIHJiX2RlZmluZV9tZXRob2QoY1ByaW9yaXR5UXVldWUsICJpbml0aWFsaXplIiwgcHFfaW5p dCwgMCk7CiAgcmJfZGVmaW5lX21ldGhvZChjUHJpb3JpdHlRdWV1ZSwgInB1c2giLCBwcV9wdXNo LCAyKTsKICByYl9kZWZpbmVfbWV0aG9kKGNQcmlvcml0eVF1ZXVlLCAibWluIiwgcHFfbWluLCAw KTsKICByYl9kZWZpbmVfbWV0aG9kKGNQcmlvcml0eVF1ZXVlLCAicG9wX21pbiIsIHBxX3BvcF9t aW4sIDApOwogIHJiX2RlZmluZV9tZXRob2QoY1ByaW9yaXR5UXVldWUsICJkZWNyZWFzZV9wcmlv cml0eSIsIHBxX2RlY3JlYXNlX3ByaW9yaXR5LCAyKTsKICByYl9kZWZpbmVfbWV0aG9kKGNQcmlv cml0eVF1ZXVlLCAibGVuZ3RoIiwgcHFfbGVuZ3RoLCAwKTsKICByYl9kZWZpbmVfbWV0aG9kKGNQ cmlvcml0eVF1ZXVlLCAidG9fZG90IiwgcHFfdG9fZG90LCAwKTsKfQo------ art_28_28939322.1125353190237 Content-Type: application/x-ruby; name="test.rb" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="test.rb" cmVxdWlyZSAncHJpb3JpdHlfcXVldWUnCgpyZXF1aXJlICd0ZXN0L3VuaXQnCgpjbGFzcyBUQ19w cV90ZXN0IDwgVGVzdDo6VW5pdDo6VGVzdENhc2UKICBkZWYgc2V0dXAKICAgIEBxID0gUHJpb3Jp dHlRdWV1ZS5uZXcKICBlbmQKCiAgZGVmIHRlc3RfcG9wX25pbAogICAgYXNzZXJ0X2VxdWFsKG5p bCwgQHEucG9wX21pbikKICBlbmQKICAKICBkZWYgdGVzdF9wdXNoX3BvcAogICAgMjAudGltZXMg ZG8gfCBpIHwKICAgICAgQHEucHVzaCBpLCBpCiAgICBlbmQKCiAgICAyMC50aW1lcyBkbyB8IGkg fAogICAgICBhc3NlcnRfZXF1YWwoaSwgQHEucG9wX21pbikKICAgIGVuZAoKICAgIGFzc2VydF9l cXVhbChuaWwsIEBxLnBvcF9taW4pCiAgICBhc3NlcnRfZXF1YWwobmlsLCBAcS5taW4pCiAgZW5k CgogIGRlZiB0ZXN0X2RlY3JlYXNlX3ByaW9yaXR5CgogICAgMjAudGltZXMgZG8gfCBpIHwKICAg ICAgQHEucHVzaCBpLCBpIC8gMjAuMAogICAgZW5kCgogICAgYXNzZXJ0X2VxdWFsKDAsIEBxLnBv cF9taW4pCgogICAgQHEuZGVjcmVhc2VfcHJpb3JpdHkoMTAsIC0xKQogICAgQHEuZGVjcmVhc2Vf cHJpb3JpdHkoMTEsIC0xKQoKICAgIFsxMCwgMTEsICgxLi45KS50b19hLCAoMTIuLjE5KS50b19h LCBuaWxdLmZsYXR0ZW4uZWFjaCBkbyB8IHNoYWxsIHwKICAgICAgYXNzZXJ0X2VxdWFsKHNoYWxs LCBAcS5wb3BfbWluKQogICAgZW5kCiAgZW5kCgogIGRlZiB0ZXN0X3RvX2RvdCAgICAKICAgIDUu dGltZXMgZG8gfCBpIHwKICAgICAgQHEucHVzaCAiTiN7aX0iLCBpCiAgICBlbmQKICAgIEBxLnBv cF9taW4KICAgIGFzc2VydF9lcXVhbCgKICAgIFsnZGlncmFwaCBmaWJvbmFjY3lfaGVhcCB7JywK ICAgICcgIE5PREUgW2xhYmVsPSJOMSAoMSkiLHNoYXBlPWJveF07JywKICAgICcgICAgTk9ERSBb bGFiZWw9Ik4zICgzKSIsc2hhcGU9Ym94XTsnLAogICAgJyAgICAgIE5PREUgW2xhYmVsPSJONCAo NCkiLHNoYXBlPWJveF07JywKICAgICcgICAgTk9ERSAtPiBOT0RFOycsCiAgICAnICBOT0RFIC0+ IE5PREU7JywKICAgICcgICAgTk9ERSBbbGFiZWw9Ik4yICgyKSIsc2hhcGU9Ym94XTsnLAogICAg JyAgTk9ERSAtPiBOT0RFOycsCiAgICAnfScsJyddLmpvaW4oIlxuIiksICBAcS50b19kb3QuZ3N1 YigvTk9ERVswLTldKi8sICdOT0RFJykpCiAgZW5kCmVuZAo------ art_28_28939322.1125353190237 Content-Type: application/x-ruby; name="extconf.rb" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="extconf.rb" cmVxdWlyZSAnbWttZicKY3JlYXRlX21ha2VmaWxlKCJwcmlvcml0eV9xdWV1ZSIpCg ------ art_28_28939322.1125353190237--