LyoKICogQ29weXJpZ2h0IChjKSAxOTgyLCAxOTg2LCAxOTg4LCAxOTkwLCAxOTkzCiAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgogKgogKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCiAqIGFyZSBtZXQ6CiAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CiAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQogKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgogKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycwogKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAqCiAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECiAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQogKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQogKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCiAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCiAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgogKiBTVUNIIERBTUFHRS4KICoKICoJQCgjKXRjcF9zdWJyLmMJOC4xIChCZXJrZWxleSkgNi8xMC85MwogKiB0Y3Bfc3Vici5jLHYgMS41IDE5OTQvMTAvMDggMjI6Mzk6NTggcGhrIEV4cAogKi8KCi8qCiAqIENoYW5nZXMgYW5kIGFkZGl0aW9ucyByZWxhdGluZyB0byBTTGlSUAogKiBDb3B5cmlnaHQgKGMpIDE5OTUgRGFubnkgR2FzcGFyb3Zza2kuCiAqCiAqIFBsZWFzZSByZWFkIHRoZSBmaWxlIENPUFlSSUdIVCBmb3IgdGhlCiAqIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBjb3B5cmlnaHQuCiAqLwoKI2luY2x1ZGUgPHNsaXJwLmg+CgovKiBwYXRjaGFibGUvc2V0dGFibGUgcGFyYW1ldGVycyBmb3IgdGNwICovCi8qIERvbid0IGRvIHJmYzEzMjMgcGVyZm9ybWFuY2UgZW5oYW5jZW1lbnRzICovCiNkZWZpbmUgVENQX0RPX1JGQzEzMjMgMAoKLyoKICogVGNwIGluaXRpYWxpemF0aW9uCiAqLwp2b2lkCnRjcF9pbml0KHZvaWQpCnsKCXRjcF9pc3MgPSAxOwkJLyogd3JvbmcgKi8KCXRjYi5zb19uZXh0ID0gdGNiLnNvX3ByZXYgPSAmdGNiOwp9CgovKgogKiBDcmVhdGUgdGVtcGxhdGUgdG8gYmUgdXNlZCB0byBzZW5kIHRjcCBwYWNrZXRzIG9uIGEgY29ubmVjdGlvbi4KICogQ2FsbCBhZnRlciBob3N0IGVudHJ5IGNyZWF0ZWQsIGZpbGxzCiAqIGluIGEgc2tlbGV0YWwgdGNwL2lwIGhlYWRlciwgbWluaW1pemluZyB0aGUgYW1vdW50IG9mIHdvcmsKICogbmVjZXNzYXJ5IHdoZW4gdGhlIGNvbm5lY3Rpb24gaXMgdXNlZC4KICovCi8qIHN0cnVjdCB0Y3BpcGhkciAqICovCnZvaWQKdGNwX3RlbXBsYXRlKHN0cnVjdCB0Y3BjYiAqdHApCnsKCXN0cnVjdCBzb2NrZXQgKnNvID0gdHAtPnRfc29ja2V0OwoJcmVnaXN0ZXIgc3RydWN0IHRjcGlwaGRyICpuID0gJnRwLT50X3RlbXBsYXRlOwoKCW4tPnRpX21idWYgPSBOVUxMOwoJbi0+dGlfeDEgPSAwOwoJbi0+dGlfcHIgPSBJUFBST1RPX1RDUDsKCW4tPnRpX2xlbiA9IGh0b25zKHNpemVvZiAoc3RydWN0IHRjcGlwaGRyKSAtIHNpemVvZiAoc3RydWN0IGlwKSk7CgluLT50aV9zcmMgPSBzby0+c29fZmFkZHI7CgluLT50aV9kc3QgPSBzby0+c29fbGFkZHI7CgluLT50aV9zcG9ydCA9IHNvLT5zb19mcG9ydDsKCW4tPnRpX2Rwb3J0ID0gc28tPnNvX2xwb3J0OwoKCW4tPnRpX3NlcSA9IDA7CgluLT50aV9hY2sgPSAwOwoJbi0+dGlfeDIgPSAwOwoJbi0+dGlfb2ZmID0gNTsKCW4tPnRpX2ZsYWdzID0gMDsKCW4tPnRpX3dpbiA9IDA7CgluLT50aV9zdW0gPSAwOwoJbi0+dGlfdXJwID0gMDsKfQoKLyoKICogU2VuZCBhIHNpbmdsZSBtZXNzYWdlIHRvIHRoZSBUQ1AgYXQgYWRkcmVzcyBzcGVjaWZpZWQgYnkKICogdGhlIGdpdmVuIFRDUC9JUCBoZWFkZXIuICBJZiBtID09IDAsIHRoZW4gd2UgbWFrZSBhIGNvcHkKICogb2YgdGhlIHRjcGlwaGRyIGF0IHRpIGFuZCBzZW5kIGRpcmVjdGx5IHRvIHRoZSBhZGRyZXNzZWQgaG9zdC4KICogVGhpcyBpcyB1c2VkIHRvIGZvcmNlIGtlZXAgYWxpdmUgbWVzc2FnZXMgb3V0IHVzaW5nIHRoZSBUQ1AKICogdGVtcGxhdGUgZm9yIGEgY29ubmVjdGlvbiB0cC0+dF90ZW1wbGF0ZS4gIElmIGZsYWdzIGFyZSBnaXZlbgogKiB0aGVuIHdlIHNlbmQgYSBtZXNzYWdlIGJhY2sgdG8gdGhlIFRDUCB3aGljaCBvcmlnaW5hdGVkIHRoZQogKiBzZWdtZW50IHRpLCBhbmQgZGlzY2FyZCB0aGUgbWJ1ZiBjb250YWluaW5nIGl0IGFuZCBhbnkgb3RoZXIKICogYXR0YWNoZWQgbWJ1ZnMuCiAqCiAqIEluIGFueSBjYXNlIHRoZSBhY2sgYW5kIHNlcXVlbmNlIG51bWJlciBvZiB0aGUgdHJhbnNtaXR0ZWQKICogc2VnbWVudCBhcmUgYXMgc3BlY2lmaWVkIGJ5IHRoZSBwYXJhbWV0ZXJzLgogKi8Kdm9pZAp0Y3BfcmVzcG9uZChzdHJ1Y3QgdGNwY2IgKnRwLCBzdHJ1Y3QgdGNwaXBoZHIgKnRpLCBzdHJ1Y3QgbWJ1ZiAqbSwKICAgICAgICAgICAgdGNwX3NlcSBhY2ssIHRjcF9zZXEgc2VxLCBpbnQgZmxhZ3MpCnsKCXJlZ2lzdGVyIGludCB0bGVuOwoJaW50IHdpbiA9IDA7CgoJREVCVUdfQ0FMTCgidGNwX3Jlc3BvbmQiKTsKCURFQlVHX0FSRygidHAgPSAlbHgiLCAobG9uZyl0cCk7CglERUJVR19BUkcoInRpID0gJWx4IiwgKGxvbmcpdGkpOwoJREVCVUdfQVJHKCJtID0gJWx4IiwgKGxvbmcpbSk7CglERUJVR19BUkcoImFjayA9ICV1IiwgYWNrKTsKCURFQlVHX0FSRygic2VxID0gJXUiLCBzZXEpOwoJREVCVUdfQVJHKCJmbGFncyA9ICV4IiwgZmxhZ3MpOwoKCWlmICh0cCkKCQl3aW4gPSBzYnNwYWNlKCZ0cC0+dF9zb2NrZXQtPnNvX3Jjdik7CiAgICAgICAgaWYgKG0gPT0gTlVMTCkgewoJCWlmICgobSA9IG1fZ2V0KCkpID09IE5VTEwpCgkJCXJldHVybjsKI2lmZGVmIFRDUF9DT01QQVRfNDIKCQl0bGVuID0gMTsKI2Vsc2UKCQl0bGVuID0gMDsKI2VuZGlmCgkJbS0+bV9kYXRhICs9IElGX01BWExJTktIRFI7CgkJKm10b2QobSwgc3RydWN0IHRjcGlwaGRyICopID0gKnRpOwoJCXRpID0gbXRvZChtLCBzdHJ1Y3QgdGNwaXBoZHIgKik7CgkJZmxhZ3MgPSBUSF9BQ0s7Cgl9IGVsc2UgewoJCS8qCgkJICogdGkgcG9pbnRzIGludG8gbSBzbyB0aGUgbmV4dCBsaW5lIGlzIGp1c3QgbWFraW5nCgkJICogdGhlIG1idWYgcG9pbnQgdG8gdGkKCQkgKi8KCQltLT5tX2RhdGEgPSAoY2FkZHJfdCl0aTsKCgkJbS0+bV9sZW4gPSBzaXplb2YgKHN0cnVjdCB0Y3BpcGhkcik7CgkJdGxlbiA9IDA7CiNkZWZpbmUgeGNoZyhhLGIsdHlwZSkgeyB0eXBlIHQ7IHQ9YTsgYT1iOyBiPXQ7IH0KCQl4Y2hnKHRpLT50aV9kc3Quc19hZGRyLCB0aS0+dGlfc3JjLnNfYWRkciwgdV9pbnQzMl90KTsKCQl4Y2hnKHRpLT50aV9kcG9ydCwgdGktPnRpX3Nwb3J0LCB1X2ludDE2X3QpOwojdW5kZWYgeGNoZwoJfQoJdGktPnRpX2xlbiA9IGh0b25zKCh1X3Nob3J0KShzaXplb2YgKHN0cnVjdCB0Y3BoZHIpICsgdGxlbikpOwoJdGxlbiArPSBzaXplb2YgKHN0cnVjdCB0Y3BpcGhkcik7CgltLT5tX2xlbiA9IHRsZW47CgogICAgICAgIHRpLT50aV9tYnVmID0gTlVMTDsKCXRpLT50aV94MSA9IDA7Cgl0aS0+dGlfc2VxID0gaHRvbmwoc2VxKTsKCXRpLT50aV9hY2sgPSBodG9ubChhY2spOwoJdGktPnRpX3gyID0gMDsKCXRpLT50aV9vZmYgPSBzaXplb2YgKHN0cnVjdCB0Y3BoZHIpID4+IDI7Cgl0aS0+dGlfZmxhZ3MgPSBmbGFnczsKCWlmICh0cCkKCQl0aS0+dGlfd2luID0gaHRvbnMoKHVfaW50MTZfdCkgKHdpbiA+PiB0cC0+cmN2X3NjYWxlKSk7CgllbHNlCgkJdGktPnRpX3dpbiA9IGh0b25zKCh1X2ludDE2X3Qpd2luKTsKCXRpLT50aV91cnAgPSAwOwoJdGktPnRpX3N1bSA9IDA7Cgl0aS0+dGlfc3VtID0gY2tzdW0obSwgdGxlbik7CgkoKHN0cnVjdCBpcCAqKXRpKS0+aXBfbGVuID0gdGxlbjsKCglpZihmbGFncyAmIFRIX1JTVCkKCSAgKChzdHJ1Y3QgaXAgKil0aSktPmlwX3R0bCA9IE1BWFRUTDsKCWVsc2UKCSAgKChzdHJ1Y3QgaXAgKil0aSktPmlwX3R0bCA9IElQREVGVFRMOwoKCSh2b2lkKSBpcF9vdXRwdXQoKHN0cnVjdCBzb2NrZXQgKikwLCBtKTsKfQoKLyoKICogQ3JlYXRlIGEgbmV3IFRDUCBjb250cm9sIGJsb2NrLCBtYWtpbmcgYW4KICogZW1wdHkgcmVhc3NlbWJseSBxdWV1ZSBhbmQgaG9va2luZyBpdCB0byB0aGUgYXJndW1lbnQKICogcHJvdG9jb2wgY29udHJvbCBibG9jay4KICovCnN0cnVjdCB0Y3BjYiAqCnRjcF9uZXd0Y3BjYihzdHJ1Y3Qgc29ja2V0ICpzbykKewoJcmVnaXN0ZXIgc3RydWN0IHRjcGNiICp0cDsKCgl0cCA9IChzdHJ1Y3QgdGNwY2IgKiltYWxsb2Moc2l6ZW9mKCp0cCkpOwoJaWYgKHRwID09IE5VTEwpCgkJcmV0dXJuICgoc3RydWN0IHRjcGNiICopMCk7CgoJbWVtc2V0KChjaGFyICopIHRwLCAwLCBzaXplb2Yoc3RydWN0IHRjcGNiKSk7Cgl0cC0+c2VnX25leHQgPSB0cC0+c2VnX3ByZXYgPSAoc3RydWN0IHRjcGlwaGRyKil0cDsKCXRwLT50X21heHNlZyA9IFRDUF9NU1M7CgoJdHAtPnRfZmxhZ3MgPSBUQ1BfRE9fUkZDMTMyMyA/IChURl9SRVFfU0NBTEV8VEZfUkVRX1RTVE1QKSA6IDA7Cgl0cC0+dF9zb2NrZXQgPSBzbzsKCgkvKgoJICogSW5pdCBzcnR0IHRvIFRDUFRWX1NSVFRCQVNFICgwKSwgc28gd2UgY2FuIHRlbGwgdGhhdCB3ZSBoYXZlIG5vCgkgKiBydHQgZXN0aW1hdGUuICBTZXQgcnR0dmFyIHNvIHRoYXQgc3J0dCArIDIgKiBydHR2YXIgZ2l2ZXMKCSAqIHJlYXNvbmFibGUgaW5pdGlhbCByZXRyYW5zbWl0IHRpbWUuCgkgKi8KCXRwLT50X3NydHQgPSBUQ1BUVl9TUlRUQkFTRTsKCXRwLT50X3J0dHZhciA9IFRDUFRWX1NSVFRERkxUIDw8IDI7Cgl0cC0+dF9ydHRtaW4gPSBUQ1BUVl9NSU47CgoJVENQVF9SQU5HRVNFVCh0cC0+dF9yeHRjdXIsCgkgICAgKChUQ1BUVl9TUlRUQkFTRSA+PiAyKSArIChUQ1BUVl9TUlRUREZMVCA8PCAyKSkgPj4gMSwKCSAgICBUQ1BUVl9NSU4sIFRDUFRWX1JFWE1UTUFYKTsKCgl0cC0+c25kX2N3bmQgPSBUQ1BfTUFYV0lOIDw8IFRDUF9NQVhfV0lOU0hJRlQ7Cgl0cC0+c25kX3NzdGhyZXNoID0gVENQX01BWFdJTiA8PCBUQ1BfTUFYX1dJTlNISUZUOwoJdHAtPnRfc3RhdGUgPSBUQ1BTX0NMT1NFRDsKCglzby0+c29fdGNwY2IgPSB0cDsKCglyZXR1cm4gKHRwKTsKfQoKLyoKICogRHJvcCBhIFRDUCBjb25uZWN0aW9uLCByZXBvcnRpbmcKICogdGhlIHNwZWNpZmllZCBlcnJvci4gIElmIGNvbm5lY3Rpb24gaXMgc3luY2hyb25pemVkLAogKiB0aGVuIHNlbmQgYSBSU1QgdG8gcGVlci4KICovCnN0cnVjdCB0Y3BjYiAqdGNwX2Ryb3Aoc3RydWN0IHRjcGNiICp0cCwgaW50IGVycikKewovKiB0Y3BfZHJvcCh0cCwgZXJybm8pCglyZWdpc3RlciBzdHJ1Y3QgdGNwY2IgKnRwOwoJaW50IGVycm5vOwp7CiovCgoJREVCVUdfQ0FMTCgidGNwX2Ryb3AiKTsKCURFQlVHX0FSRygidHAgPSAlbHgiLCAobG9uZyl0cCk7CglERUJVR19BUkcoImVycm5vID0gJWQiLCBlcnJubyk7CgoJaWYgKFRDUFNfSEFWRVJDVkRTWU4odHAtPnRfc3RhdGUpKSB7CgkJdHAtPnRfc3RhdGUgPSBUQ1BTX0NMT1NFRDsKCQkodm9pZCkgdGNwX291dHB1dCh0cCk7CgkJU1RBVCh0Y3BzdGF0LnRjcHNfZHJvcHMrKyk7Cgl9IGVsc2UKCQlTVEFUKHRjcHN0YXQudGNwc19jb25uZHJvcHMrKyk7Ci8qCWlmIChlcnJubyA9PSBFVElNRURPVVQgJiYgdHAtPnRfc29mdGVycm9yKQogKgkJZXJybm8gPSB0cC0+dF9zb2Z0ZXJyb3I7CiAqLwovKglzby0+c29fZXJyb3IgPSBlcnJubzsgKi8KCXJldHVybiAodGNwX2Nsb3NlKHRwKSk7Cn0KCi8qCiAqIENsb3NlIGEgVENQIGNvbnRyb2wgYmxvY2s6CiAqCWRpc2NhcmQgYWxsIHNwYWNlIGhlbGQgYnkgdGhlIHRjcAogKglkaXNjYXJkIGludGVybmV0IHByb3RvY29sIGJsb2NrCiAqCXdha2UgdXAgYW55IHNsZWVwZXJzCiAqLwpzdHJ1Y3QgdGNwY2IgKgp0Y3BfY2xvc2Uoc3RydWN0IHRjcGNiICp0cCkKewoJcmVnaXN0ZXIgc3RydWN0IHRjcGlwaGRyICp0OwoJc3RydWN0IHNvY2tldCAqc28gPSB0cC0+dF9zb2NrZXQ7CglyZWdpc3RlciBzdHJ1Y3QgbWJ1ZiAqbTsKCglERUJVR19DQUxMKCJ0Y3BfY2xvc2UiKTsKCURFQlVHX0FSRygidHAgPSAlbHgiLCAobG9uZyApdHApOwoKCS8qIGZyZWUgdGhlIHJlYXNzZW1ibHkgcXVldWUsIGlmIGFueSAqLwoJdCA9IHRjcGZyYWdfbGlzdF9maXJzdCh0cCk7Cgl3aGlsZSAoIXRjcGZyYWdfbGlzdF9lbmQodCwgdHApKSB7CgkJdCA9IHRjcGlwaGRyX25leHQodCk7CgkJbSA9IHRjcGlwaGRyX3ByZXYodCktPnRpX21idWY7CgkJcmVtcXVlKHRjcGlwaGRyMnFsaW5rKHRjcGlwaGRyX3ByZXYodCkpKTsKCQltX2ZyZWVtKG0pOwoJfQoJLyogSXQncyBzdGF0aWMgKi8KLyoJaWYgKHRwLT50X3RlbXBsYXRlKQogKgkJKHZvaWQpIG1fZnJlZShkdG9tKHRwLT50X3RlbXBsYXRlKSk7CiAqLwovKglmcmVlKHRwLCBNX1BDQik7ICAqLwoJZnJlZSh0cCk7CiAgICAgICAgc28tPnNvX3RjcGNiID0gTlVMTDsKCXNvaXNmZGlzY29ubmVjdGVkKHNvKTsKCS8qIGNsb2JiZXIgaW5wdXQgc29ja2V0IGNhY2hlIGlmIHdlJ3JlIGNsb3NpbmcgdGhlIGNhY2hlZCBjb25uZWN0aW9uICovCglpZiAoc28gPT0gdGNwX2xhc3Rfc28pCgkJdGNwX2xhc3Rfc28gPSAmdGNiOwoJY2xvc2Vzb2NrZXQoc28tPnMpOwoJc2JmcmVlKCZzby0+c29fcmN2KTsKCXNiZnJlZSgmc28tPnNvX3NuZCk7Cglzb2ZyZWUoc28pOwoJU1RBVCh0Y3BzdGF0LnRjcHNfY2xvc2VkKyspOwoJcmV0dXJuICgoc3RydWN0IHRjcGNiICopMCk7Cn0KCiNpZmRlZiBub3RkZWYKdm9pZAp0Y3BfZHJhaW4oKQp7CgkvKiBYWFggKi8KfQoKLyoKICogV2hlbiBhIHNvdXJjZSBxdWVuY2ggaXMgcmVjZWl2ZWQsIGNsb3NlIGNvbmdlc3Rpb24gd2luZG93CiAqIHRvIG9uZSBzZWdtZW50LiAgV2Ugd2lsbCBncmFkdWFsbHkgb3BlbiBpdCBhZ2FpbiBhcyB3ZSBwcm9jZWVkLgogKi8Kdm9pZAp0Y3BfcXVlbmNoKGksIGVycm5vKQoKCWludCBlcnJubzsKewoJc3RydWN0IHRjcGNiICp0cCA9IGludG90Y3BjYihpbnApOwoKCWlmICh0cCkKCQl0cC0+c25kX2N3bmQgPSB0cC0+dF9tYXhzZWc7Cn0KCiNlbmRpZiAvKiBub3RkZWYgKi8KCi8qCiAqIFRDUCBwcm90b2NvbCBpbnRlcmZhY2UgdG8gc29ja2V0IGFic3RyYWN0aW9uLgogKi8KCi8qCiAqIFVzZXIgaXNzdWVkIGNsb3NlLCBhbmQgd2lzaCB0byB0cmFpbCB0aHJvdWdoIHNodXRkb3duIHN0YXRlczoKICogaWYgbmV2ZXIgcmVjZWl2ZWQgU1lOLCBqdXN0IGZvcmdldCBpdC4gIElmIGdvdCBhIFNZTiBmcm9tIHBlZXIsCiAqIGJ1dCBoYXZlbid0IHNlbnQgRklOLCB0aGVuIGdvIHRvIEZJTl9XQUlUXzEgc3RhdGUgdG8gc2VuZCBwZWVyIGEgRklOLgogKiBJZiBhbHJlYWR5IGdvdCBhIEZJTiBmcm9tIHBlZXIsIHRoZW4gYWxtb3N0IGRvbmU7IGdvIHRvIExBU1RfQUNLCiAqIHN0YXRlLiAgSW4gYWxsIG90aGVyIGNhc2VzLCBoYXZlIGFscmVhZHkgc2VudCBGSU4gdG8gcGVlciAoZS5nLgogKiBhZnRlciBQUlVfU0hVVERPV04pLCBhbmQganVzdCBoYXZlIHRvIHBsYXkgdGVkaW91cyBnYW1lIHdhaXRpbmcKICogZm9yIHBlZXIgdG8gc2VuZCBGSU4gb3Igbm90IHJlc3BvbmQgdG8ga2VlcC1hbGl2ZXMsIGV0Yy4KICogV2UgY2FuIGxldCB0aGUgdXNlciBleGl0IGZyb20gdGhlIGNsb3NlIGFzIHNvb24gYXMgdGhlIEZJTiBpcyBhY2tlZC4KICovCnZvaWQKdGNwX3NvY2tjbG9zZWQoc3RydWN0IHRjcGNiICp0cCkKewoKCURFQlVHX0NBTEwoInRjcF9zb2NrY2xvc2VkIik7CglERUJVR19BUkcoInRwID0gJWx4IiwgKGxvbmcpdHApOwoKCXN3aXRjaCAodHAtPnRfc3RhdGUpIHsKCgljYXNlIFRDUFNfQ0xPU0VEOgoJY2FzZSBUQ1BTX0xJU1RFTjoKCWNhc2UgVENQU19TWU5fU0VOVDoKCQl0cC0+dF9zdGF0ZSA9IFRDUFNfQ0xPU0VEOwoJCXRwID0gdGNwX2Nsb3NlKHRwKTsKCQlicmVhazsKCgljYXNlIFRDUFNfU1lOX1JFQ0VJVkVEOgoJY2FzZSBUQ1BTX0VTVEFCTElTSEVEOgoJCXRwLT50X3N0YXRlID0gVENQU19GSU5fV0FJVF8xOwoJCWJyZWFrOwoKCWNhc2UgVENQU19DTE9TRV9XQUlUOgoJCXRwLT50X3N0YXRlID0gVENQU19MQVNUX0FDSzsKCQlicmVhazsKCX0KLyoJc29pc2ZkaXNjb25uZWN0aW5nKHRwLT50X3NvY2tldCk7ICovCglpZiAodHAgJiYgdHAtPnRfc3RhdGUgPj0gVENQU19GSU5fV0FJVF8yKQoJCXNvaXNmZGlzY29ubmVjdGVkKHRwLT50X3NvY2tldCk7CglpZiAodHApCgkJdGNwX291dHB1dCh0cCk7Cn0KCi8qCiAqIENvbm5lY3QgdG8gYSBob3N0IG9uIHRoZSBJbnRlcm5ldAogKiBDYWxsZWQgYnkgdGNwX2lucHV0CiAqIE9ubHkgZG8gYSBjb25uZWN0LCB0aGUgdGNwIGZpZWxkcyB3aWxsIGJlIHNldCBpbiB0Y3BfaW5wdXQKICogcmV0dXJuIDAgaWYgdGhlcmUncyBhIHJlc3VsdCBvZiB0aGUgY29ubmVjdCwKICogZWxzZSByZXR1cm4gLTEgbWVhbnMgd2UncmUgc3RpbGwgY29ubmVjdGluZwogKiBUaGUgcmV0dXJuIHZhbHVlIGlzIGFsbW9zdCBhbHdheXMgLTEgc2luY2UgdGhlIHNvY2tldCBpcwogKiBub25ibG9ja2luZy4gIENvbm5lY3QgcmV0dXJucyBhZnRlciB0aGUgU1lOIGlzIHNlbnQsIGFuZCBkb2VzCiAqIG5vdCB3YWl0IGZvciBBQ0srU1lOLgogKi8KaW50IHRjcF9mY29ubmVjdChzdHJ1Y3Qgc29ja2V0ICpzbykKewogIGludCByZXQ9MDsKCiAgREVCVUdfQ0FMTCgidGNwX2Zjb25uZWN0Iik7CiAgREVCVUdfQVJHKCJzbyA9ICVseCIsIChsb25nIClzbyk7CgogIGlmKCAocmV0PXNvLT5zPXNvY2tldChBRl9JTkVULFNPQ0tfU1RSRUFNLDApKSA+PSAwKSB7CiAgICBpbnQgb3B0LCBzPXNvLT5zOwogICAgc3RydWN0IHNvY2thZGRyX2luIGFkZHI7CgogICAgZmRfbm9uYmxvY2socyk7CiAgICBvcHQgPSAxOwogICAgc2V0c29ja29wdChzLFNPTF9TT0NLRVQsU09fUkVVU0VBRERSLChjaGFyICopJm9wdCxzaXplb2Yob3B0ICkpOwogICAgb3B0ID0gMTsKICAgIHNldHNvY2tvcHQocyxTT0xfU09DS0VULFNPX09PQklOTElORSwoY2hhciAqKSZvcHQsc2l6ZW9mKG9wdCApKTsKCiAgICBhZGRyLnNpbl9mYW1pbHkgPSBBRl9JTkVUOwogICAgaWYgKChzby0+c29fZmFkZHIuc19hZGRyICYgaHRvbmwoMHhmZmZmZmYwMCkpID09IHNwZWNpYWxfYWRkci5zX2FkZHIpIHsKICAgICAgLyogSXQncyBhbiBhbGlhcyAqLwogICAgICBzd2l0Y2gobnRvaGwoc28tPnNvX2ZhZGRyLnNfYWRkcikgJiAweGZmKSB7CiAgICAgIGNhc2UgQ1RMX0ROUzoKCWFkZHIuc2luX2FkZHIgPSBkbnNfYWRkcjsKCWJyZWFrOwogICAgICBjYXNlIENUTF9BTElBUzoKICAgICAgZGVmYXVsdDoKCWFkZHIuc2luX2FkZHIgPSBsb29wYmFja19hZGRyOwoJYnJlYWs7CiAgICAgIH0KICAgIH0gZWxzZQogICAgICBhZGRyLnNpbl9hZGRyID0gc28tPnNvX2ZhZGRyOwogICAgYWRkci5zaW5fcG9ydCA9IHNvLT5zb19mcG9ydDsKCiAgICBERUJVR19NSVNDKChkZmQsICIgY29ubmVjdCgpaW5nLCBhZGRyLnNpbl9wb3J0PSVkLCAiCgkJImFkZHIuc2luX2FkZHIuc19hZGRyPSUuMTZzXG4iLAoJCW50b2hzKGFkZHIuc2luX3BvcnQpLCBpbmV0X250b2EoYWRkci5zaW5fYWRkcikpKTsKICAgIC8qIFdlIGRvbid0IGNhcmUgd2hhdCBwb3J0IHdlIGdldCAqLwogICAgcmV0ID0gY29ubmVjdChzLChzdHJ1Y3Qgc29ja2FkZHIgKikmYWRkcixzaXplb2YgKGFkZHIpKTsKCiAgICAvKgogICAgICogSWYgaXQncyBub3QgaW4gcHJvZ3Jlc3MsIGl0IGZhaWxlZCwgc28gd2UganVzdCByZXR1cm4gMCwKICAgICAqIHdpdGhvdXQgY2xlYXJpbmcgU1NfTk9GRFJFRgogICAgICovCiAgICBzb2lzZmNvbm5lY3Rpbmcoc28pOwogIH0KCiAgcmV0dXJuKHJldCk7Cn0KCi8qCiAqIEFjY2VwdCB0aGUgc29ja2V0IGFuZCBjb25uZWN0IHRvIHRoZSBsb2NhbC1ob3N0CiAqCiAqIFdlIGhhdmUgYSBwcm9ibGVtLiBUaGUgY29ycmVjdCB0aGluZyB0byBkbyB3b3VsZCBiZQogKiB0byBmaXJzdCBjb25uZWN0IHRvIHRoZSBsb2NhbC1ob3N0LCBhbmQgb25seSBpZiB0aGUKICogY29ubmVjdGlvbiBpcyBhY2NlcHRlZCwgdGhlbiBkbyBhbiBhY2NlcHQoKSBoZXJlLgogKiBCdXQsIGEpIHdlIG5lZWQgdG8ga25vdyB3aG8ncyB0cnlpbmcgdG8gY29ubmVjdAogKiB0byB0aGUgc29ja2V0IHRvIGJlIGFibGUgdG8gU1lOIHRoZSBsb2NhbC1ob3N0LCBhbmQKICogYikgd2UgYXJlIGFscmVhZHkgY29ubmVjdGVkIHRvIHRoZSBmb3JlaWduIGhvc3QgYnkKICogdGhlIHRpbWUgaXQgZ2V0cyB0byBhY2NlcHQoKSwgc28uLi4gV2Ugc2ltcGx5IGFjY2VwdAogKiBoZXJlIGFuZCBTWU4gdGhlIGxvY2FsLWhvc3QuCiAqLwp2b2lkCnRjcF9jb25uZWN0KHN0cnVjdCBzb2NrZXQgKmluc28pCnsKCXN0cnVjdCBzb2NrZXQgKnNvOwoJc3RydWN0IHNvY2thZGRyX2luIGFkZHI7Cglzb2NrbGVuX3QgYWRkcmxlbiA9IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW4pOwoJc3RydWN0IHRjcGNiICp0cDsKCWludCBzLCBvcHQ7CgoJREVCVUdfQ0FMTCgidGNwX2Nvbm5lY3QiKTsKCURFQlVHX0FSRygiaW5zbyA9ICVseCIsIChsb25nKWluc28pOwoKCS8qCgkgKiBJZiBpdCdzIGFuIFNTX0FDQ0VQVE9OQ0Ugc29ja2V0LCBubyBuZWVkIHRvIHNvY3JlYXRlKCkKCSAqIGFub3RoZXIgc29ja2V0LCBqdXN0IHVzZSB0aGUgYWNjZXB0KCkgc29ja2V0LgoJICovCglpZiAoaW5zby0+c29fc3RhdGUgJiBTU19GQUNDRVBUT05DRSkgewoJCS8qIEZBQ0NFUFRPTkNFIGFscmVhZHkgaGF2ZSBhIHRjcGNiICovCgkJc28gPSBpbnNvOwoJfSBlbHNlIHsKCQlpZiAoKHNvID0gc29jcmVhdGUoKSkgPT0gTlVMTCkgewoJCQkvKiBJZiBpdCBmYWlsZWQsIGdldCByaWQgb2YgdGhlIHBlbmRpbmcgY29ubmVjdGlvbiAqLwoJCQljbG9zZXNvY2tldChhY2NlcHQoaW5zby0+cywoc3RydWN0IHNvY2thZGRyICopJmFkZHIsJmFkZHJsZW4pKTsKCQkJcmV0dXJuOwoJCX0KCQlpZiAodGNwX2F0dGFjaChzbykgPCAwKSB7CgkJCWZyZWUoc28pOyAvKiBOT1Qgc29mcmVlICovCgkJCXJldHVybjsKCQl9CgkJc28tPnNvX2xhZGRyID0gaW5zby0+c29fbGFkZHI7CgkJc28tPnNvX2xwb3J0ID0gaW5zby0+c29fbHBvcnQ7Cgl9CgoJKHZvaWQpIHRjcF9tc3Moc290b3RjcGNiKHNvKSwgMCk7CgoJaWYgKChzID0gYWNjZXB0KGluc28tPnMsKHN0cnVjdCBzb2NrYWRkciAqKSZhZGRyLCZhZGRybGVuKSkgPCAwKSB7CgkJdGNwX2Nsb3NlKHNvdG90Y3BjYihzbykpOyAvKiBUaGlzIHdpbGwgc29mcmVlKCkgYXMgd2VsbCAqLwoJCXJldHVybjsKCX0KCWZkX25vbmJsb2NrKHMpOwoJb3B0ID0gMTsKCXNldHNvY2tvcHQocyxTT0xfU09DS0VULFNPX1JFVVNFQUREUiwoY2hhciAqKSZvcHQsc2l6ZW9mKGludCkpOwoJb3B0ID0gMTsKCXNldHNvY2tvcHQocyxTT0xfU09DS0VULFNPX09PQklOTElORSwoY2hhciAqKSZvcHQsc2l6ZW9mKGludCkpOwoJb3B0ID0gMTsKCXNldHNvY2tvcHQocyxJUFBST1RPX1RDUCxUQ1BfTk9ERUxBWSwoY2hhciAqKSZvcHQsc2l6ZW9mKGludCkpOwoKCXNvLT5zb19mcG9ydCA9IGFkZHIuc2luX3BvcnQ7Cglzby0+c29fZmFkZHIgPSBhZGRyLnNpbl9hZGRyOwoJLyogVHJhbnNsYXRlIGNvbm5lY3Rpb25zIGZyb20gbG9jYWxob3N0IHRvIHRoZSByZWFsIGhvc3RuYW1lICovCglpZiAoc28tPnNvX2ZhZGRyLnNfYWRkciA9PSAwIHx8IHNvLT5zb19mYWRkci5zX2FkZHIgPT0gbG9vcGJhY2tfYWRkci5zX2FkZHIpCgkgICBzby0+c29fZmFkZHIgPSBhbGlhc19hZGRyOwoKCS8qIENsb3NlIHRoZSBhY2NlcHQoKSBzb2NrZXQsIHNldCByaWdodCBzdGF0ZSAqLwoJaWYgKGluc28tPnNvX3N0YXRlICYgU1NfRkFDQ0VQVE9OQ0UpIHsKCQljbG9zZXNvY2tldChzby0+cyk7IC8qIElmIHdlIG9ubHkgYWNjZXB0IG9uY2UsIGNsb3NlIHRoZSBhY2NlcHQoKSBzb2NrZXQgKi8KCQlzby0+c29fc3RhdGUgPSBTU19OT0ZEUkVGOyAvKiBEb24ndCBzZWxlY3QgaXQgeWV0LCBldmVuIHRob3VnaCB3ZSBoYXZlIGFuIEZEICovCgkJCQkJICAgLyogaWYgaXQncyBub3QgRkFDQ0VQVE9OQ0UsIGl0J3MgYWxyZWFkeSBOT0ZEUkVGICovCgl9Cglzby0+cyA9IHM7CgoJc28tPnNvX2lwdG9zID0gdGNwX3Rvcyhzbyk7Cgl0cCA9IHNvdG90Y3BjYihzbyk7CgoJdGNwX3RlbXBsYXRlKHRwKTsKCgkvKiBDb21wdXRlIHdpbmRvdyBzY2FsaW5nIHRvIHJlcXVlc3QuICAqLwovKgl3aGlsZSAodHAtPnJlcXVlc3Rfcl9zY2FsZSA8IFRDUF9NQVhfV0lOU0hJRlQgJiYKICoJCShUQ1BfTUFYV0lOIDw8IHRwLT5yZXF1ZXN0X3Jfc2NhbGUpIDwgc28tPnNvX3Jjdi5zYl9oaXdhdCkKICoJCXRwLT5yZXF1ZXN0X3Jfc2NhbGUrKzsKICovCgovKglzb2lzY29ubmVjdGluZyhzbyk7ICovIC8qIE5PRkRSRUYgdXNlZCBpbnN0ZWFkICovCglTVEFUKHRjcHN0YXQudGNwc19jb25uYXR0ZW1wdCsrKTsKCgl0cC0+dF9zdGF0ZSA9IFRDUFNfU1lOX1NFTlQ7Cgl0cC0+dF90aW1lcltUQ1BUX0tFRVBdID0gVENQVFZfS0VFUF9JTklUOwoJdHAtPmlzcyA9IHRjcF9pc3M7Cgl0Y3BfaXNzICs9IFRDUF9JU1NJTkNSLzI7Cgl0Y3Bfc2VuZHNlcWluaXQodHApOwoJdGNwX291dHB1dCh0cCk7Cn0KCi8qCiAqIEF0dGFjaCBhIFRDUENCIHRvIGEgc29ja2V0LgogKi8KaW50CnRjcF9hdHRhY2goc3RydWN0IHNvY2tldCAqc28pCnsKCWlmICgoc28tPnNvX3RjcGNiID0gdGNwX25ld3RjcGNiKHNvKSkgPT0gTlVMTCkKCSAgIHJldHVybiAtMTsKCglpbnNxdWUoc28sICZ0Y2IpOwoKCXJldHVybiAwOwp9CgovKgogKiBTZXQgdGhlIHNvY2tldCdzIHR5cGUgb2Ygc2VydmljZSBmaWVsZAogKi8Kc3RhdGljIGNvbnN0IHN0cnVjdCB0b3NfdCB0Y3B0b3NbXSA9IHsKCSAgezAsIDIwLCBJUFRPU19USFJPVUdIUFVULCAwfSwJLyogZnRwIGRhdGEgKi8KCSAgezIxLCAyMSwgSVBUT1NfTE9XREVMQVksICBFTVVfRlRQfSwJLyogZnRwIGNvbnRyb2wgKi8KCSAgezAsIDIzLCBJUFRPU19MT1dERUxBWSwgMH0sCS8qIHRlbG5ldCAqLwoJICB7MCwgODAsIElQVE9TX1RIUk9VR0hQVVQsIDB9LAkvKiBXV1cgKi8KCSAgezAsIDUxMywgSVBUT1NfTE9XREVMQVksIEVNVV9STE9HSU58RU1VX05PQ09OTkVDVH0sCS8qIHJsb2dpbiAqLwoJICB7MCwgNTE0LCBJUFRPU19MT1dERUxBWSwgRU1VX1JTSHxFTVVfTk9DT05ORUNUfSwJLyogc2hlbGwgKi8KCSAgezAsIDU0NCwgSVBUT1NfTE9XREVMQVksIEVNVV9LU0h9LAkJLyoga3NoZWxsICovCgkgIHswLCA1NDMsIElQVE9TX0xPV0RFTEFZLCAwfSwJLyoga2xvZ2luICovCgkgIHswLCA2NjY3LCBJUFRPU19USFJPVUdIUFVULCBFTVVfSVJDfSwJLyogSVJDICovCgkgIHswLCA2NjY4LCBJUFRPU19USFJPVUdIUFVULCBFTVVfSVJDfSwJLyogSVJDIHVuZGVybmV0ICovCgkgIHswLCA3MDcwLCBJUFRPU19MT1dERUxBWSwgRU1VX1JFQUxBVURJTyB9LCAvKiBSZWFsQXVkaW8gY29udHJvbCAqLwoJICB7MCwgMTEzLCBJUFRPU19MT1dERUxBWSwgRU1VX0lERU5UIH0sIC8qIGlkZW50ZCBwcm90b2NvbCAqLwoJICB7MCwgMCwgMCwgMH0KfTsKCiNpZmRlZiBDT05GSUdfUUVNVQpzdGF0aWMKI2VuZGlmCnN0cnVjdCBlbXVfdCAqdGNwZW11ID0gTlVMTDsKCi8qCiAqIFJldHVybiBUT1MgYWNjb3JkaW5nIHRvIHRoZSBhYm92ZSB0YWJsZQogKi8KdV9pbnQ4X3QKdGNwX3RvcyhzdHJ1Y3Qgc29ja2V0ICpzbykKewoJaW50IGkgPSAwOwoJc3RydWN0IGVtdV90ICplbXVwOwoKCXdoaWxlKHRjcHRvc1tpXS50b3MpIHsKCQlpZiAoKHRjcHRvc1tpXS5mcG9ydCAmJiAobnRvaHMoc28tPnNvX2Zwb3J0KSA9PSB0Y3B0b3NbaV0uZnBvcnQpKSB8fAoJCSAgICAodGNwdG9zW2ldLmxwb3J0ICYmIChudG9ocyhzby0+c29fbHBvcnQpID09IHRjcHRvc1tpXS5scG9ydCkpKSB7CgkJCXNvLT5zb19lbXUgPSB0Y3B0b3NbaV0uZW11OwoJCQlyZXR1cm4gdGNwdG9zW2ldLnRvczsKCQl9CgkJaSsrOwoJfQoKCS8qIE5vcGUsIGxldHMgc2VlIGlmIHRoZXJlJ3MgYSB1c2VyLWFkZGVkIG9uZSAqLwoJZm9yIChlbXVwID0gdGNwZW11OyBlbXVwOyBlbXVwID0gZW11cC0+bmV4dCkgewoJCWlmICgoZW11cC0+ZnBvcnQgJiYgKG50b2hzKHNvLT5zb19mcG9ydCkgPT0gZW11cC0+ZnBvcnQpKSB8fAoJCSAgICAoZW11cC0+bHBvcnQgJiYgKG50b2hzKHNvLT5zb19scG9ydCkgPT0gZW11cC0+bHBvcnQpKSkgewoJCQlzby0+c29fZW11ID0gZW11cC0+ZW11OwoJCQlyZXR1cm4gZW11cC0+dG9zOwoJCX0KCX0KCglyZXR1cm4gMDsKfQoKI2lmIDAKaW50IGRvX2VjaG8gPSAtMTsKI2VuZGlmCgovKgogKiBFbXVsYXRlIHByb2dyYW1zIHRoYXQgdHJ5IGFuZCBjb25uZWN0IHRvIHVzCiAqIFRoaXMgaW5jbHVkZXMgZnRwICh0aGUgZGF0YSBjb25uZWN0aW9uIGlzCiAqIGluaXRpYXRlZCBieSB0aGUgc2VydmVyKSBhbmQgSVJDIChEQ0MgQ0hBVCBhbmQKICogRENDIFNFTkQpIGZvciBub3cKICoKICogTk9URTogSXQncyBwb3NzaWJsZSB0byBjcmFzaCBTTGlSUCBieSBzZW5kaW5nIGl0CiAqIHVuc3RhbmRhcmQgc3RyaW5ncyB0byBlbXVsYXRlLi4uIGlmIHRoaXMgaXMgYSBwcm9ibGVtLAogKiBtb3JlIGNoZWNrcyBhcmUgbmVlZGVkIGhlcmUKICoKICogWFhYIEFzc3VtZXMgdGhlIHdob2xlIGNvbW1hbmQgY2FtZSBpbiBvbmUgcGFja2V0CiAqCiAqIFhYWCBTb21lIGZ0cCBjbGllbnRzIHdpbGwgaGF2ZSB0aGVpciBUT1Mgc2V0IHRvCiAqIExPV0RFTEFZIGFuZCBzbyBOYWdlbCB3aWxsIGtpY2sgaW4uICBCZWNhdXNlIG9mIHRoaXMsCiAqIHdlJ2xsIGdldCB0aGUgZmlyc3QgbGV0dGVyLCBmb2xsb3dlZCBieSB0aGUgcmVzdCwgc28KICogd2Ugc2ltcGx5IHNjYW4gZm9yIE9SVCBpbnN0ZWFkIG9mIFBPUlQuLi4KICogRENDIGRvZXNuJ3QgaGF2ZSB0aGlzIHByb2JsZW0gYmVjYXVzZSB0aGVyZSdzIG90aGVyIHN0dWZmCiAqIGluIHRoZSBwYWNrZXQgYmVmb3JlIHRoZSBEQ0MgY29tbWFuZC4KICoKICogUmV0dXJuIDEgaWYgdGhlIG1idWYgbSBpcyBzdGlsbCB2YWxpZCBhbmQgc2hvdWxkIGJlCiAqIHNiYXBwZW5kKCllZAogKgogKiBOT1RFOiBpZiB5b3UgcmV0dXJuIDAgeW91IE1VU1QgbV9mcmVlKCkgdGhlIG1idWYhCiAqLwppbnQKdGNwX2VtdShzdHJ1Y3Qgc29ja2V0ICpzbywgc3RydWN0IG1idWYgKm0pCnsKCXVfaW50IG4xLCBuMiwgbjMsIG40LCBuNSwgbjY7CiAgICAgICAgY2hhciBidWZmWzI1N107Cgl1X2ludDMyX3QgbGFkZHI7Cgl1X2ludCBscG9ydDsKCWNoYXIgKmJwdHI7CgoJREVCVUdfQ0FMTCgidGNwX2VtdSIpOwoJREVCVUdfQVJHKCJzbyA9ICVseCIsIChsb25nKXNvKTsKCURFQlVHX0FSRygibSA9ICVseCIsIChsb25nKW0pOwoKCXN3aXRjaChzby0+c29fZW11KSB7CgkJaW50IHgsIGk7CgoJIGNhc2UgRU1VX0lERU5UOgoJCS8qCgkJICogSWRlbnRpZmljYXRpb24gcHJvdG9jb2wgYXMgcGVyIHJmYy0xNDEzCgkJICovCgoJCXsKCQkJc3RydWN0IHNvY2tldCAqdG1wc287CgkJCXN0cnVjdCBzb2NrYWRkcl9pbiBhZGRyOwoJCQlzb2NrbGVuX3QgYWRkcmxlbiA9IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW4pOwoJCQlzdHJ1Y3Qgc2J1ZiAqc29fcmN2ID0gJnNvLT5zb19yY3Y7CgoJCQltZW1jcHkoc29fcmN2LT5zYl93cHRyLCBtLT5tX2RhdGEsIG0tPm1fbGVuKTsKCQkJc29fcmN2LT5zYl93cHRyICs9IG0tPm1fbGVuOwoJCQlzb19yY3YtPnNiX3JwdHIgKz0gbS0+bV9sZW47CgkJCW0tPm1fZGF0YVttLT5tX2xlbl0gPSAwOyAvKiBOVUxMIHRlcm1pbmF0ZSAqLwoJCQlpZiAoc3RyY2hyKG0tPm1fZGF0YSwgJ1xyJykgfHwgc3RyY2hyKG0tPm1fZGF0YSwgJ1xuJykpIHsKCQkJCWlmIChzc2NhbmYoc29fcmN2LT5zYl9kYXRhLCAiJXUlKlsgLF0ldSIsICZuMSwgJm4yKSA9PSAyKSB7CgkJCQkJSFRPTlMobjEpOwoJCQkJCUhUT05TKG4yKTsKCQkJCQkvKiBuMiBpcyB0aGUgb25lIG9uIG91ciBob3N0ICovCgkJCQkJZm9yICh0bXBzbyA9IHRjYi5zb19uZXh0OyB0bXBzbyAhPSAmdGNiOyB0bXBzbyA9IHRtcHNvLT5zb19uZXh0KSB7CgkJCQkJCWlmICh0bXBzby0+c29fbGFkZHIuc19hZGRyID09IHNvLT5zb19sYWRkci5zX2FkZHIgJiYKCQkJCQkJICAgIHRtcHNvLT5zb19scG9ydCA9PSBuMiAmJgoJCQkJCQkgICAgdG1wc28tPnNvX2ZhZGRyLnNfYWRkciA9PSBzby0+c29fZmFkZHIuc19hZGRyICYmCgkJCQkJCSAgICB0bXBzby0+c29fZnBvcnQgPT0gbjEpIHsKCQkJCQkJCWlmIChnZXRzb2NrbmFtZSh0bXBzby0+cywKCQkJCQkJCQkoc3RydWN0IHNvY2thZGRyICopJmFkZHIsICZhZGRybGVuKSA9PSAwKQoJCQkJCQkJICAgbjIgPSBudG9ocyhhZGRyLnNpbl9wb3J0KTsKCQkJCQkJCWJyZWFrOwoJCQkJCQl9CgkJCQkJfQoJCQkJfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvX3Jjdi0+c2JfY2MgPSBzbnByaW50Zihzb19yY3YtPnNiX2RhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvX3Jjdi0+c2JfZGF0YWxlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVkLCVkXHJcbiIsIG4xLCBuMik7CgkJCQlzb19yY3YtPnNiX3JwdHIgPSBzb19yY3YtPnNiX2RhdGE7CgkJCQlzb19yY3YtPnNiX3dwdHIgPSBzb19yY3YtPnNiX2RhdGEgKyBzb19yY3YtPnNiX2NjOwoJCQl9CgkJCW1fZnJlZShtKTsKCQkJcmV0dXJuIDA7CgkJfQoKI2lmIDAKCSBjYXNlIEVNVV9STE9HSU46CgkJLyoKCQkgKiBSbG9naW4gZW11bGF0aW9uCgkJICogRmlyc3Qgd2UgYWNjdW11bGF0ZSBhbGwgdGhlIGluaXRpYWwgb3B0aW9uIG5lZ290aWF0aW9uLAoJCSAqIHRoZW4gZm9ya19leGVjKCkgcmxvZ2luIGFjY29yZGluZyB0byB0aGUgIG9wdGlvbnMKCQkgKi8KCQl7CgkJCWludCBpLCBpMiwgbjsKCQkJY2hhciAqcHRyOwoJCQljaGFyIGFyZ3NbMTAwXTsKCQkJY2hhciB0ZXJtWzEwMF07CgkJCXN0cnVjdCBzYnVmICpzb19zbmQgPSAmc28tPnNvX3NuZDsKCQkJc3RydWN0IHNidWYgKnNvX3JjdiA9ICZzby0+c29fcmN2OwoKCQkJLyogRmlyc3QgY2hlY2sgaWYgdGhleSBoYXZlIGEgcHJpdmVsYWRnZWQgcG9ydCwgb3IgdG9vIG11Y2ggZGF0YSBoYXMgYXJyaXZlZCAqLwoJCQlpZiAobnRvaHMoc28tPnNvX2xwb3J0KSA+IDEwMjMgfHwgbnRvaHMoc28tPnNvX2xwb3J0KSA8IDUxMiB8fAoJCQkgICAgKG0tPm1fbGVuICsgc29fcmN2LT5zYl93cHRyKSA+IChzb19yY3YtPnNiX2RhdGEgKyBzb19yY3YtPnNiX2RhdGFsZW4pKSB7CgkJCQltZW1jcHkoc29fc25kLT5zYl93cHRyLCAiUGVybWlzc2lvbiBkZW5pZWRcbiIsIDE4KTsKCQkJCXNvX3NuZC0+c2Jfd3B0ciArPSAxODsKCQkJCXNvX3NuZC0+c2JfY2MgKz0gMTg7CgkJCQl0Y3Bfc29ja2Nsb3NlZChzb3RvdGNwY2Ioc28pKTsKCQkJCW1fZnJlZShtKTsKCQkJCXJldHVybiAwOwoJCQl9CgoJCQkvKiBBcHBlbmQgdGhlIGN1cnJlbnQgZGF0YSAqLwoJCQltZW1jcHkoc29fcmN2LT5zYl93cHRyLCBtLT5tX2RhdGEsIG0tPm1fbGVuKTsKCQkJc29fcmN2LT5zYl93cHRyICs9IG0tPm1fbGVuOwoJCQlzb19yY3YtPnNiX3JwdHIgKz0gbS0+bV9sZW47CgkJCW1fZnJlZShtKTsKCgkJCS8qCgkJCSAqIENoZWNrIGlmIHdlIGhhdmUgYWxsIHRoZSBpbml0aWFsIG9wdGlvbnMsCgkJCSAqIGFuZCBidWlsZCBhcmd1bWVudCBsaXN0IHRvIHJsb2dpbiB3aGlsZSB3ZSdyZSBoZXJlCgkJCSAqLwoJCQluID0gMDsKCQkJcHRyID0gc29fcmN2LT5zYl9kYXRhOwoJCQlhcmdzWzBdID0gMDsKCQkJdGVybVswXSA9IDA7CgkJCXdoaWxlIChwdHIgPCBzb19yY3YtPnNiX3dwdHIpIHsKCQkJCWlmICgqcHRyKysgPT0gMCkgewoJCQkJCW4rKzsKCQkJCQlpZiAobiA9PSAyKSB7CgkJCQkJCXNwcmludGYoYXJncywgInJsb2dpbiAtbCAlcyAlcyIsCgkJCQkJCQlwdHIsIGluZXRfbnRvYShzby0+c29fZmFkZHIpKTsKCQkJCQl9IGVsc2UgaWYgKG4gPT0gMykgewoJCQkJCQlpMiA9IHNvX3Jjdi0+c2Jfd3B0ciAtIHB0cjsKCQkJCQkJZm9yIChpID0gMDsgaSA8IGkyOyBpKyspIHsKCQkJCQkJCWlmIChwdHJbaV0gPT0gJy8nKSB7CgkJCQkJCQkJcHRyW2ldID0gMDsKI2lmZGVmIEhBVkVfU0VURU5WCgkJCQkJCQkJc3ByaW50Zih0ZXJtLCAiJXMiLCBwdHIpOwojZWxzZQoJCQkJCQkJCXNwcmludGYodGVybSwgIlRFUk09JXMiLCBwdHIpOwojZW5kaWYKCQkJCQkJCQlwdHJbaV0gPSAnLyc7CgkJCQkJCQkJYnJlYWs7CgkJCQkJCQl9CgkJCQkJCX0KCQkJCQl9CgkJCQl9CgkJCX0KCgkJCWlmIChuICE9IDQpCgkJCSAgIHJldHVybiAwOwoKCQkJLyogV2UgaGF2ZSBpdCwgc2V0IG91ciB0ZXJtIHZhcmlhYmxlIGFuZCBmb3JrX2V4ZWMoKSAqLwojaWZkZWYgSEFWRV9TRVRFTlYKCQkJc2V0ZW52KCJURVJNIiwgdGVybSwgMSk7CiNlbHNlCgkJCXB1dGVudih0ZXJtKTsKI2VuZGlmCgkJCWZvcmtfZXhlYyhzbywgYXJncywgMik7CgkJCXRlcm1bMF0gPSAwOwoJCQlzby0+c29fZW11ID0gMDsKCgkJCS8qIEFuZCBmaW5hbGx5LCBzZW5kIHRoZSBjbGllbnQgYSAwIGNoYXJhY3RlciAqLwoJCQlzb19zbmQtPnNiX3dwdHJbMF0gPSAwOwoJCQlzb19zbmQtPnNiX3dwdHIrKzsKCQkJc29fc25kLT5zYl9jYysrOwoKCQkJcmV0dXJuIDA7CgkJfQoKCSBjYXNlIEVNVV9SU0g6CgkJLyoKCQkgKiByc2ggZW11bGF0aW9uCgkJICogRmlyc3Qgd2UgYWNjdW11bGF0ZSBhbGwgdGhlIGluaXRpYWwgb3B0aW9uIG5lZ290aWF0aW9uLAoJCSAqIHRoZW4gcnNoX2V4ZWMoKSByc2ggYWNjb3JkaW5nIHRvIHRoZSAgb3B0aW9ucwoJCSAqLwoJCXsKCQkJaW50ICBuOwoJCQljaGFyICpwdHI7CgkJCWNoYXIgKnVzZXI7CgkJCWNoYXIgKmFyZ3M7CgkJCXN0cnVjdCBzYnVmICpzb19zbmQgPSAmc28tPnNvX3NuZDsKCQkJc3RydWN0IHNidWYgKnNvX3JjdiA9ICZzby0+c29fcmN2OwoKCQkJLyogRmlyc3QgY2hlY2sgaWYgdGhleSBoYXZlIGEgcHJpdmVsYWRnZWQgcG9ydCwgb3IgdG9vIG11Y2ggZGF0YSBoYXMgYXJyaXZlZCAqLwoJCQlpZiAobnRvaHMoc28tPnNvX2xwb3J0KSA+IDEwMjMgfHwgbnRvaHMoc28tPnNvX2xwb3J0KSA8IDUxMiB8fAoJCQkgICAgKG0tPm1fbGVuICsgc29fcmN2LT5zYl93cHRyKSA+IChzb19yY3YtPnNiX2RhdGEgKyBzb19yY3YtPnNiX2RhdGFsZW4pKSB7CgkJCQltZW1jcHkoc29fc25kLT5zYl93cHRyLCAiUGVybWlzc2lvbiBkZW5pZWRcbiIsIDE4KTsKCQkJCXNvX3NuZC0+c2Jfd3B0ciArPSAxODsKCQkJCXNvX3NuZC0+c2JfY2MgKz0gMTg7CgkJCQl0Y3Bfc29ja2Nsb3NlZChzb3RvdGNwY2Ioc28pKTsKCQkJCW1fZnJlZShtKTsKCQkJCXJldHVybiAwOwoJCQl9CgoJCQkvKiBBcHBlbmQgdGhlIGN1cnJlbnQgZGF0YSAqLwoJCQltZW1jcHkoc29fcmN2LT5zYl93cHRyLCBtLT5tX2RhdGEsIG0tPm1fbGVuKTsKCQkJc29fcmN2LT5zYl93cHRyICs9IG0tPm1fbGVuOwoJCQlzb19yY3YtPnNiX3JwdHIgKz0gbS0+bV9sZW47CgkJCW1fZnJlZShtKTsKCgkJCS8qCgkJCSAqIENoZWNrIGlmIHdlIGhhdmUgYWxsIHRoZSBpbml0aWFsIG9wdGlvbnMsCgkJCSAqIGFuZCBidWlsZCBhcmd1bWVudCBsaXN0IHRvIHJsb2dpbiB3aGlsZSB3ZSdyZSBoZXJlCgkJCSAqLwoJCQluID0gMDsKCQkJcHRyID0gc29fcmN2LT5zYl9kYXRhOwoJCQl1c2VyPSIiOwoJCQlhcmdzPSIiOwoJCQlpZiAoc28tPmV4dHJhPT1OVUxMKSB7CgkJCQlzdHJ1Y3Qgc29ja2V0ICpuczsKCQkJCXN0cnVjdCB0Y3BjYiogdHA7CgkJCQlpbnQgcG9ydD1hdG9pKHB0cik7CgkJCQlpZiAocG9ydCA8PSAwKSByZXR1cm4gMDsKICAgICAgICAgICAgICAgIGlmIChwb3J0ID4gMTAyMyB8fCBwb3J0IDwgNTEyKSB7CiAgICAgICAgICAgICAgICAgIG1lbWNweShzb19zbmQtPnNiX3dwdHIsICJQZXJtaXNzaW9uIGRlbmllZFxuIiwgMTgpOwogICAgICAgICAgICAgICAgICBzb19zbmQtPnNiX3dwdHIgKz0gMTg7CiAgICAgICAgICAgICAgICAgIHNvX3NuZC0+c2JfY2MgKz0gMTg7CiAgICAgICAgICAgICAgICAgIHRjcF9zb2NrY2xvc2VkKHNvdG90Y3BjYihzbykpOwogICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgICAgIH0KCQkJCWlmICgobnM9c29jcmVhdGUoKSkgPT0gTlVMTCkKICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CgkJCQlpZiAodGNwX2F0dGFjaChucyk8MCkgewogICAgICAgICAgICAgICAgICBmcmVlKG5zKTsKICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CgkJCQl9CgoJCQkJbnMtPnNvX2xhZGRyPXNvLT5zb19sYWRkcjsKCQkJCW5zLT5zb19scG9ydD1odG9ucyhwb3J0KTsKCgkJCQkodm9pZCkgdGNwX21zcyhzb3RvdGNwY2IobnMpLCAwKTsKCgkJCQlucy0+c29fZmFkZHI9c28tPnNvX2ZhZGRyOwoJCQkJbnMtPnNvX2Zwb3J0PWh0b25zKElQUE9SVF9SRVNFUlZFRC0xKTsgLyogVXNlIGEgZmFrZSBwb3J0LiAqLwoKCQkJCWlmIChucy0+c29fZmFkZHIuc19hZGRyID09IDAgfHwKCQkJCQlucy0+c29fZmFkZHIuc19hZGRyID09IGxvb3BiYWNrX2FkZHIuc19hZGRyKQogICAgICAgICAgICAgICAgICBucy0+c29fZmFkZHIgPSBhbGlhc19hZGRyOwoKCQkJCW5zLT5zb19pcHRvcyA9IHRjcF90b3MobnMpOwoJCQkJdHAgPSBzb3RvdGNwY2IobnMpOwoKCQkJCXRjcF90ZW1wbGF0ZSh0cCk7CgoJCQkJLyogQ29tcHV0ZSB3aW5kb3cgc2NhbGluZyB0byByZXF1ZXN0LiAgKi8KCQkJCS8qCXdoaWxlICh0cC0+cmVxdWVzdF9yX3NjYWxlIDwgVENQX01BWF9XSU5TSElGVCAmJgoJCQkJICoJCShUQ1BfTUFYV0lOIDw8IHRwLT5yZXF1ZXN0X3Jfc2NhbGUpIDwgc28tPnNvX3Jjdi5zYl9oaXdhdCkKCQkJCSAqCQl0cC0+cmVxdWVzdF9yX3NjYWxlKys7CgkJCQkgKi8KCiAgICAgICAgICAgICAgICAvKnNvaXNmY29ubmVjdGluZyhucyk7Ki8KCgkJCQlTVEFUKHRjcHN0YXQudGNwc19jb25uYXR0ZW1wdCsrKTsKCgkJCQl0cC0+dF9zdGF0ZSA9IFRDUFNfU1lOX1NFTlQ7CgkJCQl0cC0+dF90aW1lcltUQ1BUX0tFRVBdID0gVENQVFZfS0VFUF9JTklUOwoJCQkJdHAtPmlzcyA9IHRjcF9pc3M7CgkJCQl0Y3BfaXNzICs9IFRDUF9JU1NJTkNSLzI7CgkJCQl0Y3Bfc2VuZHNlcWluaXQodHApOwoJCQkJdGNwX291dHB1dCh0cCk7CgkJCQlzby0+ZXh0cmE9bnM7CgkJCX0KCQkJd2hpbGUgKHB0ciA8IHNvX3Jjdi0+c2Jfd3B0cikgewogICAgICAgICAgICAgIGlmICgqcHRyKysgPT0gMCkgewogICAgICAgICAgICAgICAgbisrOwogICAgICAgICAgICAgICAgaWYgKG4gPT0gMikgewogICAgICAgICAgICAgICAgICB1c2VyPXB0cjsKICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobiA9PSAzKSB7CiAgICAgICAgICAgICAgICAgIGFyZ3M9cHRyOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KCQkJfQoKCQkJaWYgKG4gIT0gNCkKICAgICAgICAgICAgICByZXR1cm4gMDsKCgkJCXJzaF9leGVjKHNvLHNvLT5leHRyYSwgdXNlciwgaW5ldF9udG9hKHNvLT5zb19mYWRkciksIGFyZ3MpOwoJCQlzby0+c29fZW11ID0gMDsKCQkJc28tPmV4dHJhPU5VTEw7CgoJCQkvKiBBbmQgZmluYWxseSwgc2VuZCB0aGUgY2xpZW50IGEgMCBjaGFyYWN0ZXIgKi8KCQkJc29fc25kLT5zYl93cHRyWzBdID0gMDsKCQkJc29fc25kLT5zYl93cHRyKys7CgkJCXNvX3NuZC0+c2JfY2MrKzsKCgkJCXJldHVybiAwOwoJCX0KCgkgY2FzZSBFTVVfQ1RMOgoJCXsKCQkJaW50IG51bTsKCQkJc3RydWN0IHNidWYgKnNvX3NuZCA9ICZzby0+c29fc25kOwoJCQlzdHJ1Y3Qgc2J1ZiAqc29fcmN2ID0gJnNvLT5zb19yY3Y7CgoJCQkvKgoJCQkgKiBJZiB0aGVyZSBpcyBiaW5hcnkgZGF0YSBoZXJlLCB3ZSBzYXZlIGl0IGluIHNvLT5zb19tCgkJCSAqLwoJCQlpZiAoIXNvLT5zb19tKSB7CgkJCSAgaW50IHJ4bGVuOwoJCQkgIGNoYXIgKnJ4ZGF0YTsKCQkJICByeGRhdGE9bXRvZChtLCBjaGFyICopOwoJCQkgIGZvciAocnhsZW49bS0+bV9sZW47IHJ4bGVuOyByeGxlbi0tKSB7CgkJCSAgICBpZiAoKnJ4ZGF0YSsrICYgMHg4MCkgewoJCQkgICAgICBzby0+c29fbSA9IG07CgkJCSAgICAgIHJldHVybiAwOwoJCQkgICAgfQoJCQkgIH0KCQkJfSAvKiBpZihzby0+c29fbT09TlVMTCkgKi8KCgkJCS8qCgkJCSAqIEFwcGVuZCB0aGUgbGluZQoJCQkgKi8KCQkJc2JhcHBlbmRzYihzb19yY3YsIG0pOwoKCQkJLyogVG8gYXZvaWQgZ29pbmcgb3ZlciB0aGUgZWRnZSBvZiB0aGUgYnVmZmVyLCB3ZSByZXNldCBpdCAqLwoJCQlpZiAoc29fc25kLT5zYl9jYyA9PSAwKQoJCQkgICBzb19zbmQtPnNiX3dwdHIgPSBzb19zbmQtPnNiX3JwdHIgPSBzb19zbmQtPnNiX2RhdGE7CgoJCQkvKgoJCQkgKiBBIGJpdCBvZiBhIGhhY2s6CgkJCSAqIElmIHRoZSBmaXJzdCBwYWNrZXQgd2UgZ2V0IGhlcmUgaXMgMSBieXRlIGxvbmcsIHRoZW4gaXQKCQkJICogd2FzIGRvbmUgaW4gdGVsbmV0IGNoYXJhY3RlciBtb2RlLCB0aGVyZWZvcmUgd2UgbXVzdCBlY2hvCgkJCSAqIHRoZSBjaGFyYWN0ZXJzIGFzIHRoZXkgY29tZS4gIE90aGVyd2lzZSwgd2UgZWNobyBub3RoaW5nLAoJCQkgKiBiZWNhdXNlIGluIGxpbmVtb2RlLCB0aGUgbGluZSBpcyBhbHJlYWR5IGVjaG9lZAoJCQkgKiBYWFggdHdvIG9yIG1vcmUgY29udHJvbCBjb25uZWN0aW9ucyB3b24ndCB3b3JrCgkJCSAqLwoJCQlpZiAoZG9fZWNobyA9PSAtMSkgewoJCQkJaWYgKG0tPm1fbGVuID09IDEpIGRvX2VjaG8gPSAxOwoJCQkJZWxzZSBkb19lY2hvID0gMDsKCQkJfQoJCQlpZiAoZG9fZWNobykgewoJCQkgIHNiYXBwZW5kc2Ioc29fc25kLCBtKTsKCQkJICBtX2ZyZWUobSk7CgkJCSAgdGNwX291dHB1dChzb3RvdGNwY2Ioc28pKTsgLyogWFhYICovCgkJCX0gZWxzZQoJCQkgIG1fZnJlZShtKTsKCgkJCW51bSA9IDA7CgkJCXdoaWxlIChudW0gPCBzby0+c29fcmN2LnNiX2NjKSB7CgkJCQlpZiAoKihzby0+c29fcmN2LnNiX3JwdHIgKyBudW0pID09ICdcbicgfHwKCQkJCSAgICAqKHNvLT5zb19yY3Yuc2JfcnB0ciArIG51bSkgPT0gJ1xyJykgewoJCQkJCWludCBuOwoKCQkJCQkqKHNvX3Jjdi0+c2JfcnB0ciArIG51bSkgPSAwOwoJCQkJCWlmIChjdGxfcGFzc3dvcmQgJiYgIWN0bF9wYXNzd29yZF9vaykgewoJCQkJCQkvKiBOZWVkIGEgcGFzc3dvcmQgKi8KCQkJCQkJaWYgKHNzY2FuZihzb19yY3YtPnNiX3JwdHIsICJwYXNzICUyNTZzIiwgYnVmZikgPT0gMSkgewoJCQkJCQkJaWYgKHN0cmNtcChidWZmLCBjdGxfcGFzc3dvcmQpID09IDApIHsKCQkJCQkJCQljdGxfcGFzc3dvcmRfb2sgPSAxOwoJCQkJCQkJCW4gPSBzcHJpbnRmKHNvX3NuZC0+c2Jfd3B0ciwKCQkJCQkJCQkJICAgICJQYXNzd29yZCBPSy5cclxuIik7CgkJCQkJCQkJZ290byBkb19wcm9tcHQ7CgkJCQkJCQl9CgkJCQkJCX0KCQkJCQkJbiA9IHNwcmludGYoc29fc25kLT5zYl93cHRyLAoJCQkJCSAiRXJyb3I6IFBhc3N3b3JkIHJlcXVpcmVkLCBsb2cgb24gd2l0aCBcInBhc3MgUEFTU1dPUkRcIlxyXG4iKTsKCQkJCQkJZ290byBkb19wcm9tcHQ7CgkJCQkJfQoJCQkJCWNmZ19xdWl0dGluZyA9IDA7CgkJCQkJbiA9IGRvX2NvbmZpZyhzb19yY3YtPnNiX3JwdHIsIHNvLCBQUk5fU1BSSU5URik7CgkJCQkJaWYgKCFjZmdfcXVpdHRpbmcpIHsKCQkJCQkJLyogUmVnaXN0ZXIgdGhlIHByaW50ZWQgZGF0YSAqLwpkb19wcm9tcHQ6CgkJCQkJCXNvX3NuZC0+c2JfY2MgKz0gbjsKCQkJCQkJc29fc25kLT5zYl93cHRyICs9IG47CgkJCQkJCS8qIEFkZCBwcm9tcHQgKi8KCQkJCQkJbiA9IHNwcmludGYoc29fc25kLT5zYl93cHRyLCAiU2xpcnA+ICIpOwoJCQkJCQlzb19zbmQtPnNiX2NjICs9IG47CgkJCQkJCXNvX3NuZC0+c2Jfd3B0ciArPSBuOwoJCQkJCX0KCQkJCQkvKiBEcm9wIHNvX3JjdiBkYXRhICovCgkJCQkJc29fcmN2LT5zYl9jYyA9IDA7CgkJCQkJc29fcmN2LT5zYl93cHRyID0gc29fcmN2LT5zYl9ycHRyID0gc29fcmN2LT5zYl9kYXRhOwoJCQkJCXRjcF9vdXRwdXQoc290b3RjcGNiKHNvKSk7IC8qIFNlbmQgdGhlIHJlcGx5ICovCgkJCQl9CgkJCQludW0rKzsKCQkJfQoJCQlyZXR1cm4gMDsKCQl9CiNlbmRpZgogICAgICAgIGNhc2UgRU1VX0ZUUDogLyogZnRwICovCiAgICAgICAgICAgICAgICAqKG0tPm1fZGF0YSttLT5tX2xlbikgPSAwOyAvKiBOVUwgdGVybWluYXRlIGZvciBzdHJzdHIgKi8KCQlpZiAoKGJwdHIgPSAoY2hhciAqKXN0cnN0cihtLT5tX2RhdGEsICJPUlQiKSkgIT0gTlVMTCkgewoJCQkvKgoJCQkgKiBOZWVkIHRvIGVtdWxhdGUgdGhlIFBPUlQgY29tbWFuZAoJCQkgKi8KCQkJeCA9IHNzY2FuZihicHRyLCAiT1JUICV1LCV1LCV1LCV1LCV1LCV1XHJcbiUyNTZbXlwxNzddIiwKCQkJCSAgICZuMSwgJm4yLCAmbjMsICZuNCwgJm41LCAmbjYsIGJ1ZmYpOwoJCQlpZiAoeCA8IDYpCgkJCSAgIHJldHVybiAxOwoKCQkJbGFkZHIgPSBodG9ubCgobjEgPDwgMjQpIHwgKG4yIDw8IDE2KSB8IChuMyA8PCA4KSB8IChuNCkpOwoJCQlscG9ydCA9IGh0b25zKChuNSA8PCA4KSB8IChuNikpOwoKCQkJaWYgKChzbyA9IHNvbGlzdGVuKDAsIGxhZGRyLCBscG9ydCwgU1NfRkFDQ0VQVE9OQ0UpKSA9PSBOVUxMKQoJCQkgICByZXR1cm4gMTsKCgkJCW42ID0gbnRvaHMoc28tPnNvX2Zwb3J0KTsKCgkJCW41ID0gKG42ID4+IDgpICYgMHhmZjsKCQkJbjYgJj0gMHhmZjsKCgkJCWxhZGRyID0gbnRvaGwoc28tPnNvX2ZhZGRyLnNfYWRkcik7CgoJCQluMSA9ICgobGFkZHIgPj4gMjQpICYgMHhmZik7CgkJCW4yID0gKChsYWRkciA+PiAxNikgJiAweGZmKTsKCQkJbjMgPSAoKGxhZGRyID4+IDgpICAmIDB4ZmYpOwoJCQluNCA9ICAobGFkZHIgJiAweGZmKTsKCgkJCW0tPm1fbGVuID0gYnB0ciAtIG0tPm1fZGF0YTsgLyogQWRqdXN0IGxlbmd0aCAqLwogICAgICAgICAgICAgICAgICAgICAgICBtLT5tX2xlbiArPSBzbnByaW50ZihicHRyLCBtLT5tX2hkci5taF9zaXplIC0gbS0+bV9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJPUlQgJWQsJWQsJWQsJWQsJWQsJWRcclxuJXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuMSwgbjIsIG4zLCBuNCwgbjUsIG42LCB4PT03P2J1ZmY6IiIpOwoJCQlyZXR1cm4gMTsKCQl9IGVsc2UgaWYgKChicHRyID0gKGNoYXIgKilzdHJzdHIobS0+bV9kYXRhLCAiMjcgRW50ZXJpbmciKSkgIT0gTlVMTCkgewoJCQkvKgoJCQkgKiBOZWVkIHRvIGVtdWxhdGUgdGhlIFBBU1YgcmVzcG9uc2UKCQkJICovCgkJCXggPSBzc2NhbmYoYnB0ciwgIjI3IEVudGVyaW5nIFBhc3NpdmUgTW9kZSAoJXUsJXUsJXUsJXUsJXUsJXUpXHJcbiUyNTZbXlwxNzddIiwKCQkJCSAgICZuMSwgJm4yLCAmbjMsICZuNCwgJm41LCAmbjYsIGJ1ZmYpOwoJCQlpZiAoeCA8IDYpCgkJCSAgIHJldHVybiAxOwoKCQkJbGFkZHIgPSBodG9ubCgobjEgPDwgMjQpIHwgKG4yIDw8IDE2KSB8IChuMyA8PCA4KSB8IChuNCkpOwoJCQlscG9ydCA9IGh0b25zKChuNSA8PCA4KSB8IChuNikpOwoKCQkJaWYgKChzbyA9IHNvbGlzdGVuKDAsIGxhZGRyLCBscG9ydCwgU1NfRkFDQ0VQVE9OQ0UpKSA9PSBOVUxMKQoJCQkgICByZXR1cm4gMTsKCgkJCW42ID0gbnRvaHMoc28tPnNvX2Zwb3J0KTsKCgkJCW41ID0gKG42ID4+IDgpICYgMHhmZjsKCQkJbjYgJj0gMHhmZjsKCgkJCWxhZGRyID0gbnRvaGwoc28tPnNvX2ZhZGRyLnNfYWRkcik7CgoJCQluMSA9ICgobGFkZHIgPj4gMjQpICYgMHhmZik7CgkJCW4yID0gKChsYWRkciA+PiAxNikgJiAweGZmKTsKCQkJbjMgPSAoKGxhZGRyID4+IDgpICAmIDB4ZmYpOwoJCQluNCA9ICAobGFkZHIgJiAweGZmKTsKCgkJCW0tPm1fbGVuID0gYnB0ciAtIG0tPm1fZGF0YTsgLyogQWRqdXN0IGxlbmd0aCAqLwoJCQltLT5tX2xlbiArPSBzbnByaW50ZihicHRyLCBtLT5tX2hkci5taF9zaXplIC0gbS0+bV9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIyNyBFbnRlcmluZyBQYXNzaXZlIE1vZGUgKCVkLCVkLCVkLCVkLCVkLCVkKVxyXG4lcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4xLCBuMiwgbjMsIG40LCBuNSwgbjYsIHg9PTc/YnVmZjoiIik7CgoJCQlyZXR1cm4gMTsKCQl9CgoJCXJldHVybiAxOwoKCSBjYXNlIEVNVV9LU0g6CgkJLyoKCQkgKiBUaGUga3NoZWxsIChLZXJiZXJvcyByc2gpIGFuZCBzaGVsbCBzZXJ2aWNlcyBib3RoIHBhc3MKCQkgKiBhIGxvY2FsIHBvcnQgcG9ydCBudW1iZXIgdG8gY2Fycnkgc2lnbmFscyB0byB0aGUgc2VydmVyCgkJICogYW5kIHN0ZGVyciB0byB0aGUgY2xpZW50LiAgSXQgaXMgcGFzc2VkIGF0IHRoZSBiZWdpbm5pbmcKCQkgKiBvZiB0aGUgY29ubmVjdGlvbiBhcyBhIE5VTC10ZXJtaW5hdGVkIGRlY2ltYWwgQVNDSUkgc3RyaW5nLgoJCSAqLwoJCXNvLT5zb19lbXUgPSAwOwoJCWZvciAobHBvcnQgPSAwLCBpID0gMDsgaSA8IG0tPm1fbGVuLTE7ICsraSkgewoJCQlpZiAobS0+bV9kYXRhW2ldIDwgJzAnIHx8IG0tPm1fZGF0YVtpXSA+ICc5JykKCQkJCXJldHVybiAxOyAgICAgICAvKiBpbnZhbGlkIG51bWJlciAqLwoJCQlscG9ydCAqPSAxMDsKCQkJbHBvcnQgKz0gbS0+bV9kYXRhW2ldIC0gJzAnOwoJCX0KCQlpZiAobS0+bV9kYXRhW20tPm1fbGVuLTFdID09ICdcMCcgJiYgbHBvcnQgIT0gMCAmJgoJCSAgICAoc28gPSBzb2xpc3RlbigwLCBzby0+c29fbGFkZHIuc19hZGRyLCBodG9ucyhscG9ydCksIFNTX0ZBQ0NFUFRPTkNFKSkgIT0gTlVMTCkKICAgICAgICAgICAgICAgICAgICBtLT5tX2xlbiA9IHNucHJpbnRmKG0tPm1fZGF0YSwgbS0+bV9oZHIubWhfc2l6ZSwgIiVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG50b2hzKHNvLT5zb19mcG9ydCkpICsgMTsKCQlyZXR1cm4gMTsKCgkgY2FzZSBFTVVfSVJDOgoJCS8qCgkJICogTmVlZCB0byBlbXVsYXRlIERDQyBDSEFULCBEQ0MgU0VORCBhbmQgRENDIE1PVkUKCQkgKi8KCQkqKG0tPm1fZGF0YSttLT5tX2xlbikgPSAwOyAvKiBOVUxMIHRlcm1pbmF0ZSB0aGUgc3RyaW5nIGZvciBzdHJzdHIgKi8KCQlpZiAoKGJwdHIgPSAoY2hhciAqKXN0cnN0cihtLT5tX2RhdGEsICJEQ0MiKSkgPT0gTlVMTCkKCQkJIHJldHVybiAxOwoKCQkvKiBUaGUgJTI1NnMgaXMgZm9yIHRoZSBicm9rZW4gbUlSQyAqLwoJCWlmIChzc2NhbmYoYnB0ciwgIkRDQyBDSEFUICUyNTZzICV1ICV1IiwgYnVmZiwgJmxhZGRyLCAmbHBvcnQpID09IDMpIHsKCQkJaWYgKChzbyA9IHNvbGlzdGVuKDAsIGh0b25sKGxhZGRyKSwgaHRvbnMobHBvcnQpLCBTU19GQUNDRVBUT05DRSkpID09IE5VTEwpCgkJCQlyZXR1cm4gMTsKCgkJCW0tPm1fbGVuID0gYnB0ciAtIG0tPm1fZGF0YTsgLyogQWRqdXN0IGxlbmd0aCAqLwogICAgICAgICAgICAgICAgICAgICAgICBtLT5tX2xlbiArPSBzbnByaW50ZihicHRyLCBtLT5tX2hkci5taF9zaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRENDIENIQVQgY2hhdCAlbHUgJXUlY1xuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpbnRvaGwoc28tPnNvX2ZhZGRyLnNfYWRkciksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG50b2hzKHNvLT5zb19mcG9ydCksIDEpOwoJCX0gZWxzZSBpZiAoc3NjYW5mKGJwdHIsICJEQ0MgU0VORCAlMjU2cyAldSAldSAldSIsIGJ1ZmYsICZsYWRkciwgJmxwb3J0LCAmbjEpID09IDQpIHsKCQkJaWYgKChzbyA9IHNvbGlzdGVuKDAsIGh0b25sKGxhZGRyKSwgaHRvbnMobHBvcnQpLCBTU19GQUNDRVBUT05DRSkpID09IE5VTEwpCgkJCQlyZXR1cm4gMTsKCgkJCW0tPm1fbGVuID0gYnB0ciAtIG0tPm1fZGF0YTsgLyogQWRqdXN0IGxlbmd0aCAqLwogICAgICAgICAgICAgICAgICAgICAgICBtLT5tX2xlbiArPSBzbnByaW50ZihicHRyLCBtLT5tX2hkci5taF9zaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRENDIFNFTkQgJXMgJWx1ICV1ICV1JWNcbiIsIGJ1ZmYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKW50b2hsKHNvLT5zb19mYWRkci5zX2FkZHIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudG9ocyhzby0+c29fZnBvcnQpLCBuMSwgMSk7CgkJfSBlbHNlIGlmIChzc2NhbmYoYnB0ciwgIkRDQyBNT1ZFICUyNTZzICV1ICV1ICV1IiwgYnVmZiwgJmxhZGRyLCAmbHBvcnQsICZuMSkgPT0gNCkgewoJCQlpZiAoKHNvID0gc29saXN0ZW4oMCwgaHRvbmwobGFkZHIpLCBodG9ucyhscG9ydCksIFNTX0ZBQ0NFUFRPTkNFKSkgPT0gTlVMTCkKCQkJCXJldHVybiAxOwoKCQkJbS0+bV9sZW4gPSBicHRyIC0gbS0+bV9kYXRhOyAvKiBBZGp1c3QgbGVuZ3RoICovCiAgICAgICAgICAgICAgICAgICAgICAgIG0tPm1fbGVuICs9IHNucHJpbnRmKGJwdHIsIG0tPm1faGRyLm1oX3NpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEQ0MgTU9WRSAlcyAlbHUgJXUgJXUlY1xuIiwgYnVmZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpbnRvaGwoc28tPnNvX2ZhZGRyLnNfYWRkciksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG50b2hzKHNvLT5zb19mcG9ydCksIG4xLCAxKTsKCQl9CgkJcmV0dXJuIDE7CgoJIGNhc2UgRU1VX1JFQUxBVURJTzoKICAgICAgICAgICAgICAgIC8qCgkJICogUmVhbEF1ZGlvIGVtdWxhdGlvbiAtIEpQLiBXZSBtdXN0IHRyeSB0byBwYXJzZSB0aGUgaW5jb21pbmcKCQkgKiBkYXRhIGFuZCB0cnkgdG8gZmluZCB0aGUgdHdvIGNoYXJhY3RlcnMgdGhhdCBjb250YWluIHRoZQoJCSAqIHBvcnQgbnVtYmVyLiBUaGVuIHdlIHJlZGlyZWN0IGFuIHVkcCBwb3J0IGFuZCByZXBsYWNlIHRoZQoJCSAqIG51bWJlciB3aXRoIHRoZSByZWFsIHBvcnQgd2UgZ290LgoJCSAqCgkJICogVGhlIDEuMCBiZXRhIHZlcnNpb25zIG9mIHRoZSBwbGF5ZXIgYXJlIG5vdCBzdXBwb3J0ZWQKCQkgKiBhbnkgbW9yZS4KCQkgKgoJCSAqIEEgdHlwaWNhbCBwYWNrZXQgZm9yIHBsYXllciB2ZXJzaW9uIDEuMCAocmVsZWFzZSB2ZXJzaW9uKToKCQkgKgoJCSAqIDAwMDA6NTAgNEUgNDEgMDAgMDUKCQkgKiAwMDAwOjAwIDAxIDAwIDAyIDFCIEQ3IDAwIDAwIDY3IEU2IDZDIERDIDYzIDAwIDEyIDUwIC4uLi4u1y4uZ+Zs3GMuLlAKCQkgKiAwMDEwOjRFIDQzIDRDIDQ5IDQ1IDRFIDU0IDIwIDMxIDMwIDMxIDIwIDQxIDRDIDUwIDQ4IE5DTElFTlQgMTAxIEFMUEgKCQkgKiAwMDIwOjQxIDZDIDAwIDAwIDUyIDAwIDE3IDcyIDYxIDY2IDY5IDZDIDY1IDczIDJGIDc2IEFsLi5SLi5yYWZpbGVzL3YKCQkgKiAwMDMwOjZGIDYxIDJGIDY1IDZFIDY3IDZDIDY5IDczIDY4IDVGIDJFIDcyIDYxIDc5IDQyIG9hL2VuZ2xpc2hfLnJheUIKCQkgKgoJCSAqIE5vdyB0aGUgcG9ydCBudW1iZXIgMHgxQkQ3IGlzIGZvdW5kIGF0IG9mZnNldCAweDA0IG9mIHRoZQoJCSAqIE5vdyB0aGUgcG9ydCBudW1iZXIgMHgxQkQ3IGlzIGZvdW5kIGF0IG9mZnNldCAweDA0IG9mIHRoZQoJCSAqIHNlY29uZCBwYWNrZXQuIFRoaXMgdGltZSB3ZSByZWNlaXZlZCBmaXZlIGJ5dGVzIGZpcnN0IGFuZAoJCSAqIHRoZW4gdGhlIHJlc3QuIFlvdSBuZXZlciBrbm93IGhvdyBtYW55IGJ5dGVzIHlvdSBnZXQuCgkJICoKCQkgKiBBIHR5cGljYWwgcGFja2V0IGZvciBwbGF5ZXIgdmVyc2lvbiAyLjAgKGJldGEpOgoJCSAqCgkJICogMDAwMDo1MCA0RSA0MSAwMCAwNiAwMCAwMiAwMCAwMCAwMCAwMSAwMCAwMiAxQiBDMSAwMCBQTkEuLi4uLi4uLi4uLsEuCgkJICogMDAxMDowMCA2NyA3NSA3OCBGNSA2MyAwMCAwQSA1NyA2OSA2RSAzMiAyRSAzMCAyRSAzMCAuZ3V49WMuLldpbjIuMC4wCgkJICogMDAyMDoyRSAzNSA2QyAwMCAwMCA1MiAwMCAxQyA3MiA2MSA2NiA2OSA2QyA2NSA3MyAyRiAuNWwuLlIuLnJhZmlsZXMvCgkJICogMDAzMDo3NyA2NSA2MiA3MyA2OSA3NCA2NSAyRiAzMiAzMCA3MiA2NSA2QyA2NSA2MSA3MyB3ZWJzaXRlLzIwcmVsZWFzCgkJICogMDA0MDo2NSAyRSA3MiA2MSA3OSA1MyAwMCAwMCAwNiAzNiA0MiAgICAgICAgICAgICAgICBlLnJheVMuLi42QgoJCSAqCgkJICogUG9ydCBudW1iZXIgMHgxQkMxIGlzIGZvdW5kIGF0IG9mZnNldCAweDBkLgoJCSAqCgkJICogVGhpcyBpcyBqdXN0IGEgaG9ycmlibGUgc3dpdGNoIHN0YXRlbWVudC4gVmFyaWFibGUgcmEgdGVsbHMKCQkgKiB1cyB3aGVyZSB3ZSdyZSBnb2luZy4KCQkgKi8KCgkJYnB0ciA9IG0tPm1fZGF0YTsKCQl3aGlsZSAoYnB0ciA8IG0tPm1fZGF0YSArIG0tPm1fbGVuKSB7CgkJCXVfc2hvcnQgcDsKCQkJc3RhdGljIGludCByYSA9IDA7CgkJCWNoYXIgcmFfdGJsWzRdOwoKCQkJcmFfdGJsWzBdID0gMHg1MDsKCQkJcmFfdGJsWzFdID0gMHg0ZTsKCQkJcmFfdGJsWzJdID0gMHg0MTsKCQkJcmFfdGJsWzNdID0gMDsKCgkJCXN3aXRjaCAocmEpIHsKCQkJIGNhc2UgMDoKCQkJIGNhc2UgMjoKCQkJIGNhc2UgMzoKCQkJCWlmICgqYnB0cisrICE9IHJhX3RibFtyYV0pIHsKCQkJCQlyYSA9IDA7CgkJCQkJY29udGludWU7CgkJCQl9CgkJCQlicmVhazsKCgkJCSBjYXNlIDE6CgkJCQkvKgoJCQkJICogV2UgbWF5IGdldCAweDUwIHNldmVyYWwgdGltZXMsIGlnbm9yZSB0aGVtCgkJCQkgKi8KCQkJCWlmICgqYnB0ciA9PSAweDUwKSB7CgkJCQkJcmEgPSAxOwoJCQkJCWJwdHIrKzsKCQkJCQljb250aW51ZTsKCQkJCX0gZWxzZSBpZiAoKmJwdHIrKyAhPSByYV90YmxbcmFdKSB7CgkJCQkJcmEgPSAwOwoJCQkJCWNvbnRpbnVlOwoJCQkJfQoJCQkJYnJlYWs7CgoJCQkgY2FzZSA0OgoJCQkJLyoKCQkJCSAqIHNraXAgdmVyc2lvbiBudW1iZXIKCQkJCSAqLwoJCQkJYnB0cisrOwoJCQkJYnJlYWs7CgoJCQkgY2FzZSA1OgoJCQkJLyoKCQkJCSAqIFRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdmVyc2lvbnMgMS4wIGFuZAoJCQkJICogMi4wIGlzIGhlcmUuIEZvciBmdXR1cmUgdmVyc2lvbnMgb2YKCQkJCSAqIHRoZSBwbGF5ZXIgdGhpcyBtYXkgbmVlZCB0byBiZSBtb2RpZmllZC4KCQkJCSAqLwoJCQkJaWYgKCooYnB0ciArIDEpID09IDB4MDIpCgkJCQkgICBicHRyICs9IDg7CgkJCQllbHNlCgkJCQkgICBicHRyICs9IDQ7CgkJCQlicmVhazsKCgkJCSBjYXNlIDY6CgkJCQkvKiBUaGlzIGlzIHRoZSBmaWVsZCBjb250YWluaW5nIHRoZSBwb3J0CgkJCQkgKiBudW1iZXIgdGhhdCBSQS1wbGF5ZXIgaXMgbGlzdGVuaW5nIHRvLgoJCQkJICovCgkJCQlscG9ydCA9ICgoKHVfY2hhciopYnB0cilbMF0gPDwgOCkKCQkJCSsgKCh1X2NoYXIgKilicHRyKVsxXTsKCQkJCWlmIChscG9ydCA8IDY5NzApCgkJCQkgICBscG9ydCArPSAyNTY7ICAgLyogZG9uJ3Qga25vdyB3aHkgKi8KCQkJCWlmIChscG9ydCA8IDY5NzAgfHwgbHBvcnQgPiA3MTcwKQoJCQkJICAgcmV0dXJuIDE7ICAgICAgIC8qIGZhaWxlZCAqLwoKCQkJCS8qIHRyeSB0byBnZXQgdWRwIHBvcnQgYmV0d2VlbiA2OTcwIC0gNzE3MCAqLwoJCQkJZm9yIChwID0gNjk3MDsgcCA8IDcwNzE7IHArKykgewoJCQkJCWlmICh1ZHBfbGlzdGVuKCBodG9ucyhwKSwKCQkJCQkJICAgICAgIHNvLT5zb19sYWRkci5zX2FkZHIsCgkJCQkJCSAgICAgICBodG9ucyhscG9ydCksCgkJCQkJCSAgICAgICBTU19GQUNDRVBUT05DRSkpIHsKCQkJCQkJYnJlYWs7CgkJCQkJfQoJCQkJfQoJCQkJaWYgKHAgPT0gNzA3MSkKCQkJCSAgIHAgPSAwOwoJCQkJKih1X2NoYXIgKilicHRyKysgPSAocCA+PiA4KSAmIDB4ZmY7CgkJCQkqKHVfY2hhciAqKWJwdHIrKyA9IHAgJiAweGZmOwoJCQkJcmEgPSAwOwoJCQkJcmV0dXJuIDE7ICAgLyogcG9ydCByZWRpcmVjdGVkLCB3ZSdyZSBkb25lICovCgkJCQlicmVhazsKCgkJCSBkZWZhdWx0OgoJCQkJcmEgPSAwOwoJCQl9CgkJCXJhKys7CgkJfQoJCXJldHVybiAxOwoKCSBkZWZhdWx0OgoJCS8qIE9vb3BzLCBub3QgZW11bGF0ZWQsIHdvbid0IGNhbGwgdGNwX2VtdSBhZ2FpbiAqLwoJCXNvLT5zb19lbXUgPSAwOwoJCXJldHVybiAxOwoJfQp9CgovKgogKiBEbyBtaXNjLiBjb25maWcgb2YgU0xpUlAgd2hpbGUgaXRzIHJ1bm5pbmcuCiAqIFJldHVybiAwIGlmIHRoaXMgY29ubmVjdGlvbnMgaXMgdG8gYmUgY2xvc2VkLCAxIG90aGVyd2lzZSwKICogcmV0dXJuIDIgaWYgdGhpcyBpcyBhIGNvbW1hbmQtbGluZSBjb25uZWN0aW9uCiAqLwppbnQKdGNwX2N0bChzdHJ1Y3Qgc29ja2V0ICpzbykKewoJc3RydWN0IHNidWYgKnNiID0gJnNvLT5zb19zbmQ7CglpbnQgY29tbWFuZDsKIAlzdHJ1Y3QgZXhfbGlzdCAqZXhfcHRyOwoJaW50IGRvX3B0eTsKICAgICAgICAvLwlzdHJ1Y3Qgc29ja2V0ICp0bXBzbzsKCglERUJVR19DQUxMKCJ0Y3BfY3RsIik7CglERUJVR19BUkcoInNvID0gJWx4IiwgKGxvbmcgKXNvKTsKCiNpZiAwCgkvKgoJICogQ2hlY2sgaWYgdGhleSdyZSBhdXRob3Jpc2VkCgkgKi8KCWlmIChjdGxfYWRkci5zX2FkZHIgJiYgKGN0bF9hZGRyLnNfYWRkciA9PSAtMSB8fCAoc28tPnNvX2xhZGRyLnNfYWRkciAhPSBjdGxfYWRkci5zX2FkZHIpKSkgewoJCXNiLT5zYl9jYyA9IHNwcmludGYoc2ItPnNiX3dwdHIsIkVycm9yOiBQZXJtaXNzaW9uIGRlbmllZC5cclxuIik7CgkJc2ItPnNiX3dwdHIgKz0gc2ItPnNiX2NjOwoJCXJldHVybiAwOwoJfQojZW5kaWYKCWNvbW1hbmQgPSAobnRvaGwoc28tPnNvX2ZhZGRyLnNfYWRkcikgJiAweGZmKTsKCglzd2l0Y2goY29tbWFuZCkgewoJZGVmYXVsdDogLyogQ2hlY2sgZm9yIGV4ZWMncyAqLwoKCQkvKgoJCSAqIENoZWNrIGlmIGl0J3MgcHR5X2V4ZWMKCQkgKi8KCQlmb3IgKGV4X3B0ciA9IGV4ZWNfbGlzdDsgZXhfcHRyOyBleF9wdHIgPSBleF9wdHItPmV4X25leHQpIHsKCQkJaWYgKGV4X3B0ci0+ZXhfZnBvcnQgPT0gc28tPnNvX2Zwb3J0ICYmCgkJCSAgICBjb21tYW5kID09IGV4X3B0ci0+ZXhfYWRkcikgewoJCQkJaWYgKGV4X3B0ci0+ZXhfcHR5ID09IDMpIHsKCQkJCQlzby0+cyA9IC0xOwoJCQkJCXNvLT5leHRyYSA9ICh2b2lkICopZXhfcHRyLT5leF9leGVjOwoJCQkJCXJldHVybiAxOwoJCQkJfQoJCQkJZG9fcHR5ID0gZXhfcHRyLT5leF9wdHk7CgkJCQlnb3RvIGRvX2V4ZWM7CgkJCX0KCQl9CgoJCS8qCgkJICogTm90aGluZyBib3VuZC4uCgkJICovCgkJLyogdGNwX2Zjb25uZWN0KHNvKTsgKi8KCgkJLyogRkFMTFRIUk9VR0ggKi8KCWNhc2UgQ1RMX0FMSUFTOgogICAgICAgICAgc2ItPnNiX2NjID0gc25wcmludGYoc2ItPnNiX3dwdHIsIHNiLT5zYl9kYXRhbGVuIC0gKHNiLT5zYl93cHRyIC0gc2ItPnNiX2RhdGEpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVycm9yOiBObyBhcHBsaWNhdGlvbiBjb25maWd1cmVkLlxyXG4iKTsKCSAgc2ItPnNiX3dwdHIgKz0gc2ItPnNiX2NjOwoJICByZXR1cm4oMCk7CgoJZG9fZXhlYzoKCQlERUJVR19NSVNDKChkZmQsICIgZXhlY3V0aW5nICVzIFxuIixleF9wdHItPmV4X2V4ZWMpKTsKCQlyZXR1cm4oZm9ya19leGVjKHNvLCBleF9wdHItPmV4X2V4ZWMsIGRvX3B0eSkpOwoKI2lmIDAKCWNhc2UgQ1RMX0NNRDoKCSAgIGZvciAodG1wc28gPSB0Y2Iuc29fbmV4dDsgdG1wc28gIT0gJnRjYjsgdG1wc28gPSB0bXBzby0+c29fbmV4dCkgewoJICAgICBpZiAodG1wc28tPnNvX2VtdSA9PSBFTVVfQ1RMICYmCgkJICEodG1wc28tPnNvX3RjcGNiPwoJCSAgICh0bXBzby0+c29fdGNwY2ItPnRfc3RhdGUgJiAoVENQU19USU1FX1dBSVR8VENQU19MQVNUX0FDSykpCgkJICAgOjApKSB7CgkgICAgICAgLyogT29vcHMsIGNvbnRyb2wgY29ubmVjdGlvbiBhbHJlYWR5IGFjdGl2ZSAqLwoJICAgICAgIHNiLT5zYl9jYyA9IHNwcmludGYoc2ItPnNiX3dwdHIsIlNvcnJ5LCBhbHJlYWR5IGNvbm5lY3RlZC5cclxuIik7CgkgICAgICAgc2ItPnNiX3dwdHIgKz0gc2ItPnNiX2NjOwoJICAgICAgIHJldHVybiAwOwoJICAgICB9CgkgICB9CgkgICBzby0+c29fZW11ID0gRU1VX0NUTDsKCSAgIGN0bF9wYXNzd29yZF9vayA9IDA7CgkgICBzYi0+c2JfY2MgPSBzcHJpbnRmKHNiLT5zYl93cHRyLCAiU2xpcnAgY29tbWFuZC1saW5lIHJlYWR5ICh0eXBlIFwiaGVscFwiIGZvciBoZWxwKS5cclxuU2xpcnA+ICIpOwoJICAgc2ItPnNiX3dwdHIgKz0gc2ItPnNiX2NjOwoJICAgZG9fZWNobz0tMTsKCSAgIHJldHVybigyKTsKI2VuZGlmCgl9Cn0K