LyoKICogQ2luZXBhayBlbmNvZGVyIChjKSAyMDExIFRvbWFzIEjkcmRpbgogKiBodHRwOi8vdGl0YW4uY29kZW1pbGwuc2UvfnRvbWhhci9jaW5lcGFrZW5jLnBhdGNoCiAqCiAqIEZpeGVzIGFuZCBpbXByb3ZlbWVudHMsIHZpbnRhZ2UgZGVjb2RlcnMgY29tcGF0aWJpbGl0eQogKiAgKGMpIDIwMTMsIDIwMTQgUmwsIEFldGV5IEdsb2JhbCBUZWNobm9sb2dpZXMgQUIKClBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCmNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCnRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCmFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQpTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgoKVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQKaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCgpUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgpJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwKVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCkFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgpPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCgogKiBUT0RPOgogKiAtIG9wdGltaXplOiBjb2xvciBzcGFjZSBjb252ZXJzaW9uLCAuLi4KICogLSBpbXBsZW1lbnQgb3B0aW9ucyB0byBzZXQgdGhlIG1pbi9tYXggbnVtYmVyIG9mIHN0cmlwcz8KICogTUFZQkU6CiAqIC0gIm9wdGltYWxseSIgc3BsaXQgdGhlIGZyYW1lIGludG8gc2V2ZXJhbCBub24tcmVndWxhciBhcmVhcwogKiAgIHVzaW5nIGEgc2VwYXJhdGUgY29kZWJvb2sgcGFpciBmb3IgZWFjaCBhcmVhIGFuZCBhcHByb3hpbWF0aW5nCiAqICAgdGhlIGFyZWEgYnkgc2V2ZXJhbCByZWN0YW5ndWxhciBzdHJpcHMgKGdlbmVyYWxseSBub3QgZnVsbCB3aWR0aCBvbmVzKQogKiAgICh1c2UgcXVhZHRyZWUgc3BsaXR0aW5nPyBhIHNpbXBsZSBmaXhlZC1ncmFudWxhcml0eSBncmlkPykKICoKICoKICogdmVyc2lvbiAyMDE0LTAxLTIzIFJsCiAqIC0gYWRkZWQgb3B0aW9uIGhhbmRsaW5nIGZvciBmbGV4aWJpbGl0eQogKgogKiB2ZXJzaW9uIDIwMTQtMDEtMjEgUmwKICogLSBiZWxpZXZlIGl0IG9yIG5vdCwgbm93IHdlIGdldCBldmVuIHNtYWxsZXIgZmlsZXMsIHdpdGggYmV0dGVyIHF1YWxpdHkKICogICAod2hpY2ggbWVhbnMgSSBtaXNzZWQgYW4gb3B0aW1pemF0aW9uIGVhcmxpZXIgOikKICoKICogdmVyc2lvbiAyMDE0LTAxLTIwIFJsCiAqIC0gbWFkZSB0aGUgZW5jb2RlciBjb21wYXRpYmxlIHdpdGggdmludGFnZSBkZWNvZGVycwogKiAgIGFuZCBhZGRlZCBzb21lIHlldCB1bnVzZWQgY29kZSBmb3IgcG9zc2libGUgZnV0dXJlCiAqICAgaW5jcmVtZW50YWwgY29kZWJvb2sgdXBkYXRlcwogKiAtIGZpeGVkIGEgc21hbGwgbWVtb3J5IGxlYWsKICoKICogdmVyc2lvbiAyMDEzLTA0LTI4IFJsCiAqIC0gYnVnZml4ZWQgY29kZWJvb2sgb3B0aW1pemF0aW9uIGxvZ2ljCiAqCiAqIHZlcnNpb24gMjAxMy0wMi0xNCBSbAogKiAiVmFsZW50aW5lJ3MgRGF5IiB2ZXJzaW9uOgogKiAtIG1hZGUgc3RyaXAgZGl2aXNpb24gbW9yZSByb2J1c3QKICogLSBtaW5pbWl6ZWQgYnJ1dGVmb3JjaW5nIHRoZSBudW1iZXIgb2Ygc3RyaXBzLAogKiAgIChjb3N0cyBzb21lIFIvRCBidXQgc3BlZWRzIHVwIGNvbXBlc3Npb24gYSBsb3QpLCB0aGUgaGV1cmlzdGljCiAqICAgYXNzdW1wdGlvbiBpcyB0aGF0IHNjb3JlIGFzIGEgZnVuY3Rpb24gb2YgdGhlIG51bWJlciBvZiBzdHJpcHMgaGFzCiAqICAgb25lIHdpZGUgbWluaW11bSB3aGljaCBtb3ZlcyBzbG93bHksIG9mIGNvdXJzZSBub3QgZnVsbHkgdHJ1ZQogKiAtIHNpbXBsaWZpZWQgY29kZWJvb2sgZ2VuZXJhdGlvbiwKICogICB0aGUgb2xkIGNvZGUgd2FzIG1lYW50IGZvciBvdGhlciBvcHRpbWl6YXRpb25zIHRoYW4gd2UgYWN0dWFsbHkgZG8KICogLSBvcHRpbWl6ZWQgdGhlIGNvZGVib29rIGdlbmVyYXRpb24gLyBlcnJvciBlc3RpbWF0aW9uIGZvciBNT0RFX01DCiAqCiAqIHZlcnNpb24gMjAxMy0wMi0xMiBSbAogKiAtIHNlcGFyYXRlZCBjb2RlYm9vayB0cmFpbmluZyBzZXRzLCBhdm9pZGVkIHRoZSB0cmFuc2ZlciBvZiB3YXN0ZWQgYnl0ZXMsCiAqICAgd2hpY2ggeWllbGRzIGJvdGggYmV0dGVyIHF1YWxpdHkgYW5kIHNtYWxsZXIgZmlsZXMKICogLSBub3cgdXNpbmcgdGhlIGNvcnJlY3QgY29sb3JzcGFjZSAoVE9ETzogbW92ZSBjb252ZXJzaW9uIHRvIGxpYnN3c2NhbGUpCiAqCiAqIHZlcnNpb24gMjAxMy0wMi0wOCBSbAogKiAtIGZpeGVzL29wdGltaXphdGlvbiBpbiBtdWx0aXN0cmlwIGVuY29kaW5nIGFuZCBjb2RlYm9vayBzaXplIGNob2ljZSwKICogICBxdWFsaXR5L2JpdHJhdGUgaXMgbm93IGJldHRlciB0aGFuIHRoYXQgb2YgdGhlIGJpbmFyeSBwcm9wcmlldGFyeSBlbmNvZGVyCiAqLwoKI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKI2luY2x1ZGUgImF2Y29kZWMuaCIKI2luY2x1ZGUgImxpYmF2dXRpbC9sZmcuaCIKI2luY2x1ZGUgImVsYmcuaCIKI2luY2x1ZGUgImludGVybmFsLmgiCgojaW5jbHVkZSAibGliYXZ1dGlsL2F2YXNzZXJ0LmgiCiNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCgojZGVmaW5lIENWSURfSEVBREVSX1NJWkUgMTAKI2RlZmluZSBTVFJJUF9IRUFERVJfU0laRSAxMgojZGVmaW5lIENIVU5LX0hFQURFUl9TSVpFIDQKCiNkZWZpbmUgTUJfU0laRSA0ICAgICAgICAgICAvLzR4NCBNQnMKI2RlZmluZSBNQl9BUkVBIChNQl9TSVpFKk1CX1NJWkUpCgojZGVmaW5lIFZFQ1RPUl9NQVggNiAgICAgICAgLy9zaXggb3IgZm91ciBlbnRyaWVzIHBlciB2ZWN0b3IgZGVwZW5kaW5nIG9uIGZvcm1hdAojZGVmaW5lIENPREVCT09LX01BWCAyNTYgICAgLy9zaXplIG9mIGEgY29kZWJvb2sKCiNkZWZpbmUgTUFYX1NUUklQUyAgMzIgICAgICAvL05vdGU6IGhhdmluZyBmZXdlciBjaG9pY2VzIHJlZ2FyZGluZyB0aGUgbnVtYmVyIG9mIHN0cmlwcyBzcGVlZHMgdXAgZW5jb2RpbmcgKG9idmlvdXNseSkKI2RlZmluZSBNSU5fU1RSSVBTICAxICAgICAgIC8vTm90ZTogaGF2aW5nIG1vcmUgc3RyaXBzIHNwZWVkcyB1cCBlbmNvZGluZyB0aGUgZnJhbWUgKHRoaXMgaXMgbGVzcyBvYnZpb3VzKQovLyBNQVhfU1RSSVBTIGxpbWl0cyB0aGUgbWF4aW11bSBxdWFsaXR5IHlvdSBjYW4gcmVhY2gKLy8gICAgICAgICAgICB3aGVuIHlvdSB3YW50IGhpZ2h0IHF1YWxpdHkgb24gaGlnaCByZXNvbHV0aW9ucywKLy8gTUlOX1NUUklQUyBsaW1pdHMgdGhlIG1pbmltdW0gZWZmaWNpZW50bHkgZW5jb2RhYmxlIGJpdCByYXRlCi8vICAgICAgICAgICAgb24gbG93IHJlc29sdXRpb25zCi8vIHRoZSBudW1iZXJzIGFyZSBvbmx5IHVzZWQgZm9yIGJydXRlIGZvcmNlIG9wdGltaXphdGlvbiBmb3IgdGhlIGZpcnN0IGZyYW1lLAovLyBmb3IgdGhlIGZvbGxvd2luZyBmcmFtZXMgdGhleSBhcmUgYWRhcHRpdmVseSByZWFkanVzdGVkCi8vIE5PVEUgdGhlIGRlY29kZXIgaW4gZmZtcGVnIGhhcyBpdHMgb3duIGFyYml0cmFyeSBsaW1pdGF0aW9uIG9uIHRoZSBudW1iZXIKLy8gb2Ygc3RyaXBzLCBjdXJyZW50bHkgMzIKCnR5cGVkZWYgZW51bSB7CiAgICBNT0RFX1YxX09OTFkgPSAwLAogICAgTU9ERV9WMV9WNCwKICAgIE1PREVfTUMsCgogICAgTU9ERV9DT1VOVCwKfSBDaW5lcGFrTW9kZTsKCnR5cGVkZWYgZW51bSB7CiAgICBFTkNfVjEsCiAgICBFTkNfVjQsCiAgICBFTkNfU0tJUCwKCiAgICBFTkNfVU5DRVJUQUlOCn0gbWJfZW5jb2Rpbmc7Cgp0eXBlZGVmIHN0cnVjdCB7CiAgICBpbnQgdjFfdmVjdG9yOyAgICAgICAgICAgICAgICAgIC8vaW5kZXggaW50byB2MSBjb2RlYm9vawogICAgaW50IHYxX2Vycm9yOyAgICAgICAgICAgICAgICAgICAvL2Vycm9yIHdoZW4gdXNpbmcgVjEgZW5jb2RpbmcKICAgIGludCB2NF92ZWN0b3JbNF07ICAgICAgICAgICAgICAgLy9pbmRpY2VzIGludG8gdjQgY29kZWJvb2tzCiAgICBpbnQgdjRfZXJyb3I7ICAgICAgICAgICAgICAgICAgIC8vZXJyb3Igd2hlbiB1c2luZyBWNCBlbmNvZGluZwogICAgaW50IHNraXBfZXJyb3I7ICAgICAgICAgICAgICAgICAvL2Vycm9yIHdoZW4gYmxvY2sgaXMgc2tpcHBlZCAoYWthIGNvcGllZCBmcm9tIGxhc3QgZnJhbWUpCiAgICBtYl9lbmNvZGluZyBiZXN0X2VuY29kaW5nOyAgICAgIC8vbGFzdCByZXN1bHQgZnJvbSBjYWxjdWxhdGVfbW9kZV9zY29yZSgpCn0gbWJfaW5mbzsKCnR5cGVkZWYgc3RydWN0IHsKICAgIGludCB2MV9jb2RlYm9va1tDT0RFQk9PS19NQVgqVkVDVE9SX01BWF07CiAgICBpbnQgdjRfY29kZWJvb2tbQ09ERUJPT0tfTUFYKlZFQ1RPUl9NQVhdOwogICAgaW50IHYxX3NpemU7CiAgICBpbnQgdjRfc2l6ZTsKICAgIENpbmVwYWtNb2RlIG1vZGU7Cn0gc3RyaXBfaW5mbzsKCnR5cGVkZWYgc3RydWN0IHsKICAgIGNvbnN0IEFWQ2xhc3MgKmNsYXNzOwogICAgQVZDb2RlY0NvbnRleHQgKmF2Y3R4OwogICAgdW5zaWduZWQgY2hhciAqcGljdF9idWZzWzRdLCAqc3RyaXBfYnVmLCAqZnJhbWVfYnVmOwogICAgQVZGcmFtZSAqbGFzdF9mcmFtZTsKICAgIEFWRnJhbWUgKmJlc3RfZnJhbWU7CiAgICBBVkZyYW1lICpzY3JhdGNoX2ZyYW1lOwogICAgQVZGcmFtZSAqaW5wdXRfZnJhbWU7CiAgICBlbnVtIEFWUGl4ZWxGb3JtYXQgcGl4X2ZtdDsKICAgIGludCB3LCBoOwogICAgaW50IGZyYW1lX2J1Zl9zaXplOwogICAgaW50IGN1cmZyYW1lLCBrZXlpbnQ7CiAgICBBVkxGRyByYW5kY3R4OwogICAgdWludDY0X3QgbGFtYmRhOwogICAgaW50ICpjb2RlYm9va19pbnB1dDsKICAgIGludCAqY29kZWJvb2tfY2xvc2VzdDsKICAgIG1iX2luZm8gKm1iOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9NQiBSRCBzdGF0ZQogICAgaW50IG1pbl9zdHJpcHM7ICAgICAgICAgIC8vdGhlIGN1cnJlbnQgbGltaXQKICAgIGludCBtYXhfc3RyaXBzOyAgICAgICAgICAvL3RoZSBjdXJyZW50IGxpbWl0CiNpZmRlZiBDSU5FUEFLRU5DX0RFQlVHCiAgICBtYl9pbmZvICpiZXN0X21iOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vVE9ETzogcmVtb3ZlLiBvbmx5IHVzZWQgZm9yIHByaW50aW5nIHN0YXRzCiAgICBpbnQgbnVtX3YxX21vZGUsIG51bV92NF9tb2RlLCBudW1fbWNfbW9kZTsKICAgIGludCBudW1fdjFfZW5jcywgbnVtX3Y0X2VuY3MsIG51bV9za2lwczsKI2VuZGlmCi8vIG9wdGlvbnMKICAgIGludCBtYXhfZXh0cmFfY2JfaXRlcmF0aW9uczsKICAgIGludCBza2lwX2VtcHR5X2NiOwogICAgaW50IG1pbl9taW5fc3RyaXBzOwogICAgaW50IG1heF9tYXhfc3RyaXBzOwogICAgaW50IHN0cmlwX251bWJlcl9kZWx0YV9yYW5nZTsKfSBDaW5lcGFrRW5jQ29udGV4dDsKCiNkZWZpbmUgT0ZGU0VUKHgpIG9mZnNldG9mKENpbmVwYWtFbmNDb250ZXh0LCB4KQojZGVmaW5lIFZFIEFWX09QVF9GTEFHX1ZJREVPX1BBUkFNIHwgQVZfT1BUX0ZMQUdfRU5DT0RJTkdfUEFSQU0Kc3RhdGljIGNvbnN0IEFWT3B0aW9uIG9wdGlvbnNbXSA9IHsKICAgIHsgIm1heF9leHRyYV9jYl9pdGVyYXRpb25zIiwgIk1heCBleHRyYSBjb2RlYm9vayByZWNhbGN1bGF0aW9uIHBhc3NlcywgbW9yZSBpcyBiZXR0ZXIgYW5kIHNsb3dlciIsIE9GRlNFVChtYXhfZXh0cmFfY2JfaXRlcmF0aW9ucyksIEFWX09QVF9UWVBFX0lOVCwgeyAuaTY0ID0gMiB9LCAwLCBJTlRfTUFYLCBWRSB9LAogICAgeyAic2tpcF9lbXB0eV9jYiIsICJBdm9pZCB3YXN0aW5nIGJ5dGVzLCBpZ25vcmUgdmludGFnZSBNYWNPUyBkZWNvZGVyIiwgT0ZGU0VUKHNraXBfZW1wdHlfY2IpLCBBVl9PUFRfVFlQRV9CT09MLCB7IC5pNjQgPSAwIH0sIDAsIDEsIFZFIH0sCiAgICB7ICJtYXhfc3RyaXBzIiwgIkxpbWl0IHN0cmlwcy9mcmFtZSwgdmludGFnZSBjb21wYXRpYmxlIGlzIDEuLjMsIG90aGVyd2lzZSB0aGUgbW9yZSB0aGUgYmV0dGVyIiwgT0ZGU0VUKG1heF9tYXhfc3RyaXBzKSwgQVZfT1BUX1RZUEVfSU5ULCB7IC5pNjQgPSAzIH0sIE1JTl9TVFJJUFMsIE1BWF9TVFJJUFMsIFZFIH0sCiAgICB7ICJtaW5fc3RyaXBzIiwgIkVuZm9yY2UgbWluIHN0cmlwcy9mcmFtZSwgbW9yZSBpcyB3b3JzZSBhbmQgZmFzdGVyLCBtdXN0IGJlIDw9IG1heF9zdHJpcHMiLCBPRkZTRVQobWluX21pbl9zdHJpcHMpLCBBVl9PUFRfVFlQRV9JTlQsIHsgLmk2NCA9IE1JTl9TVFJJUFMgfSwgTUlOX1NUUklQUywgTUFYX1NUUklQUywgVkUgfSwKICAgIHsgInN0cmlwX251bWJlcl9hZGFwdGl2aXR5IiwgIkhvdyBmYXN0IHRoZSBzdHJpcCBudW1iZXIgYWRhcHRzLCBtb3JlIGlzIHNsaWdodGx5IGJldHRlciwgbXVjaCBzbG93ZXIiLCBPRkZTRVQoc3RyaXBfbnVtYmVyX2RlbHRhX3JhbmdlKSwgQVZfT1BUX1RZUEVfSU5ULCB7IC5pNjQgPSAwIH0sIDAsIE1BWF9TVFJJUFMtTUlOX1NUUklQUywgVkUgfSwKICAgIHsgTlVMTCB9LAp9OwoKc3RhdGljIGNvbnN0IEFWQ2xhc3MgY2luZXBha19jbGFzcyA9IHsKICAgIC5jbGFzc19uYW1lID0gImNpbmVwYWsiLAogICAgLml0ZW1fbmFtZSAgPSBhdl9kZWZhdWx0X2l0ZW1fbmFtZSwKICAgIC5vcHRpb24gICAgID0gb3B0aW9ucywKICAgIC52ZXJzaW9uICAgID0gTElCQVZVVElMX1ZFUlNJT05fSU5ULAp9OwoKc3RhdGljIGF2X2NvbGQgaW50IGNpbmVwYWtfZW5jb2RlX2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQp7CiAgICBDaW5lcGFrRW5jQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CiAgICBpbnQgeCwgbWJfY291bnQsIHN0cmlwX2J1Zl9zaXplLCBmcmFtZV9idWZfc2l6ZTsKCiAgICBpZiAoYXZjdHgtPndpZHRoICYgMyB8fCBhdmN0eC0+aGVpZ2h0ICYgMykgewogICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAid2lkdGggYW5kIGhlaWdodCBtdXN0IGJlIG11bHRpcGxlcyBvZiBmb3VyIChnb3QgJWl4JWkpXG4iLAogICAgICAgICAgICAgICAgYXZjdHgtPndpZHRoLCBhdmN0eC0+aGVpZ2h0KTsKICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOwogICAgfQoKICAgIGlmIChzLT5taW5fbWluX3N0cmlwcyA+IHMtPm1heF9tYXhfc3RyaXBzKSB7CiAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJtaW5pbWFsIG51bWJlciBvZiBzdHJpcHMgY2FuIG5vdCBleGNlZWQgbWF4aW1hbCAoZ290ICVpIGFuZCAlaSlcbiIsCiAgICAgICAgICAgICAgICBzLT5taW5fbWluX3N0cmlwcywgcy0+bWF4X21heF9zdHJpcHMpOwogICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CiAgICB9CgogICAgaWYgKCEocy0+bGFzdF9mcmFtZSA9IGF2X2ZyYW1lX2FsbG9jKCkpKQogICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CiAgICBpZiAoIShzLT5iZXN0X2ZyYW1lID0gYXZfZnJhbWVfYWxsb2MoKSkpCiAgICAgICAgZ290byBlbm9tZW07CiAgICBpZiAoIShzLT5zY3JhdGNoX2ZyYW1lID0gYXZfZnJhbWVfYWxsb2MoKSkpCiAgICAgICAgZ290byBlbm9tZW07CiAgICBpZiAoYXZjdHgtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9SR0IyNCkKICAgICAgICBpZiAoIShzLT5pbnB1dF9mcmFtZSA9IGF2X2ZyYW1lX2FsbG9jKCkpKQogICAgICAgICAgICBnb3RvIGVub21lbTsKCiAgICBpZiAoIShzLT5jb2RlYm9va19pbnB1dCA9IGF2X21hbGxvYyhzaXplb2YoaW50KSAqIChhdmN0eC0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX1JHQjI0ID8gNiA6IDQpICogKGF2Y3R4LT53aWR0aCAqIGF2Y3R4LT5oZWlnaHQpID4+IDIpKSkKICAgICAgICBnb3RvIGVub21lbTsKCiAgICBpZiAoIShzLT5jb2RlYm9va19jbG9zZXN0ID0gYXZfbWFsbG9jKHNpemVvZihpbnQpICogKGF2Y3R4LT53aWR0aCAqIGF2Y3R4LT5oZWlnaHQpID4+IDIpKSkKICAgICAgICBnb3RvIGVub21lbTsKCiAgICBmb3IoeCA9IDA7IHggPCAoYXZjdHgtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9SR0IyNCA/IDQgOiAzKTsgeCsrKQogICAgICAgIGlmKCEocy0+cGljdF9idWZzW3hdID0gYXZfbWFsbG9jKChhdmN0eC0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX1JHQjI0ID8gNiA6IDQpICogKGF2Y3R4LT53aWR0aCAqIGF2Y3R4LT5oZWlnaHQpID4+IDIpKSkKICAgICAgICAgICAgZ290byBlbm9tZW07CgogICAgbWJfY291bnQgPSBhdmN0eC0+d2lkdGggKiBhdmN0eC0+aGVpZ2h0IC8gTUJfQVJFQTsKCiAgICAvL3RoZSBsYXJnZXN0IHBvc3NpYmxlIGNodW5rIGlzIDB4MzEgd2l0aCBhbGwgTUJzIGVuY29kZWQgaW4gVjQgbW9kZQogICAgLy9hbmQgZnVsbCBjb2RlYm9va3MgYmVpbmcgcmVwbGFjZWQgaW4gSU5URVIgbW9kZSwKICAgIC8vIHdoaWNoIGlzIDM0IGJpdHMgcGVyIE1CCiAgICAvL2FuZCAyKjI1NiBleHRyYSBmbGFnIGJpdHMgcGVyIHN0cmlwCiAgICBzdHJpcF9idWZfc2l6ZSA9IFNUUklQX0hFQURFUl9TSVpFICsgMyAqIENIVU5LX0hFQURFUl9TSVpFICsgMiAqIFZFQ1RPUl9NQVggKiBDT0RFQk9PS19NQVggKyA0ICogKG1iX2NvdW50ICsgKG1iX2NvdW50ICsgMTUpIC8gMTYpICsgKDIgKiBDT0RFQk9PS19NQVgpLzg7CgogICAgZnJhbWVfYnVmX3NpemUgPSBDVklEX0hFQURFUl9TSVpFICsgcy0+bWF4X21heF9zdHJpcHMgKiBzdHJpcF9idWZfc2l6ZTsKCiAgICBpZiAoIShzLT5zdHJpcF9idWYgPSBhdl9tYWxsb2Moc3RyaXBfYnVmX3NpemUpKSkKICAgICAgICBnb3RvIGVub21lbTsKCiAgICBpZiAoIShzLT5mcmFtZV9idWYgPSBhdl9tYWxsb2MoZnJhbWVfYnVmX3NpemUpKSkKICAgICAgICBnb3RvIGVub21lbTsKCiAgICBpZiAoIShzLT5tYiA9IGF2X21hbGxvY19hcnJheShtYl9jb3VudCwgc2l6ZW9mKG1iX2luZm8pKSkpCiAgICAgICAgZ290byBlbm9tZW07CgojaWZkZWYgQ0lORVBBS0VOQ19ERUJVRwogICAgaWYgKCEocy0+YmVzdF9tYiA9IGF2X21hbGxvY19hcnJheShtYl9jb3VudCwgc2l6ZW9mKG1iX2luZm8pKSkpCiAgICAgICAgZ290byBlbm9tZW07CiNlbmRpZgoKICAgIGF2X2xmZ19pbml0KCZzLT5yYW5kY3R4LCAxKTsKICAgIHMtPmF2Y3R4ID0gYXZjdHg7CiAgICBzLT53ID0gYXZjdHgtPndpZHRoOwogICAgcy0+aCA9IGF2Y3R4LT5oZWlnaHQ7CiAgICBzLT5mcmFtZV9idWZfc2l6ZSA9IGZyYW1lX2J1Zl9zaXplOwogICAgcy0+Y3VyZnJhbWUgPSAwOwogICAgcy0+a2V5aW50ID0gYXZjdHgtPmtleWludF9taW47CiAgICBzLT5waXhfZm10ID0gYXZjdHgtPnBpeF9mbXQ7CgogICAgLy9zZXQgdXAgQVZGcmFtZXMKICAgIHMtPmxhc3RfZnJhbWUtPmRhdGFbMF0gICAgICAgID0gcy0+cGljdF9idWZzWzBdOwogICAgcy0+bGFzdF9mcmFtZS0+bGluZXNpemVbMF0gICAgPSBzLT53OwogICAgcy0+YmVzdF9mcmFtZS0+ZGF0YVswXSAgICAgICAgPSBzLT5waWN0X2J1ZnNbMV07CiAgICBzLT5iZXN0X2ZyYW1lLT5saW5lc2l6ZVswXSAgICA9IHMtPnc7CiAgICBzLT5zY3JhdGNoX2ZyYW1lLT5kYXRhWzBdICAgICA9IHMtPnBpY3RfYnVmc1syXTsKICAgIHMtPnNjcmF0Y2hfZnJhbWUtPmxpbmVzaXplWzBdID0gcy0+dzsKCiAgICBpZiAocy0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX1JHQjI0KSB7CiAgICAgICAgcy0+bGFzdF9mcmFtZS0+ZGF0YVsxXSAgICAgICAgPSBzLT5sYXN0X2ZyYW1lLT5kYXRhWzBdICsgcy0+dyAqIHMtPmg7CiAgICAgICAgcy0+bGFzdF9mcmFtZS0+ZGF0YVsyXSAgICAgICAgPSBzLT5sYXN0X2ZyYW1lLT5kYXRhWzFdICsgKChzLT53ICogcy0+aCkgPj4gMik7CiAgICAgICAgcy0+bGFzdF9mcmFtZS0+bGluZXNpemVbMV0gICAgPSBzLT5sYXN0X2ZyYW1lLT5saW5lc2l6ZVsyXSA9IHMtPncgPj4gMTsKCiAgICAgICAgcy0+YmVzdF9mcmFtZS0+ZGF0YVsxXSAgICAgICAgPSBzLT5iZXN0X2ZyYW1lLT5kYXRhWzBdICsgcy0+dyAqIHMtPmg7CiAgICAgICAgcy0+YmVzdF9mcmFtZS0+ZGF0YVsyXSAgICAgICAgPSBzLT5iZXN0X2ZyYW1lLT5kYXRhWzFdICsgKChzLT53ICogcy0+aCkgPj4gMik7CiAgICAgICAgcy0+YmVzdF9mcmFtZS0+bGluZXNpemVbMV0gICAgPSBzLT5iZXN0X2ZyYW1lLT5saW5lc2l6ZVsyXSA9IHMtPncgPj4gMTsKCiAgICAgICAgcy0+c2NyYXRjaF9mcmFtZS0+ZGF0YVsxXSAgICAgPSBzLT5zY3JhdGNoX2ZyYW1lLT5kYXRhWzBdICsgcy0+dyAqIHMtPmg7CiAgICAgICAgcy0+c2NyYXRjaF9mcmFtZS0+ZGF0YVsyXSAgICAgPSBzLT5zY3JhdGNoX2ZyYW1lLT5kYXRhWzFdICsgKChzLT53ICogcy0+aCkgPj4gMik7CiAgICAgICAgcy0+c2NyYXRjaF9mcmFtZS0+bGluZXNpemVbMV0gPSBzLT5zY3JhdGNoX2ZyYW1lLT5saW5lc2l6ZVsyXSA9IHMtPncgPj4gMTsKCiAgICAgICAgcy0+aW5wdXRfZnJhbWUtPmRhdGFbMF0gICAgICAgPSBzLT5waWN0X2J1ZnNbM107CiAgICAgICAgcy0+aW5wdXRfZnJhbWUtPmxpbmVzaXplWzBdICAgPSBzLT53OwogICAgICAgIHMtPmlucHV0X2ZyYW1lLT5kYXRhWzFdICAgICAgID0gcy0+aW5wdXRfZnJhbWUtPmRhdGFbMF0gKyBzLT53ICogcy0+aDsKICAgICAgICBzLT5pbnB1dF9mcmFtZS0+ZGF0YVsyXSAgICAgICA9IHMtPmlucHV0X2ZyYW1lLT5kYXRhWzFdICsgKChzLT53ICogcy0+aCkgPj4gMik7CiAgICAgICAgcy0+aW5wdXRfZnJhbWUtPmxpbmVzaXplWzFdICAgPSBzLT5pbnB1dF9mcmFtZS0+bGluZXNpemVbMl0gPSBzLT53ID4+IDE7CiAgICB9CgogICAgcy0+bWluX3N0cmlwcyA9IHMtPm1pbl9taW5fc3RyaXBzOwogICAgcy0+bWF4X3N0cmlwcyA9IHMtPm1heF9tYXhfc3RyaXBzOwoKI2lmZGVmIENJTkVQQUtFTkNfREVCVUcKICAgIHMtPm51bV92MV9tb2RlID0gcy0+bnVtX3Y0X21vZGUgPSBzLT5udW1fbWNfbW9kZSA9IHMtPm51bV92MV9lbmNzID0gcy0+bnVtX3Y0X2VuY3MgPSBzLT5udW1fc2tpcHMgPSAwOwojZW5kaWYKCiAgICByZXR1cm4gMDsKCmVub21lbToKICAgIGF2X2ZyYW1lX2ZyZWUoJnMtPmxhc3RfZnJhbWUpOwogICAgYXZfZnJhbWVfZnJlZSgmcy0+YmVzdF9mcmFtZSk7CiAgICBhdl9mcmFtZV9mcmVlKCZzLT5zY3JhdGNoX2ZyYW1lKTsKICAgIGlmIChhdmN0eC0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX1JHQjI0KQogICAgICAgIGF2X2ZyYW1lX2ZyZWUoJnMtPmlucHV0X2ZyYW1lKTsKICAgIGF2X2ZyZWVwKCZzLT5jb2RlYm9va19pbnB1dCk7CiAgICBhdl9mcmVlcCgmcy0+Y29kZWJvb2tfY2xvc2VzdCk7CiAgICBhdl9mcmVlcCgmcy0+c3RyaXBfYnVmKTsKICAgIGF2X2ZyZWVwKCZzLT5mcmFtZV9idWYpOwogICAgYXZfZnJlZXAoJnMtPm1iKTsKI2lmZGVmIENJTkVQQUtFTkNfREVCVUcKICAgIGF2X2ZyZWVwKCZzLT5iZXN0X21iKTsKI2VuZGlmCgogICAgZm9yKHggPSAwOyB4IDwgKGF2Y3R4LT5waXhfZm10ID09IEFWX1BJWF9GTVRfUkdCMjQgPyA0IDogMyk7IHgrKykKICAgICAgICBhdl9mcmVlcCgmcy0+cGljdF9idWZzW3hdKTsKCiAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwp9CgpzdGF0aWMgaW50NjRfdCBjYWxjdWxhdGVfbW9kZV9zY29yZShDaW5lcGFrRW5jQ29udGV4dCAqcywgaW50IGgsIHN0cmlwX2luZm8gKmluZm8sIGludCByZXBvcnQsIGludCAqdHJhaW5pbmdfc2V0X3YxX3NocnVuaywgaW50ICp0cmFpbmluZ19zZXRfdjRfc2hydW5rCiNpZmRlZiBDSU5FUEFLX1JFUE9SVF9TRVJSCiwgaW50NjRfdCAqc2VycgojZW5kaWYKKQp7CiAgICAvL3Njb3JlID0gRkZfTEFNQkRBX1NDQUxFICogZXJyb3IgKyBsYW1iZGEgKiBiaXRzCiAgICBpbnQgeDsKICAgIGludCBlbnRyeV9zaXplID0gcy0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX1JHQjI0ID8gNiA6IDQ7CiAgICBpbnQgbWJfY291bnQgPSBzLT53ICogaCAvIE1CX0FSRUE7CiAgICBtYl9pbmZvICptYjsKICAgIGludDY0X3Qgc2NvcmUxLCBzY29yZTIsIHNjb3JlMzsKICAgIGludDY0X3QgcmV0ID0gcy0+bGFtYmRhICogKChpbmZvLT52MV9zaXplID8gQ0hVTktfSEVBREVSX1NJWkUgKyBpbmZvLT52MV9zaXplICogZW50cnlfc2l6ZSA6IDApICsKICAgICAgICAgICAgICAgICAgIChpbmZvLT52NF9zaXplID8gQ0hVTktfSEVBREVSX1NJWkUgKyBpbmZvLT52NF9zaXplICogZW50cnlfc2l6ZSA6IDApICsKICAgICAgICAgICAgICAgICAgIENIVU5LX0hFQURFUl9TSVpFKSA8PCAzOwoKICAgIC8vYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfSU5GTywgInNpemVzICUzaSAlM2kgLT4gJTkiUFJJZDY0IiBzY29yZSBtYl9jb3VudCAlaSIsIGluZm8tPnYxX3NpemUsIGluZm8tPnY0X3NpemUsIHJldCwgbWJfY291bnQpOwoKI2lmZGVmIENJTkVQQUtfUkVQT1JUX1NFUlIKICAgICpzZXJyID0gMDsKI2VuZGlmCgogICAgc3dpdGNoKGluZm8tPm1vZGUpIHsKICAgIGNhc2UgTU9ERV9WMV9PTkxZOgogICAgICAgIC8vb25lIGJ5dGUgcGVyIE1CCiAgICAgICAgcmV0ICs9IHMtPmxhbWJkYSAqIDggKiBtYl9jb3VudDsKCi8vIHdoaWxlIGNhbGN1bGF0aW5nIHdlIGFzc3VtZSBhbGwgYmxvY2tzIGFyZSBFTkNfVjEKICAgICAgICBmb3IoeCA9IDA7IHggPCBtYl9jb3VudDsgeCsrKSB7CiAgICAgICAgICAgIG1iID0gJnMtPm1iW3hdOwogICAgICAgICAgICByZXQgKz0gRkZfTEFNQkRBX1NDQUxFICogbWItPnYxX2Vycm9yOwojaWZkZWYgQ0lORVBBS19SRVBPUlRfU0VSUgogICAgICAgICAgICAqc2VyciArPSBtYi0+djFfZXJyb3I7CiNlbmRpZgovLyB0aGlzIGZ1bmN0aW9uIGlzIG5ldmVyIGNhbGxlZCBmb3IgcmVwb3J0IGluIE1PREVfVjFfT05MWQovLyAgICAgICAgICAgIGlmKCFyZXBvcnQpCiAgICAgICAgICAgIG1iLT5iZXN0X2VuY29kaW5nID0gRU5DX1YxOwogICAgICAgIH0KCiAgICAgICAgYnJlYWs7CiAgICBjYXNlIE1PREVfVjFfVjQ6CiAgICAgICAgLy85IG9yIDMzIGJpdHMgcGVyIE1CCiAgICAgICAgaWYocmVwb3J0KSB7Ci8vIG5vIG1vdmVzIGJldHdlZW4gdGhlIGNvcnJlc3BvbmRpbmcgdHJhaW5pbmcgc2V0cyBhcmUgYWxsb3dlZAogICAgICAgICAgICAqdHJhaW5pbmdfc2V0X3YxX3NocnVuayA9ICp0cmFpbmluZ19zZXRfdjRfc2hydW5rID0gMDsKICAgICAgICAgICAgZm9yKHggPSAwOyB4IDwgbWJfY291bnQ7IHgrKykgewogICAgICAgICAgICAgICAgaW50IG1iZXJyOwogICAgICAgICAgICAgICAgbWIgPSAmcy0+bWJbeF07CiAgICAgICAgICAgICAgICBpZihtYi0+YmVzdF9lbmNvZGluZyA9PSBFTkNfVjEpCiAgICAgICAgICAgICAgICAgICAgc2NvcmUxID0gcy0+bGFtYmRhICogOSAgKyBGRl9MQU1CREFfU0NBTEUgKiAobWJlcnI9bWItPnYxX2Vycm9yKTsKICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICBzY29yZTEgPSBzLT5sYW1iZGEgKiAzMyArIEZGX0xBTUJEQV9TQ0FMRSAqIChtYmVycj1tYi0+djRfZXJyb3IpOwogICAgICAgICAgICAgICAgcmV0ICs9IHNjb3JlMTsKI2lmZGVmIENJTkVQQUtfUkVQT1JUX1NFUlIKICAgICAgICAgICAgICAgICpzZXJyICs9IG1iZXJyOwojZW5kaWYKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7IC8vIGZpbmQgYmVzdCBtb2RlIHBlciBibG9jawogICAgICAgICAgICBmb3IoeCA9IDA7IHggPCBtYl9jb3VudDsgeCsrKSB7CiAgICAgICAgICAgICAgICBtYiA9ICZzLT5tYlt4XTsKICAgICAgICAgICAgICAgIHNjb3JlMSA9IHMtPmxhbWJkYSAqIDkgICsgRkZfTEFNQkRBX1NDQUxFICogbWItPnYxX2Vycm9yOwogICAgICAgICAgICAgICAgc2NvcmUyID0gcy0+bGFtYmRhICogMzMgKyBGRl9MQU1CREFfU0NBTEUgKiBtYi0+djRfZXJyb3I7CgogICAgICAgICAgICAgICAgaWYoc2NvcmUxIDw9IHNjb3JlMikgewogICAgICAgICAgICAgICAgICAgIHJldCArPSBzY29yZTE7CiNpZmRlZiBDSU5FUEFLX1JFUE9SVF9TRVJSCiAgICAgICAgICAgICAgICAgICAgKnNlcnIgKz0gbWItPnYxX2Vycm9yOwojZW5kaWYKICAgICAgICAgICAgICAgICAgICBtYi0+YmVzdF9lbmNvZGluZyA9IEVOQ19WMTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgcmV0ICs9IHNjb3JlMjsKI2lmZGVmIENJTkVQQUtfUkVQT1JUX1NFUlIKICAgICAgICAgICAgICAgICAgICAqc2VyciArPSBtYi0+djRfZXJyb3I7CiNlbmRpZgogICAgICAgICAgICAgICAgICAgIG1iLT5iZXN0X2VuY29kaW5nID0gRU5DX1Y0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBicmVhazsKICAgIGNhc2UgTU9ERV9NQzoKICAgICAgICAvLzEsIDEwIG9yIDM0IGJpdHMgcGVyIE1CCiAgICAgICAgaWYocmVwb3J0KSB7CiAgICAgICAgICAgIGludCB2MV9zaHJ1bmsgPSAwLCB2NF9zaHJ1bmsgPSAwOwogICAgICAgICAgICBmb3IoeCA9IDA7IHggPCBtYl9jb3VudDsgeCsrKSB7CiAgICAgICAgICAgICAgICBtYiA9ICZzLT5tYlt4XTsKLy8gaXQgaXMgT0sgdG8gbW92ZSBibG9ja3MgdG8gRU5DX1NLSVAgaGVyZQovLyBidXQgbm90IHRvIGFueSBjb2RlYm9vayBlbmNvZGluZyEKICAgICAgICAgICAgICAgIHNjb3JlMSA9IHMtPmxhbWJkYSAqIDEgICsgRkZfTEFNQkRBX1NDQUxFICogbWItPnNraXBfZXJyb3I7CiAgICAgICAgICAgICAgICBpZihtYi0+YmVzdF9lbmNvZGluZyA9PSBFTkNfU0tJUCkgewogICAgICAgICAgICAgICAgICAgIHJldCArPSBzY29yZTE7CiNpZmRlZiBDSU5FUEFLX1JFUE9SVF9TRVJSCiAgICAgICAgICAgICAgICAgICAgKnNlcnIgKz0gbWItPnNraXBfZXJyb3I7CiNlbmRpZgogICAgICAgICAgICAgICAgfSBlbHNlIGlmKG1iLT5iZXN0X2VuY29kaW5nID09IEVOQ19WMSkgewogICAgICAgICAgICAgICAgICAgIGlmKChzY29yZTI9cy0+bGFtYmRhICogMTAgKyBGRl9MQU1CREFfU0NBTEUgKiBtYi0+djFfZXJyb3IpID49IHNjb3JlMSkgewogICAgICAgICAgICAgICAgICAgICAgICBtYi0+YmVzdF9lbmNvZGluZyA9IEVOQ19TS0lQOwogICAgICAgICAgICAgICAgICAgICAgICArK3YxX3NocnVuazsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0ICs9IHNjb3JlMTsKI2lmZGVmIENJTkVQQUtfUkVQT1JUX1NFUlIKICAgICAgICAgICAgICAgICAgICAgICAgKnNlcnIgKz0gbWItPnNraXBfZXJyb3I7CiNlbmRpZgogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldCArPSBzY29yZTI7CiNpZmRlZiBDSU5FUEFLX1JFUE9SVF9TRVJSCiAgICAgICAgICAgICAgICAgICAgICAgICpzZXJyICs9IG1iLT52MV9lcnJvcjsKI2VuZGlmCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBpZigoc2NvcmUzPXMtPmxhbWJkYSAqIDM0ICsgRkZfTEFNQkRBX1NDQUxFICogbWItPnY0X2Vycm9yKSA+PSBzY29yZTEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbWItPmJlc3RfZW5jb2RpbmcgPSBFTkNfU0tJUDsKICAgICAgICAgICAgICAgICAgICAgICAgKyt2NF9zaHJ1bms7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldCArPSBzY29yZTE7CiNpZmRlZiBDSU5FUEFLX1JFUE9SVF9TRVJSCiAgICAgICAgICAgICAgICAgICAgICAgICpzZXJyICs9IG1iLT5za2lwX2Vycm9yOwojZW5kaWYKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICByZXQgKz0gc2NvcmUzOwojaWZkZWYgQ0lORVBBS19SRVBPUlRfU0VSUgogICAgICAgICAgICAgICAgICAgICAgICAqc2VyciArPSBtYi0+djRfZXJyb3I7CiNlbmRpZgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAqdHJhaW5pbmdfc2V0X3YxX3NocnVuayA9IHYxX3NocnVuazsKICAgICAgICAgICAgKnRyYWluaW5nX3NldF92NF9zaHJ1bmsgPSB2NF9zaHJ1bms7CiAgICAgICAgfSBlbHNlIHsgLy8gZmluZCBiZXN0IG1vZGUgcGVyIGJsb2NrCiAgICAgICAgICAgIGZvcih4ID0gMDsgeCA8IG1iX2NvdW50OyB4KyspIHsKICAgICAgICAgICAgICAgIG1iID0gJnMtPm1iW3hdOwogICAgICAgICAgICAgICAgc2NvcmUxID0gcy0+bGFtYmRhICogMSAgKyBGRl9MQU1CREFfU0NBTEUgKiBtYi0+c2tpcF9lcnJvcjsKICAgICAgICAgICAgICAgIHNjb3JlMiA9IHMtPmxhbWJkYSAqIDEwICsgRkZfTEFNQkRBX1NDQUxFICogbWItPnYxX2Vycm9yOwogICAgICAgICAgICAgICAgc2NvcmUzID0gcy0+bGFtYmRhICogMzQgKyBGRl9MQU1CREFfU0NBTEUgKiBtYi0+djRfZXJyb3I7CgogICAgICAgICAgICAgICAgaWYoc2NvcmUxIDw9IHNjb3JlMiAmJiBzY29yZTEgPD0gc2NvcmUzKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0ICs9IHNjb3JlMTsKI2lmZGVmIENJTkVQQUtfUkVQT1JUX1NFUlIKICAgICAgICAgICAgICAgICAgICAqc2VyciArPSBtYi0+c2tpcF9lcnJvcjsKI2VuZGlmCiAgICAgICAgICAgICAgICAgICAgbWItPmJlc3RfZW5jb2RpbmcgPSBFTkNfU0tJUDsKICAgICAgICAgICAgICAgIH0gZWxzZSBpZihzY29yZTIgPD0gc2NvcmUzKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0ICs9IHNjb3JlMjsKI2lmZGVmIENJTkVQQUtfUkVQT1JUX1NFUlIKICAgICAgICAgICAgICAgICAgICAqc2VyciArPSBtYi0+djFfZXJyb3I7CiNlbmRpZgogICAgICAgICAgICAgICAgICAgIG1iLT5iZXN0X2VuY29kaW5nID0gRU5DX1YxOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICByZXQgKz0gc2NvcmUzOwojaWZkZWYgQ0lORVBBS19SRVBPUlRfU0VSUgogICAgICAgICAgICAgICAgICAgICpzZXJyICs9IG1iLT52NF9lcnJvcjsKI2VuZGlmCiAgICAgICAgICAgICAgICAgICAgbWItPmJlc3RfZW5jb2RpbmcgPSBFTkNfVjQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGJyZWFrOwogICAgfQoKICAgIHJldHVybiByZXQ7Cn0KCnN0YXRpYyBpbnQgd3JpdGVfY2h1bmtfaGVhZGVyKHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGNodW5rX3R5cGUsIGludCBjaHVua19zaXplKQp7CiAgICBidWZbMF0gPSBjaHVua190eXBlOwogICAgQVZfV0IyNCgmYnVmWzFdLCBjaHVua19zaXplICsgQ0hVTktfSEVBREVSX1NJWkUpOwogICAgcmV0dXJuIENIVU5LX0hFQURFUl9TSVpFOwp9CgpzdGF0aWMgaW50IGVuY29kZV9jb2RlYm9vayhDaW5lcGFrRW5jQ29udGV4dCAqcywgaW50ICpjb2RlYm9vaywgaW50IHNpemUsIGludCBjaHVua190eXBlX3l1diwgaW50IGNodW5rX3R5cGVfZ3JheSwgdW5zaWduZWQgY2hhciAqYnVmKQp7CiAgICBpbnQgeCwgeSwgcmV0LCBlbnRyeV9zaXplID0gcy0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX1JHQjI0ID8gNiA6IDQ7CiAgICBpbnQgaW5jcmVtZW50YWxfY29kZWJvb2tfcmVwbGFjZW1lbnRfbW9kZSA9IDA7IC8vIGhhcmRjb2RlZCBoZXJlLAogICAgICAgICAgICAgICAgLy8gdGhlIGNvbXBpbGVyIHNob3VsZCBub3RpY2UgdGhhdCB0aGlzIGlzIGEgY29uc3RhbnQgLS0gcmwKCiAgICByZXQgPSB3cml0ZV9jaHVua19oZWFkZXIoYnVmLAogICAgICAgICAgcy0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX1JHQjI0ID8KICAgICAgICAgICBjaHVua190eXBlX3l1disoaW5jcmVtZW50YWxfY29kZWJvb2tfcmVwbGFjZW1lbnRfbW9kZT8xOjApIDoKICAgICAgICAgICBjaHVua190eXBlX2dyYXkrKGluY3JlbWVudGFsX2NvZGVib29rX3JlcGxhY2VtZW50X21vZGU/MTowKSwKICAgICAgICAgIGVudHJ5X3NpemUgKiBzaXplCiAgICAgICAgICAgKyAoaW5jcmVtZW50YWxfY29kZWJvb2tfcmVwbGFjZW1lbnRfbW9kZT8oc2l6ZSszMSkvMzIqNDowKSApOwoKLy8gd2UgZG8gY29kZWJvb2sgZW5jb2RpbmcgYWNjb3JkaW5nIHRvIHRoZSAiaW50cmEiIG1vZGUKLy8gYnV0IHdlIGtlZXAgdGhlICJkZWFkIiBjb2RlIGZvciByZWZlcmVuY2UgaW4gY2FzZSB3ZSB3aWxsIHdhbnQKLy8gdG8gdXNlIGluY3JlbWVudGFsIGNvZGVib29rIHVwZGF0ZXMgKHdoaWNoIGFjdHVhbGx5IHdvdWxkIGdpdmUgdXMKLy8gImtpbmQgb2YiIG1vdGlvbiBjb21wZW5zYXRpb24sIGVzcGVjaWFsbHkgaW4gMSBzdHJpcC9mcmFtZSBjYXNlKSAtLSBybAovLyAob2YgY291cnNlLCB0aGUgY29kZSB3aWxsIGJlIG5vdCB1c2VmdWwgYXMtaXMpCiAgICBpZihpbmNyZW1lbnRhbF9jb2RlYm9va19yZXBsYWNlbWVudF9tb2RlKSB7CiAgICAgICAgaW50IGZsYWdzID0gMDsKICAgICAgICBpbnQgZmxhZ3NpbmQ7CiAgICAgICAgZm9yKHggPSAwOyB4IDwgc2l6ZTsgeCsrKSB7CiAgICAgICAgICAgIGlmKGZsYWdzID09IDApIHsKICAgICAgICAgICAgICAgIGZsYWdzaW5kID0gcmV0OwogICAgICAgICAgICAgICAgcmV0ICs9IDQ7CiAgICAgICAgICAgICAgICBmbGFncyA9IDB4ODAwMDAwMDA7CiAgICAgICAgICAgIH0gZWxzZQogICAgICAgICAgICAgICAgZmxhZ3MgPSAoKGZsYWdzPj4xKSB8IDB4ODAwMDAwMDApOwogICAgICAgICAgICBmb3IoeSA9IDA7IHkgPCBlbnRyeV9zaXplOyB5KyspCiAgICAgICAgICAgICAgICBidWZbcmV0KytdID0gY29kZWJvb2tbeSArIHgqZW50cnlfc2l6ZV0gXiAoeSA+PSA0ID8gMHg4MCA6IDApOwogICAgICAgICAgICBpZigoZmxhZ3MmMHhmZmZmZmZmZikgPT0gMHhmZmZmZmZmZikgewogICAgICAgICAgICAgICAgQVZfV0IzMigmYnVmW2ZsYWdzaW5kXSwgZmxhZ3MpOwogICAgICAgICAgICAgICAgZmxhZ3MgPSAwOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmKGZsYWdzKQogICAgICAgICAgICBBVl9XQjMyKCZidWZbZmxhZ3NpbmRdLCBmbGFncyk7CiAgICB9IGVsc2UKICAgICAgICBmb3IoeCA9IDA7IHggPCBzaXplOyB4KyspCiAgICAgICAgICAgIGZvcih5ID0gMDsgeSA8IGVudHJ5X3NpemU7IHkrKykKICAgICAgICAgICAgICAgIGJ1ZltyZXQrK10gPSBjb2RlYm9va1t5ICsgeCplbnRyeV9zaXplXSBeICh5ID49IDQgPyAweDgwIDogMCk7CgogICAgcmV0dXJuIHJldDsKfQoKLy9zZXRzIG91dCB0byB0aGUgc3ViIHBpY3R1cmUgc3RhcnRpbmcgYXQgKHgseSkgaW4gaW4Kc3RhdGljIHZvaWQgZ2V0X3N1Yl9waWN0dXJlKENpbmVwYWtFbmNDb250ZXh0ICpzLCBpbnQgeCwgaW50IHksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICogaW5fZGF0YVs0XSwgaW50ICBpbl9saW5lc2l6ZVs0XSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKm91dF9kYXRhWzRdLCBpbnQgb3V0X2xpbmVzaXplWzRdKQp7CiAgICBvdXRfZGF0YVswXSA9IGluX2RhdGFbMF0gKyB4ICsgeSAqIGluX2xpbmVzaXplWzBdOwogICAgb3V0X2xpbmVzaXplWzBdID0gaW5fbGluZXNpemVbMF07CgogICAgaWYocy0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX1JHQjI0KSB7CiAgICAgICAgb3V0X2RhdGFbMV0gPSBpbl9kYXRhWzFdICsgKHggPj4gMSkgKyAoeSA+PiAxKSAqIGluX2xpbmVzaXplWzFdOwogICAgICAgIG91dF9saW5lc2l6ZVsxXSA9IGluX2xpbmVzaXplWzFdOwoKICAgICAgICBvdXRfZGF0YVsyXSA9IGluX2RhdGFbMl0gKyAoeCA+PiAxKSArICh5ID4+IDEpICogaW5fbGluZXNpemVbMl07CiAgICAgICAgb3V0X2xpbmVzaXplWzJdID0gaW5fbGluZXNpemVbMl07CiAgICB9Cn0KCi8vZGVjb2RlcyB0aGUgVjEgdmVjdG9yIGluIG1iIGludG8gdGhlIDR4NCBNQiBwb2ludGVkIHRvIGJ5IGRhdGEKc3RhdGljIHZvaWQgZGVjb2RlX3YxX3ZlY3RvcihDaW5lcGFrRW5jQ29udGV4dCAqcywgdWludDhfdCAqZGF0YVs0XSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGluZXNpemVbNF0sIGludCB2MV92ZWN0b3IsIHN0cmlwX2luZm8gKmluZm8pCnsKICAgIGludCBlbnRyeV9zaXplID0gcy0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX1JHQjI0ID8gNiA6IDQ7CgogICAgZGF0YVswXVswXSA9CiAgICAgICAgICAgIGRhdGFbMF1bMV0gPQogICAgICAgICAgICBkYXRhWzBdWyAgICBsaW5lc2l6ZVswXV0gPQogICAgICAgICAgICBkYXRhWzBdWzErICBsaW5lc2l6ZVswXV0gPSBpbmZvLT52MV9jb2RlYm9va1t2MV92ZWN0b3IqZW50cnlfc2l6ZV07CgogICAgZGF0YVswXVsyXSA9CiAgICAgICAgICAgIGRhdGFbMF1bM10gPQogICAgICAgICAgICBkYXRhWzBdWzIrICBsaW5lc2l6ZVswXV0gPQogICAgICAgICAgICBkYXRhWzBdWzMrICBsaW5lc2l6ZVswXV0gPSBpbmZvLT52MV9jb2RlYm9va1t2MV92ZWN0b3IqZW50cnlfc2l6ZSsxXTsKCiAgICBkYXRhWzBdWzIqbGluZXNpemVbMF1dID0KICAgICAgICAgICAgZGF0YVswXVsxKzIqbGluZXNpemVbMF1dID0KICAgICAgICAgICAgZGF0YVswXVsgIDMqbGluZXNpemVbMF1dID0KICAgICAgICAgICAgZGF0YVswXVsxKzMqbGluZXNpemVbMF1dID0gaW5mby0+djFfY29kZWJvb2tbdjFfdmVjdG9yKmVudHJ5X3NpemUrMl07CgogICAgZGF0YVswXVsyKzIqbGluZXNpemVbMF1dID0KICAgICAgICAgICAgZGF0YVswXVszKzIqbGluZXNpemVbMF1dID0KICAgICAgICAgICAgZGF0YVswXVsyKzMqbGluZXNpemVbMF1dID0KICAgICAgICAgICAgZGF0YVswXVszKzMqbGluZXNpemVbMF1dID0gaW5mby0+djFfY29kZWJvb2tbdjFfdmVjdG9yKmVudHJ5X3NpemUrM107CgogICAgaWYocy0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX1JHQjI0KSB7CiAgICAgICAgZGF0YVsxXVswXSA9CiAgICAgICAgICAgIGRhdGFbMV1bMV0gPQogICAgICAgICAgICBkYXRhWzFdWyAgICBsaW5lc2l6ZVsxXV0gPQogICAgICAgICAgICBkYXRhWzFdWzErICBsaW5lc2l6ZVsxXV0gPSBpbmZvLT52MV9jb2RlYm9va1t2MV92ZWN0b3IqZW50cnlfc2l6ZSs0XTsKCiAgICAgICAgZGF0YVsyXVswXSA9CiAgICAgICAgICAgIGRhdGFbMl1bMV0gPQogICAgICAgICAgICBkYXRhWzJdWyAgICBsaW5lc2l6ZVsyXV0gPQogICAgICAgICAgICBkYXRhWzJdWzErICBsaW5lc2l6ZVsyXV0gPSBpbmZvLT52MV9jb2RlYm9va1t2MV92ZWN0b3IqZW50cnlfc2l6ZSs1XTsKICAgIH0KfQoKLy9kZWNvZGVzIHRoZSBWNCB2ZWN0b3JzIGluIG1iIGludG8gdGhlIDR4NCBNQiBwb2ludGVkIHRvIGJ5IGRhdGEKc3RhdGljIHZvaWQgZGVjb2RlX3Y0X3ZlY3RvcihDaW5lcGFrRW5jQ29udGV4dCAqcywgdWludDhfdCAqZGF0YVs0XSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGluZXNpemVbNF0sIGludCAqdjRfdmVjdG9yLCBzdHJpcF9pbmZvICppbmZvKQp7CiAgICBpbnQgaSwgeCwgeSwgZW50cnlfc2l6ZSA9IHMtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9SR0IyNCA/IDYgOiA0OwoKICAgIGZvcihpID0geSA9IDA7IHkgPCA0OyB5ICs9IDIpIHsKICAgICAgICBmb3IoeCA9IDA7IHggPCA0OyB4ICs9IDIsIGkrKykgewogICAgICAgICAgICBkYXRhWzBdW3ggICArICAgICB5KmxpbmVzaXplWzBdXSA9IGluZm8tPnY0X2NvZGVib29rW3Y0X3ZlY3RvcltpXSplbnRyeV9zaXplXTsKICAgICAgICAgICAgZGF0YVswXVt4KzEgKyAgICAgeSpsaW5lc2l6ZVswXV0gPSBpbmZvLT52NF9jb2RlYm9va1t2NF92ZWN0b3JbaV0qZW50cnlfc2l6ZSsxXTsKICAgICAgICAgICAgZGF0YVswXVt4ICAgKyAoeSsxKSpsaW5lc2l6ZVswXV0gPSBpbmZvLT52NF9jb2RlYm9va1t2NF92ZWN0b3JbaV0qZW50cnlfc2l6ZSsyXTsKICAgICAgICAgICAgZGF0YVswXVt4KzEgKyAoeSsxKSpsaW5lc2l6ZVswXV0gPSBpbmZvLT52NF9jb2RlYm9va1t2NF92ZWN0b3JbaV0qZW50cnlfc2l6ZSszXTsKCiAgICAgICAgICAgIGlmKHMtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9SR0IyNCkgewogICAgICAgICAgICAgICAgZGF0YVsxXVsoeD4+MSkgKyAoeT4+MSkqbGluZXNpemVbMV1dID0gaW5mby0+djRfY29kZWJvb2tbdjRfdmVjdG9yW2ldKmVudHJ5X3NpemUrNF07CiAgICAgICAgICAgICAgICBkYXRhWzJdWyh4Pj4xKSArICh5Pj4xKSpsaW5lc2l6ZVsyXV0gPSBpbmZvLT52NF9jb2RlYm9va1t2NF92ZWN0b3JbaV0qZW50cnlfc2l6ZSs1XTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KfQoKc3RhdGljIHZvaWQgY29weV9tYihDaW5lcGFrRW5jQ29udGV4dCAqcywKICAgICAgICAgICAgICAgICAgICB1aW50OF90ICphX2RhdGFbNF0sIGludCBhX2xpbmVzaXplWzRdLAogICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmJfZGF0YVs0XSwgaW50IGJfbGluZXNpemVbNF0pCnsKICAgIGludCB5LCBwOwoKICAgIGZvcih5ID0gMDsgeSA8IE1CX1NJWkU7IHkrKykgewogICAgICAgIG1lbWNweShhX2RhdGFbMF0reSphX2xpbmVzaXplWzBdLCBiX2RhdGFbMF0reSpiX2xpbmVzaXplWzBdLAogICAgICAgICAgICAgICBNQl9TSVpFKTsKICAgIH0KCiAgICBpZihzLT5waXhfZm10ID09IEFWX1BJWF9GTVRfUkdCMjQpIHsKICAgICAgICBmb3IocCA9IDE7IHAgPD0gMjsgcCsrKSB7CiAgICAgICAgICAgIGZvcih5ID0gMDsgeSA8IE1CX1NJWkUvMjsgeSsrKSB7CiAgICAgICAgICAgICAgICBtZW1jcHkoYV9kYXRhW3BdICsgeSphX2xpbmVzaXplW3BdLAogICAgICAgICAgICAgICAgICAgICAgIGJfZGF0YVtwXSArIHkqYl9saW5lc2l6ZVtwXSwKICAgICAgICAgICAgICAgICAgICAgICBNQl9TSVpFLzIpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQp9CgpzdGF0aWMgaW50IGVuY29kZV9tb2RlKENpbmVwYWtFbmNDb250ZXh0ICpzLCBpbnQgaCwKICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpzY3JhdGNoX2RhdGFbNF0sIGludCBzY3JhdGNoX2xpbmVzaXplWzRdLAogICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmxhc3RfZGF0YVs0XSwgaW50IGxhc3RfbGluZXNpemVbNF0sCiAgICAgICAgICAgICAgICAgICAgICAgc3RyaXBfaW5mbyAqaW5mbywgdW5zaWduZWQgY2hhciAqYnVmKQp7CiAgICBpbnQgeCwgeSwgeiwgZmxhZ3MsIGJpdHMsIHRlbXBfc2l6ZSwgaGVhZGVyX29mcywgcmV0ID0gMCwgbWJfY291bnQgPSBzLT53ICogaCAvIE1CX0FSRUE7CiAgICBpbnQgbmVlZHNfZXh0cmFfYml0LCBzaG91bGRfd3JpdGVfdGVtcDsKICAgIHVuc2lnbmVkIGNoYXIgdGVtcFs2NF07IC8vMzIvMiA9IDE2IFY0IGJsb2NrcyBhdCA0IEIgZWFjaCAtPiA2NCBCCiAgICBtYl9pbmZvICptYjsKICAgIHVpbnQ4X3QgKnN1Yl9zY3JhdGNoX2RhdGFbNF0gPSB7MH0sICpzdWJfbGFzdF9kYXRhWzRdID0gezB9OwogICAgaW50IHN1Yl9zY3JhdGNoX2xpbmVzaXplWzRdID0gezB9LCBzdWJfbGFzdF9saW5lc2l6ZVs0XSA9IHswfTsKCiAgICAvL2VuY29kZSBjb2RlYm9va3MKLy8vLy8vIE1hY09TIHZpbnRhZ2UgZGVjb2RlciBjb21wYXRpYmlsaXR5IGRpY3RhdGVzIHRoZSBwcmVzZW5jZSBvZgovLy8vLy8gdGhlIGNvZGVib29rIGNodW5rIGV2ZW4gd2hlbiB0aGUgY29kZWJvb2sgaXMgZW1wdHkgLSBwcmV0dHkgZHVtYi4uLgovLy8vLy8gYW5kIGFsc28gdGhlIGNlcnRhaW4gb3JkZXIgb2YgdGhlIGNvZGVib29rIGNodW5rcyAtLSBybAogICAgaWYoaW5mby0+djRfc2l6ZSB8fCAhcy0+c2tpcF9lbXB0eV9jYikKICAgICAgICByZXQgKz0gZW5jb2RlX2NvZGVib29rKHMsIGluZm8tPnY0X2NvZGVib29rLCBpbmZvLT52NF9zaXplLCAweDIwLCAweDI0LCBidWYgKyByZXQpOwoKICAgIGlmKGluZm8tPnYxX3NpemUgfHwgIXMtPnNraXBfZW1wdHlfY2IpCiAgICAgICAgcmV0ICs9IGVuY29kZV9jb2RlYm9vayhzLCBpbmZvLT52MV9jb2RlYm9vaywgaW5mby0+djFfc2l6ZSwgMHgyMiwgMHgyNiwgYnVmICsgcmV0KTsKCiAgICAvL3VwZGF0ZSBzY3JhdGNoIHBpY3R1cmUKICAgIGZvcih6ID0geSA9IDA7IHkgPCBoOyB5ICs9IE1CX1NJWkUpIHsKICAgICAgICBmb3IoeCA9IDA7IHggPCBzLT53OyB4ICs9IE1CX1NJWkUsIHorKykgewogICAgICAgICAgICBtYiA9ICZzLT5tYlt6XTsKCiAgICAgICAgICAgIGdldF9zdWJfcGljdHVyZShzLCB4LCB5LCBzY3JhdGNoX2RhdGEsIHNjcmF0Y2hfbGluZXNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJfc2NyYXRjaF9kYXRhLCBzdWJfc2NyYXRjaF9saW5lc2l6ZSk7CgogICAgICAgICAgICBpZihpbmZvLT5tb2RlID09IE1PREVfTUMgJiYgbWItPmJlc3RfZW5jb2RpbmcgPT0gRU5DX1NLSVApIHsKICAgICAgICAgICAgICAgIGdldF9zdWJfcGljdHVyZShzLCB4LCB5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RfZGF0YSwgbGFzdF9saW5lc2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJfbGFzdF9kYXRhLCBzdWJfbGFzdF9saW5lc2l6ZSk7CiAgICAgICAgICAgICAgICBjb3B5X21iKHMsIHN1Yl9zY3JhdGNoX2RhdGEsIHN1Yl9zY3JhdGNoX2xpbmVzaXplLAogICAgICAgICAgICAgICAgICAgICAgICBzdWJfbGFzdF9kYXRhLCBzdWJfbGFzdF9saW5lc2l6ZSk7CiAgICAgICAgICAgIH0gZWxzZSBpZihpbmZvLT5tb2RlID09IE1PREVfVjFfT05MWSB8fCBtYi0+YmVzdF9lbmNvZGluZyA9PSBFTkNfVjEpCiAgICAgICAgICAgICAgICBkZWNvZGVfdjFfdmVjdG9yKHMsIHN1Yl9zY3JhdGNoX2RhdGEsIHN1Yl9zY3JhdGNoX2xpbmVzaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYi0+djFfdmVjdG9yLCBpbmZvKTsKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgZGVjb2RlX3Y0X3ZlY3RvcihzLCBzdWJfc2NyYXRjaF9kYXRhLCBzdWJfc2NyYXRjaF9saW5lc2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWItPnY0X3ZlY3RvciwgaW5mbyk7CiAgICAgICAgfQogICAgfQoKICAgIHN3aXRjaChpbmZvLT5tb2RlKSB7CiAgICBjYXNlIE1PREVfVjFfT05MWToKICAgICAgICAvL2F2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0lORk8sICJtYl9jb3VudCA9ICVpXG4iLCBtYl9jb3VudCk7CiAgICAgICAgcmV0ICs9IHdyaXRlX2NodW5rX2hlYWRlcihidWYgKyByZXQsIDB4MzIsIG1iX2NvdW50KTsKCiAgICAgICAgZm9yKHggPSAwOyB4IDwgbWJfY291bnQ7IHgrKykKICAgICAgICAgICAgYnVmW3JldCsrXSA9IHMtPm1iW3hdLnYxX3ZlY3RvcjsKCiAgICAgICAgYnJlYWs7CiAgICBjYXNlIE1PREVfVjFfVjQ6CiAgICAgICAgLy9yZW1lbWJlciBoZWFkZXIgcG9zaXRpb24KICAgICAgICBoZWFkZXJfb2ZzID0gcmV0OwogICAgICAgIHJldCArPSBDSFVOS19IRUFERVJfU0laRTsKCiAgICAgICAgZm9yKHggPSAwOyB4IDwgbWJfY291bnQ7IHggKz0gMzIpIHsKICAgICAgICAgICAgZmxhZ3MgPSAwOwogICAgICAgICAgICBmb3IoeSA9IHg7IHkgPCBGRk1JTih4KzMyLCBtYl9jb3VudCk7IHkrKykKICAgICAgICAgICAgICAgIGlmKHMtPm1iW3ldLmJlc3RfZW5jb2RpbmcgPT0gRU5DX1Y0KQogICAgICAgICAgICAgICAgICAgIGZsYWdzIHw9IDEgPDwgKDMxIC0geSArIHgpOwoKICAgICAgICAgICAgQVZfV0IzMigmYnVmW3JldF0sIGZsYWdzKTsKICAgICAgICAgICAgcmV0ICs9IDQ7CgogICAgICAgICAgICBmb3IoeSA9IHg7IHkgPCBGRk1JTih4KzMyLCBtYl9jb3VudCk7IHkrKykgewogICAgICAgICAgICAgICAgbWIgPSAmcy0+bWJbeV07CgogICAgICAgICAgICAgICAgaWYobWItPmJlc3RfZW5jb2RpbmcgPT0gRU5DX1YxKQogICAgICAgICAgICAgICAgICAgIGJ1ZltyZXQrK10gPSBtYi0+djFfdmVjdG9yOwogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIGZvcih6ID0gMDsgeiA8IDQ7IHorKykKICAgICAgICAgICAgICAgICAgICAgICAgYnVmW3JldCsrXSA9IG1iLT52NF92ZWN0b3Jbel07CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHdyaXRlX2NodW5rX2hlYWRlcihidWYgKyBoZWFkZXJfb2ZzLCAweDMwLCByZXQgLSBoZWFkZXJfb2ZzIC0gQ0hVTktfSEVBREVSX1NJWkUpOwoKICAgICAgICBicmVhazsKICAgIGNhc2UgTU9ERV9NQzoKICAgICAgICAvL3JlbWVtYmVyIGhlYWRlciBwb3NpdGlvbgogICAgICAgIGhlYWRlcl9vZnMgPSByZXQ7CiAgICAgICAgcmV0ICs9IENIVU5LX0hFQURFUl9TSVpFOwogICAgICAgIGZsYWdzID0gYml0cyA9IHRlbXBfc2l6ZSA9IDA7CgogICAgICAgIGZvcih4ID0gMDsgeCA8IG1iX2NvdW50OyB4KyspIHsKICAgICAgICAgICAgbWIgPSAmcy0+bWJbeF07CiAgICAgICAgICAgIGZsYWdzIHw9IChtYi0+YmVzdF9lbmNvZGluZyAhPSBFTkNfU0tJUCkgPDwgKDMxIC0gYml0cysrKTsKICAgICAgICAgICAgbmVlZHNfZXh0cmFfYml0ID0gMDsKICAgICAgICAgICAgc2hvdWxkX3dyaXRlX3RlbXAgPSAwOwoKICAgICAgICAgICAgaWYobWItPmJlc3RfZW5jb2RpbmcgIT0gRU5DX1NLSVApIHsKICAgICAgICAgICAgICAgIGlmKGJpdHMgPCAzMikKICAgICAgICAgICAgICAgICAgICBmbGFncyB8PSAobWItPmJlc3RfZW5jb2RpbmcgPT0gRU5DX1Y0KSA8PCAoMzEgLSBiaXRzKyspOwogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIG5lZWRzX2V4dHJhX2JpdCA9IDE7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmKGJpdHMgPT0gMzIpIHsKICAgICAgICAgICAgICAgIEFWX1dCMzIoJmJ1ZltyZXRdLCBmbGFncyk7CiAgICAgICAgICAgICAgICByZXQgKz0gNDsKICAgICAgICAgICAgICAgIGZsYWdzID0gYml0cyA9IDA7CgogICAgICAgICAgICAgICAgaWYobWItPmJlc3RfZW5jb2RpbmcgPT0gRU5DX1NLSVAgfHwgbmVlZHNfZXh0cmFfYml0KSB7CiAgICAgICAgICAgICAgICAgICAgbWVtY3B5KCZidWZbcmV0XSwgdGVtcCwgdGVtcF9zaXplKTsKICAgICAgICAgICAgICAgICAgICByZXQgKz0gdGVtcF9zaXplOwogICAgICAgICAgICAgICAgICAgIHRlbXBfc2l6ZSA9IDA7CiAgICAgICAgICAgICAgICB9IGVsc2UKICAgICAgICAgICAgICAgICAgICBzaG91bGRfd3JpdGVfdGVtcCA9IDE7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmKG5lZWRzX2V4dHJhX2JpdCkgewogICAgICAgICAgICAgICAgZmxhZ3MgPSAobWItPmJlc3RfZW5jb2RpbmcgPT0gRU5DX1Y0KSA8PCAzMTsKICAgICAgICAgICAgICAgIGJpdHMgPSAxOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZihtYi0+YmVzdF9lbmNvZGluZyA9PSBFTkNfVjEpCiAgICAgICAgICAgICAgICB0ZW1wW3RlbXBfc2l6ZSsrXSA9IG1iLT52MV92ZWN0b3I7CiAgICAgICAgICAgIGVsc2UgaWYobWItPmJlc3RfZW5jb2RpbmcgPT0gRU5DX1Y0KQogICAgICAgICAgICAgICAgZm9yKHogPSAwOyB6IDwgNDsgeisrKQogICAgICAgICAgICAgICAgICAgIHRlbXBbdGVtcF9zaXplKytdID0gbWItPnY0X3ZlY3Rvclt6XTsKCiAgICAgICAgICAgIGlmKHNob3VsZF93cml0ZV90ZW1wKSB7CiAgICAgICAgICAgICAgICBtZW1jcHkoJmJ1ZltyZXRdLCB0ZW1wLCB0ZW1wX3NpemUpOwogICAgICAgICAgICAgICAgcmV0ICs9IHRlbXBfc2l6ZTsKICAgICAgICAgICAgICAgIHRlbXBfc2l6ZSA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmKGJpdHMgPiAwKSB7CiAgICAgICAgICAgIEFWX1dCMzIoJmJ1ZltyZXRdLCBmbGFncyk7CiAgICAgICAgICAgIHJldCArPSA0OwogICAgICAgICAgICBtZW1jcHkoJmJ1ZltyZXRdLCB0ZW1wLCB0ZW1wX3NpemUpOwogICAgICAgICAgICByZXQgKz0gdGVtcF9zaXplOwogICAgICAgIH0KCiAgICAgICAgd3JpdGVfY2h1bmtfaGVhZGVyKGJ1ZiArIGhlYWRlcl9vZnMsIDB4MzEsIHJldCAtIGhlYWRlcl9vZnMgLSBDSFVOS19IRUFERVJfU0laRSk7CgogICAgICAgIGJyZWFrOwogICAgfQoKICAgIHJldHVybiByZXQ7Cn0KCi8vY29tcHV0ZXMgZGlzdG9ydGlvbiBvZiA0eDQgTUIgaW4gYiBjb21wYXJlZCB0byBhCnN0YXRpYyBpbnQgY29tcHV0ZV9tYl9kaXN0b3J0aW9uKENpbmVwYWtFbmNDb250ZXh0ICpzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICphX2RhdGFbNF0sIGludCBhX2xpbmVzaXplWzRdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpiX2RhdGFbNF0sIGludCBiX2xpbmVzaXplWzRdKQp7CiAgICBpbnQgeCwgeSwgcCwgZCwgcmV0ID0gMDsKCiAgICBmb3IoeSA9IDA7IHkgPCBNQl9TSVpFOyB5KyspIHsKICAgICAgICBmb3IoeCA9IDA7IHggPCBNQl9TSVpFOyB4KyspIHsKICAgICAgICAgICAgZCA9IGFfZGF0YVswXVt4ICsgeSphX2xpbmVzaXplWzBdXSAtIGJfZGF0YVswXVt4ICsgeSpiX2xpbmVzaXplWzBdXTsKICAgICAgICAgICAgcmV0ICs9IGQqZDsKICAgICAgICB9CiAgICB9CgogICAgaWYocy0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX1JHQjI0KSB7CiAgICAgICAgZm9yKHAgPSAxOyBwIDw9IDI7IHArKykgewogICAgICAgICAgICBmb3IoeSA9IDA7IHkgPCBNQl9TSVpFLzI7IHkrKykgewogICAgICAgICAgICAgICAgZm9yKHggPSAwOyB4IDwgTUJfU0laRS8yOyB4KyspIHsKICAgICAgICAgICAgICAgICAgICBkID0gYV9kYXRhW3BdW3ggKyB5KmFfbGluZXNpemVbcF1dIC0gYl9kYXRhW3BdW3ggKyB5KmJfbGluZXNpemVbcF1dOwogICAgICAgICAgICAgICAgICAgIHJldCArPSBkKmQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIHJldDsKfQoKLy8gcmV0dXJuIHRoZSBwb3NzaWJseSBhZGp1c3RlZCBzaXplIG9mIHRoZSBjb2RlYm9vawojZGVmaW5lIENFUlRBSU4oeCkgKCh4KSE9RU5DX1VOQ0VSVEFJTikKc3RhdGljIGludCBxdWFudGl6ZShDaW5lcGFrRW5jQ29udGV4dCAqcywgaW50IGgsCiAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZGF0YVs0XSwgaW50IGxpbmVzaXplWzRdLAogICAgICAgICAgICAgICAgICAgIGludCB2MW1vZGUsIHN0cmlwX2luZm8gKmluZm8sCiAgICAgICAgICAgICAgICAgICAgbWJfZW5jb2RpbmcgZW5jb2RpbmcpCnsKICAgIGludCB4LCB5LCBpLCBqLCBrLCB4MiwgeTIsIHgzLCB5MywgcGxhbmUsIHNoaWZ0LCBtYm47CiAgICBpbnQgZW50cnlfc2l6ZSA9IHMtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9SR0IyNCA/IDYgOiA0OwogICAgaW50ICpjb2RlYm9vayA9IHYxbW9kZSA/IGluZm8tPnYxX2NvZGVib29rIDogaW5mby0+djRfY29kZWJvb2s7CiAgICBpbnQgc2l6ZSA9IHYxbW9kZSA/IGluZm8tPnYxX3NpemUgOiBpbmZvLT52NF9zaXplOwogICAgaW50NjRfdCB0b3RhbF9lcnJvciA9IDA7CiAgICB1aW50OF90IHZxX3BpY3RfYnVmWyhNQl9BUkVBKjMpLzJdOwogICAgdWludDhfdCAqc3ViX2RhdGEgICAgWzRdLCAqdnFfZGF0YSAgICBbNF07CiAgICBpbnQgICAgICBzdWJfbGluZXNpemVbNF0sICB2cV9saW5lc2l6ZVs0XTsKCiAgICBmb3IobWJuID0gaSA9IHkgPSAwOyB5IDwgaDsgeSArPSBNQl9TSVpFKSB7CiAgICAgICAgZm9yKHggPSAwOyB4IDwgcy0+dzsgeCArPSBNQl9TSVpFLCArK21ibikgewogICAgICAgICAgICBpbnQgKmJhc2U7CgogICAgICAgICAgICBpZihDRVJUQUlOKGVuY29kaW5nKSkgewovLyB1c2UgZm9yIHRoZSB0cmFpbmluZyBvbmx5IHRoZSBibG9ja3Mga25vd24gdG8gYmUgdG8gYmUgZW5jb2RlZCBbc2ljOi1dCiAgICAgICAgICAgICAgIGlmKHMtPm1iW21ibl0uYmVzdF9lbmNvZGluZyAhPSBlbmNvZGluZykgY29udGludWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGJhc2UgPSBzLT5jb2RlYm9va19pbnB1dCArIGkqZW50cnlfc2l6ZTsKICAgICAgICAgICAgaWYodjFtb2RlKSB7CiAgICAgICAgICAgICAgICAvL3N1YnNhbXBsZQogICAgICAgICAgICAgICAgZm9yKGogPSB5MiA9IDA7IHkyIDwgZW50cnlfc2l6ZTsgeTIgKz0gMikgewogICAgICAgICAgICAgICAgICAgIGZvcih4MiA9IDA7IHgyIDwgNDsgeDIgKz0gMiwgaisrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHBsYW5lID0geTIgPCA0ID8gMCA6IDEgKyAoeDIgPj4gMSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHNoaWZ0ID0geTIgPCA0ID8gMCA6IDE7CiAgICAgICAgICAgICAgICAgICAgICAgIHgzID0gc2hpZnQgPyAwIDogeDI7CiAgICAgICAgICAgICAgICAgICAgICAgIHkzID0gc2hpZnQgPyAwIDogeTI7CiAgICAgICAgICAgICAgICAgICAgICAgIGJhc2Vbal0gPSAoZGF0YVtwbGFuZV1bKCh4K3gzKSA+PiBzaGlmdCkgKyAgICAgICgoeSt5MykgPj4gc2hpZnQpICAgICAgKiBsaW5lc2l6ZVtwbGFuZV1dICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhW3BsYW5lXVsoKHgreDMpID4+IHNoaWZ0KSArIDEgKyAgKCh5K3kzKSA+PiBzaGlmdCkgICAgICAqIGxpbmVzaXplW3BsYW5lXV0gKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFbcGxhbmVdWygoeCt4MykgPj4gc2hpZnQpICsgICAgICgoKHkreTMpID4+IHNoaWZ0KSArIDEpICogbGluZXNpemVbcGxhbmVdXSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVtwbGFuZV1bKCh4K3gzKSA+PiBzaGlmdCkgKyAxICsgKCgoeSt5MykgPj4gc2hpZnQpICsgMSkgKiBsaW5lc2l6ZVtwbGFuZV1dKSA+PiAyOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIC8vY29weQogICAgICAgICAgICAgICAgZm9yKGogPSB5MiA9IDA7IHkyIDwgTUJfU0laRTsgeTIgKz0gMikgewogICAgICAgICAgICAgICAgICAgIGZvcih4MiA9IDA7IHgyIDwgTUJfU0laRTsgeDIgKz0gMikgewogICAgICAgICAgICAgICAgICAgICAgICBmb3IoayA9IDA7IGsgPCBlbnRyeV9zaXplOyBrKyssIGorKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhbmUgPSBrID49IDQgPyBrIC0gMyA6IDA7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoayA+PSA0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeDMgPSAoeCt4MikgPj4gMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5MyA9ICh5K3kyKSA+PiAxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4MyA9IHggKyB4MiArIChrICYgMSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeTMgPSB5ICsgeTIgKyAoayA+PiAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlW2pdID0gZGF0YVtwbGFuZV1beDMgKyB5MypsaW5lc2l6ZVtwbGFuZV1dOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGkgKz0gdjFtb2RlID8gMSA6IDQ7CiAgICAgICAgfQogICAgfQovLyAgICBpZihpIDwgbWJuKih2MW1vZGUgPyAxIDogNCkpIHsKLy8gICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0lORk8sICJyZWR1Y2luZyB0cmFpbmluZyBzZXQgZm9yICVzIGZyb20gJWkgdG8gJWkgKGVuY29kaW5nICVpKVxuIiwgdjFtb2RlPyJ2MSI6InY0IiwgbWJuKih2MW1vZGUgPyAxIDogNCksIGksIGVuY29kaW5nKTsKLy8gICAgfQoKICAgIGlmKGkgPT0gMCkgLy8gZW1wdHkgdHJhaW5pbmcgc2V0LCBub3RoaW5nIHRvIGRvCiAgICAgICAgcmV0dXJuIDA7CiAgICBpZihpIDwgc2l6ZSkgewogICAgICAgIC8vYXZfbG9nKHMtPmF2Y3R4LCAoQ0VSVEFJTihlbmNvZGluZykgPyBBVl9MT0dfRVJST1IgOiBBVl9MT0dfSU5GTyksICJXT1VMRCBXQVNURTogJXMgY2JzaXplICVpIGJpZ2dlciB0aGFuIHRyYWluaW5nIHNldCBzaXplICVpIChlbmNvZGluZyAlaSlcbiIsIHYxbW9kZT8idjEiOiJ2NCIsIHNpemUsIGksIGVuY29kaW5nKTsKICAgICAgICBzaXplID0gaTsKICAgIH0KCiAgICBhdnByaXZfaW5pdF9lbGJnKHMtPmNvZGVib29rX2lucHV0LCBlbnRyeV9zaXplLCBpLCBjb2RlYm9vaywgc2l6ZSwgMSwgcy0+Y29kZWJvb2tfY2xvc2VzdCwgJnMtPnJhbmRjdHgpOwogICAgYXZwcml2X2RvX2VsYmcocy0+Y29kZWJvb2tfaW5wdXQsIGVudHJ5X3NpemUsIGksIGNvZGVib29rLCBzaXplLCAxLCBzLT5jb2RlYm9va19jbG9zZXN0LCAmcy0+cmFuZGN0eCk7CgogICAgLy9zZXR1cCB2cV9kYXRhLCB3aGljaCBjb250YWlucyBhIHNpbmdsZSBNQgogICAgdnFfZGF0YVswXSA9IHZxX3BpY3RfYnVmOwogICAgdnFfbGluZXNpemVbMF0gPSBNQl9TSVpFOwogICAgdnFfZGF0YVsxXSA9ICZ2cV9waWN0X2J1ZltNQl9BUkVBXTsKICAgIHZxX2RhdGFbMl0gPSB2cV9kYXRhWzFdICsgKE1CX0FSRUEgPj4gMik7CiAgICB2cV9saW5lc2l6ZVsxXSA9IHZxX2xpbmVzaXplWzJdID0gTUJfU0laRSA+PiAxOwoKICAgIC8vY29weSBpbmRpY2VzCiAgICBmb3IoaSA9IGogPSB5ID0gMDsgeSA8IGg7IHkgKz0gTUJfU0laRSkgewogICAgICAgIGZvcih4ID0gMDsgeCA8IHMtPnc7IHggKz0gTUJfU0laRSwgaisrKSB7CiAgICAgICAgICAgIG1iX2luZm8gKm1iID0gJnMtPm1iW2pdOwovLyBza2lwIHVuaW50ZXJlc3RpbmcgYmxvY2tzIGlmIHdlIGtub3cgdGhlaXIgcHJlZmVycmVkIGVuY29kaW5nCiAgICAgICAgICAgIGlmKENFUlRBSU4oZW5jb2RpbmcpICYmIG1iLT5iZXN0X2VuY29kaW5nICE9IGVuY29kaW5nKQogICAgICAgICAgICAgICAgY29udGludWU7CgogICAgICAgICAgICAvL3BvaW50IHN1Yl9kYXRhIHRvIGN1cnJlbnQgTUIKICAgICAgICAgICAgZ2V0X3N1Yl9waWN0dXJlKHMsIHgsIHksIGRhdGEsIGxpbmVzaXplLCBzdWJfZGF0YSwgc3ViX2xpbmVzaXplKTsKCiAgICAgICAgICAgIGlmKHYxbW9kZSkgewogICAgICAgICAgICAgICAgbWItPnYxX3ZlY3RvciA9IHMtPmNvZGVib29rX2Nsb3Nlc3RbaV07CgogICAgICAgICAgICAgICAgLy9maWxsIGluIHZxX2RhdGEgd2l0aCBWMSBkYXRhCiAgICAgICAgICAgICAgICBkZWNvZGVfdjFfdmVjdG9yKHMsIHZxX2RhdGEsIHZxX2xpbmVzaXplLCBtYi0+djFfdmVjdG9yLCBpbmZvKTsKCiAgICAgICAgICAgICAgICBtYi0+djFfZXJyb3IgPSBjb21wdXRlX21iX2Rpc3RvcnRpb24ocywgc3ViX2RhdGEsIHN1Yl9saW5lc2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2cV9kYXRhLCB2cV9saW5lc2l6ZSk7CiAgICAgICAgICAgICAgICB0b3RhbF9lcnJvciArPSBtYi0+djFfZXJyb3I7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBmb3IoayA9IDA7IGsgPCA0OyBrKyspCiAgICAgICAgICAgICAgICAgICAgbWItPnY0X3ZlY3RvcltrXSA9IHMtPmNvZGVib29rX2Nsb3Nlc3RbaStrXTsKCiAgICAgICAgICAgICAgICAvL2ZpbGwgaW4gdnFfZGF0YSB3aXRoIFY0IGRhdGEKICAgICAgICAgICAgICAgIGRlY29kZV92NF92ZWN0b3IocywgdnFfZGF0YSwgdnFfbGluZXNpemUsIG1iLT52NF92ZWN0b3IsIGluZm8pOwoKICAgICAgICAgICAgICAgIG1iLT52NF9lcnJvciA9IGNvbXB1dGVfbWJfZGlzdG9ydGlvbihzLCBzdWJfZGF0YSwgc3ViX2xpbmVzaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZxX2RhdGEsIHZxX2xpbmVzaXplKTsKICAgICAgICAgICAgICAgIHRvdGFsX2Vycm9yICs9IG1iLT52NF9lcnJvcjsKICAgICAgICAgICAgfQogICAgICAgICAgICBpICs9IHYxbW9kZSA/IDEgOiA0OwogICAgICAgIH0KICAgIH0KLy8gY2hlY2sgdGhhdCB3ZSBkaWQgaXQgcmlnaHQgaW4gdGhlIGJlZ2lubmluZyBvZiB0aGUgZnVuY3Rpb24KICAgIGF2X2Fzc2VydDAoaSA+PSBzaXplKTsgLy8gdHJhaW5pbmcgc2V0IGlzIG5vIHNtYWxsZXIgdGhhbiB0aGUgY29kZWJvb2sKCiAgICAvL2F2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0lORk8sICJpc3YxICVpIHNpemU9ICVpIGk9ICVpIGVycm9yICUiUFJJZDY0IlxuIiwgdjFtb2RlLCBzaXplLCBpLCB0b3RhbF9lcnJvcik7CgogICAgcmV0dXJuIHNpemU7Cn0KCnN0YXRpYyB2b2lkIGNhbGN1bGF0ZV9za2lwX2Vycm9ycyhDaW5lcGFrRW5jQ29udGV4dCAqcywgaW50IGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpsYXN0X2RhdGFbNF0sIGludCBsYXN0X2xpbmVzaXplWzRdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZGF0YVs0XSwgaW50IGxpbmVzaXplWzRdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaXBfaW5mbyAqaW5mbykKewogICAgaW50IHgsIHksIGk7CiAgICB1aW50OF90ICpzdWJfbGFzdF9kYXRhICAgIFs0XSwgKnN1Yl9waWN0X2RhdGEgICAgWzRdOwogICAgaW50ICAgICAgc3ViX2xhc3RfbGluZXNpemVbNF0sICBzdWJfcGljdF9saW5lc2l6ZVs0XTsKCiAgICBmb3IoaSA9IHkgPSAwOyB5IDwgaDsgeSArPSBNQl9TSVpFKSB7CiAgICAgICAgZm9yKHggPSAwOyB4IDwgcy0+dzsgeCArPSBNQl9TSVpFLCBpKyspIHsKICAgICAgICAgICAgZ2V0X3N1Yl9waWN0dXJlKHMsIHgsIHksIGxhc3RfZGF0YSwgICAgIGxhc3RfbGluZXNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Yl9sYXN0X2RhdGEsIHN1Yl9sYXN0X2xpbmVzaXplKTsKICAgICAgICAgICAgZ2V0X3N1Yl9waWN0dXJlKHMsIHgsIHksICAgICAgZGF0YSwgICAgICAgICAgbGluZXNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Yl9waWN0X2RhdGEsIHN1Yl9waWN0X2xpbmVzaXplKTsKCiAgICAgICAgICAgIHMtPm1iW2ldLnNraXBfZXJyb3IgPSBjb21wdXRlX21iX2Rpc3RvcnRpb24ocywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJfbGFzdF9kYXRhLCBzdWJfbGFzdF9saW5lc2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJfcGljdF9kYXRhLCBzdWJfcGljdF9saW5lc2l6ZSk7CiAgICAgICAgfQogICAgfQp9CgpzdGF0aWMgdm9pZCB3cml0ZV9zdHJpcF9oZWFkZXIoQ2luZXBha0VuY0NvbnRleHQgKnMsIGludCB5LCBpbnQgaCwgaW50IGtleWZyYW1lLCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBzdHJpcF9zaXplKQp7Ci8vIGFjdHVhbGx5IHdlIGFyZSBleGNsdXNpdmVseSB1c2luZyBpbnRyYSBzdHJpcCBjb2RpbmcgKGhvdyBtdWNoIGNhbiB3ZSB3aW4KLy8gb3RoZXJ3aXNlPyBob3cgdG8gY2hvb3NlIHdoaWNoIHBhcnQgb2YgYSBjb2RlYm9vayB0byB1cGRhdGU/KSwKLy8ga2V5ZnJhbWVzIGFyZSBkaWZmZXJlbnQgb25seSBiZWNhdXNlIHdlIGRpc2FsbG93IEVOQ19TS0lQIG9uIHRoZW0gLS0gcmwKLy8gKGJlc2lkZXMsIHRoZSBsb2dpYyBoZXJlIHVzZWQgdG8gYmUgaW52ZXJ0ZWQ6ICkKLy8gICAgYnVmWzBdID0ga2V5ZnJhbWUgPyAweDExOiAweDEwOwogICAgYnVmWzBdID0ga2V5ZnJhbWUgPyAweDEwOiAweDExOwogICAgQVZfV0IyNCgmYnVmWzFdLCBzdHJpcF9zaXplICsgU1RSSVBfSEVBREVSX1NJWkUpOwovLyAgICBBVl9XQjE2KCZidWZbNF0sIHkpOyAvKiB1c2luZyBhYnNvbHV0ZSB5IHZhbHVlcyB3b3JrcyAtLSBybCAqLwogICAgQVZfV0IxNigmYnVmWzRdLCAwKTsgLyogdXNpbmcgcmVsYXRpdmUgdmFsdWVzIHdvcmtzIGFzIHdlbGwgLS0gcmwgKi8KICAgIEFWX1dCMTYoJmJ1Zls2XSwgMCk7Ci8vICAgIEFWX1dCMTYoJmJ1Zls4XSwgeStoKTsgLyogdXNpbmcgYWJzb2x1dGUgeSB2YWx1ZXMgd29ya3MgLS0gcmwgKi8KICAgIEFWX1dCMTYoJmJ1Zls4XSwgaCk7IC8qIHVzaW5nIHJlbGF0aXZlIHZhbHVlcyB3b3JrcyBhcyB3ZWxsIC0tIHJsICovCiAgICBBVl9XQjE2KCZidWZbMTBdLCBzLT53KTsKICAgIC8vYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfSU5GTywgIndyaXRlX3N0cmlwX2hlYWRlcigpICV4IGtleWZyYW1lPSVkXG4iLCBidWZbMF0sIGtleWZyYW1lKTsKfQoKc3RhdGljIGludCByZF9zdHJpcChDaW5lcGFrRW5jQ29udGV4dCAqcywgaW50IHksIGludCBoLCBpbnQga2V5ZnJhbWUsCiAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqbGFzdF9kYXRhWzRdLCBpbnQgbGFzdF9saW5lc2l6ZVs0XSwKICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkYXRhWzRdLCBpbnQgbGluZXNpemVbNF0sCiAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqc2NyYXRjaF9kYXRhWzRdLCBpbnQgc2NyYXRjaF9saW5lc2l6ZVs0XSwKICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpidWYsIGludDY0X3QgKmJlc3Rfc2NvcmUKI2lmZGVmIENJTkVQQUtfUkVQT1JUX1NFUlIKLCBpbnQ2NF90ICpiZXN0X3NlcnIKI2VuZGlmCikKewogICAgaW50NjRfdCBzY29yZSA9IDA7CiNpZmRlZiBDSU5FUEFLX1JFUE9SVF9TRVJSCiAgICBpbnQ2NF90IHNlcnI7CiNlbmRpZgogICAgaW50IGJlc3Rfc2l6ZSA9IDA7CiAgICBzdHJpcF9pbmZvIGluZm87Ci8vIGZvciBjb2RlYm9vayBvcHRpbWl6YXRpb246CiAgICBpbnQgdjFlbm91Z2gsIHYxX3NpemUsIHY0ZW5vdWdoLCB2NF9zaXplOwogICAgaW50IG5ld192MV9zaXplLCBuZXdfdjRfc2l6ZTsKICAgIGludCB2MXNocnVuaywgdjRzaHJ1bms7CgogICAgaWYoIWtleWZyYW1lKQogICAgICAgIGNhbGN1bGF0ZV9za2lwX2Vycm9ycyhzLCBoLCBsYXN0X2RhdGEsIGxhc3RfbGluZXNpemUsIGRhdGEsIGxpbmVzaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5mbyk7CgogICAgLy90cnkgc29tZSBwb3dlcnMgb2YgNCBmb3IgdGhlIHNpemUgb2YgdGhlIGNvZGVib29rcwogICAgLy9jb25zdHJhaW50IHRoZSB2NCBjb2RlYm9vayB0byBiZSBubyBiaWdnZXIgdGhhbiB2MSBvbmUsCiAgICAvLyhhbmQgbm8gbGVzcyB0aGFuIHYxX3NpemUvNCkKICAgIC8vdGh1cyBtYWtpbmcgdjEgcHJlZmVyYWJsZSBhbmQgcG9zc2libHkgbG9zaW5nIHNtYWxsIGRldGFpbHM/IHNob3VsZCBiZSBvawojZGVmaW5lIFNNQUxMRVNUX0NPREVCT09LIDEKICAgIGZvcih2MWVub3VnaCA9IDAsIHYxX3NpemUgPSBTTUFMTEVTVF9DT0RFQk9PSzsgdjFfc2l6ZSA8PSBDT0RFQk9PS19NQVggJiYgIXYxZW5vdWdoOyB2MV9zaXplIDw8PSAyKSB7CiAgICAgICAgZm9yKHY0ZW5vdWdoID0gMCwgdjRfc2l6ZSA9IDA7IHY0X3NpemUgPD0gdjFfc2l6ZSAmJiAhdjRlbm91Z2g7IHY0X3NpemUgPSB2NF9zaXplID8gdjRfc2l6ZSA8PCAyIDogdjFfc2l6ZSA+PSBTTUFMTEVTVF9DT0RFQk9PSyA8PCAyID8gdjFfc2l6ZSA+PiAyIDogU01BTExFU1RfQ09ERUJPT0spIHsKICAgICAgICAgICAgLy90cnkgYWxsIG1vZGVzCiAgICAgICAgICAgIGZvcihDaW5lcGFrTW9kZSBtb2RlID0gMDsgbW9kZSA8IE1PREVfQ09VTlQ7IG1vZGUrKykgewogICAgICAgICAgICAgICAgLy9kb24ndCBhbGxvdyBNT0RFX01DIGluIGludHJhIGZyYW1lcwogICAgICAgICAgICAgICAgaWYoa2V5ZnJhbWUgJiYgbW9kZSA9PSBNT0RFX01DKQogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwoKICAgICAgICAgICAgICAgIGlmKG1vZGUgPT0gTU9ERV9WMV9PTkxZKSB7CiAgICAgICAgICAgICAgICAgICAgaW5mby52MV9zaXplID0gdjFfc2l6ZTsKLy8gdGhlIHNpemUgbWF5IHNocmluayBldmVuIGJlZm9yZSBvcHRpbWl6YXRpb25zIGlmIHRoZSBpbnB1dCBpcyBzaG9ydDoKICAgICAgICAgICAgICAgICAgICBpbmZvLnYxX3NpemUgPSBxdWFudGl6ZShzLCBoLCBkYXRhLCBsaW5lc2l6ZSwgMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5mbywgRU5DX1VOQ0VSVEFJTik7CiAgICAgICAgICAgICAgICAgICAgaWYoaW5mby52MV9zaXplIDwgdjFfc2l6ZSkKLy8gdG9vIGZldyBlbGlnaWJsZSBibG9ja3MsIG5vIHNlbnNlIGluIHRyeWluZyBiaWdnZXIgc2l6ZXMKICAgICAgICAgICAgICAgICAgICAgICAgdjFlbm91Z2ggPSAxOwoKICAgICAgICAgICAgICAgICAgICBpbmZvLnY0X3NpemUgPSAwOwogICAgICAgICAgICAgICAgfSBlbHNlIHsgLy8gbW9kZSAhPSBNT0RFX1YxX09OTFkKICAgICAgICAgICAgICAgICAgICAvLyBpZiB2NCBjb2RlYm9vayBpcyBlbXB0eSB0aGVuIG9ubHkgYWxsb3cgVjEtb25seSBtb2RlCiAgICAgICAgICAgICAgICAgICAgaWYoIXY0X3NpemUpCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwoKICAgICAgICAgICAgICAgICAgICBpZihtb2RlID09IE1PREVfVjFfVjQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaW5mby52NF9zaXplID0gdjRfc2l6ZTsKICAgICAgICAgICAgICAgICAgICAgICAgaW5mby52NF9zaXplID0gcXVhbnRpemUocywgaCwgZGF0YSwgbGluZXNpemUsIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbmZvLCBFTkNfVU5DRVJUQUlOKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYoaW5mby52NF9zaXplIDwgdjRfc2l6ZSkKLy8gdG9vIGZldyBlbGlnaWJsZSBibG9ja3MsIG5vIHNlbnNlIGluIHRyeWluZyBiaWdnZXIgc2l6ZXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHY0ZW5vdWdoID0gMTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaW5mby5tb2RlID0gbW9kZTsKLy8gY2hvb3NlIHRoZSBiZXN0IGVuY29kaW5nIHBlciBibG9jaywgYmFzZWQgb24gY3VycmVudCBleHBlcmllbmNlCiAgICAgICAgICAgICAgICBzY29yZSA9IGNhbGN1bGF0ZV9tb2RlX3Njb3JlKHMsIGgsICZpbmZvLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdjFzaHJ1bmssICZ2NHNocnVuawojaWZkZWYgQ0lORVBBS19SRVBPUlRfU0VSUgosICZzZXJyCiNlbmRpZgopOwoKICAgICAgICAgICAgICAgIGlmKG1vZGUgIT0gTU9ERV9WMV9PTkxZKXsKICAgICAgICAgICAgICAgICAgICBpbnQgZXh0cmFfaXRlcmF0aW9uc19saW1pdCA9IHMtPm1heF9leHRyYV9jYl9pdGVyYXRpb25zOwovLyByZWNvbXB1dGUgdGhlIGNvZGVib29rcywgb21pdHRpbmcgdGhlIGV4dHJhIGJsb2NrcwovLyB3ZSBhc3N1bWUgd2UgX21heV8gY29tZSBoZXJlIHdpdGggbW9yZSBibG9ja3MgdG8gZW5jb2RlIHRoYW4gYmVmb3JlCiAgICAgICAgICAgICAgICAgICAgaW5mby52MV9zaXplID0gdjFfc2l6ZTsKICAgICAgICAgICAgICAgICAgICBuZXdfdjFfc2l6ZSA9IHF1YW50aXplKHMsIGgsIGRhdGEsIGxpbmVzaXplLCAxLCAmaW5mbywgRU5DX1YxKTsKICAgICAgICAgICAgICAgICAgICBpZihuZXdfdjFfc2l6ZSA8IGluZm8udjFfc2l6ZSl7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfSU5GTywgIm1vZGUgJWksICUzaSwgJTNpOiBjdXQgdjEgY29kZWJvb2sgdG8gJWkgZW50cmllc1xuIiwgbW9kZSwgdjFfc2l6ZSwgdjRfc2l6ZSwgbmV3X3YxX3NpemUpOwogICAgICAgICAgICAgICAgICAgICAgICBpbmZvLnYxX3NpemUgPSBuZXdfdjFfc2l6ZTsKICAgICAgICAgICAgICAgICAgICB9Ci8vIHdlIGFzc3VtZSB3ZSBfbWF5XyBjb21lIGhlcmUgd2l0aCBtb3JlIGJsb2NrcyB0byBlbmNvZGUgdGhhbiBiZWZvcmUKICAgICAgICAgICAgICAgICAgICBpbmZvLnY0X3NpemUgPSB2NF9zaXplOwogICAgICAgICAgICAgICAgICAgIG5ld192NF9zaXplID0gcXVhbnRpemUocywgaCwgZGF0YSwgbGluZXNpemUsIDAsICZpbmZvLCBFTkNfVjQpOwogICAgICAgICAgICAgICAgICAgIGlmKG5ld192NF9zaXplIDwgaW5mby52NF9zaXplKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfSU5GTywgIm1vZGUgJWksICUzaSwgJTNpOiBjdXQgdjQgY29kZWJvb2sgdG8gJWkgZW50cmllcyBhdCBmaXJzdCBpdGVyYXRpb25cbiIsIG1vZGUsIHYxX3NpemUsIHY0X3NpemUsIG5ld192NF9zaXplKTsKICAgICAgICAgICAgICAgICAgICAgICAgaW5mby52NF9zaXplID0gbmV3X3Y0X3NpemU7CiAgICAgICAgICAgICAgICAgICAgfQovLyBjYWxjdWxhdGUgdGhlIHJlc3VsdGluZyBzY29yZQovLyAoZG8gbm90IG1vdmUgYmxvY2tzIHRvIGNvZGVib29rIGVuY29kaW5ncyBub3csIGFzIHNvbWUgYmxvY2tzIG1heSBoYXZlCi8vIGdvdCBiaWdnZXIgZXJyb3JzIGRlc3BpdGUgYSBzbWFsbGVyIHRyYWluaW5nIHNldCAtIGJ1dCB3ZSBkbyBub3QKLy8gZXZlciBncm93IHRoZSB0cmFpbmluZyBzZXRzIGJhY2spCiAgICAgICAgICAgICAgICAgICAgZm9yKDs7KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNjb3JlID0gY2FsY3VsYXRlX21vZGVfc2NvcmUocywgaCwgJmluZm8sIDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnYxc2hydW5rLCAmdjRzaHJ1bmsKI2lmZGVmIENJTkVQQUtfUkVQT1JUX1NFUlIKLCAmc2VycgojZW5kaWYKKTsKLy8gZG8gd2UgaGF2ZSBhIHJlYXNvbiB0byByZWl0ZXJhdGU/IGlmIHNvLCBoYXZlIHdlIHJlYWNoZWQgdGhlIGxpbWl0PwogICAgICAgICAgICAgICAgICAgICAgICBpZigoIXYxc2hydW5rICYmICF2NHNocnVuaykgfHwgIWV4dHJhX2l0ZXJhdGlvbnNfbGltaXQtLSkgYnJlYWs7Ci8vIHJlY29tcHV0ZSB0aGUgY29kZWJvb2tzLCBvbWl0dGluZyB0aGUgZXh0cmEgYmxvY2tzCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKHYxc2hydW5rKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLnYxX3NpemUgPSB2MV9zaXplOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3X3YxX3NpemUgPSBxdWFudGl6ZShzLCBoLCBkYXRhLCBsaW5lc2l6ZSwgMSwgJmluZm8sIEVOQ19WMSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihuZXdfdjFfc2l6ZSA8IGluZm8udjFfc2l6ZSl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9hdl9sb2cocy0+YXZjdHgsIEFWX0xPR19JTkZPLCAibW9kZSAlaSwgJTNpLCAlM2k6IGN1dCB2MSBjb2RlYm9vayB0byAlaSBlbnRyaWVzXG4iLCBtb2RlLCB2MV9zaXplLCB2NF9zaXplLCBuZXdfdjFfc2l6ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mby52MV9zaXplID0gbmV3X3YxX3NpemU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYodjRzaHJ1bmspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8udjRfc2l6ZSA9IHY0X3NpemU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdfdjRfc2l6ZSA9IHF1YW50aXplKHMsIGgsIGRhdGEsIGxpbmVzaXplLCAwLCAmaW5mbywgRU5DX1Y0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKG5ld192NF9zaXplIDwgaW5mby52NF9zaXplKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9hdl9sb2cocy0+YXZjdHgsIEFWX0xPR19JTkZPLCAibW9kZSAlaSwgJTNpLCAlM2k6IGN1dCB2NCBjb2RlYm9vayB0byAlaSBlbnRyaWVzXG4iLCBtb2RlLCB2MV9zaXplLCB2NF9zaXplLCBuZXdfdjRfc2l6ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mby52NF9zaXplID0gbmV3X3Y0X3NpemU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy9hdl9sb2cocy0+YXZjdHgsIEFWX0xPR19JTkZPLCAiJTNpICUzaSBzY29yZSA9ICUiUFJJZDY0IlxuIiwgdjFfc2l6ZSwgdjRfc2l6ZSwgc2NvcmUpOwoKICAgICAgICAgICAgICAgIGlmKGJlc3Rfc2l6ZSA9PSAwIHx8IHNjb3JlIDwgKmJlc3Rfc2NvcmUpIHsKCiAgICAgICAgICAgICAgICAgICAgKmJlc3Rfc2NvcmUgPSBzY29yZTsKI2lmZGVmIENJTkVQQUtfUkVQT1JUX1NFUlIKICAgICAgICAgICAgICAgICAgICAqYmVzdF9zZXJyID0gc2VycjsKI2VuZGlmCiAgICAgICAgICAgICAgICAgICAgYmVzdF9zaXplID0gZW5jb2RlX21vZGUocywgaCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JhdGNoX2RhdGEsIHNjcmF0Y2hfbGluZXNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdF9kYXRhLCBsYXN0X2xpbmVzaXplLCAmaW5mbywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5zdHJpcF9idWYgKyBTVFJJUF9IRUFERVJfU0laRSk7CgogICAgICAgICAgICAgICAgICAgIC8vYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfSU5GTywgIm1vZGUgJWksICUzaSwgJTNpOiAlMTgiUFJJZDY0IiAlaSBCIiwgbW9kZSwgaW5mby52MV9zaXplLCBpbmZvLnY0X3NpemUsIHNjb3JlLCBiZXN0X3NpemUpOwogICAgICAgICAgICAgICAgICAgIC8vYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfSU5GTywgIlxuIik7CiNpZmRlZiBDSU5FUEFLX1JFUE9SVF9TRVJSCiAgICAgICAgICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfSU5GTywgIm1vZGUgJWksICUzaSwgJTNpOiAlMTgiUFJJZDY0IiAlaSBCXG4iLCBtb2RlLCB2MV9zaXplLCB2NF9zaXplLCBzZXJyLCBiZXN0X3NpemUpOwojZW5kaWYKCiNpZmRlZiBDSU5FUEFLRU5DX0RFQlVHCiAgICAgICAgICAgICAgICAgICAgLy9zYXZlIE1CIGVuY29kaW5nIGNob2ljZXMKICAgICAgICAgICAgICAgICAgICBtZW1jcHkocy0+YmVzdF9tYiwgcy0+bWIsIG1iX2NvdW50KnNpemVvZihtYl9pbmZvKSk7CiNlbmRpZgoKICAgICAgICAgICAgICAgICAgICAvL21lbWNweShzdHJpcF90ZW1wICsgU1RSSVBfSEVBREVSX1NJWkUsIHN0cmlwX3RlbXAsIGJlc3Rfc2l6ZSk7CiAgICAgICAgICAgICAgICAgICAgd3JpdGVfc3RyaXBfaGVhZGVyKHMsIHksIGgsIGtleWZyYW1lLCBzLT5zdHJpcF9idWYsIGJlc3Rfc2l6ZSk7CgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKI2lmZGVmIENJTkVQQUtFTkNfREVCVUcKICAgIC8vZ2F0aGVyIHN0YXRzLiB0aGlzIHdpbGwgb25seSB3b3JrIHByb3Blcmx5IG9mIE1BWF9TVFJJUFMgPT0gMQogICAgaWYoYmVzdF9pbmZvLm1vZGUgPT0gTU9ERV9WMV9PTkxZKSB7CiAgICAgICAgcy0+bnVtX3YxX21vZGUrKzsKICAgICAgICBzLT5udW1fdjFfZW5jcyArPSBzLT53KmgvTUJfQVJFQTsKICAgIH0gZWxzZSB7CiAgICAgICAgaWYoYmVzdF9pbmZvLm1vZGUgPT0gTU9ERV9WMV9WNCkKICAgICAgICAgICAgcy0+bnVtX3Y0X21vZGUrKzsKICAgICAgICBlbHNlCiAgICAgICAgICAgIHMtPm51bV9tY19tb2RlKys7CgogICAgICAgIGludCB4OwogICAgICAgIGZvcih4ID0gMDsgeCA8IHMtPncqaC9NQl9BUkVBOyB4KyspCiAgICAgICAgICAgIGlmKHMtPmJlc3RfbWJbeF0uYmVzdF9lbmNvZGluZyA9PSBFTkNfVjEpCiAgICAgICAgICAgICAgICBzLT5udW1fdjFfZW5jcysrOwogICAgICAgICAgICBlbHNlIGlmKHMtPmJlc3RfbWJbeF0uYmVzdF9lbmNvZGluZyA9PSBFTkNfVjQpCiAgICAgICAgICAgICAgICBzLT5udW1fdjRfZW5jcysrOwogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICBzLT5udW1fc2tpcHMrKzsKICAgIH0KI2VuZGlmCgogICAgYmVzdF9zaXplICs9IFNUUklQX0hFQURFUl9TSVpFOwogICAgbWVtY3B5KGJ1Ziwgcy0+c3RyaXBfYnVmLCBiZXN0X3NpemUpOwoKICAgIHJldHVybiBiZXN0X3NpemU7Cn0KCnN0YXRpYyBpbnQgd3JpdGVfY3ZpZF9oZWFkZXIoQ2luZXBha0VuY0NvbnRleHQgKnMsIHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IG51bV9zdHJpcHMsIGludCBkYXRhX3NpemUsIGludCBpc2FrZXlmcmFtZSkKewogICAgYnVmWzBdID0gaXNha2V5ZnJhbWUgPyAwIDogMTsKICAgIEFWX1dCMjQoJmJ1ZlsxXSwgZGF0YV9zaXplICsgQ1ZJRF9IRUFERVJfU0laRSk7CiAgICBBVl9XQjE2KCZidWZbNF0sIHMtPncpOwogICAgQVZfV0IxNigmYnVmWzZdLCBzLT5oKTsKICAgIEFWX1dCMTYoJmJ1Zls4XSwgbnVtX3N0cmlwcyk7CgogICAgcmV0dXJuIENWSURfSEVBREVSX1NJWkU7Cn0KCnN0YXRpYyBpbnQgcmRfZnJhbWUoQ2luZXBha0VuY0NvbnRleHQgKnMsIGNvbnN0IEFWRnJhbWUgKmZyYW1lLAogICAgICAgICAgICAgICAgICAgIGludCBpc2FrZXlmcmFtZSwgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgYnVmX3NpemUpCnsKICAgIGludCBudW1fc3RyaXBzLCBzdHJpcCwgaSwgeSwgbmV4dHksIHNpemUsIHRlbXBfc2l6ZTsKICAgIHVpbnQ4X3QgKmxhc3RfZGF0YSAgICBbNF0sICpkYXRhICAgIFs0XSwgKnNjcmF0Y2hfZGF0YSAgICBbNF07CiAgICBpbnQgICAgICBsYXN0X2xpbmVzaXplWzRdLCAgbGluZXNpemVbNF0sICBzY3JhdGNoX2xpbmVzaXplWzRdOwogICAgaW50NjRfdCBiZXN0X3Njb3JlID0gMCwgc2NvcmUsIHNjb3JlX3RlbXA7CiNpZmRlZiBDSU5FUEFLX1JFUE9SVF9TRVJSCiAgICBpbnQ2NF90IGJlc3Rfc2VyciA9IDAsIHNlcnIsIHNlcnJfdGVtcDsKI2VuZGlmCgogICAgaW50IGJlc3RfbnN0cmlwcyA9IC0xLCBiZXN0X3NpemUgPSAtMTsgLy8gbWFyayBhcyB1bmluaXRpYWx6ZWQKCiAgICBpZihzLT5waXhfZm10ID09IEFWX1BJWF9GTVRfUkdCMjQpIHsKICAgICAgICBpbnQgeDsKLy8gYnVpbGQgYSBjb3B5IG9mIHRoZSBnaXZlbiBmcmFtZSBpbiB0aGUgY29ycmVjdCBjb2xvcnNwYWNlCiAgICAgICAgZm9yKHkgPSAwOyB5IDwgcy0+aDsgeSArPSAyKSB7CiAgICAgICAgICAgIGZvcih4ID0gMDsgeCA8IHMtPnc7IHggKz0gMikgewogICAgICAgICAgICAgICAgdWludDhfdCAqaXJbMl07IGludDMyX3QgciwgZywgYiwgcnIsIGdnLCBiYjsKICAgICAgICAgICAgICAgIGlyWzBdID0gZnJhbWUtPmRhdGFbMF0gKyB4KjMgKyB5KmZyYW1lLT5saW5lc2l6ZVswXTsKICAgICAgICAgICAgICAgIGlyWzFdID0gaXJbMF0gKyBmcmFtZS0+bGluZXNpemVbMF07CiAgICAgICAgICAgICAgICBnZXRfc3ViX3BpY3R1cmUocywgeCwgeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5pbnB1dF9mcmFtZS0+ZGF0YSwgcy0+aW5wdXRfZnJhbWUtPmxpbmVzaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcmF0Y2hfZGF0YSwgc2NyYXRjaF9saW5lc2l6ZSk7CiAgICAgICAgICAgICAgICByID0gZyA9IGIgPSAwOwogICAgICAgICAgICAgICAgZm9yKGk9MDsgaTw0OyArK2kpIHsKICAgICAgICAgICAgICAgICAgICBpbnQgaTEsIGkyOwogICAgICAgICAgICAgICAgICAgIGkxID0gKGkmMSk7IGkyID0gKGk+PTIpOwogICAgICAgICAgICAgICAgICAgIHJyID0gaXJbaTJdW2kxKjMrMF07CiAgICAgICAgICAgICAgICAgICAgZ2cgPSBpcltpMl1baTEqMysxXTsKICAgICAgICAgICAgICAgICAgICBiYiA9IGlyW2kyXVtpMSozKzJdOwogICAgICAgICAgICAgICAgICAgIHIgKz0gcnI7IGcgKz0gZ2c7IGIgKz0gYmI7Ci8vIHVzaW5nIGZpeGVkIHBvaW50IGFyaXRobWV0aWMgZm9yIHBvcnRhYmxlIHJlcGVhdGFiaWxpdHksIHNjYWxpbmcgYnkgMl4yMwovLyAiWSIKLy8gICAgICAgICAgICAgICAgICAgIHJyID0gMC4yODU3KnJyICsgMC41NzE0KmdnICsgMC4xNDI5KmJiOwogICAgICAgICAgICAgICAgICAgIHJyID0gKDIzOTY2MjUqcnIgKyA0NzkzMjUxKmdnICsgMTE5ODczMipiYikgPj4gMjM7CiAgICAgICAgICAgICAgICAgICAgaWYoICAgICAgcnIgPCAgIDApIHJyID0gICAwOwogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJyID4gMjU1KSByciA9IDI1NTsKICAgICAgICAgICAgICAgICAgICBzY3JhdGNoX2RhdGFbMF1baTEgKyBpMipzY3JhdGNoX2xpbmVzaXplWzBdXSA9IHJyOwogICAgICAgICAgICAgICAgfQovLyBsZXQgdXMgc2NhbGUgZG93biBhcyBsYXRlIGFzIHBvc3NpYmxlCi8vICAgICAgICAgICAgICAgIHIgLz0gNDsgZyAvPSA0OyBiIC89IDQ7Ci8vICJVIgovLyAgICAgICAgICAgICAgICByciA9IC0wLjE0MjkqciAtIDAuMjg1NypnICsgMC40Mjg2KmI7CiAgICAgICAgICAgICAgICByciA9ICgtMjk5NjgzKnIgLSA1OTkxNTYqZyArIDg5ODgzOSpiKSA+PiAyMzsKICAgICAgICAgICAgICAgIGlmKCAgICAgIHJyIDwgLTEyOCkgcnIgPSAtMTI4OwogICAgICAgICAgICAgICAgZWxzZSBpZiAocnIgPiAgMTI3KSByciA9ICAxMjc7CiAgICAgICAgICAgICAgICBzY3JhdGNoX2RhdGFbMV1bMF0gPSByciArIDEyODsgLy8gcXVhbnRpemUgbmVlZHMgdW5zaWduZWQKLy8gIlYiCi8vICAgICAgICAgICAgICAgIHJyID0gMC4zNTcxKnIgLSAwLjI4NTcqZyAtIDAuMDcxNCpiOwogICAgICAgICAgICAgICAgcnIgPSAoNzQ4ODkzKnIgLSA1OTkxNTYqZyAtIDE0OTczNypiKSA+PiAyMzsKICAgICAgICAgICAgICAgIGlmKCAgICAgIHJyIDwgLTEyOCkgcnIgPSAtMTI4OwogICAgICAgICAgICAgICAgZWxzZSBpZiAocnIgPiAgMTI3KSByciA9ICAxMjc7CiAgICAgICAgICAgICAgICBzY3JhdGNoX2RhdGFbMl1bMF0gPSByciArIDEyODsgLy8gcXVhbnRpemUgbmVlZHMgdW5zaWduZWQKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAvL3dvdWxkIGJlIG5pY2UgYnV0IHF1aXRlIGNlcnRhaW5seSBpbmNvbXBhdGlibGUgd2l0aCB2aW50YWdlIHBsYXllcnM6CiAgICAvLyBzdXBwb3J0IGVuY29kaW5nIHplcm8gc3RyaXBzIChtZWFuaW5nIHNraXAgdGhlIHdob2xlIGZyYW1lKQogICAgZm9yKG51bV9zdHJpcHMgPSBzLT5taW5fc3RyaXBzOyBudW1fc3RyaXBzIDw9IHMtPm1heF9zdHJpcHMgJiYgbnVtX3N0cmlwcyA8PSBzLT5oIC8gTUJfU0laRTsgbnVtX3N0cmlwcysrKSB7CiAgICAgICAgc2NvcmUgPSAwOwogICAgICAgIHNpemUgPSAwOwojaWZkZWYgQ0lORVBBS19SRVBPUlRfU0VSUgogICAgICAgIHNlcnIgPSAwOwojZW5kaWYKCiAgICAgICAgZm9yKHkgPSAwLCBzdHJpcCA9IDE7IHkgPCBzLT5oOyBzdHJpcCsrLCB5ID0gbmV4dHkpIHsKICAgICAgICAgICAgaW50IHN0cmlwX2hlaWdodDsKCiAgICAgICAgICAgIG5leHR5ID0gc3RyaXAgKiBzLT5oIC8gbnVtX3N0cmlwczsgLy8gPD0gcy0+aAogICAgICAgICAgICAvL21ha2UgbmV4dHkgdGhlIG5leHQgbXVsdGlwbGUgb2YgNCBpZiBub3QgYWxyZWFkeSB0aGVyZQogICAgICAgICAgICBpZihuZXh0eSAmIDMpCiAgICAgICAgICAgICAgICBuZXh0eSArPSA0IC0gKG5leHR5ICYgMyk7CgogICAgICAgICAgICBzdHJpcF9oZWlnaHQgPSBuZXh0eSAtIHk7CiAgICAgICAgICAgIGlmKHN0cmlwX2hlaWdodCA8PSAwKSB7IC8vIGNhbiB0aGlzIGV2ZXIgaGFwcGVuPwogICAgICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfSU5GTywgInNraXBwaW5nIHplcm8gaGVpZ2h0IHN0cmlwICVpIG9mICVpXG4iLCBzdHJpcCwgbnVtX3N0cmlwcyk7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYocy0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX1JHQjI0KQogICAgICAgICAgICAgICAgZ2V0X3N1Yl9waWN0dXJlKHMsIDAsIHksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+aW5wdXRfZnJhbWUtPmRhdGEsIHMtPmlucHV0X2ZyYW1lLT5saW5lc2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLCBsaW5lc2l6ZSk7CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIGdldF9zdWJfcGljdHVyZShzLCAwLCB5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50OF90ICoqKWZyYW1lLT5kYXRhLCAoaW50KilmcmFtZS0+bGluZXNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSwgbGluZXNpemUpOwogICAgICAgICAgICBnZXRfc3ViX3BpY3R1cmUocywgMCwgeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmxhc3RfZnJhbWUtPmRhdGEsIHMtPmxhc3RfZnJhbWUtPmxpbmVzaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdF9kYXRhLCBsYXN0X2xpbmVzaXplKTsKICAgICAgICAgICAgZ2V0X3N1Yl9waWN0dXJlKHMsIDAsIHksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5zY3JhdGNoX2ZyYW1lLT5kYXRhLCBzLT5zY3JhdGNoX2ZyYW1lLT5saW5lc2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcmF0Y2hfZGF0YSwgc2NyYXRjaF9saW5lc2l6ZSk7CgogICAgICAgICAgICBpZigodGVtcF9zaXplID0gcmRfc3RyaXAocywgeSwgc3RyaXBfaGVpZ2h0LCBpc2FrZXlmcmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RfZGF0YSwgbGFzdF9saW5lc2l6ZSwgZGF0YSwgbGluZXNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JhdGNoX2RhdGEsIHNjcmF0Y2hfbGluZXNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5mcmFtZV9idWYgKyBzaXplICsgQ1ZJRF9IRUFERVJfU0laRSwgJnNjb3JlX3RlbXAKI2lmZGVmIENJTkVQQUtfUkVQT1JUX1NFUlIKLCAmc2Vycl90ZW1wCiNlbmRpZgopKSA8IDApCiAgICAgICAgICAgICAgICByZXR1cm4gdGVtcF9zaXplOwoKICAgICAgICAgICAgc2NvcmUgKz0gc2NvcmVfdGVtcDsKI2lmZGVmIENJTkVQQUtfUkVQT1JUX1NFUlIKICAgICAgICAgICAgc2VyciArPSBzZXJyX3RlbXA7CiNlbmRpZgogICAgICAgICAgICBzaXplICs9IHRlbXBfc2l6ZTsKICAgICAgICAgICAgLy9hdl9sb2cocy0+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