LyoKICogQ2luZXBhayBlbmNvZGVyIChjKSAyMDExIFRvbWFzIEjkcmRpbgogKiBodHRwOi8vdGl0YW4uY29kZW1pbGwuc2UvfnRvbWhhci9jaW5lcGFrZW5jLnBhdGNoCiAqCiAqIEZpeGVzIGFuZCBpbXByb3ZlbWVudHMsIHZpbnRhZ2UgZGVjb2RlcnMgY29tcGF0aWJpbGl0eQogKiAgKGMpIDIwMTMsIDIwMTQgUmwsIEFldGV5IEdsb2JhbCBUZWNobm9sb2dpZXMgQUIKClBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCmNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCnRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCmFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQpTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgoKVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQKaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCgpUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgpJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwKVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCkFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgpPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCgogKiBUT0RPOgogKiAtIG9wdGltaXplOiBjb2xvciBzcGFjZSBjb252ZXJzaW9uLCAuLi4KICogLSBpbXBsZW1lbnQgb3B0aW9ucyB0byBzZXQgdGhlIG1pbi9tYXggbnVtYmVyIG9mIHN0cmlwcz8KICogTUFZQkU6CiAqIC0gIm9wdGltYWxseSIgc3BsaXQgdGhlIGZyYW1lIGludG8gc2V2ZXJhbCBub24tcmVndWxhciBhcmVhcwogKiAgIHVzaW5nIGEgc2VwYXJhdGUgY29kZWJvb2sgcGFpciBmb3IgZWFjaCBhcmVhIGFuZCBhcHByb3hpbWF0aW5nCiAqICAgdGhlIGFyZWEgYnkgc2V2ZXJhbCByZWN0YW5ndWxhciBzdHJpcHMgKGdlbmVyYWxseSBub3QgZnVsbCB3aWR0aCBvbmVzKQogKiAgICh1c2UgcXVhZHRyZWUgc3BsaXR0aW5nPyBhIHNpbXBsZSBmaXhlZC1ncmFudWxhcml0eSBncmlkPykKICoKICoKICogdmVyc2lvbiAyMDE0LTAxLTIzIFJsCiAqIC0gYWRkZWQgb3B0aW9uIGhhbmRsaW5nIGZvciBmbGV4aWJpbGl0eQogKgogKiB2ZXJzaW9uIDIwMTQtMDEtMjEgUmwKICogLSBiZWxpZXZlIGl0IG9yIG5vdCwgbm93IHdlIGdldCBldmVuIHNtYWxsZXIgZmlsZXMsIHdpdGggYmV0dGVyIHF1YWxpdHkKICogICAod2hpY2ggbWVhbnMgSSBtaXNzZWQgYW4gb3B0aW1pemF0aW9uIGVhcmxpZXIgOikKICoKICogdmVyc2lvbiAyMDE0LTAxLTIwIFJsCiAqIC0gbWFkZSB0aGUgZW5jb2RlciBjb21wYXRpYmxlIHdpdGggdmludGFnZSBkZWNvZGVycwogKiAgIGFuZCBhZGRlZCBzb21lIHlldCB1bnVzZWQgY29kZSBmb3IgcG9zc2libGUgZnV0dXJlCiAqICAgaW5jcmVtZW50YWwgY29kZWJvb2sgdXBkYXRlcwogKiAtIGZpeGVkIGEgc21hbGwgbWVtb3J5IGxlYWsKICoKICogdmVyc2lvbiAyMDEzLTA0LTI4IFJsCiAqIC0gYnVnZml4ZWQgY29kZWJvb2sgb3B0aW1pemF0aW9uIGxvZ2ljCiAqCiAqIHZlcnNpb24gMjAxMy0wMi0xNCBSbAogKiAiVmFsZW50aW5lJ3MgRGF5IiB2ZXJzaW9uOgogKiAtIG1hZGUgc3RyaXAgZGl2aXNpb24gbW9yZSByb2J1c3QKICogLSBtaW5pbWl6ZWQgYnJ1dGVmb3JjaW5nIHRoZSBudW1iZXIgb2Ygc3RyaXBzLAogKiAgIChjb3N0cyBzb21lIFIvRCBidXQgc3BlZWRzIHVwIGNvbXBlc3Npb24gYSBsb3QpLCB0aGUgaGV1cmlzdGljCiAqICAgYXNzdW1wdGlvbiBpcyB0aGF0IHNjb3JlIGFzIGEgZnVuY3Rpb24gb2YgdGhlIG51bWJlciBvZiBzdHJpcHMgaGFzCiAqICAgb25lIHdpZGUgbWluaW11bSB3aGljaCBtb3ZlcyBzbG93bHksIG9mIGNvdXJzZSBub3QgZnVsbHkgdHJ1ZQogKiAtIHNpbXBsaWZpZWQgY29kZWJvb2sgZ2VuZXJhdGlvbiwKICogICB0aGUgb2xkIGNvZGUgd2FzIG1lYW50IGZvciBvdGhlciBvcHRpbWl6YXRpb25zIHRoYW4gd2UgYWN0dWFsbHkgZG8KICogLSBvcHRpbWl6ZWQgdGhlIGNvZGVib29rIGdlbmVyYXRpb24gLyBlcnJvciBlc3RpbWF0aW9uIGZvciBNT0RFX01DCiAqCiAqIHZlcnNpb24gMjAxMy0wMi0xMiBSbAogKiAtIHNlcGFyYXRlZCBjb2RlYm9vayB0cmFpbmluZyBzZXRzLCBhdm9pZGVkIHRoZSB0cmFuc2ZlciBvZiB3YXN0ZWQgYnl0ZXMsCiAqICAgd2hpY2ggeWllbGRzIGJvdGggYmV0dGVyIHF1YWxpdHkgYW5kIHNtYWxsZXIgZmlsZXMKICogLSBub3cgdXNpbmcgdGhlIGNvcnJlY3QgY29sb3JzcGFjZSAoVE9ETzogbW92ZSBjb252ZXJzaW9uIHRvIGxpYnN3c2NhbGUpCiAqCiAqIHZlcnNpb24gMjAxMy0wMi0wOCBSbAogKiAtIGZpeGVzL29wdGltaXphdGlvbiBpbiBtdWx0aXN0cmlwIGVuY29kaW5nIGFuZCBjb2RlYm9vayBzaXplIGNob2ljZSwKICogICBxdWFsaXR5L2JpdHJhdGUgaXMgbm93IGJldHRlciB0aGFuIHRoYXQgb2YgdGhlIGJpbmFyeSBwcm9wcmlldGFyeSBlbmNvZGVyCiAqLwoKI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKI2luY2x1ZGUgImF2Y29kZWMuaCIKI2luY2x1ZGUgImxpYmF2dXRpbC9sZmcuaCIKI2luY2x1ZGUgImVsYmcuaCIKI2luY2x1ZGUgImludGVybmFsLmgiCgojaW5jbHVkZSAibGliYXZ1dGlsL2F2YXNzZXJ0LmgiCiNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCgojZGVmaW5lIENWSURfSEVBREVSX1NJWkUgMTAKI2RlZmluZSBTVFJJUF9IRUFERVJfU0laRSAxMgojZGVmaW5lIENIVU5LX0hFQURFUl9TSVpFIDQKCiNkZWZpbmUgTUJfU0laRSA0ICAgICAgICAgICAvLzR4NCBNQnMKI2RlZmluZSBNQl9BUkVBIChNQl9TSVpFKk1CX1NJWkUpCgojZGVmaW5lIFZFQ1RPUl9NQVggNiAgICAgICAgLy9zaXggb3IgZm91ciBlbnRyaWVzIHBlciB2ZWN0b3IgZGVwZW5kaW5nIG9uIGZvcm1hdAojZGVmaW5lIENPREVCT09LX01BWCAyNTYgICAgLy9zaXplIG9mIGEgY29kZWJvb2sKCiNkZWZpbmUgTUFYX1NUUklQUyAgMzIgICAgICAvL05vdGU6IGhhdmluZyBmZXdlciBjaG9pY2VzIHJlZ2FyZGluZyB0aGUgbnVtYmVyIG9mIHN0cmlwcyBzcGVlZHMgdXAgZW5jb2RpbmcgKG9idmlvdXNseSkKI2RlZmluZSBNSU5fU1RSSVBTICAxICAgICAgIC8vTm90ZTogaGF2aW5nIG1vcmUgc3RyaXBzIHNwZWVkcyB1cCBlbmNvZGluZyB0aGUgZnJhbWUgKHRoaXMgaXMgbGVzcyBvYnZpb3VzKQovLyBNQVhfU1RSSVBTIGxpbWl0cyB0aGUgbWF4aW11bSBxdWFsaXR5IHlvdSBjYW4gcmVhY2gKLy8gICAgICAgICAgICB3aGVuIHlvdSB3YW50IGhpZ2h0IHF1YWxpdHkgb24gaGlnaCByZXNvbHV0aW9ucywKLy8gTUlOX1NUUklQUyBsaW1pdHMgdGhlIG1pbmltdW0gZWZmaWNpZW50bHkgZW5jb2RhYmxlIGJpdCByYXRlCi8vICAgICAgICAgICAgb24gbG93IHJlc29sdXRpb25zCi8vIHRoZSBudW1iZXJzIGFyZSBvbmx5IHVzZWQgZm9yIGJydXRlIGZvcmNlIG9wdGltaXphdGlvbiBmb3IgdGhlIGZpcnN0IGZyYW1lLAovLyBmb3IgdGhlIGZvbGxvd2luZyBmcmFtZXMgdGhleSBhcmUgYWRhcHRpdmVseSByZWFkanVzdGVkCi8vIE5PVEUgdGhlIGRlY29kZXIgaW4gZmZtcGVnIGhhcyBpdHMgb3duIGFyYml0cmFyeSBsaW1pdGF0aW9uIG9uIHRoZSBudW1iZXIKLy8gb2Ygc3RyaXBzLCBjdXJyZW50bHkgMzIKCnR5cGVkZWYgZW51bSB7CiAgICBNT0RFX1YxX09OTFkgPSAwLAogICAgTU9ERV9WMV9WNCwKICAgIE1PREVfTUMsCgogICAgTU9ERV9DT1VOVCwKfSBDaW5lcGFrTW9kZTsKCnR5cGVkZWYgZW51bSB7CiAgICBFTkNfVjEsCiAgICBFTkNfVjQsCiAgICBFTkNfU0tJUCwKCiAgICBFTkNfVU5DRVJUQUlOCn0gbWJfZW5jb2Rpbmc7Cgp0eXBlZGVmIHN0cnVjdCB7CiAgICBpbnQgdjFfdmVjdG9yOyAgICAgICAgICAgICAgICAgIC8vaW5kZXggaW50byB2MSBjb2RlYm9vawogICAgaW50IHYxX2Vycm9yOyAgICAgICAgICAgICAgICAgICAvL2Vycm9yIHdoZW4gdXNpbmcgVjEgZW5jb2RpbmcKICAgIGludCB2NF92ZWN0b3JbNF07ICAgICAgICAgICAgICAgLy9pbmRpY2VzIGludG8gdjQgY29kZWJvb2tzCiAgICBpbnQgdjRfZXJyb3I7ICAgICAgICAgICAgICAgICAgIC8vZXJyb3Igd2hlbiB1c2luZyBWNCBlbmNvZGluZwogICAgaW50IHNraXBfZXJyb3I7ICAgICAgICAgICAgICAgICAvL2Vycm9yIHdoZW4gYmxvY2sgaXMgc2tpcHBlZCAoYWthIGNvcGllZCBmcm9tIGxhc3QgZnJhbWUpCiAgICBtYl9lbmNvZGluZyBiZXN0X2VuY29kaW5nOyAgICAgIC8vbGFzdCByZXN1bHQgZnJvbSBjYWxjdWxhdGVfbW9kZV9zY29yZSgpCn0gbWJfaW5mbzsKCnR5cGVkZWYgc3RydWN0IHsKICAgIGludCB2MV9jb2RlYm9va1tDT0RFQk9PS19NQVgqVkVDVE9SX01BWF07CiAgICBpbnQgdjRfY29kZWJvb2tbQ09ERUJPT0tfTUFYKlZFQ1RPUl9NQVhdOwogICAgaW50IHYxX3NpemU7CiAgICBpbnQgdjRfc2l6ZTsKICAgIENpbmVwYWtNb2RlIG1vZGU7Cn0gc3RyaXBfaW5mbzsKCnR5cGVkZWYgc3RydWN0IHsKICAgIGNvbnN0IEFWQ2xhc3MgKmNsYXNzOwogICAgQVZDb2RlY0NvbnRleHQgKmF2Y3R4OwogICAgdW5zaWduZWQgY2hhciAqcGljdF9idWZzWzRdLCAqc3RyaXBfYnVmLCAqZnJhbWVfYnVmOwogICAgQVZGcmFtZSAqbGFzdF9mcmFtZTsKICAgIEFWRnJhbWUgKmJlc3RfZnJhbWU7CiAgICBBVkZyYW1lICpzY3JhdGNoX2ZyYW1lOwogICAgQVZGcmFtZSAqaW5wdXRfZnJhbWU7CiAgICBlbnVtIEFWUGl4ZWxGb3JtYXQgcGl4X2ZtdDsKICAgIGludCB3LCBoOwogICAgaW50IGZyYW1lX2J1Zl9zaXplOwogICAgaW50IGN1cmZyYW1lLCBrZXlpbnQ7CiAgICBBVkxGRyByYW5kY3R4OwogICAgdWludDY0X3QgbGFtYmRhOwogICAgaW50ICpjb2RlYm9va19pbnB1dDsKICAgIGludCAqY29kZWJvb2tfY2xvc2VzdDsKICAgIG1iX2luZm8gKm1iOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9NQiBSRCBzdGF0ZQogICAgaW50IG1pbl9zdHJpcHM7ICAgICAgICAgIC8vdGhlIGN1cnJlbnQgbGltaXQKICAgIGludCBtYXhfc3RyaXBzOyAgICAgICAgICAvL3RoZSBjdXJyZW50IGxpbWl0CiNpZmRlZiBDSU5FUEFLRU5DX0RFQlVHCiAgICBtYl9pbmZvICpiZXN0X21iOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vVE9ETzogcmVtb3ZlLiBvbmx5IHVzZWQgZm9yIHByaW50aW5nIHN0YXRzCiAgICBpbnQgbnVtX3YxX21vZGUsIG51bV92NF9tb2RlLCBudW1fbWNfbW9kZTsKICAgIGludCBudW1fdjFfZW5jcywgbnVtX3Y0X2VuY3MsIG51bV9za2lwczsKI2VuZGlmCi8vIG9wdGlvbnMKICAgIGludCBtYXhfZXh0cmFfY2JfaXRlcmF0aW9uczsKICAgIGludCBza2lwX2VtcHR5X2NiOwogICAgaW50IG1pbl9taW5fc3RyaXBzOwogICAgaW50IG1heF9tYXhfc3RyaXBzOwogICAgaW50IHN0cmlwX251bWJlcl9kZWx0YV9yYW5nZTsKfSBDaW5lcGFrRW5jQ29udGV4dDsKCiNkZWZpbmUgT0ZGU0VUKHgpIG9mZnNldG9mKENpbmVwYWtFbmNDb250ZXh0LCB4KQojZGVmaW5lIFZFIEFWX09QVF9GTEFHX1ZJREVPX1BBUkFNIHwgQVZfT1BUX0ZMQUdfRU5DT0RJTkdfUEFSQU0Kc3RhdGljIGNvbnN0IEFWT3B0aW9uIG9wdGlvbnNbXSA9IHsKICAgIHsgIm1heF9leHRyYV9jYl9pdGVyYXRpb25zIiwgIk1heCBleHRyYSBjb2RlYm9vayByZWNhbGN1bGF0aW9uIHBhc3NlcywgbW9yZSBpcyBiZXR0ZXIgYW5kIHNsb3dlciIsIE9GRlNFVChtYXhfZXh0cmFfY2JfaXRlcmF0aW9ucyksIEFWX09QVF9UWVBFX0lOVCwgeyAuaTY0ID0gMiB9LCAwLCBJTlRfTUFYLCBWRSB9LAogICAgeyAic2tpcF9lbXB0eV9jYiIsICJBdm9pZCB3YXN0aW5nIGJ5dGVzLCBpZ25vcmUgdmludGFnZSBNYWNPUyBkZWNvZGVyIiwgT0ZGU0VUKHNraXBfZW1wdHlfY2IpLCBBVl9PUFRfVFlQRV9JTlQsIHsgLmk2NCA9IDAgfSwgMCwgMSwgVkUgfSwKICAgIHsgIm1heF9zdHJpcHMiLCAiTGltaXQgc3RyaXBzL2ZyYW1lLCB2aW50YWdlIGNvbXBhdGlibGUgaXMgMS4uMywgb3RoZXJ3aXNlIHRoZSBtb3JlIHRoZSBiZXR0ZXIiLCBPRkZTRVQobWF4X21heF9zdHJpcHMpLCBBVl9PUFRfVFlQRV9JTlQsIHsgLmk2NCA9IDMgfSwgTUlOX1NUUklQUywgTUFYX1NUUklQUywgVkUgfSwKICAgIHsgIm1pbl9zdHJpcHMiLCAiRW5mb3JjZSBtaW4gc3RyaXBzL2ZyYW1lLCBtb3JlIGlzIHdvcnNlIGFuZCBmYXN0ZXIsIG11c3QgYmUgPD0gbWF4X3N0cmlwcyIsIE9GRlNFVChtaW5fbWluX3N0cmlwcyksIEFWX09QVF9UWVBFX0lOVCwgeyAuaTY0ID0gTUlOX1NUUklQUyB9LCBNSU5fU1RSSVBTLCBNQVhfU1RSSVBTLCBWRSB9LAogICAgeyAic3RyaXBfbnVtYmVyX2FkYXB0aXZpdHkiLCAiSG93IGZhc3QgdGhlIHN0cmlwIG51bWJlciBhZGFwdHMsIG1vcmUgaXMgc2xpZ2h0bHkgYmV0dGVyLCBtdWNoIHNsb3dlciIsIE9GRlNFVChzdHJpcF9udW1iZXJfZGVsdGFfcmFuZ2UpLCBBVl9PUFRfVFlQRV9JTlQsIHsgLmk2NCA9IDAgfSwgMCwgTUFYX1NUUklQUy1NSU5fU1RSSVBTLCBWRSB9LAogICAgeyBOVUxMIH0sCn07CgpzdGF0aWMgY29uc3QgQVZDbGFzcyBjaW5lcGFrX2NsYXNzID0gewogICAgLmNsYXNzX25hbWUgPSAiY2luZXBhayIsCiAgICAuaXRlbV9uYW1lICA9IGF2X2RlZmF1bHRfaXRlbV9uYW1lLAogICAgLm9wdGlvbiAgICAgPSBvcHRpb25zLAogICAgLnZlcnNpb24gICAgPSBMSUJBVlVUSUxfVkVSU0lPTl9JTlQsCn07CgpzdGF0aWMgYXZfY29sZCBpbnQgY2luZXBha19lbmNvZGVfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCnsKICAgIENpbmVwYWtFbmNDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKICAgIGludCB4LCBtYl9jb3VudCwgc3RyaXBfYnVmX3NpemUsIGZyYW1lX2J1Zl9zaXplOwoKICAgIGlmIChhdmN0eC0+d2lkdGggJiAzIHx8IGF2Y3R4LT5oZWlnaHQgJiAzKSB7CiAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJ3aWR0aCBhbmQgaGVpZ2h0IG11c3QgYmUgbXVsdGlwbGVzIG9mIGZvdXIgKGdvdCAlaXglaSlcbiIsCiAgICAgICAgICAgICAgICBhdmN0eC0+d2lkdGgsIGF2Y3R4LT5oZWlnaHQpOwogICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CiAgICB9CgogICAgaWYgKHMtPm1pbl9taW5fc3RyaXBzID4gcy0+bWF4X21heF9zdHJpcHMpIHsKICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIm1pbmltYWwgbnVtYmVyIG9mIHN0cmlwcyBjYW4gbm90IGV4Y2VlZCBtYXhpbWFsIChnb3QgJWkgYW5kICVpKVxuIiwKICAgICAgICAgICAgICAgIHMtPm1pbl9taW5fc3RyaXBzLCBzLT5tYXhfbWF4X3N0cmlwcyk7CiAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKICAgIH0KCiAgICBpZiAoIShzLT5sYXN0X2ZyYW1lID0gYXZfZnJhbWVfYWxsb2MoKSkpCiAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKICAgIGlmICghKHMtPmJlc3RfZnJhbWUgPSBhdl9mcmFtZV9hbGxvYygpKSkKICAgICAgICBnb3RvIGVub21lbTsKICAgIGlmICghKHMtPnNjcmF0Y2hfZnJhbWUgPSBhdl9mcmFtZV9hbGxvYygpKSkKICAgICAgICBnb3RvIGVub21lbTsKICAgIGlmIChhdmN0eC0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX1JHQjI0KQogICAgICAgIGlmICghKHMtPmlucHV0X2ZyYW1lID0gYXZfZnJhbWVfYWxsb2MoKSkpCiAgICAgICAgICAgIGdvdG8gZW5vbWVtOwoKICAgIGlmICghKHMtPmNvZGVib29rX2lucHV0ID0gYXZfbWFsbG9jKHNpemVvZihpbnQpICogKGF2Y3R4LT5waXhfZm10ID09IEFWX1BJWF9GTVRfUkdCMjQgPyA2IDogNCkgKiAoYXZjdHgtPndpZHRoICogYXZjdHgtPmhlaWdodCkgPj4gMikpKQogICAgICAgIGdvdG8gZW5vbWVtOwoKICAgIGlmICghKHMtPmNvZGVib29rX2Nsb3Nlc3QgPSBhdl9tYWxsb2Moc2l6ZW9mKGludCkgKiAoYXZjdHgtPndpZHRoICogYXZjdHgtPmhlaWdodCkgPj4gMikpKQogICAgICAgIGdvdG8gZW5vbWVtOwoKICAgIGZvcih4ID0gMDsgeCA8IChhdmN0eC0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX1JHQjI0ID8gNCA6IDMpOyB4KyspCiAgICAgICAgaWYoIShzLT5waWN0X2J1ZnNbeF0gPSBhdl9tYWxsb2MoKGF2Y3R4LT5waXhfZm10ID09IEFWX1BJWF9GTVRfUkdCMjQgPyA2IDogNCkgKiAoYXZjdHgtPndpZHRoICogYXZjdHgtPmhlaWdodCkgPj4gMikpKQogICAgICAgICAgICBnb3RvIGVub21lbTsKCiAgICBtYl9jb3VudCA9IGF2Y3R4LT53aWR0aCAqIGF2Y3R4LT5oZWlnaHQgLyBNQl9BUkVBOwoKICAgIC8vdGhlIGxhcmdlc3QgcG9zc2libGUgY2h1bmsgaXMgMHgzMSB3aXRoIGFsbCBNQnMgZW5jb2RlZCBpbiBWNCBtb2RlCiAgICAvL2FuZCBmdWxsIGNvZGVib29rcyBiZWluZyByZXBsYWNlZCBpbiBJTlRFUiBtb2RlLAogICAgLy8gd2hpY2ggaXMgMzQgYml0cyBwZXIgTUIKICAgIC8vYW5kIDIqMjU2IGV4dHJhIGZsYWcgYml0cyBwZXIgc3RyaXAKICAgIHN0cmlwX2J1Zl9zaXplID0gU1RSSVBfSEVBREVSX1NJWkUgKyAzICogQ0hVTktfSEVBREVSX1NJWkUgKyAyICogVkVDVE9SX01BWCAqIENPREVCT09LX01BWCArIDQgKiAobWJfY291bnQgKyAobWJfY291bnQgKyAxNSkgLyAxNikgKyAoMiAqIENPREVCT09LX01BWCkvODsKCiAgICBmcmFtZV9idWZfc2l6ZSA9IENWSURfSEVBREVSX1NJWkUgKyBzLT5tYXhfbWF4X3N0cmlwcyAqIHN0cmlwX2J1Zl9zaXplOwoKICAgIGlmICghKHMtPnN0cmlwX2J1ZiA9IGF2X21hbGxvYyhzdHJpcF9idWZfc2l6ZSkpKQogICAgICAgIGdvdG8gZW5vbWVtOwoKICAgIGlmICghKHMtPmZyYW1lX2J1ZiA9IGF2X21hbGxvYyhmcmFtZV9idWZfc2l6ZSkpKQogICAgICAgIGdvdG8gZW5vbWVtOwoKICAgIGlmICghKHMtPm1iID0gYXZfbWFsbG9jX2FycmF5KG1iX2NvdW50LCBzaXplb2YobWJfaW5mbykpKSkKICAgICAgICBnb3RvIGVub21lbTsKCiNpZmRlZiBDSU5FUEFLRU5DX0RFQlVHCiAgICBpZiAoIShzLT5iZXN0X21iID0gYXZfbWFsbG9jX2FycmF5KG1iX2NvdW50LCBzaXplb2YobWJfaW5mbykpKSkKICAgICAgICBnb3RvIGVub21lbTsKI2VuZGlmCgogICAgYXZfbGZnX2luaXQoJnMtPnJhbmRjdHgsIDEpOwogICAgcy0+YXZjdHggPSBhdmN0eDsKICAgIHMtPncgPSBhdmN0eC0+d2lkdGg7CiAgICBzLT5oID0gYXZjdHgtPmhlaWdodDsKICAgIHMtPmZyYW1lX2J1Zl9zaXplID0gZnJhbWVfYnVmX3NpemU7CiAgICBzLT5jdXJmcmFtZSA9IDA7CiAgICBzLT5rZXlpbnQgPSBhdmN0eC0+a2V5aW50X21pbjsKICAgIHMtPnBpeF9mbXQgPSBhdmN0eC0+cGl4X2ZtdDsKCiAgICAvL3NldCB1cCBBVkZyYW1lcwogICAgcy0+bGFzdF9mcmFtZS0+ZGF0YVswXSAgICAgICAgPSBzLT5waWN0X2J1ZnNbMF07CiAgICBzLT5sYXN0X2ZyYW1lLT5saW5lc2l6ZVswXSAgICA9IHMtPnc7CiAgICBzLT5iZXN0X2ZyYW1lLT5kYXRhWzBdICAgICAgICA9IHMtPnBpY3RfYnVmc1sxXTsKICAgIHMtPmJlc3RfZnJhbWUtPmxpbmVzaXplWzBdICAgID0gcy0+dzsKICAgIHMtPnNjcmF0Y2hfZnJhbWUtPmRhdGFbMF0gICAgID0gcy0+cGljdF9idWZzWzJdOwogICAgcy0+c2NyYXRjaF9mcmFtZS0+bGluZXNpemVbMF0gPSBzLT53OwoKICAgIGlmIChzLT5waXhfZm10ID09IEFWX1BJWF9GTVRfUkdCMjQpIHsKICAgICAgICBzLT5sYXN0X2ZyYW1lLT5kYXRhWzFdICAgICAgICA9IHMtPmxhc3RfZnJhbWUtPmRhdGFbMF0gKyBzLT53ICogcy0+aDsKICAgICAgICBzLT5sYXN0X2ZyYW1lLT5kYXRhWzJdICAgICAgICA9IHMtPmxhc3RfZnJhbWUtPmRhdGFbMV0gKyAoKHMtPncgKiBzLT5oKSA+PiAyKTsKICAgICAgICBzLT5sYXN0X2ZyYW1lLT5saW5lc2l6ZVsxXSAgICA9IHMtPmxhc3RfZnJhbWUtPmxpbmVzaXplWzJdID0gcy0+dyA+PiAxOwoKICAgICAgICBzLT5iZXN0X2ZyYW1lLT5kYXRhWzFdICAgICAgICA9IHMtPmJlc3RfZnJhbWUtPmRhdGFbMF0gKyBzLT53ICogcy0+aDsKICAgICAgICBzLT5iZXN0X2ZyYW1lLT5kYXRhWzJdICAgICAgICA9IHMtPmJlc3RfZnJhbWUtPmRhdGFbMV0gKyAoKHMtPncgKiBzLT5oKSA+PiAyKTsKICAgICAgICBzLT5iZXN0X2ZyYW1lLT5saW5lc2l6ZVsxXSAgICA9IHMtPmJlc3RfZnJhbWUtPmxpbmVzaXplWzJdID0gcy0+dyA+PiAxOwoKICAgICAgICBzLT5zY3JhdGNoX2ZyYW1lLT5kYXRhWzFdICAgICA9IHMtPnNjcmF0Y2hfZnJhbWUtPmRhdGFbMF0gKyBzLT53ICogcy0+aDsKICAgICAgICBzLT5zY3JhdGNoX2ZyYW1lLT5kYXRhWzJdICAgICA9IHMtPnNjcmF0Y2hfZnJhbWUtPmRhdGFbMV0gKyAoKHMtPncgKiBzLT5oKSA+PiAyKTsKICAgICAgICBzLT5zY3JhdGNoX2ZyYW1lLT5saW5lc2l6ZVsxXSA9IHMtPnNjcmF0Y2hfZnJhbWUtPmxpbmVzaXplWzJdID0gcy0+dyA+PiAxOwoKICAgICAgICBzLT5pbnB1dF9mcmFtZS0+ZGF0YVswXSAgICAgICA9IHMtPnBpY3RfYnVmc1szXTsKICAgICAgICBzLT5pbnB1dF9mcmFtZS0+bGluZXNpemVbMF0gICA9IHMtPnc7CiAgICAgICAgcy0+aW5wdXRfZnJhbWUtPmRhdGFbMV0gICAgICAgPSBzLT5pbnB1dF9mcmFtZS0+ZGF0YVswXSArIHMtPncgKiBzLT5oOwogICAgICAgIHMtPmlucHV0X2ZyYW1lLT5kYXRhWzJdICAgICAgID0gcy0+aW5wdXRfZnJhbWUtPmRhdGFbMV0gKyAoKHMtPncgKiBzLT5oKSA+PiAyKTsKICAgICAgICBzLT5pbnB1dF9mcmFtZS0+bGluZXNpemVbMV0gICA9IHMtPmlucHV0X2ZyYW1lLT5saW5lc2l6ZVsyXSA9IHMtPncgPj4gMTsKICAgIH0KCiAgICBzLT5taW5fc3RyaXBzID0gcy0+bWluX21pbl9zdHJpcHM7CiAgICBzLT5tYXhfc3RyaXBzID0gcy0+bWF4X21heF9zdHJpcHM7CgojaWZkZWYgQ0lORVBBS0VOQ19ERUJVRwogICAgcy0+bnVtX3YxX21vZGUgPSBzLT5udW1fdjRfbW9kZSA9IHMtPm51bV9tY19tb2RlID0gcy0+bnVtX3YxX2VuY3MgPSBzLT5udW1fdjRfZW5jcyA9IHMtPm51bV9za2lwcyA9IDA7CiNlbmRpZgoKICAgIHJldHVybiAwOwoKZW5vbWVtOgogICAgYXZfZnJhbWVfZnJlZSgmcy0+bGFzdF9mcmFtZSk7CiAgICBhdl9mcmFtZV9mcmVlKCZzLT5iZXN0X2ZyYW1lKTsKICAgIGF2X2ZyYW1lX2ZyZWUoJnMtPnNjcmF0Y2hfZnJhbWUpOwogICAgaWYgKGF2Y3R4LT5waXhfZm10ID09IEFWX1BJWF9GTVRfUkdCMjQpCiAgICAgICAgYXZfZnJhbWVfZnJlZSgmcy0+aW5wdXRfZnJhbWUpOwogICAgYXZfZnJlZXAoJnMtPmNvZGVib29rX2lucHV0KTsKICAgIGF2X2ZyZWVwKCZzLT5jb2RlYm9va19jbG9zZXN0KTsKICAgIGF2X2ZyZWVwKCZzLT5zdHJpcF9idWYpOwogICAgYXZfZnJlZXAoJnMtPmZyYW1lX2J1Zik7CiAgICBhdl9mcmVlcCgmcy0+bWIpOwojaWZkZWYgQ0lORVBBS0VOQ19ERUJVRwogICAgYXZfZnJlZXAoJnMtPmJlc3RfbWIpOwojZW5kaWYKCiAgICBmb3IoeCA9IDA7IHggPCAoYXZjdHgtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9SR0IyNCA/IDQgOiAzKTsgeCsrKQogICAgICAgIGF2X2ZyZWVwKCZzLT5waWN0X2J1ZnNbeF0pOwoKICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7Cn0KCnN0YXRpYyBpbnQ2NF90IGNhbGN1bGF0ZV9tb2RlX3Njb3JlKENpbmVwYWtFbmNDb250ZXh0ICpzLCBpbnQgaCwgc3RyaXBfaW5mbyAqaW5mbywgaW50IHJlcG9ydCwgaW50ICp0cmFpbmluZ19zZXRfdjFfc2hydW5rLCBpbnQgKnRyYWluaW5nX3NldF92NF9zaHJ1bmsKI2lmZGVmIENJTkVQQUtfUkVQT1JUX1NFUlIKLCBpbnQ2NF90ICpzZXJyCiNlbmRpZgopCnsKICAgIC8vc2NvcmUgPSBGRl9MQU1CREFfU0NBTEUgKiBlcnJvciArIGxhbWJkYSAqIGJpdHMKICAgIGludCB4OwogICAgaW50IGVudHJ5X3NpemUgPSBzLT5waXhfZm10ID09IEFWX1BJWF9GTVRfUkdCMjQgPyA2IDogNDsKICAgIGludCBtYl9jb3VudCA9IHMtPncgKiBoIC8gTUJfQVJFQTsKICAgIG1iX2luZm8gKm1iOwogICAgaW50NjRfdCBzY29yZTEsIHNjb3JlMiwgc2NvcmUzOwogICAgaW50NjRfdCByZXQgPSBzLT5sYW1iZGEgKiAoKGluZm8tPnYxX3NpemUgPyBDSFVOS19IRUFERVJfU0laRSArIGluZm8tPnYxX3NpemUgKiBlbnRyeV9zaXplIDogMCkgKwogICAgICAgICAgICAgICAgICAgKGluZm8tPnY0X3NpemUgPyBDSFVOS19IRUFERVJfU0laRSArIGluZm8tPnY0X3NpemUgKiBlbnRyeV9zaXplIDogMCkgKwogICAgICAgICAgICAgICAgICAgQ0hVTktfSEVBREVSX1NJWkUpIDw8IDM7CgogICAgLy9hdl9sb2cocy0+YXZjdHgsIEFWX0xPR19JTkZPLCAic2l6ZXMgJTNpICUzaSAtPiAlOSJQUklkNjQiIHNjb3JlIG1iX2NvdW50ICVpIiwgaW5mby0+djFfc2l6ZSwgaW5mby0+djRfc2l6ZSwgcmV0LCBtYl9jb3VudCk7CgojaWZkZWYgQ0lORVBBS19SRVBPUlRfU0VSUgogICAgKnNlcnIgPSAwOwojZW5kaWYKCiAgICBzd2l0Y2goaW5mby0+bW9kZSkgewogICAgY2FzZSBNT0RFX1YxX09OTFk6CiAgICAgICAgLy9vbmUgYnl0ZSBwZXIgTUIKICAgICAgICByZXQgKz0gcy0+bGFtYmRhICogOCAqIG1iX2NvdW50OwoKLy8gd2hpbGUgY2FsY3VsYXRpbmcgd2UgYXNzdW1lIGFsbCBibG9ja3MgYXJlIEVOQ19WMQogICAgICAgIGZvcih4ID0gMDsgeCA8IG1iX2NvdW50OyB4KyspIHsKICAgICAgICAgICAgbWIgPSAmcy0+bWJbeF07CiAgICAgICAgICAgIHJldCArPSBGRl9MQU1CREFfU0NBTEUgKiBtYi0+djFfZXJyb3I7CiNpZmRlZiBDSU5FUEFLX1JFUE9SVF9TRVJSCiAgICAgICAgICAgICpzZXJyICs9IG1iLT52MV9lcnJvcjsKI2VuZGlmCi8vIHRoaXMgZnVuY3Rpb24gaXMgbmV2ZXIgY2FsbGVkIGZvciByZXBvcnQgaW4gTU9ERV9WMV9PTkxZCi8vICAgICAgICAgICAgaWYoIXJlcG9ydCkKICAgICAgICAgICAgbWItPmJlc3RfZW5jb2RpbmcgPSBFTkNfVjE7CiAgICAgICAgfQoKICAgICAgICBicmVhazsKICAgIGNhc2UgTU9ERV9WMV9WNDoKICAgICAgICAvLzkgb3IgMzMgYml0cyBwZXIgTUIKICAgICAgICBpZihyZXBvcnQpIHsKLy8gbm8gbW92ZXMgYmV0d2VlbiB0aGUgY29ycmVzcG9uZGluZyB0cmFpbmluZyBzZXRzIGFyZSBhbGxvd2VkCiAgICAgICAgICAgICp0cmFpbmluZ19zZXRfdjFfc2hydW5rID0gKnRyYWluaW5nX3NldF92NF9zaHJ1bmsgPSAwOwogICAgICAgICAgICBmb3IoeCA9IDA7IHggPCBtYl9jb3VudDsgeCsrKSB7CiAgICAgICAgICAgICAgICBpbnQgbWJlcnI7CiAgICAgICAgICAgICAgICBtYiA9ICZzLT5tYlt4XTsKICAgICAgICAgICAgICAgIGlmKG1iLT5iZXN0X2VuY29kaW5nID09IEVOQ19WMSkKICAgICAgICAgICAgICAgICAgICBzY29yZTEgPSBzLT5sYW1iZGEgKiA5ICArIEZGX0xBTUJEQV9TQ0FMRSAqIChtYmVycj1tYi0+djFfZXJyb3IpOwogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIHNjb3JlMSA9IHMtPmxhbWJkYSAqIDMzICsgRkZfTEFNQkRBX1NDQUxFICogKG1iZXJyPW1iLT52NF9lcnJvcik7CiAgICAgICAgICAgICAgICByZXQgKz0gc2NvcmUxOwojaWZkZWYgQ0lORVBBS19SRVBPUlRfU0VSUgogICAgICAgICAgICAgICAgKnNlcnIgKz0gbWJlcnI7CiNlbmRpZgogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsgLy8gZmluZCBiZXN0IG1vZGUgcGVyIGJsb2NrCiAgICAgICAgICAgIGZvcih4ID0gMDsgeCA8IG1iX2NvdW50OyB4KyspIHsKICAgICAgICAgICAgICAgIG1iID0gJnMtPm1iW3hdOwogICAgICAgICAgICAgICAgc2NvcmUxID0gcy0+bGFtYmRhICogOSAgKyBGRl9MQU1CREFfU0NBTEUgKiBtYi0+djFfZXJyb3I7CiAgICAgICAgICAgICAgICBzY29yZTIgPSBzLT5sYW1iZGEgKiAzMyArIEZGX0xBTUJEQV9TQ0FMRSAqIG1iLT52NF9lcnJvcjsKCiAgICAgICAgICAgICAgICBpZihzY29yZTEgPD0gc2NvcmUyKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0ICs9IHNjb3JlMTsKI2lmZGVmIENJTkVQQUtfUkVQT1JUX1NFUlIKICAgICAgICAgICAgICAgICAgICAqc2VyciArPSBtYi0+djFfZXJyb3I7CiNlbmRpZgogICAgICAgICAgICAgICAgICAgIG1iLT5iZXN0X2VuY29kaW5nID0gRU5DX1YxOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICByZXQgKz0gc2NvcmUyOwojaWZkZWYgQ0lORVBBS19SRVBPUlRfU0VSUgogICAgICAgICAgICAgICAgICAgICpzZXJyICs9IG1iLT52NF9lcnJvcjsKI2VuZGlmCiAgICAgICAgICAgICAgICAgICAgbWItPmJlc3RfZW5jb2RpbmcgPSBFTkNfVjQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGJyZWFrOwogICAgY2FzZSBNT0RFX01DOgogICAgICAgIC8vMSwgMTAgb3IgMzQgYml0cyBwZXIgTUIKICAgICAgICBpZihyZXBvcnQpIHsKICAgICAgICAgICAgaW50IHYxX3NocnVuayA9IDAsIHY0X3NocnVuayA9IDA7CiAgICAgICAgICAgIGZvcih4ID0gMDsgeCA8IG1iX2NvdW50OyB4KyspIHsKICAgICAgICAgICAgICAgIG1iID0gJnMtPm1iW3hdOwovLyBpdCBpcyBPSyB0byBtb3ZlIGJsb2NrcyB0byBFTkNfU0tJUCBoZXJlCi8vIGJ1dCBub3QgdG8gYW55IGNvZGVib29rIGVuY29kaW5nIQogICAgICAgICAgICAgICAgc2NvcmUxID0gcy0+bGFtYmRhICogMSAgKyBGRl9MQU1CREFfU0NBTEUgKiBtYi0+c2tpcF9lcnJvcjsKICAgICAgICAgICAgICAgIGlmKG1iLT5iZXN0X2VuY29kaW5nID09IEVOQ19TS0lQKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0ICs9IHNjb3JlMTsKI2lmZGVmIENJTkVQQUtfUkVQT1JUX1NFUlIKICAgICAgICAgICAgICAgICAgICAqc2VyciArPSBtYi0+c2tpcF9lcnJvcjsKI2VuZGlmCiAgICAgICAgICAgICAgICB9IGVsc2UgaWYobWItPmJlc3RfZW5jb2RpbmcgPT0gRU5DX1YxKSB7CiAgICAgICAgICAgICAgICAgICAgaWYoKHNjb3JlMj1zLT5sYW1iZGEgKiAxMCArIEZGX0xBTUJEQV9TQ0FMRSAqIG1iLT52MV9lcnJvcikgPj0gc2NvcmUxKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1iLT5iZXN0X2VuY29kaW5nID0gRU5DX1NLSVA7CiAgICAgICAgICAgICAgICAgICAgICAgICsrdjFfc2hydW5rOwogICAgICAgICAgICAgICAgICAgICAgICByZXQgKz0gc2NvcmUxOwojaWZkZWYgQ0lORVBBS19SRVBPUlRfU0VSUgogICAgICAgICAgICAgICAgICAgICAgICAqc2VyciArPSBtYi0+c2tpcF9lcnJvcjsKI2VuZGlmCiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0ICs9IHNjb3JlMjsKI2lmZGVmIENJTkVQQUtfUkVQT1JUX1NFUlIKICAgICAgICAgICAgICAgICAgICAgICAgKnNlcnIgKz0gbWItPnYxX2Vycm9yOwojZW5kaWYKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGlmKChzY29yZTM9cy0+bGFtYmRhICogMzQgKyBGRl9MQU1CREFfU0NBTEUgKiBtYi0+djRfZXJyb3IpID49IHNjb3JlMSkgewogICAgICAgICAgICAgICAgICAgICAgICBtYi0+YmVzdF9lbmNvZGluZyA9IEVOQ19TS0lQOwogICAgICAgICAgICAgICAgICAgICAgICArK3Y0X3NocnVuazsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0ICs9IHNjb3JlMTsKI2lmZGVmIENJTkVQQUtfUkVQT1JUX1NFUlIKICAgICAgICAgICAgICAgICAgICAgICAgKnNlcnIgKz0gbWItPnNraXBfZXJyb3I7CiNlbmRpZgogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldCArPSBzY29yZTM7CiNpZmRlZiBDSU5FUEFLX1JFUE9SVF9TRVJSCiAgICAgICAgICAgICAgICAgICAgICAgICpzZXJyICs9IG1iLT52NF9lcnJvcjsKI2VuZGlmCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgICp0cmFpbmluZ19zZXRfdjFfc2hydW5rID0gdjFfc2hydW5rOwogICAgICAgICAgICAqdHJhaW5pbmdfc2V0X3Y0X3NocnVuayA9IHY0X3NocnVuazsKICAgICAgICB9IGVsc2UgeyAvLyBmaW5kIGJlc3QgbW9kZSBwZXIgYmxvY2sKICAgICAgICAgICAgZm9yKHggPSAwOyB4IDwgbWJfY291bnQ7IHgrKykgewogICAgICAgICAgICAgICAgbWIgPSAmcy0+bWJbeF07CiAgICAgICAgICAgICAgICBzY29yZTEgPSBzLT5sYW1iZGEgKiAxICArIEZGX0xBTUJEQV9TQ0FMRSAqIG1iLT5za2lwX2Vycm9yOwogICAgICAgICAgICAgICAgc2NvcmUyID0gcy0+bGFtYmRhICogMTAgKyBGRl9MQU1CREFfU0NBTEUgKiBtYi0+djFfZXJyb3I7CiAgICAgICAgICAgICAgICBzY29yZTMgPSBzLT5sYW1iZGEgKiAzNCArIEZGX0xBTUJEQV9TQ0FMRSAqIG1iLT52NF9lcnJvcjsKCiAgICAgICAgICAgICAgICBpZihzY29yZTEgPD0gc2NvcmUyICYmIHNjb3JlMSA8PSBzY29yZTMpIHsKICAgICAgICAgICAgICAgICAgICByZXQgKz0gc2NvcmUxOwojaWZkZWYgQ0lORVBBS19SRVBPUlRfU0VSUgogICAgICAgICAgICAgICAgICAgICpzZXJyICs9IG1iLT5za2lwX2Vycm9yOwojZW5kaWYKICAgICAgICAgICAgICAgICAgICBtYi0+YmVzdF9lbmNvZGluZyA9IEVOQ19TS0lQOwogICAgICAgICAgICAgICAgfSBlbHNlIGlmKHNjb3JlMiA8PSBzY29yZTMpIHsKICAgICAgICAgICAgICAgICAgICByZXQgKz0gc2NvcmUyOwojaWZkZWYgQ0lORVBBS19SRVBPUlRfU0VSUgogICAgICAgICAgICAgICAgICAgICpzZXJyICs9IG1iLT52MV9lcnJvcjsKI2VuZGlmCiAgICAgICAgICAgICAgICAgICAgbWItPmJlc3RfZW5jb2RpbmcgPSBFTkNfVjE7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIHJldCArPSBzY29yZTM7CiNpZmRlZiBDSU5FUEFLX1JFUE9SVF9TRVJSCiAgICAgICAgICAgICAgICAgICAgKnNlcnIgKz0gbWItPnY0X2Vycm9yOwojZW5kaWYKICAgICAgICAgICAgICAgICAgICBtYi0+YmVzdF9lbmNvZGluZyA9IEVOQ19WNDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgYnJlYWs7CiAgICB9CgogICAgcmV0dXJuIHJldDsKfQoKc3RhdGljIGludCB3cml0ZV9jaHVua19oZWFkZXIodW5zaWduZWQgY2hhciAqYnVmLCBpbnQgY2h1bmtfdHlwZSwgaW50IGNodW5rX3NpemUpCnsKICAgIGJ1ZlswXSA9IGNodW5rX3R5cGU7CiAgICBBVl9XQjI0KCZidWZbMV0sIGNodW5rX3NpemUgKyBDSFVOS19IRUFERVJfU0laRSk7CiAgICByZXR1cm4gQ0hVTktfSEVBREVSX1NJWkU7Cn0KCnN0YXRpYyBpbnQgZW5jb2RlX2NvZGVib29rKENpbmVwYWtFbmNDb250ZXh0ICpzLCBpbnQgKmNvZGVib29rLCBpbnQgc2l6ZSwgaW50IGNodW5rX3R5cGVfeXV2LCBpbnQgY2h1bmtfdHlwZV9ncmF5LCB1bnNpZ25lZCBjaGFyICpidWYpCnsKICAgIGludCB4LCB5LCByZXQsIGVudHJ5X3NpemUgPSBzLT5waXhfZm10ID09IEFWX1BJWF9GTVRfUkdCMjQgPyA2IDogNDsKICAgIGludCBpbmNyZW1lbnRhbF9jb2RlYm9va19yZXBsYWNlbWVudF9tb2RlID0gMDsgLy8gaGFyZGNvZGVkIGhlcmUsCiAgICAgICAgICAgICAgICAvLyB0aGUgY29tcGlsZXIgc2hvdWxkIG5vdGljZSB0aGF0IHRoaXMgaXMgYSBjb25zdGFudCAtLSBybAoKICAgIHJldCA9IHdyaXRlX2NodW5rX2hlYWRlcihidWYsCiAgICAgICAgICBzLT5waXhfZm10ID09IEFWX1BJWF9GTVRfUkdCMjQgPwogICAgICAgICAgIGNodW5rX3R5cGVfeXV2KyhpbmNyZW1lbnRhbF9jb2RlYm9va19yZXBsYWNlbWVudF9tb2RlPzE6MCkgOgogICAgICAgICAgIGNodW5rX3R5cGVfZ3JheSsoaW5jcmVtZW50YWxfY29kZWJvb2tfcmVwbGFjZW1lbnRfbW9kZT8xOjApLAogICAgICAgICAgZW50cnlfc2l6ZSAqIHNpemUKICAgICAgICAgICArIChpbmNyZW1lbnRhbF9jb2RlYm9va19yZXBsYWNlbWVudF9tb2RlPyhzaXplKzMxKS8zMio0OjApICk7CgovLyB3ZSBkbyBjb2RlYm9vayBlbmNvZGluZyBhY2NvcmRpbmcgdG8gdGhlICJpbnRyYSIgbW9kZQovLyBidXQgd2Uga2VlcCB0aGUgImRlYWQiIGNvZGUgZm9yIHJlZmVyZW5jZSBpbiBjYXNlIHdlIHdpbGwgd2FudAovLyB0byB1c2UgaW5jcmVtZW50YWwgY29kZWJvb2sgdXBkYXRlcyAod2hpY2ggYWN0dWFsbHkgd291bGQgZ2l2ZSB1cwovLyAia2luZCBvZiIgbW90aW9uIGNvbXBlbnNhdGlvbiwgZXNwZWNpYWxseSBpbiAxIHN0cmlwL2ZyYW1lIGNhc2UpIC0tIHJsCi8vIChvZiBjb3Vyc2UsIHRoZSBjb2RlIHdpbGwgYmUgbm90IHVzZWZ1bCBhcy1pcykKICAgIGlmKGluY3JlbWVudGFsX2NvZGVib29rX3JlcGxhY2VtZW50X21vZGUpIHsKICAgICAgICBpbnQgZmxhZ3MgPSAwOwogICAgICAgIGludCBmbGFnc2luZDsKICAgICAgICBmb3IoeCA9IDA7IHggPCBzaXplOyB4KyspIHsKICAgICAgICAgICAgaWYoZmxhZ3MgPT0gMCkgewogICAgICAgICAgICAgICAgZmxhZ3NpbmQgPSByZXQ7CiAgICAgICAgICAgICAgICByZXQgKz0gNDsKICAgICAgICAgICAgICAgIGZsYWdzID0gMHg4MDAwMDAwMDsKICAgICAgICAgICAgfSBlbHNlCiAgICAgICAgICAgICAgICBmbGFncyA9ICgoZmxhZ3M+PjEpIHwgMHg4MDAwMDAwMCk7CiAgICAgICAgICAgIGZvcih5ID0gMDsgeSA8IGVudHJ5X3NpemU7IHkrKykKICAgICAgICAgICAgICAgIGJ1ZltyZXQrK10gPSBjb2RlYm9va1t5ICsgeCplbnRyeV9zaXplXSBeICh5ID49IDQgPyAweDgwIDogMCk7CiAgICAgICAgICAgIGlmKChmbGFncyYweGZmZmZmZmZmKSA9PSAweGZmZmZmZmZmKSB7CiAgICAgICAgICAgICAgICBBVl9XQjMyKCZidWZbZmxhZ3NpbmRdLCBmbGFncyk7CiAgICAgICAgICAgICAgICBmbGFncyA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYoZmxhZ3MpCiAgICAgICAgICAgIEFWX1dCMzIoJmJ1ZltmbGFnc2luZF0sIGZsYWdzKTsKICAgIH0gZWxzZQogICAgICAgIGZvcih4ID0gMDsgeCA8IHNpemU7IHgrKykKICAgICAgICAgICAgZm9yKHkgPSAwOyB5IDwgZW50cnlfc2l6ZTsgeSsrKQogICAgICAgICAgICAgICAgYnVmW3JldCsrXSA9IGNvZGVib29rW3kgKyB4KmVudHJ5X3NpemVdIF4gKHkgPj0gNCA/IDB4ODAgOiAwKTsKCiAgICByZXR1cm4gcmV0Owp9CgovL3NldHMgb3V0IHRvIHRoZSBzdWIgcGljdHVyZSBzdGFydGluZyBhdCAoeCx5KSBpbiBpbgpzdGF0aWMgdm9pZCBnZXRfc3ViX3BpY3R1cmUoQ2luZXBha0VuY0NvbnRleHQgKnMsIGludCB4LCBpbnQgeSwgQVZQaWN0dXJlICppbiwgQVZQaWN0dXJlICpvdXQpCnsKICAgIG91dC0+ZGF0YVswXSA9IGluLT5kYXRhWzBdICsgeCArIHkgKiBpbi0+bGluZXNpemVbMF07CiAgICBvdXQtPmxpbmVzaXplWzBdID0gaW4tPmxpbmVzaXplWzBdOwoKICAgIGlmKHMtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9SR0IyNCkgewogICAgICAgIG91dC0+ZGF0YVsxXSA9IGluLT5kYXRhWzFdICsgKHggPj4gMSkgKyAoeSA+PiAxKSAqIGluLT5saW5lc2l6ZVsxXTsKICAgICAgICBvdXQtPmxpbmVzaXplWzFdID0gaW4tPmxpbmVzaXplWzFdOwoKICAgICAgICBvdXQtPmRhdGFbMl0gPSBpbi0+ZGF0YVsyXSArICh4ID4+IDEpICsgKHkgPj4gMSkgKiBpbi0+bGluZXNpemVbMl07CiAgICAgICAgb3V0LT5saW5lc2l6ZVsyXSA9IGluLT5saW5lc2l6ZVsyXTsKICAgIH0KfQoKLy9kZWNvZGVzIHRoZSBWMSB2ZWN0b3IgaW4gbWIgaW50byB0aGUgNHg0IE1CIHBvaW50ZWQgdG8gYnkgc3ViX3BpY3QKc3RhdGljIHZvaWQgZGVjb2RlX3YxX3ZlY3RvcihDaW5lcGFrRW5jQ29udGV4dCAqcywgQVZQaWN0dXJlICpzdWJfcGljdCwgaW50IHYxX3ZlY3Rvciwgc3RyaXBfaW5mbyAqaW5mbykKewogICAgaW50IGVudHJ5X3NpemUgPSBzLT5waXhfZm10ID09IEFWX1BJWF9GTVRfUkdCMjQgPyA2IDogNDsKCiAgICBzdWJfcGljdC0+ZGF0YVswXVswXSA9CiAgICAgICAgICAgIHN1Yl9waWN0LT5kYXRhWzBdWzFdID0KICAgICAgICAgICAgc3ViX3BpY3QtPmRhdGFbMF1bICAgIHN1Yl9waWN0LT5saW5lc2l6ZVswXV0gPQogICAgICAgICAgICBzdWJfcGljdC0+ZGF0YVswXVsxKyAgc3ViX3BpY3QtPmxpbmVzaXplWzBdXSA9IGluZm8tPnYxX2NvZGVib29rW3YxX3ZlY3RvciplbnRyeV9zaXplXTsKCiAgICBzdWJfcGljdC0+ZGF0YVswXVsyXSA9CiAgICAgICAgICAgIHN1Yl9waWN0LT5kYXRhWzBdWzNdID0KICAgICAgICAgICAgc3ViX3BpY3QtPmRhdGFbMF1bMisgIHN1Yl9waWN0LT5saW5lc2l6ZVswXV0gPQogICAgICAgICAgICBzdWJfcGljdC0+ZGF0YVswXVszKyAgc3ViX3BpY3QtPmxpbmVzaXplWzBdXSA9IGluZm8tPnYxX2NvZGVib29rW3YxX3ZlY3RvciplbnRyeV9zaXplKzFdOwoKICAgIHN1Yl9waWN0LT5kYXRhWzBdWzIqc3ViX3BpY3QtPmxpbmVzaXplWzBdXSA9CiAgICAgICAgICAgIHN1Yl9waWN0LT5kYXRhWzBdWzErMipzdWJfcGljdC0+bGluZXNpemVbMF1dID0KICAgICAgICAgICAgc3ViX3BpY3QtPmRhdGFbMF1bICAzKnN1Yl9waWN0LT5saW5lc2l6ZVswXV0gPQogICAgICAgICAgICBzdWJfcGljdC0+ZGF0YVswXVsxKzMqc3ViX3BpY3QtPmxpbmVzaXplWzBdXSA9IGluZm8tPnYxX2NvZGVib29rW3YxX3ZlY3RvciplbnRyeV9zaXplKzJdOwoKICAgIHN1Yl9waWN0LT5kYXRhWzBdWzIrMipzdWJfcGljdC0+bGluZXNpemVbMF1dID0KICAgICAgICAgICAgc3ViX3BpY3QtPmRhdGFbMF1bMysyKnN1Yl9waWN0LT5saW5lc2l6ZVswXV0gPQogICAgICAgICAgICBzdWJfcGljdC0+ZGF0YVswXVsyKzMqc3ViX3BpY3QtPmxpbmVzaXplWzBdXSA9CiAgICAgICAgICAgIHN1Yl9waWN0LT5kYXRhWzBdWzMrMypzdWJfcGljdC0+bGluZXNpemVbMF1dID0gaW5mby0+djFfY29kZWJvb2tbdjFfdmVjdG9yKmVudHJ5X3NpemUrM107CgogICAgaWYocy0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX1JHQjI0KSB7CiAgICAgICAgc3ViX3BpY3QtPmRhdGFbMV1bMF0gPQogICAgICAgICAgICBzdWJfcGljdC0+ZGF0YVsxXVsxXSA9CiAgICAgICAgICAgIHN1Yl9waWN0LT5kYXRhWzFdWyAgICBzdWJfcGljdC0+bGluZXNpemVbMV1dID0KICAgICAgICAgICAgc3ViX3BpY3QtPmRhdGFbMV1bMSsgIHN1Yl9waWN0LT5saW5lc2l6ZVsxXV0gPSBpbmZvLT52MV9jb2RlYm9va1t2MV92ZWN0b3IqZW50cnlfc2l6ZSs0XTsKCiAgICAgICAgc3ViX3BpY3QtPmRhdGFbMl1bMF0gPQogICAgICAgICAgICBzdWJfcGljdC0+ZGF0YVsyXVsxXSA9CiAgICAgICAgICAgIHN1Yl9waWN0LT5kYXRhWzJdWyAgICBzdWJfcGljdC0+bGluZXNpemVbMl1dID0KICAgICAgICAgICAgc3ViX3BpY3QtPmRhdGFbMl1bMSsgIHN1Yl9waWN0LT5saW5lc2l6ZVsyXV0gPSBpbmZvLT52MV9jb2RlYm9va1t2MV92ZWN0b3IqZW50cnlfc2l6ZSs1XTsKICAgIH0KfQoKLy9kZWNvZGVzIHRoZSBWNCB2ZWN0b3JzIGluIG1iIGludG8gdGhlIDR4NCBNQiBwb2ludGVkIHRvIGJ5IHN1Yl9waWN0CnN0YXRpYyB2b2lkIGRlY29kZV92NF92ZWN0b3IoQ2luZXBha0VuY0NvbnRleHQgKnMsIEFWUGljdHVyZSAqc3ViX3BpY3QsIGludCAqdjRfdmVjdG9yLCBzdHJpcF9pbmZvICppbmZvKQp7CiAgICBpbnQgaSwgeCwgeSwgZW50cnlfc2l6ZSA9IHMtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9SR0IyNCA/IDYgOiA0OwoKICAgIGZvcihpID0geSA9IDA7IHkgPCA0OyB5ICs9IDIpIHsKICAgICAgICBmb3IoeCA9IDA7IHggPCA0OyB4ICs9IDIsIGkrKykgewogICAgICAgICAgICBzdWJfcGljdC0+ZGF0YVswXVt4ICAgKyAgICAgeSpzdWJfcGljdC0+bGluZXNpemVbMF1dID0gaW5mby0+djRfY29kZWJvb2tbdjRfdmVjdG9yW2ldKmVudHJ5X3NpemVdOwogICAgICAgICAgICBzdWJfcGljdC0+ZGF0YVswXVt4KzEgKyAgICAgeSpzdWJfcGljdC0+bGluZXNpemVbMF1dID0gaW5mby0+djRfY29kZWJvb2tbdjRfdmVjdG9yW2ldKmVudHJ5X3NpemUrMV07CiAgICAgICAgICAgIHN1Yl9waWN0LT5kYXRhWzBdW3ggICArICh5KzEpKnN1Yl9waWN0LT5saW5lc2l6ZVswXV0gPSBpbmZvLT52NF9jb2RlYm9va1t2NF92ZWN0b3JbaV0qZW50cnlfc2l6ZSsyXTsKICAgICAgICAgICAgc3ViX3BpY3QtPmRhdGFbMF1beCsxICsgKHkrMSkqc3ViX3BpY3QtPmxpbmVzaXplWzBdXSA9IGluZm8tPnY0X2NvZGVib29rW3Y0X3ZlY3RvcltpXSplbnRyeV9zaXplKzNdOwoKICAgICAgICAgICAgaWYocy0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX1JHQjI0KSB7CiAgICAgICAgICAgICAgICBzdWJfcGljdC0+ZGF0YVsxXVsoeD4+MSkgKyAoeT4+MSkqc3ViX3BpY3QtPmxpbmVzaXplWzFdXSA9IGluZm8tPnY0X2NvZGVib29rW3Y0X3ZlY3RvcltpXSplbnRyeV9zaXplKzRdOwogICAgICAgICAgICAgICAgc3ViX3BpY3QtPmRhdGFbMl1bKHg+PjEpICsgKHk+PjEpKnN1Yl9waWN0LT5saW5lc2l6ZVsyXV0gPSBpbmZvLT52NF9jb2RlYm9va1t2NF92ZWN0b3JbaV0qZW50cnlfc2l6ZSs1XTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KfQoKc3RhdGljIHZvaWQgY29weV9tYihDaW5lcGFrRW5jQ29udGV4dCAqcywgQVZQaWN0dXJlICphLCBBVlBpY3R1cmUgKmIpCnsKICAgIGludCB5LCBwOwoKICAgIGZvcih5ID0gMDsgeSA8IE1CX1NJWkU7IHkrKykgewogICAgICAgIG1lbWNweShhLT5kYXRhWzBdK3kqYS0+bGluZXNpemVbMF0sIGItPmRhdGFbMF0reSpiLT5saW5lc2l6ZVswXSwKICAgICAgICAgICAgICAgTUJfU0laRSk7CiAgICB9CgogICAgaWYocy0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX1JHQjI0KSB7CiAgICAgICAgZm9yKHAgPSAxOyBwIDw9IDI7IHArKykgewogICAgICAgICAgICBmb3IoeSA9IDA7IHkgPCBNQl9TSVpFLzI7IHkrKykgewogICAgICAgICAgICAgICAgbWVtY3B5KGEtPmRhdGFbcF0gKyB5KmEtPmxpbmVzaXplW3BdLAogICAgICAgICAgICAgICAgICAgICAgIGItPmRhdGFbcF0gKyB5KmItPmxpbmVzaXplW3BdLAogICAgICAgICAgICAgICAgICAgICAgIE1CX1NJWkUvMik7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9Cn0KCnN0YXRpYyBpbnQgZW5jb2RlX21vZGUoQ2luZXBha0VuY0NvbnRleHQgKnMsIGludCBoLCBBVlBpY3R1cmUgKnNjcmF0Y2hfcGljdCwgQVZQaWN0dXJlICpsYXN0X3BpY3QsIHN0cmlwX2luZm8gKmluZm8sIHVuc2lnbmVkIGNoYXIgKmJ1ZikKewogICAgaW50IHgsIHksIHosIGZsYWdzLCBiaXRzLCB0ZW1wX3NpemUsIGhlYWRlcl9vZnMsIHJldCA9IDAsIG1iX2NvdW50ID0gcy0+dyAqIGggLyBNQl9BUkVBOwogICAgaW50IG5lZWRzX2V4dHJhX2JpdCwgc2hvdWxkX3dyaXRlX3RlbXA7CiAgICB1bnNpZ25lZCBjaGFyIHRlbXBbNjRdOyAvLzMyLzIgPSAxNiBWNCBibG9ja3MgYXQgNCBCIGVhY2ggLT4gNjQgQgogICAgbWJfaW5mbyAqbWI7CiAgICBBVlBpY3R1cmUgc3ViX3NjcmF0Y2ggPSB7ezB9fSwgc3ViX2xhc3QgPSB7ezB9fTsKCiAgICAvL2VuY29kZSBjb2RlYm9va3MKLy8vLy8vIE1hY09TIHZpbnRhZ2UgZGVjb2RlciBjb21wYXRpYmlsaXR5IGRpY3RhdGVzIHRoZSBwcmVzZW5jZSBvZgovLy8vLy8gdGhlIGNvZGVib29rIGNodW5rIGV2ZW4gd2hlbiB0aGUgY29kZWJvb2sgaXMgZW1wdHkgLSBwcmV0dHkgZHVtYi4uLgovLy8vLy8gYW5kIGFsc28gdGhlIGNlcnRhaW4gb3JkZXIgb2YgdGhlIGNvZGVib29rIGNodW5rcyAtLSBybAogICAgaWYoaW5mby0+djRfc2l6ZSB8fCAhcy0+c2tpcF9lbXB0eV9jYikKICAgICAgICByZXQgKz0gZW5jb2RlX2NvZGVib29rKHMsIGluZm8tPnY0X2NvZGVib29rLCBpbmZvLT52NF9zaXplLCAweDIwLCAweDI0LCBidWYgKyByZXQpOwoKICAgIGlmKGluZm8tPnYxX3NpemUgfHwgIXMtPnNraXBfZW1wdHlfY2IpCiAgICAgICAgcmV0ICs9IGVuY29kZV9jb2RlYm9vayhzLCBpbmZvLT52MV9jb2RlYm9vaywgaW5mby0+djFfc2l6ZSwgMHgyMiwgMHgyNiwgYnVmICsgcmV0KTsKCiAgICAvL3VwZGF0ZSBzY3JhdGNoIHBpY3R1cmUKICAgIGZvcih6ID0geSA9IDA7IHkgPCBoOyB5ICs9IE1CX1NJWkUpIHsKICAgICAgICBmb3IoeCA9IDA7IHggPCBzLT53OyB4ICs9IE1CX1NJWkUsIHorKykgewogICAgICAgICAgICBtYiA9ICZzLT5tYlt6XTsKCiAgICAgICAgICAgIGdldF9zdWJfcGljdHVyZShzLCB4LCB5LCBzY3JhdGNoX3BpY3QsICZzdWJfc2NyYXRjaCk7CgogICAgICAgICAgICBpZihpbmZvLT5tb2RlID09IE1PREVfTUMgJiYgbWItPmJlc3RfZW5jb2RpbmcgPT0gRU5DX1NLSVApIHsKICAgICAgICAgICAgICAgIGdldF9zdWJfcGljdHVyZShzLCB4LCB5LCBsYXN0X3BpY3QsICZzdWJfbGFzdCk7CiAgICAgICAgICAgICAgICBjb3B5X21iKHMsICZzdWJfc2NyYXRjaCwgJnN1Yl9sYXN0KTsKICAgICAgICAgICAgfSBlbHNlIGlmKGluZm8tPm1vZGUgPT0gTU9ERV9WMV9PTkxZIHx8IG1iLT5iZXN0X2VuY29kaW5nID09IEVOQ19WMSkKICAgICAgICAgICAgICAgIGRlY29kZV92MV92ZWN0b3IocywgJnN1Yl9zY3JhdGNoLCBtYi0+djFfdmVjdG9yLCBpbmZvKTsKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgZGVjb2RlX3Y0X3ZlY3RvcihzLCAmc3ViX3NjcmF0Y2gsIG1iLT52NF92ZWN0b3IsIGluZm8pOwogICAgICAgIH0KICAgIH0KCiAgICBzd2l0Y2goaW5mby0+bW9kZSkgewogICAgY2FzZSBNT0RFX1YxX09OTFk6CiAgICAgICAgLy9hdl9sb2cocy0+YXZjdHgsIEFWX0xPR19JTkZPLCAibWJfY291bnQgPSAlaVxuIiwgbWJfY291bnQpOwogICAgICAgIHJldCArPSB3cml0ZV9jaHVua19oZWFkZXIoYnVmICsgcmV0LCAweDMyLCBtYl9jb3VudCk7CgogICAgICAgIGZvcih4ID0gMDsgeCA8IG1iX2NvdW50OyB4KyspCiAgICAgICAgICAgIGJ1ZltyZXQrK10gPSBzLT5tYlt4XS52MV92ZWN0b3I7CgogICAgICAgIGJyZWFrOwogICAgY2FzZSBNT0RFX1YxX1Y0OgogICAgICAgIC8vcmVtZW1iZXIgaGVhZGVyIHBvc2l0aW9uCiAgICAgICAgaGVhZGVyX29mcyA9IHJldDsKICAgICAgICByZXQgKz0gQ0hVTktfSEVBREVSX1NJWkU7CgogICAgICAgIGZvcih4ID0gMDsgeCA8IG1iX2NvdW50OyB4ICs9IDMyKSB7CiAgICAgICAgICAgIGZsYWdzID0gMDsKICAgICAgICAgICAgZm9yKHkgPSB4OyB5IDwgRkZNSU4oeCszMiwgbWJfY291bnQpOyB5KyspCiAgICAgICAgICAgICAgICBpZihzLT5tYlt5XS5iZXN0X2VuY29kaW5nID09IEVOQ19WNCkKICAgICAgICAgICAgICAgICAgICBmbGFncyB8PSAxIDw8ICgzMSAtIHkgKyB4KTsKCiAgICAgICAgICAgIEFWX1dCMzIoJmJ1ZltyZXRdLCBmbGFncyk7CiAgICAgICAgICAgIHJldCArPSA0OwoKICAgICAgICAgICAgZm9yKHkgPSB4OyB5IDwgRkZNSU4oeCszMiwgbWJfY291bnQpOyB5KyspIHsKICAgICAgICAgICAgICAgIG1iID0gJnMtPm1iW3ldOwoKICAgICAgICAgICAgICAgIGlmKG1iLT5iZXN0X2VuY29kaW5nID09IEVOQ19WMSkKICAgICAgICAgICAgICAgICAgICBidWZbcmV0KytdID0gbWItPnYxX3ZlY3RvcjsKICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICBmb3IoeiA9IDA7IHogPCA0OyB6KyspCiAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZltyZXQrK10gPSBtYi0+djRfdmVjdG9yW3pdOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICB3cml0ZV9jaHVua19oZWFkZXIoYnVmICsgaGVhZGVyX29mcywgMHgzMCwgcmV0IC0gaGVhZGVyX29mcyAtIENIVU5LX0hFQURFUl9TSVpFKTsKCiAgICAgICAgYnJlYWs7CiAgICBjYXNlIE1PREVfTUM6CiAgICAgICAgLy9yZW1lbWJlciBoZWFkZXIgcG9zaXRpb24KICAgICAgICBoZWFkZXJfb2ZzID0gcmV0OwogICAgICAgIHJldCArPSBDSFVOS19IRUFERVJfU0laRTsKICAgICAgICBmbGFncyA9IGJpdHMgPSB0ZW1wX3NpemUgPSAwOwoKICAgICAgICBmb3IoeCA9IDA7IHggPCBtYl9jb3VudDsgeCsrKSB7CiAgICAgICAgICAgIG1iID0gJnMtPm1iW3hdOwogICAgICAgICAgICBmbGFncyB8PSAobWItPmJlc3RfZW5jb2RpbmcgIT0gRU5DX1NLSVApIDw8ICgzMSAtIGJpdHMrKyk7CiAgICAgICAgICAgIG5lZWRzX2V4dHJhX2JpdCA9IDA7CiAgICAgICAgICAgIHNob3VsZF93cml0ZV90ZW1wID0gMDsKCiAgICAgICAgICAgIGlmKG1iLT5iZXN0X2VuY29kaW5nICE9IEVOQ19TS0lQKSB7CiAgICAgICAgICAgICAgICBpZihiaXRzIDwgMzIpCiAgICAgICAgICAgICAgICAgICAgZmxhZ3MgfD0gKG1iLT5iZXN0X2VuY29kaW5nID09IEVOQ19WNCkgPDwgKDMxIC0gYml0cysrKTsKICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICBuZWVkc19leHRyYV9iaXQgPSAxOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZihiaXRzID09IDMyKSB7CiAgICAgICAgICAgICAgICBBVl9XQjMyKCZidWZbcmV0XSwgZmxhZ3MpOwogICAgICAgICAgICAgICAgcmV0ICs9IDQ7CiAgICAgICAgICAgICAgICBmbGFncyA9IGJpdHMgPSAwOwoKICAgICAgICAgICAgICAgIGlmKG1iLT5iZXN0X2VuY29kaW5nID09IEVOQ19TS0lQIHx8IG5lZWRzX2V4dHJhX2JpdCkgewogICAgICAgICAgICAgICAgICAgIG1lbWNweSgmYnVmW3JldF0sIHRlbXAsIHRlbXBfc2l6ZSk7CiAgICAgICAgICAgICAgICAgICAgcmV0ICs9IHRlbXBfc2l6ZTsKICAgICAgICAgICAgICAgICAgICB0ZW1wX3NpemUgPSAwOwogICAgICAgICAgICAgICAgfSBlbHNlCiAgICAgICAgICAgICAgICAgICAgc2hvdWxkX3dyaXRlX3RlbXAgPSAxOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZihuZWVkc19leHRyYV9iaXQpIHsKICAgICAgICAgICAgICAgIGZsYWdzID0gKG1iLT5iZXN0X2VuY29kaW5nID09IEVOQ19WNCkgPDwgMzE7CiAgICAgICAgICAgICAgICBiaXRzID0gMTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYobWItPmJlc3RfZW5jb2RpbmcgPT0gRU5DX1YxKQogICAgICAgICAgICAgICAgdGVtcFt0ZW1wX3NpemUrK10gPSBtYi0+djFfdmVjdG9yOwogICAgICAgICAgICBlbHNlIGlmKG1iLT5iZXN0X2VuY29kaW5nID09IEVOQ19WNCkKICAgICAgICAgICAgICAgIGZvcih6ID0gMDsgeiA8IDQ7IHorKykKICAgICAgICAgICAgICAgICAgICB0ZW1wW3RlbXBfc2l6ZSsrXSA9IG1iLT52NF92ZWN0b3Jbel07CgogICAgICAgICAgICBpZihzaG91bGRfd3JpdGVfdGVtcCkgewogICAgICAgICAgICAgICAgbWVtY3B5KCZidWZbcmV0XSwgdGVtcCwgdGVtcF9zaXplKTsKICAgICAgICAgICAgICAgIHJldCArPSB0ZW1wX3NpemU7CiAgICAgICAgICAgICAgICB0ZW1wX3NpemUgPSAwOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZihiaXRzID4gMCkgewogICAgICAgICAgICBBVl9XQjMyKCZidWZbcmV0XSwgZmxhZ3MpOwogICAgICAgICAgICByZXQgKz0gNDsKICAgICAgICAgICAgbWVtY3B5KCZidWZbcmV0XSwgdGVtcCwgdGVtcF9zaXplKTsKICAgICAgICAgICAgcmV0ICs9IHRlbXBfc2l6ZTsKICAgICAgICB9CgogICAgICAgIHdyaXRlX2NodW5rX2hlYWRlcihidWYgKyBoZWFkZXJfb2ZzLCAweDMxLCByZXQgLSBoZWFkZXJfb2ZzIC0gQ0hVTktfSEVBREVSX1NJWkUpOwoKICAgICAgICBicmVhazsKICAgIH0KCiAgICByZXR1cm4gcmV0Owp9CgovL2NvbXB1dGVzIGRpc3RvcnRpb24gb2YgNHg0IE1CIGluIGIgY29tcGFyZWQgdG8gYQpzdGF0aWMgaW50IGNvbXB1dGVfbWJfZGlzdG9ydGlvbihDaW5lcGFrRW5jQ29udGV4dCAqcywgQVZQaWN0dXJlICphLCBBVlBpY3R1cmUgKmIpCnsKICAgIGludCB4LCB5LCBwLCBkLCByZXQgPSAwOwoKICAgIGZvcih5ID0gMDsgeSA8IE1CX1NJWkU7IHkrKykgewogICAgICAgIGZvcih4ID0gMDsgeCA8IE1CX1NJWkU7IHgrKykgewogICAgICAgICAgICBkID0gYS0+ZGF0YVswXVt4ICsgeSphLT5saW5lc2l6ZVswXV0gLSBiLT5kYXRhWzBdW3ggKyB5KmItPmxpbmVzaXplWzBdXTsKICAgICAgICAgICAgcmV0ICs9IGQqZDsKICAgICAgICB9CiAgICB9CgogICAgaWYocy0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX1JHQjI0KSB7CiAgICAgICAgZm9yKHAgPSAxOyBwIDw9IDI7IHArKykgewogICAgICAgICAgICBmb3IoeSA9IDA7IHkgPCBNQl9TSVpFLzI7IHkrKykgewogICAgICAgICAgICAgICAgZm9yKHggPSAwOyB4IDwgTUJfU0laRS8yOyB4KyspIHsKICAgICAgICAgICAgICAgICAgICBkID0gYS0+ZGF0YVtwXVt4ICsgeSphLT5saW5lc2l6ZVtwXV0gLSBiLT5kYXRhW3BdW3ggKyB5KmItPmxpbmVzaXplW3BdXTsKICAgICAgICAgICAgICAgICAgICByZXQgKz0gZCpkOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiByZXQ7Cn0KCi8vIHJldHVybiB0aGUgcG9zc2libHkgYWRqdXN0ZWQgc2l6ZSBvZiB0aGUgY29kZWJvb2sKI2RlZmluZSBDRVJUQUlOKHgpICgoeCkhPUVOQ19VTkNFUlRBSU4pCnN0YXRpYyBpbnQgcXVhbnRpemUoQ2luZXBha0VuY0NvbnRleHQgKnMsIGludCBoLCBBVlBpY3R1cmUgKnBpY3QsCiAgICAgICAgICAgICAgICAgICAgaW50IHYxbW9kZSwgc3RyaXBfaW5mbyAqaW5mbywKICAgICAgICAgICAgICAgICAgICBtYl9lbmNvZGluZyBlbmNvZGluZykKewogICAgaW50IHgsIHksIGksIGosIGssIHgyLCB5MiwgeDMsIHkzLCBwbGFuZSwgc2hpZnQsIG1ibjsKICAgIGludCBlbnRyeV9zaXplID0gcy0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX1JHQjI0ID8gNiA6IDQ7CiAgICBpbnQgKmNvZGVib29rID0gdjFtb2RlID8gaW5mby0+djFfY29kZWJvb2sgOiBpbmZvLT52NF9jb2RlYm9vazsKICAgIGludCBzaXplID0gdjFtb2RlID8gaW5mby0+djFfc2l6ZSA6IGluZm8tPnY0X3NpemU7CiAgICBpbnQ2NF90IHRvdGFsX2Vycm9yID0gMDsKICAgIHVpbnQ4X3QgdnFfcGljdF9idWZbKE1CX0FSRUEqMykvMl07CiAgICBBVlBpY3R1cmUgc3ViX3BpY3QsIHZxX3BpY3Q7CgogICAgZm9yKG1ibiA9IGkgPSB5ID0gMDsgeSA8IGg7IHkgKz0gTUJfU0laRSkgewogICAgICAgIGZvcih4ID0gMDsgeCA8IHMtPnc7IHggKz0gTUJfU0laRSwgKyttYm4pIHsKICAgICAgICAgICAgaW50ICpiYXNlOwoKICAgICAgICAgICAgaWYoQ0VSVEFJTihlbmNvZGluZykpIHsKLy8gdXNlIGZvciB0aGUgdHJhaW5pbmcgb25seSB0aGUgYmxvY2tzIGtub3duIHRvIGJlIHRvIGJlIGVuY29kZWQgW3NpYzotXQogICAgICAgICAgICAgICBpZihzLT5tYlttYm5dLmJlc3RfZW5jb2RpbmcgIT0gZW5jb2RpbmcpIGNvbnRpbnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBiYXNlID0gcy0+Y29kZWJvb2tfaW5wdXQgKyBpKmVudHJ5X3NpemU7CiAgICAgICAgICAgIGlmKHYxbW9kZSkgewogICAgICAgICAgICAgICAgLy9zdWJzYW1wbGUKICAgICAgICAgICAgICAgIGZvcihqID0geTIgPSAwOyB5MiA8IGVudHJ5X3NpemU7IHkyICs9IDIpIHsKICAgICAgICAgICAgICAgICAgICBmb3IoeDIgPSAwOyB4MiA8IDQ7IHgyICs9IDIsIGorKykgewogICAgICAgICAgICAgICAgICAgICAgICBwbGFuZSA9IHkyIDwgNCA/IDAgOiAxICsgKHgyID4+IDEpOwogICAgICAgICAgICAgICAgICAgICAgICBzaGlmdCA9IHkyIDwgNCA/IDAgOiAxOwogICAgICAgICAgICAgICAgICAgICAgICB4MyA9IHNoaWZ0ID8gMCA6IHgyOwogICAgICAgICAgICAgICAgICAgICAgICB5MyA9IHNoaWZ0ID8gMCA6IHkyOwogICAgICAgICAgICAgICAgICAgICAgICBiYXNlW2pdID0gKHBpY3QtPmRhdGFbcGxhbmVdWygoeCt4MykgPj4gc2hpZnQpICsgICAgICAoKHkreTMpID4+IHNoaWZ0KSAgICAgICogcGljdC0+bGluZXNpemVbcGxhbmVdXSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGljdC0+ZGF0YVtwbGFuZV1bKCh4K3gzKSA+PiBzaGlmdCkgKyAxICsgICgoeSt5MykgPj4gc2hpZnQpICAgICAgKiBwaWN0LT5saW5lc2l6ZVtwbGFuZV1dICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWN0LT5kYXRhW3BsYW5lXVsoKHgreDMpID4+IHNoaWZ0KSArICAgICAoKCh5K3kzKSA+PiBzaGlmdCkgKyAxKSAqIHBpY3QtPmxpbmVzaXplW3BsYW5lXV0gKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpY3QtPmRhdGFbcGxhbmVdWygoeCt4MykgPj4gc2hpZnQpICsgMSArICgoKHkreTMpID4+IHNoaWZ0KSArIDEpICogcGljdC0+bGluZXNpemVbcGxhbmVdXSkgPj4gMjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAvL2NvcHkKICAgICAgICAgICAgICAgIGZvcihqID0geTIgPSAwOyB5MiA8IE1CX1NJWkU7IHkyICs9IDIpIHsKICAgICAgICAgICAgICAgICAgICBmb3IoeDIgPSAwOyB4MiA8IE1CX1NJWkU7IHgyICs9IDIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yKGsgPSAwOyBrIDwgZW50cnlfc2l6ZTsgaysrLCBqKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYW5lID0gayA+PSA0ID8gayAtIDMgOiAwOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGsgPj0gNCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHgzID0gKHgreDIpID4+IDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeTMgPSAoeSt5MikgPj4gMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeDMgPSB4ICsgeDIgKyAoayAmIDEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkzID0geSArIHkyICsgKGsgPj4gMSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZVtqXSA9IHBpY3QtPmRhdGFbcGxhbmVdW3gzICsgeTMqcGljdC0+bGluZXNpemVbcGxhbmVdXTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpICs9IHYxbW9kZSA/IDEgOiA0OwogICAgICAgIH0KICAgIH0KLy8gICAgaWYoaSA8IG1ibioodjFtb2RlID8gMSA6IDQpKSB7Ci8vICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19JTkZPLCAicmVkdWNpbmcgdHJhaW5pbmcgc2V0IGZvciAlcyBmcm9tICVpIHRvICVpIChlbmNvZGluZyAlaSlcbiIsIHYxbW9kZT8idjEiOiJ2NCIsIG1ibioodjFtb2RlID8gMSA6IDQpLCBpLCBlbmNvZGluZyk7Ci8vICAgIH0KCiAgICBpZihpID09IDApIC8vIGVtcHR5IHRyYWluaW5nIHNldCwgbm90aGluZyB0byBkbwogICAgICAgIHJldHVybiAwOwogICAgaWYoaSA8IHNpemUpIHsKICAgICAgICAvL2F2X2xvZyhzLT5hdmN0eCwgKENFUlRBSU4oZW5jb2RpbmcpID8gQVZfTE9HX0VSUk9SIDogQVZfTE9HX0lORk8pLCAiV09VTEQgV0FTVEU6ICVzIGNic2l6ZSAlaSBiaWdnZXIgdGhhbiB0cmFpbmluZyBzZXQgc2l6ZSAlaSAoZW5jb2RpbmcgJWkpXG4iLCB2MW1vZGU/InYxIjoidjQiLCBzaXplLCBpLCBlbmNvZGluZyk7CiAgICAgICAgc2l6ZSA9IGk7CiAgICB9CgogICAgYXZwcml2X2luaXRfZWxiZyhzLT5jb2RlYm9va19pbnB1dCwgZW50cnlfc2l6ZSwgaSwgY29kZWJvb2ssIHNpemUsIDEsIHMtPmNvZGVib29rX2Nsb3Nlc3QsICZzLT5yYW5kY3R4KTsKICAgIGF2cHJpdl9kb19lbGJnKHMtPmNvZGVib29rX2lucHV0LCBlbnRyeV9zaXplLCBpLCBjb2RlYm9vaywgc2l6ZSwgMSwgcy0+Y29kZWJvb2tfY2xvc2VzdCwgJnMtPnJhbmRjdHgpOwoKICAgIC8vc2V0dXAgdnFfcGljdCwgd2hpY2ggY29udGFpbnMgYSBzaW5nbGUgTUIKICAgIHZxX3BpY3QuZGF0YVswXSA9IHZxX3BpY3RfYnVmOwogICAgdnFfcGljdC5saW5lc2l6ZVswXSA9IE1CX1NJWkU7CiAgICB2cV9waWN0LmRhdGFbMV0gPSAmdnFfcGljdF9idWZbTUJfQVJFQV07CiAgICB2cV9waWN0LmRhdGFbMl0gPSB2cV9waWN0LmRhdGFbMV0gKyAoTUJfQVJFQSA+PiAyKTsKICAgIHZxX3BpY3QubGluZXNpemVbMV0gPSB2cV9waWN0LmxpbmVzaXplWzJdID0gTUJfU0laRSA+PiAxOwoKICAgIC8vY29weSBpbmRpY2VzCiAgICBmb3IoaSA9IGogPSB5ID0gMDsgeSA8IGg7IHkgKz0gTUJfU0laRSkgewogICAgICAgIGZvcih4ID0gMDsgeCA8IHMtPnc7IHggKz0gTUJfU0laRSwgaisrKSB7CiAgICAgICAgICAgIG1iX2luZm8gKm1iID0gJnMtPm1iW2pdOwovLyBza2lwIHVuaW50ZXJlc3RpbmcgYmxvY2tzIGlmIHdlIGtub3cgdGhlaXIgcHJlZmVycmVkIGVuY29kaW5nCiAgICAgICAgICAgIGlmKENFUlRBSU4oZW5jb2RpbmcpICYmIG1iLT5iZXN0X2VuY29kaW5nICE9IGVuY29kaW5nKQogICAgICAgICAgICAgICAgY29udGludWU7CgogICAgICAgICAgICAvL3BvaW50IHN1Yl9waWN0IHRvIGN1cnJlbnQgTUIKICAgICAgICAgICAgZ2V0X3N1Yl9waWN0dXJlKHMsIHgsIHksIHBpY3QsICZzdWJfcGljdCk7CgogICAgICAgICAgICBpZih2MW1vZGUpIHsKICAgICAgICAgICAgICAgIG1iLT52MV92ZWN0b3IgPSBzLT5jb2RlYm9va19jbG9zZXN0W2ldOwoKICAgICAgICAgICAgICAgIC8vZmlsbCBpbiB2cV9waWN0IHdpdGggVjEgZGF0YQogICAgICAgICAgICAgICAgZGVjb2RlX3YxX3ZlY3RvcihzLCAmdnFfcGljdCwgbWItPnYxX3ZlY3RvciwgaW5mbyk7CgogICAgICAgICAgICAgICAgbWItPnYxX2Vycm9yID0gY29tcHV0ZV9tYl9kaXN0b3J0aW9uKHMsICZzdWJfcGljdCwgJnZxX3BpY3QpOwogICAgICAgICAgICAgICAgdG90YWxfZXJyb3IgKz0gbWItPnYxX2Vycm9yOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgZm9yKGsgPSAwOyBrIDwgNDsgaysrKQogICAgICAgICAgICAgICAgICAgIG1iLT52NF92ZWN0b3Jba10gPSBzLT5jb2RlYm9va19jbG9zZXN0W2kra107CgogICAgICAgICAgICAgICAgLy9maWxsIGluIHZxX3BpY3Qgd2l0aCBWNCBkYXRhCiAgICAgICAgICAgICAgICBkZWNvZGVfdjRfdmVjdG9yKHMsICZ2cV9waWN0LCBtYi0+djRfdmVjdG9yLCBpbmZvKTsKCiAgICAgICAgICAgICAgICBtYi0+djRfZXJyb3IgPSBjb21wdXRlX21iX2Rpc3RvcnRpb24ocywgJnN1Yl9waWN0LCAmdnFfcGljdCk7CiAgICAgICAgICAgICAgICB0b3RhbF9lcnJvciArPSBtYi0+djRfZXJyb3I7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaSArPSB2MW1vZGUgPyAxIDogNDsKICAgICAgICB9CiAgICB9Ci8vIGNoZWNrIHRoYXQgd2UgZGlkIGl0IHJpZ2h0IGluIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZ1bmN0aW9uCiAgICBhdl9hc3NlcnQwKGkgPj0gc2l6ZSk7IC8vIHRyYWluaW5nIHNldCBpcyBubyBzbWFsbGVyIHRoYW4gdGhlIGNvZGVib29rCgogICAgLy9hdl9sb2cocy0+YXZjdHgsIEFWX0xPR19JTkZPLCAiaXN2MSAlaSBzaXplPSAlaSBpPSAlaSBlcnJvciAlIlBSSWQ2NCJcbiIsIHYxbW9kZSwgc2l6ZSwgaSwgdG90YWxfZXJyb3IpOwoKICAgIHJldHVybiBzaXplOwp9CgpzdGF0aWMgdm9pZCBjYWxjdWxhdGVfc2tpcF9lcnJvcnMoQ2luZXBha0VuY0NvbnRleHQgKnMsIGludCBoLCBBVlBpY3R1cmUgKmxhc3RfcGljdCwgQVZQaWN0dXJlICpwaWN0LCBzdHJpcF9pbmZvICppbmZvKQp7CiAgICBpbnQgeCwgeSwgaTsKICAgIEFWUGljdHVyZSBzdWJfbGFzdCwgc3ViX3BpY3Q7CgogICAgZm9yKGkgPSB5ID0gMDsgeSA8IGg7IHkgKz0gTUJfU0laRSkgewogICAgICAgIGZvcih4ID0gMDsgeCA8IHMtPnc7IHggKz0gTUJfU0laRSwgaSsrKSB7CiAgICAgICAgICAgIGdldF9zdWJfcGljdHVyZShzLCB4LCB5LCBsYXN0X3BpY3QsICZzdWJfbGFzdCk7CiAgICAgICAgICAgIGdldF9zdWJfcGljdHVyZShzLCB4LCB5LCBwaWN0LCAgICAgICZzdWJfcGljdCk7CgogICAgICAgICAgICBzLT5tYltpXS5za2lwX2Vycm9yID0gY29tcHV0ZV9tYl9kaXN0b3J0aW9uKHMsICZzdWJfbGFzdCwgJnN1Yl9waWN0KTsKICAgICAgICB9CiAgICB9Cn0KCnN0YXRpYyB2b2lkIHdyaXRlX3N0cmlwX2hlYWRlcihDaW5lcGFrRW5jQ29udGV4dCAqcywgaW50IHksIGludCBoLCBpbnQga2V5ZnJhbWUsIHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IHN0cmlwX3NpemUpCnsKLy8gYWN0dWFsbHkgd2UgYXJlIGV4Y2x1c2l2ZWx5IHVzaW5nIGludHJhIHN0cmlwIGNvZGluZyAoaG93IG11Y2ggY2FuIHdlIHdpbgovLyBvdGhlcndpc2U/IGhvdyB0byBjaG9vc2Ugd2hpY2ggcGFydCBvZiBhIGNvZGVib29rIHRvIHVwZGF0ZT8pLAovLyBrZXlmcmFtZXMgYXJlIGRpZmZlcmVudCBvbmx5IGJlY2F1c2Ugd2UgZGlzYWxsb3cgRU5DX1NLSVAgb24gdGhlbSAtLSBybAovLyAoYmVzaWRlcywgdGhlIGxvZ2ljIGhlcmUgdXNlZCB0byBiZSBpbnZlcnRlZDogKQovLyAgICBidWZbMF0gPSBrZXlmcmFtZSA/IDB4MTE6IDB4MTA7CiAgICBidWZbMF0gPSBrZXlmcmFtZSA/IDB4MTA6IDB4MTE7CiAgICBBVl9XQjI0KCZidWZbMV0sIHN0cmlwX3NpemUgKyBTVFJJUF9IRUFERVJfU0laRSk7Ci8vICAgIEFWX1dCMTYoJmJ1Zls0XSwgeSk7IC8qIHVzaW5nIGFic29sdXRlIHkgdmFsdWVzIHdvcmtzIC0tIHJsICovCiAgICBBVl9XQjE2KCZidWZbNF0sIDApOyAvKiB1c2luZyByZWxhdGl2ZSB2YWx1ZXMgd29ya3MgYXMgd2VsbCAtLSBybCAqLwogICAgQVZfV0IxNigmYnVmWzZdLCAwKTsKLy8gICAgQVZfV0IxNigmYnVmWzhdLCB5K2gpOyAvKiB1c2luZyBhYnNvbHV0ZSB5IHZhbHVlcyB3b3JrcyAtLSBybCAqLwogICAgQVZfV0IxNigmYnVmWzhdLCBoKTsgLyogdXNpbmcgcmVsYXRpdmUgdmFsdWVzIHdvcmtzIGFzIHdlbGwgLS0gcmwgKi8KICAgIEFWX1dCMTYoJmJ1ZlsxMF0sIHMtPncpOwogICAgLy9hdl9sb2cocy0+YXZjdHgsIEFWX0xPR19JTkZPLCAid3JpdGVfc3RyaXBfaGVhZGVyKCkgJXgga2V5ZnJhbWU9JWRcbiIsIGJ1ZlswXSwga2V5ZnJhbWUpOwp9CgpzdGF0aWMgaW50IHJkX3N0cmlwKENpbmVwYWtFbmNDb250ZXh0ICpzLCBpbnQgeSwgaW50IGgsIGludCBrZXlmcmFtZSwgQVZQaWN0dXJlICpsYXN0X3BpY3QsIEFWUGljdHVyZSAqcGljdCwgQVZQaWN0dXJlICpzY3JhdGNoX3BpY3QsIHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50NjRfdCAqYmVzdF9zY29yZQojaWZkZWYgQ0lORVBBS19SRVBPUlRfU0VSUgosIGludDY0X3QgKmJlc3Rfc2VycgojZW5kaWYKKQp7CiAgICBpbnQ2NF90IHNjb3JlID0gMDsKI2lmZGVmIENJTkVQQUtfUkVQT1JUX1NFUlIKICAgIGludDY0X3Qgc2VycjsKI2VuZGlmCiAgICBpbnQgYmVzdF9zaXplID0gMDsKICAgIHN0cmlwX2luZm8gaW5mbzsKLy8gZm9yIGNvZGVib29rIG9wdGltaXphdGlvbjoKICAgIGludCB2MWVub3VnaCwgdjFfc2l6ZSwgdjRlbm91Z2gsIHY0X3NpemU7CiAgICBpbnQgbmV3X3YxX3NpemUsIG5ld192NF9zaXplOwogICAgaW50IHYxc2hydW5rLCB2NHNocnVuazsKCiAgICBpZigha2V5ZnJhbWUpCiAgICAgICAgY2FsY3VsYXRlX3NraXBfZXJyb3JzKHMsIGgsIGxhc3RfcGljdCwgcGljdCwgJmluZm8pOwoKICAgIC8vdHJ5IHNvbWUgcG93ZXJzIG9mIDQgZm9yIHRoZSBzaXplIG9mIHRoZSBjb2RlYm9va3MKICAgIC8vY29uc3RyYWludCB0aGUgdjQgY29kZWJvb2sgdG8gYmUgbm8gYmlnZ2VyIHRoYW4gdjEgb25lLAogICAgLy8oYW5kIG5vIGxlc3MgdGhhbiB2MV9zaXplLzQpCiAgICAvL3RodXMgbWFraW5nIHYxIHByZWZlcmFibGUgYW5kIHBvc3NpYmx5IGxvc2luZyBzbWFsbCBkZXRhaWxzPyBzaG91bGQgYmUgb2sKI2RlZmluZSBTTUFMTEVTVF9DT0RFQk9PSyAxCiAgICBmb3IodjFlbm91Z2ggPSAwLCB2MV9zaXplID0gU01BTExFU1RfQ09ERUJPT0s7IHYxX3NpemUgPD0gQ09ERUJPT0tfTUFYICYmICF2MWVub3VnaDsgdjFfc2l6ZSA8PD0gMikgewogICAgICAgIGZvcih2NGVub3VnaCA9IDAsIHY0X3NpemUgPSAwOyB2NF9zaXplIDw9IHYxX3NpemUgJiYgIXY0ZW5vdWdoOyB2NF9zaXplID0gdjRfc2l6ZSA/IHY0X3NpemUgPDwgMiA6IHYxX3NpemUgPj0gU01BTExFU1RfQ09ERUJPT0sgPDwgMiA/IHYxX3NpemUgPj4gMiA6IFNNQUxMRVNUX0NPREVCT09LKSB7CiAgICAgICAgICAgIC8vdHJ5IGFsbCBtb2RlcwogICAgICAgICAgICBmb3IoQ2luZXBha01vZGUgbW9kZSA9IDA7IG1vZGUgPCBNT0RFX0NPVU5UOyBtb2RlKyspIHsKICAgICAgICAgICAgICAgIC8vZG9uJ3QgYWxsb3cgTU9ERV9NQyBpbiBpbnRyYSBmcmFtZXMKICAgICAgICAgICAgICAgIGlmKGtleWZyYW1lICYmIG1vZGUgPT0gTU9ERV9NQykKICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKCiAgICAgICAgICAgICAgICBpZihtb2RlID09IE1PREVfVjFfT05MWSkgewogICAgICAgICAgICAgICAgICAgIGluZm8udjFfc2l6ZSA9IHYxX3NpemU7Ci8vIHRoZSBzaXplIG1heSBzaHJpbmsgZXZlbiBiZWZvcmUgb3B0aW1pemF0aW9ucyBpZiB0aGUgaW5wdXQgaXMgc2hvcnQ6CiAgICAgICAgICAgICAgICAgICAgaW5mby52MV9zaXplID0gcXVhbnRpemUocywgaCwgcGljdCwgMSwgJmluZm8sIEVOQ19VTkNFUlRBSU4pOwogICAgICAgICAgICAgICAgICAgIGlmKGluZm8udjFfc2l6ZSA8IHYxX3NpemUpCi8vIHRvbyBmZXcgZWxpZ2libGUgYmxvY2tzLCBubyBzZW5zZSBpbiB0cnlpbmcgYmlnZ2VyIHNpemVzCiAgICAgICAgICAgICAgICAgICAgICAgIHYxZW5vdWdoID0gMTsKCiAgICAgICAgICAgICAgICAgICAgaW5mby52NF9zaXplID0gMDsKICAgICAgICAgICAgICAgIH0gZWxzZSB7IC8vIG1vZGUgIT0gTU9ERV9WMV9PTkxZCiAgICAgICAgICAgICAgICAgICAgLy8gaWYgdjQgY29kZWJvb2sgaXMgZW1wdHkgdGhlbiBvbmx5IGFsbG93IFYxLW9ubHkgbW9kZQogICAgICAgICAgICAgICAgICAgIGlmKCF2NF9zaXplKQogICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKCiAgICAgICAgICAgICAgICAgICAgaWYobW9kZSA9PSBNT0RFX1YxX1Y0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGluZm8udjRfc2l6ZSA9IHY0X3NpemU7CiAgICAgICAgICAgICAgICAgICAgICAgIGluZm8udjRfc2l6ZSA9IHF1YW50aXplKHMsIGgsIHBpY3QsIDAsICZpbmZvLCBFTkNfVU5DRVJUQUlOKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYoaW5mby52NF9zaXplIDwgdjRfc2l6ZSkKLy8gdG9vIGZldyBlbGlnaWJsZSBibG9ja3MsIG5vIHNlbnNlIGluIHRyeWluZyBiaWdnZXIgc2l6ZXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHY0ZW5vdWdoID0gMTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaW5mby5tb2RlID0gbW9kZTsKLy8gY2hvb3NlIHRoZSBiZXN0IGVuY29kaW5nIHBlciBibG9jaywgYmFzZWQgb24gY3VycmVudCBleHBlcmllbmNlCiAgICAgICAgICAgICAgICBzY29yZSA9IGNhbGN1bGF0ZV9tb2RlX3Njb3JlKHMsIGgsICZpbmZvLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdjFzaHJ1bmssICZ2NHNocnVuawojaWZkZWYgQ0lORVBBS19SRVBPUlRfU0VSUgosICZzZXJyCiNlbmRpZgopOwoKICAgICAgICAgICAgICAgIGlmKG1vZGUgIT0gTU9ERV9WMV9PTkxZKXsKICAgICAgICAgICAgICAgICAgICBpbnQgZXh0cmFfaXRlcmF0aW9uc19saW1pdCA9IHMtPm1heF9leHRyYV9jYl9pdGVyYXRpb25zOwovLyByZWNvbXB1dGUgdGhlIGNvZGVib29rcywgb21pdHRpbmcgdGhlIGV4dHJhIGJsb2NrcwovLyB3ZSBhc3N1bWUgd2UgX21heV8gY29tZSBoZXJlIHdpdGggbW9yZSBibG9ja3MgdG8gZW5jb2RlIHRoYW4gYmVmb3JlCiAgICAgICAgICAgICAgICAgICAgaW5mby52MV9zaXplID0gdjFfc2l6ZTsKICAgICAgICAgICAgICAgICAgICBuZXdfdjFfc2l6ZSA9IHF1YW50aXplKHMsIGgsIHBpY3QsIDEsICZpbmZvLCBFTkNfVjEpOwogICAgICAgICAgICAgICAgICAgIGlmKG5ld192MV9zaXplIDwgaW5mby52MV9zaXplKXsKICAgICAgICAgICAgICAgICAgICAgICAgLy9hdl9sb2cocy0+YXZjdHgsIEFWX0xPR19JTkZPLCAibW9kZSAlaSwgJTNpLCAlM2k6IGN1dCB2MSBjb2RlYm9vayB0byAlaSBlbnRyaWVzXG4iLCBtb2RlLCB2MV9zaXplLCB2NF9zaXplLCBuZXdfdjFfc2l6ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGluZm8udjFfc2l6ZSA9IG5ld192MV9zaXplOwogICAgICAgICAgICAgICAgICAgIH0KLy8gd2UgYXNzdW1lIHdlIF9tYXlfIGNvbWUgaGVyZSB3aXRoIG1vcmUgYmxvY2tzIHRvIGVuY29kZSB0aGFuIGJlZm9yZQogICAgICAgICAgICAgICAgICAgIGluZm8udjRfc2l6ZSA9IHY0X3NpemU7CiAgICAgICAgICAgICAgICAgICAgbmV3X3Y0X3NpemUgPSBxdWFudGl6ZShzLCBoLCBwaWN0LCAwLCAmaW5mbywgRU5DX1Y0KTsKICAgICAgICAgICAgICAgICAgICBpZihuZXdfdjRfc2l6ZSA8IGluZm8udjRfc2l6ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAvL2F2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0lORk8sICJtb2RlICVpLCAlM2ksICUzaTogY3V0IHY0IGNvZGVib29rIHRvICVpIGVudHJpZXMgYXQgZmlyc3QgaXRlcmF0aW9uXG4iLCBtb2RlLCB2MV9zaXplLCB2NF9zaXplLCBuZXdfdjRfc2l6ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGluZm8udjRfc2l6ZSA9IG5ld192NF9zaXplOwogICAgICAgICAgICAgICAgICAgIH0KLy8gY2FsY3VsYXRlIHRoZSByZXN1bHRpbmcgc2NvcmUKLy8gKGRvIG5vdCBtb3ZlIGJsb2NrcyB0byBjb2RlYm9vayBlbmNvZGluZ3Mgbm93LCBhcyBzb21lIGJsb2NrcyBtYXkgaGF2ZQovLyBnb3QgYmlnZ2VyIGVycm9ycyBkZXNwaXRlIGEgc21hbGxlciB0cmFpbmluZyBzZXQgLSBidXQgd2UgZG8gbm90Ci8vIGV2ZXIgZ3JvdyB0aGUgdHJhaW5pbmcgc2V0cyBiYWNrKQogICAgICAgICAgICAgICAgICAgIGZvcig7OykgewogICAgICAgICAgICAgICAgICAgICAgICBzY29yZSA9IGNhbGN1bGF0ZV9tb2RlX3Njb3JlKHMsIGgsICZpbmZvLCAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2MXNocnVuaywgJnY0c2hydW5rCiNpZmRlZiBDSU5FUEFLX1JFUE9SVF9TRVJSCiwgJnNlcnIKI2VuZGlmCik7Ci8vIGRvIHdlIGhhdmUgYSByZWFzb24gdG8gcmVpdGVyYXRlPyBpZiBzbywgaGF2ZSB3ZSByZWFjaGVkIHRoZSBsaW1pdD8KICAgICAgICAgICAgICAgICAgICAgICAgaWYoKCF2MXNocnVuayAmJiAhdjRzaHJ1bmspIHx8ICFleHRyYV9pdGVyYXRpb25zX2xpbWl0LS0pIGJyZWFrOwovLyByZWNvbXB1dGUgdGhlIGNvZGVib29rcywgb21pdHRpbmcgdGhlIGV4dHJhIGJsb2NrcwogICAgICAgICAgICAgICAgICAgICAgICBpZih2MXNocnVuaykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mby52MV9zaXplID0gdjFfc2l6ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld192MV9zaXplID0gcXVhbnRpemUocywgaCwgcGljdCwgMSwgJmluZm8sIEVOQ19WMSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihuZXdfdjFfc2l6ZSA8IGluZm8udjFfc2l6ZSl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9hdl9sb2cocy0+YXZjdHgsIEFWX0xPR19JTkZPLCAibW9kZSAlaSwgJTNpLCAlM2k6IGN1dCB2MSBjb2RlYm9vayB0byAlaSBlbnRyaWVzXG4iLCBtb2RlLCB2MV9zaXplLCB2NF9zaXplLCBuZXdfdjFfc2l6ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mby52MV9zaXplID0gbmV3X3YxX3NpemU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYodjRzaHJ1bmspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8udjRfc2l6ZSA9IHY0X3NpemU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdfdjRfc2l6ZSA9IHF1YW50aXplKHMsIGgsIHBpY3QsIDAsICZpbmZvLCBFTkNfVjQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYobmV3X3Y0X3NpemUgPCBpbmZvLnY0X3NpemUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2F2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0lORk8sICJtb2RlICVpLCAlM2ksICUzaTogY3V0IHY0IGNvZGVib29rIHRvICVpIGVudHJpZXNcbiIsIG1vZGUsIHYxX3NpemUsIHY0X3NpemUsIG5ld192NF9zaXplKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLnY0X3NpemUgPSBuZXdfdjRfc2l6ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvL2F2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0lORk8sICIlM2kgJTNpIHNjb3JlID0gJSJQUklkNjQiXG4iLCB2MV9zaXplLCB2NF9zaXplLCBzY29yZSk7CgogICAgICAgICAgICAgICAgaWYoYmVzdF9zaXplID09IDAgfHwgc2NvcmUgPCAqYmVzdF9zY29yZSkgewoKICAgICAgICAgICAgICAgICAgICAqYmVzdF9zY29yZSA9IHNjb3JlOwojaWZkZWYgQ0lORVBBS19SRVBPUlRfU0VSUgogICAgICAgICAgICAgICAgICAgICpiZXN0X3NlcnIgPSBzZXJyOwojZW5kaWYKICAgICAgICAgICAgICAgICAgICBiZXN0X3NpemUgPSBlbmNvZGVfbW9kZShzLCBoLCBzY3JhdGNoX3BpY3QsIGxhc3RfcGljdCwgJmluZm8sIHMtPnN0cmlwX2J1ZiArIFNUUklQX0hFQURFUl9TSVpFKTsKCiAgICAgICAgICAgICAgICAgICAgLy9hdl9sb2cocy0+YXZjdHgsIEFWX0xPR19JTkZPLCAibW9kZSAlaSwgJTNpLCAlM2k6ICUxOCJQUklkNjQiICVpIEIiLCBtb2RlLCBpbmZvLnYxX3NpemUsIGluZm8udjRfc2l6ZSwgc2NvcmUsIGJlc3Rfc2l6ZSk7CiAgICAgICAgICAgICAgICAgICAgLy9hdl9sb2cocy0+YXZjdHgsIEFWX0xPR19JTkZPLCAiXG4iKTsKI2lmZGVmIENJTkVQQUtfUkVQT1JUX1NFUlIKICAgICAgICAgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19JTkZPLCAibW9kZSAlaSwgJTNpLCAlM2k6ICUxOCJQUklkNjQiICVpIEJcbiIsIG1vZGUsIHYxX3NpemUsIHY0X3NpemUsIHNlcnIsIGJlc3Rfc2l6ZSk7CiNlbmRpZgoKI2lmZGVmIENJTkVQQUtFTkNfREVCVUcKICAgICAgICAgICAgICAgICAgICAvL3NhdmUgTUIgZW5jb2RpbmcgY2hvaWNlcwogICAgICAgICAgICAgICAgICAgIG1lbWNweShzLT5iZXN0X21iLCBzLT5tYiwgbWJfY291bnQqc2l6ZW9mKG1iX2luZm8pKTsKI2VuZGlmCgogICAgICAgICAgICAgICAgICAgIC8vbWVtY3B5KHN0cmlwX3RlbXAgKyBTVFJJUF9IRUFERVJfU0laRSwgc3RyaXBfdGVtcCwgYmVzdF9zaXplKTsKICAgICAgICAgICAgICAgICAgICB3cml0ZV9zdHJpcF9oZWFkZXIocywgeSwgaCwga2V5ZnJhbWUsIHMtPnN0cmlwX2J1ZiwgYmVzdF9zaXplKTsKCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgojaWZkZWYgQ0lORVBBS0VOQ19ERUJVRwogICAgLy9nYXRoZXIgc3RhdHMuIHRoaXMgd2lsbCBvbmx5IHdvcmsgcHJvcGVybHkgb2YgTUFYX1NUUklQUyA9PSAxCiAgICBpZihiZXN0X2luZm8ubW9kZSA9PSBNT0RFX1YxX09OTFkpIHsKICAgICAgICBzLT5udW1fdjFfbW9kZSsrOwogICAgICAgIHMtPm51bV92MV9lbmNzICs9IHMtPncqaC9NQl9BUkVBOwogICAgfSBlbHNlIHsKICAgICAgICBpZihiZXN0X2luZm8ubW9kZSA9PSBNT0RFX1YxX1Y0KQogICAgICAgICAgICBzLT5udW1fdjRfbW9kZSsrOwogICAgICAgIGVsc2UKICAgICAgICAgICAgcy0+bnVtX21jX21vZGUrKzsKCiAgICAgICAgaW50IHg7CiAgICAgICAgZm9yKHggPSAwOyB4IDwgcy0+dypoL01CX0FSRUE7IHgrKykKICAgICAgICAgICAgaWYocy0+YmVzdF9tYlt4XS5iZXN0X2VuY29kaW5nID09IEVOQ19WMSkKICAgICAgICAgICAgICAgIHMtPm51bV92MV9lbmNzKys7CiAgICAgICAgICAgIGVsc2UgaWYocy0+YmVzdF9tYlt4XS5iZXN0X2VuY29kaW5nID09IEVOQ19WNCkKICAgICAgICAgICAgICAgIHMtPm51bV92NF9lbmNzKys7CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHMtPm51bV9za2lwcysrOwogICAgfQojZW5kaWYKCiAgICBiZXN0X3NpemUgKz0gU1RSSVBfSEVBREVSX1NJWkU7CiAgICBtZW1jcHkoYnVmLCBzLT5zdHJpcF9idWYsIGJlc3Rfc2l6ZSk7CgogICAgcmV0dXJuIGJlc3Rfc2l6ZTsKfQoKc3RhdGljIGludCB3cml0ZV9jdmlkX2hlYWRlcihDaW5lcGFrRW5jQ29udGV4dCAqcywgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgbnVtX3N0cmlwcywgaW50IGRhdGFfc2l6ZSwgaW50IGlzYWtleWZyYW1lKQp7CiAgICBidWZbMF0gPSBpc2FrZXlmcmFtZSA/IDAgOiAxOwogICAgQVZfV0IyNCgmYnVmWzFdLCBkYXRhX3NpemUgKyBDVklEX0hFQURFUl9TSVpFKTsKICAgIEFWX1dCMTYoJmJ1Zls0XSwgcy0+dyk7CiAgICBBVl9XQjE2KCZidWZbNl0sIHMtPmgpOwogICAgQVZfV0IxNigmYnVmWzhdLCBudW1fc3RyaXBzKTsKCiAgICByZXR1cm4gQ1ZJRF9IRUFERVJfU0laRTsKfQoKc3RhdGljIGludCByZF9mcmFtZShDaW5lcGFrRW5jQ29udGV4dCAqcywgY29uc3QgQVZGcmFtZSAqZnJhbWUsIGludCBpc2FrZXlmcmFtZSwgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgYnVmX3NpemUpCnsKICAgIGludCBudW1fc3RyaXBzLCBzdHJpcCwgaSwgeSwgbmV4dHksIHNpemUsIHRlbXBfc2l6ZTsKICAgIEFWUGljdHVyZSBsYXN0X3BpY3QsIHBpY3QsIHNjcmF0Y2hfcGljdDsKICAgIGludDY0X3QgYmVzdF9zY29yZSA9IDAsIHNjb3JlLCBzY29yZV90ZW1wOwojaWZkZWYgQ0lORVBBS19SRVBPUlRfU0VSUgogICAgaW50NjRfdCBiZXN0X3NlcnIgPSAwLCBzZXJyLCBzZXJyX3RlbXA7CiNlbmRpZgoKICAgIGludCBiZXN0X25zdHJpcHMgPSAtMSwgYmVzdF9zaXplID0gLTE7IC8vIG1hcmsgYXMgdW5pbml0aWFsemVkCgogICAgaWYocy0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX1JHQjI0KSB7CiAgICAgICAgaW50IHg7Ci8vIGJ1aWxkIGEgY29weSBvZiB0aGUgZ2l2ZW4gZnJhbWUgaW4gdGhlIGNvcnJlY3QgY29sb3JzcGFjZQogICAgICAgIGZvcih5ID0gMDsgeSA8IHMtPmg7IHkgKz0gMikgewogICAgICAgICAgICBmb3IoeCA9IDA7IHggPCBzLT53OyB4ICs9IDIpIHsKICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmlyWzJdOyBpbnQzMl90IHIsIGcsIGIsIHJyLCBnZywgYmI7CiAgICAgICAgICAgICAgICBpclswXSA9ICgoQVZQaWN0dXJlKilmcmFtZSktPmRhdGFbMF0gKyB4KjMgKyB5KigoQVZQaWN0dXJlKilmcmFtZSktPmxpbmVzaXplWzBdOwogICAgICAgICAgICAgICAgaXJbMV0gPSBpclswXSArICgoQVZQaWN0dXJlKilmcmFtZSktPmxpbmVzaXplWzBdOwogICAgICAgICAgICAgICAgZ2V0X3N1Yl9waWN0dXJlKHMsIHgsIHksIChBVlBpY3R1cmUqKXMtPmlucHV0X2ZyYW1lLCAmc2NyYXRjaF9waWN0KTsKICAgICAgICAgICAgICAgIHIgPSBnID0gYiA9IDA7CiAgICAgICAgICAgICAgICBmb3IoaT0wOyBpPDQ7ICsraSkgewogICAgICAgICAgICAgICAgICAgIGludCBpMSwgaTI7CiAgICAgICAgICAgICAgICAgICAgaTEgPSAoaSYxKTsgaTIgPSAoaT49Mik7CiAgICAgICAgICAgICAgICAgICAgcnIgPSBpcltpMl1baTEqMyswXTsKICAgICAgICAgICAgICAgICAgICBnZyA9IGlyW2kyXVtpMSozKzFdOwogICAgICAgICAgICAgICAgICAgIGJiID0gaXJbaTJdW2kxKjMrMl07CiAgICAgICAgICAgICAgICAgICAgciArPSBycjsgZyArPSBnZzsgYiArPSBiYjsKLy8gdXNpbmcgZml4ZWQgcG9pbnQgYXJpdGhtZXRpYyBmb3IgcG9ydGFibGUgcmVwZWF0YWJpbGl0eSwgc2NhbGluZyBieSAyXjIzCi8vICJZIgovLyAgICAgICAgICAgICAgICAgICAgcnIgPSAwLjI4NTcqcnIgKyAwLjU3MTQqZ2cgKyAwLjE0MjkqYmI7CiAgICAgICAgICAgICAgICAgICAgcnIgPSAoMjM5NjYyNSpyciArIDQ3OTMyNTEqZ2cgKyAxMTk4NzMyKmJiKSA+PiAyMzsKICAgICAgICAgICAgICAgICAgICBpZiggICAgICByciA8ICAgMCkgcnIgPSAgIDA7CiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAocnIgPiAyNTUpIHJyID0gMjU1OwogICAgICAgICAgICAgICAgICAgIHNjcmF0Y2hfcGljdC5kYXRhWzBdW2kxICsgaTIqc2NyYXRjaF9waWN0LmxpbmVzaXplWzBdXSA9IHJyOwogICAgICAgICAgICAgICAgfQovLyBsZXQgdXMgc2NhbGUgZG93biBhcyBsYXRlIGFzIHBvc3NpYmxlCi8vICAgICAgICAgICAgICAgIHIgLz0gNDsgZyAvPSA0OyBiIC89IDQ7Ci8vICJVIgovLyAgICAgICAgICAgICAgICByciA9IC0wLjE0MjkqciAtIDAuMjg1NypnICsgMC40Mjg2KmI7CiAgICAgICAgICAgICAgICByciA9ICgtMjk5NjgzKnIgLSA1OTkxNTYqZyArIDg5ODgzOSpiKSA+PiAyMzsKICAgICAgICAgICAgICAgIGlmKCAgICAgIHJyIDwgLTEyOCkgcnIgPSAtMTI4OwogICAgICAgICAgICAgICAgZWxzZSBpZiAocnIgPiAgMTI3KSByciA9ICAxMjc7CiAgICAgICAgICAgICAgICBzY3JhdGNoX3BpY3QuZGF0YVsxXVswXSA9IHJyICsgMTI4OyAvLyBxdWFudGl6ZSBuZWVkcyB1bnNpZ25lZAovLyAiViIKLy8gICAgICAgICAgICAgICAgcnIgPSAwLjM1NzEqciAtIDAuMjg1NypnIC0gMC4wNzE0KmI7CiAgICAgICAgICAgICAgICByciA9ICg3NDg4OTMqciAtIDU5OTE1NipnIC0gMTQ5NzM3KmIpID4+IDIzOwogICAgICAgICAgICAgICAgaWYoICAgICAgcnIgPCAtMTI4KSByciA9IC0xMjg7CiAgICAgICAgICAgICAgICBlbHNlIGlmIChyciA+ICAxMjcpIHJyID0gIDEyNzsKICAgICAgICAgICAgICAgIHNjcmF0Y2hfcGljdC5kYXRhWzJdWzBdID0gcnIgKyAxMjg7IC8vIHF1YW50aXplIG5lZWRzIHVuc2lnbmVkCiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgLy93b3VsZCBiZSBuaWNlIGJ1dCBxdWl0ZSBjZXJ0YWlubHkgaW5jb21wYXRpYmxlIHdpdGggdmludGFnZSBwbGF5ZXJzOgogICAgLy8gc3VwcG9ydCBlbmNvZGluZyB6ZXJvIHN0cmlwcyAobWVhbmluZyBza2lwIHRoZSB3aG9sZSBmcmFtZSkKICAgIGZvcihudW1fc3RyaXBzID0gcy0+bWluX3N0cmlwczsgbnVtX3N0cmlwcyA8PSBzLT5tYXhfc3RyaXBzICYmIG51bV9zdHJpcHMgPD0gcy0+aCAvIE1CX1NJWkU7IG51bV9zdHJpcHMrKykgewogICAgICAgIHNjb3JlID0gMDsKICAgICAgICBzaXplID0gMDsKI2lmZGVmIENJTkVQQUtfUkVQT1JUX1NFUlIKICAgICAgICBzZXJyID0gMDsKI2VuZGlmCgogICAgICAgIGZvcih5ID0gMCwgc3RyaXAgPSAxOyB5IDwgcy0+aDsgc3RyaXArKywgeSA9IG5leHR5KSB7CiAgICAgICAgICAgIGludCBzdHJpcF9oZWlnaHQ7CgogICAgICAgICAgICBuZXh0eSA9IHN0cmlwICogcy0+aCAvIG51bV9zdHJpcHM7IC8vIDw9IHMtPmgKICAgICAgICAgICAgLy9tYWtlIG5leHR5IHRoZSBuZXh0IG11bHRpcGxlIG9mIDQgaWYgbm90IGFscmVhZHkgdGhlcmUKICAgICAgICAgICAgaWYobmV4dHkgJiAzKQogICAgICAgICAgICAgICAgbmV4dHkgKz0gNCAtIChuZXh0eSAmIDMpOwoKICAgICAgICAgICAgc3RyaXBfaGVpZ2h0ID0gbmV4dHkgLSB5OwogICAgICAgICAgICBpZihzdHJpcF9oZWlnaHQgPD0gMCkgeyAvLyBjYW4gdGhpcyBldmVyIGhhcHBlbj8KICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0lORk8sICJza2lwcGluZyB6ZXJvIGhlaWdodCBzdHJpcCAlaSBvZiAlaVxuIiwgc3RyaXAsIG51bV9zdHJpcHMpOwogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmKHMtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9SR0IyNCkKICAgICAgICAgICAgICAgIGdldF9zdWJfcGljdHVyZShzLCAwLCB5LCAoQVZQaWN0dXJlKilzLT5pbnB1dF9mcmFtZSwgICAgJnBpY3QpOwogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICBnZXRfc3ViX3BpY3R1cmUocywgMCwgeSwgKEFWUGljdHVyZSopZnJhbWUsICAgICAgICAgICAgICAmcGljdCk7CiAgICAgICAgICAgIGdldF9zdWJfcGljdHVyZShzLCAwLCB5LCAoQVZQaWN0dXJlKilzLT5sYXN0X2ZyYW1lLCAgICAmbGFzdF9waWN0KTsKICAgICAgICAgICAgZ2V0X3N1Yl9waWN0dXJlKHMsIDAsIHksIChBVlBpY3R1cmUqKXMtPnNjcmF0Y2hfZnJhbWUsICZzY3JhdGNoX3BpY3QpOwoKICAgICAgICAgICAgaWYoKHRlbXBfc2l6ZSA9IHJkX3N0cmlwKHMsIHksIHN0cmlwX2hlaWdodCwgaXNha2V5ZnJhbWUsICZsYXN0X3BpY3QsICZwaWN0LCAmc2NyYXRjaF9waWN0LCBzLT5mcmFtZV9idWYgKyBzaXplICsgQ1ZJRF9IRUFERVJfU0laRSwgJnNjb3JlX3RlbXAKI2lmZGVmIENJTkVQQUtfUkVQT1JUX1NFUlIKLCAmc2Vycl90ZW1wCiNlbmRpZgopKSA8IDApCiAgICAgICAgICAgICAgICByZXR1cm4gdGVtcF9zaXplOwoKICAgICAgICAgICAgc2NvcmUgKz0gc2NvcmVfdGVtcDsKI2lmZGVmIENJTkVQQUtfUkVQT1JUX1NFUlIKICAgICAgICAgICAgc2VyciArPSBzZXJyX3RlbXA7CiNlbmRpZgogICAgICAgICAgICBzaXplICs9IHRlbXBfc2l6ZTsKICAgICAgICAgICAgLy9hdl9sb2cocy0+YXZjdHgsIEFWX0xPR19JTkZPLCAic3RyaXAgJWQsIGlzYWtleWZyYW1lPSVkIiwgc3RyaXAsIGlzYWtleWZyYW1lKTsKICAgICAgICAgICAgLy9hdl9sb2cocy0+YXZjdHgsIEFWX0xPR19JTkZPLCAiXG4iKTsKICAgICAgICB9CgogICAgICAgIGlmKGJlc3Rfc2NvcmUgPT0gMCB8fCBzY29yZSA8IGJlc3Rfc2NvcmUpIHsKICAgICAgICAgICAgYmVzdF9zY29yZSA9IHNjb3JlOwojaWZkZWYgQ0lORVBBS19SRVBPUlRfU0VSUgogICAgICAgICAgICBiZXN0X3NlcnIgPSBzZXJyOwojZW5kaWYKICAgICAgICAgICAgYmVzdF9zaXplID0gc2l6ZSArIHdyaXRlX2N2aWRfaGVhZGVyKHMsIHMtPmZyYW1lX2J1ZiwgbnVtX3N0cmlwcywgc2l6ZSwgaXNha2V5ZnJhbWUpOwogICAgICAgICAgICAvL2F2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0lORk8sICJiZXN0IG51bWJlciBvZiBzdHJpcHMgc28gZmFyOiAlMmksICUxMiJQUklkNjQiLCAlaSBCXG4iLCBudW1fc3RyaXBzLCBzY29yZSwgYmVzdF9zaXplKTsKI2lmZGVmIENJTkVQQUtfUkVQT1JUX1NFUlIKICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfSU5GTywgImJlc3QgbnVtYmVyIG9mIHN0cmlwcyBzbyBmYXI6ICUyaSwgJTEyIlBSSWQ2NCIsICVpIEJcbiIsIG51bV9zdHJpcHMsIHNlcnIsIGJlc3Rfc2l6ZSk7CiNlbmRpZgoKICAgICAgICAgICAgRkZTV0FQKEFWRnJhbWUgKiwgcy0+YmVzdF9mcmFtZSwgcy0+c2NyYXRjaF9mcmFtZSk7CiAgICAgICAgICAgIG1lbWNweShidWYsIHMtPmZyYW1lX2J1ZiwgYmVzdF9zaXplKTsKICAgICAgICAgICAgYmVzdF9uc3RyaXBzID0gbnVtX3N0cmlwczsKICAgICAgICB9Ci8vIGF2b2lkIHRyeWluZyB0b28gbWFueSBzdHJpcCBudW1iZXJzIHdpdGhvdXQgYSByZWFsIHJlYXNvbgovLyAodGhpcyBtYWtlcyB0aGUgcHJvY2Vzc2luZyBvZiB0aGUgdmVyeSBmaXJzdCBmcmFtZSBmYXN0ZXIpCiAgICAgICAgaWYobnVtX3N0cmlwcyAtIGJlc3RfbnN0cmlwcyA+IDQpCiAgICAgICAgICAgIGJyZWFrOwogICAgfQoKICAgIGF2X2Fzc2VydDAoYmVzdF9uc3RyaXBzID49IDAgJiYgYmVzdF9zaXplID49IDApOwoKLy8gbGV0IHRoZSBudW1iZXIgb2Ygc3RyaXBzIHNsb3dseSBhZGFwdCB0byB0aGUgY2hhbmdlcyBpbiB0aGUgY29udGVudHMsCi8vIGNvbXBhcmVkIHRvIGZ1bGwgYnJ1dGVmb3JjaW5nIGV2ZXJ5IHRpbWUgdGhpcyB3aWxsIG9jY2FzaW9uYWxseSBsZWFkCi8vIHRvIHNvbWUgci9kIHBlcmZvcm1hbmNlIGxvc3MgYnV0IG1ha2VzIGVuY29kaW5nIHVwIHRvIHNldmVyYWwgdGltZXMgZmFzdGVyCiAgICBpZighcy0+c3RyaXBfbnVtYmVyX2RlbHRhX3JhbmdlKSB7CiAgICAgICAgaWYoYmVzdF9uc3RyaXBzID09IHMtPm1heF9zdHJpcHMpIHsgLy8gbGV0IHVzIHRyeSB0byBzdGVwIHVwCiAgICAgICAgICAgIHMtPm1heF9zdHJpcHMgPSBiZXN0X25zdHJpcHMgKyAxOwogICAgICAgICAgICBpZihzLT5tYXhfc3RyaXBzID49IHMtPm1heF9tYXhfc3RyaXBzKQogICAgICAgICAgICAgICAgcy0+bWF4X3N0cmlwcyA9IHMtPm1heF9tYXhfc3RyaXBzOwogICAgICAgIH0gZWxzZSB7IC8vIHRyeSB0byBzdGVwIGRvd24KICAgICAgICAgICAgcy0+bWF4X3N0cmlwcyA9IGJlc3RfbnN0cmlwczsKICAgICAgICB9CiAgICAgICAgcy0+bWluX3N0cmlwcyA9IHMtPm1heF9zdHJpcHMgLSAxOwogICAgICAgIGlmKHMtPm1pbl9zdHJpcHMgPCBzLT5taW5fbWluX3N0cmlwcykKICAgICAgICAgICAgcy0+bWluX3N0cmlwcyA9IHMtPm1pbl9taW5fc3RyaXBzOwogICAgfSBlbHNlIHsKICAgICAgICBzLT5tYXhfc3RyaXBzID0gYmVzdF9uc3RyaXBzICsgcy0+c3RyaXBfbnVtYmVyX2RlbHRhX3JhbmdlOwogICAgICAgIGlmKHMtPm1heF9zdHJpcHMgPj0gcy0+bWF4X21heF9zdHJpcHMpCiAgICAgICAgICAgIHMtPm1heF9zdHJpcHMgPSBzLT5tYXhfbWF4X3N0cmlwczsKICAgICAgICBzLT5taW5fc3RyaXBzID0gYmVzdF9uc3RyaXBzIC0gcy0+c3RyaXBfbnVtYmVyX2RlbHRhX3JhbmdlOwogICAgICAgIGlmKHMtPm1pbl9zdHJpcHMgPCBzLT5taW5fbWluX3N0cmlwcykKICAgICAgICAgICAgcy0+bWluX3N0cmlwcyA9IHMtPm1pbl9taW5fc3RyaXBzOwogICAgfQoKICAgIHJldHVybiBiZXN0X3NpemU7Cn0KCnN0YXRpYyBpbnQgY2luZXBha19lbmNvZGVfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBBVlBhY2tldCAqcGt0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFWRnJhbWUgKmZyYW1lLCBpbnQgKmdvdF9wYWNrZXQpCnsKICAgIENpbmVwYWtFbmNDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKICAgIGludCByZXQ7CgogICAgcy0+bGFtYmRhID0gZnJhbWUtPnF1YWxpdHkgPyBmcmFtZS0+cXVhbGl0eSAtIDEgOiAyICogRkZfTEFNQkRBX1NDQUxFOwoKICAgIGlmICgocmV0ID0gZmZfYWxsb2NfcGFja2V0MihhdmN0eCwgcGt0LCBzLT5mcmFtZV9idWZfc2l6ZSwgMCkpIDwgMCkKICAgICAgICByZXR1cm4gcmV0OwogICAgcmV0ID0gcmRfZnJhbWUocywgZnJhbWUsIChzLT5jdXJmcmFtZSA9PSAwKSwgcGt0LT5kYXRhLCBzLT5mcmFtZV9idWZfc2l6ZSk7CiAgICBwa3QtPnNpemUgPSByZXQ7CiAgICBpZiAocy0+Y3VyZnJhbWUgPT0gMCkKICAgICAgICBwa3QtPmZsYWdzIHw9IEFWX1BLVF9GTEFHX0tFWTsKICAgICpnb3RfcGFja2V0ID0gMTsKCiAgICBGRlNXQVAoQVZGcmFtZSAqLCBzLT5sYXN0X2ZyYW1lLCBzLT5iZXN0X2ZyYW1lKTsKCiAgICBpZiAoKytzLT5jdXJmcmFtZSA+PSBzLT5rZXlpbnQpCiAgICAgICAgcy0+Y3VyZnJhbWUgPSAwOwoKICAgIHJldHVybiAwOwp9CgpzdGF0aWMgYXZfY29sZCBpbnQgY2luZXBha19lbmNvZGVfZW5kKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKewogICAgQ2luZXBha0VuY0NvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOwogICAgaW50IHg7CgogICAgYXZfZnJhbWVfZnJlZSgmcy0+bGFzdF9mcmFtZSk7CiAgICBhdl9mcmFtZV9mcmVlKCZzLT5iZXN0X2ZyYW1lKTsKICAgIGF2X2ZyYW1lX2ZyZWUoJnMtPnNjcmF0Y2hfZnJhbWUpOwogICAgaWYgKGF2Y3R4LT5waXhfZm10ID09IEFWX1BJWF9GTVRfUkdCMjQpCiAgICAgICAgYXZfZnJhbWVfZnJlZSgmcy0+aW5wdXRfZnJhbWUpOwogICAgYXZfZnJlZXAoJnMtPmNvZGVib29rX2lucHV0KTsKICAgIGF2X2ZyZWVwKCZzLT5jb2RlYm9va19jbG9zZXN0KTsKICAgIGF2X2ZyZWVwKCZzLT5zdHJpcF9idWYpOwogICAgYXZfZnJlZXAoJnMtPmZyYW1lX2J1Zik7CiAgICBhdl9mcmVlcCgmcy0+bWIpOwojaWZkZWYgQ0lORVBBS0VOQ19ERUJVRwogICAgYXZfZnJlZXAoJnMtPmJlc3RfbWIpOwojZW5kaWYKCiAgICBmb3IoeCA9IDA7IHggPCAoYXZjdHgtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9SR0IyNCA/IDQgOiAzKTsgeCsrKQogICAgICAgIGF2X2ZyZWVwKCZzLT5waWN0X2J1ZnNbeF0pOwoKI2lmZGVmIENJTkVQQUtFTkNfREVCVUcKICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0lORk8sICJzdHJpcCBjb2Rpbmcgc3RhdHM6ICVpIFYxIG1vZGUsICVpIFY0IG1vZGUsICVpIE1DIG1vZGUgKCVpIFYxIGVuY3MsICVpIFY0IGVuY3MsICVpIHNraXBzKVxuIiwKICAgICAgICBzLT5udW1fdjFfbW9kZSwgcy0+bnVtX3Y0X21vZGUsIHMtPm51bV9tY19tb2RlLCBzLT5udW1fdjFfZW5jcywgcy0+bnVtX3Y0X2VuY3MsIHMtPm51bV9za2lwcyk7CiNlbmRpZgoKICAgIHJldHVybiAwOwp9CgpBVkNvZGVjIGZmX2NpbmVwYWtfZW5jb2RlciA9IHsKICAgIC5uYW1lICAgICAgICAgICA9ICJjaW5lcGFrIiwKICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX0NJTkVQQUssCiAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoQ2luZXBha0VuY0NvbnRleHQpLAogICAgLmluaXQgICAgICAgICAgID0gY2luZXBha19lbmNvZGVfaW5pdCwKICAgIC5lbmNvZGUyICAgICAgICA9IGNpbmVwYWtfZW5jb2RlX2ZyYW1lLAogICAgLmNsb3NlICAgICAgICAgID0gY2luZXBha19lbmNvZGVfZW5kLAogICAgLnBpeF9mbXRzICAgICAgID0gKGNvbnN0IGVudW0gQVZQaXhlbEZvcm1hdFtdKXtBVl9QSVhfRk1UX1JHQjI0LCBBVl9QSVhfRk1UX0dSQVk4LCBBVl9QSVhfRk1UX05PTkV9LAogICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkNpbmVwYWsgLyBDVklEIiksCiAgICAucHJpdl9jbGFzcyAgICAgPSAmY2luZXBha19jbGFzcywKfTsK