LyoKICogQUlYNC81IGNwdSBzdGF0aXN0aWNzIG1vZHVsZSBmb3IgbmV0LXNubXAKICoKICogVmVyc2lvbiAwLjEgLSBJbml0aWFsIHJlbGVhc2UgLSAwNS9KdW4vMjAwMwogKgogKiBEZXJpdmVkIGZyb20gdm1zdGF0X3NvbGFyaXMyLmMKICogVXNpbmcgbGlicGVyZnN0YXQgZm9yIHN0YXRpc3RpY3MgKFJlZGJvb2sgU0cyNC02MDM5KQogKgogKiBQb3J0ZWQgdG8gQUlYIGJ5IE1pY2hhZWwgS3VrYXQgPG1pY2hhZWwua3VrYXRAdG8uY29tPgogKiBUaGlua2luZyBPYmplY3RzIFNvZnR3YXJlIEdtYkgKICogTGlsaWVudGhhbHN0cmHfZSAyCiAqIDcwODI1IFN0dXR0Z2FydC1Lb3JudGFsCiAqIGh0dHA6Ly93d3cudG8uY29tLwogKgogKiBUaGFua3MgZ28gdG8gSm9jaGVuIEttaWV0c2NoIGZvciB0aGUgc29sYXJpczIgc3VwcG9ydCBhbmQKICogdG8gRGFpbWxlckNocnlzbGVyIEFHIFN0dXR0Z2FydCBmb3IgbWFraW5nIHRoaXMgcG9ydCBwb3NzaWJsZQogKi8KCi8qCiAqIFRvIG1ha2UgbGludCBza2lwIHRoZSBkZWJ1ZyBjb2RlIGFuZCBzdG9wIGNvbXBsYWluaW5nIAogKi8KI2lmZGVmIF9fbGludAojZGVmaW5lIE5FVFNOTVBfTk9fREVCVUdHSU5HIDEKI2VuZGlmCgovKgogKiBJbmNsdWRlcyBzdGFydCBoZXJlIAogKi8KCi8qCiAqIFN0YW5kYXJkIGluY2x1ZGVzIAogKi8KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8dW5pc3RkLmg+CiNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KI2luY2x1ZGUgPHN5cy90aW1lLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KCi8qCiAqIGxpYnBlcmZzdGF0IHN0cnVjdHMgCiAqLwojaW5jbHVkZSA8bGlicGVyZnN0YXQuaD4KCiNpbmNsdWRlIDxuZXQtc25tcC9uZXQtc25tcC1jb25maWcuaD4KI2luY2x1ZGUgPG5ldC1zbm1wL25ldC1zbm1wLWluY2x1ZGVzLmg+CiNpbmNsdWRlIDxuZXQtc25tcC9hZ2VudC9uZXQtc25tcC1hZ2VudC1pbmNsdWRlcy5oPgoKI2luY2x1ZGUgIm1pYmRlZnMuaCIKI2luY2x1ZGUgInV0aWxfZnVuY3MvaGVhZGVyX2dlbmVyaWMuaCIKCi8qCiAqIEhlYWRlciBmaWxlIGZvciB0aGlzIG1vZHVsZSAKICovCiNpbmNsdWRlICJ2bXN0YXQuaCIKI2luY2x1ZGUgInZtc3RhdF9haXg0LmgiCgovKgogKiBJbmNsdWRlcyBlbmQgaGVyZSAKICovCgoKLyoKICogR2xvYmFsIHN0cnVjdHVyZXMgc3RhcnQgaGVyZSAKICovCgovKgogKiBBIHN0cnVjdHVyZSB0byBzYXZlIGRhdGEgZ2F0aGVyZWQgZnJvbSB0aGUgbGlicGVyZnN0YXQuCiAqLwpzdHJ1Y3QgY3B1X3N0YXRfc25hcHNob3QgewoJdW5zaWduZWQgbG9uZyBsb25nIGNzc190aW1lOwoJdW5zaWduZWQgaW50CSAgIGNzc19jcHVzOwoJdW5zaWduZWQgbG9uZyBsb25nIGNzc19zd2FwaW47Cgl1bnNpZ25lZCBsb25nIGxvbmcgY3NzX3N3YXBvdXQ7Cgl1bnNpZ25lZCBsb25nIGxvbmcgY3NzX2Jsb2Nrc19yZWFkOwoJdW5zaWduZWQgbG9uZyBsb25nIGNzc19ibG9ja3Nfd3JpdGU7Cgl1bnNpZ25lZCBsb25nIGxvbmcgY3NzX2ludGVycnVwdHM7Cgl1bnNpZ25lZCBsb25nIGxvbmcgY3NzX2NvbnRleHRfc3c7Cgl1bnNpZ25lZCBsb25nIGxvbmcgY3NzX2NwdVtDUFVfU1RBVEVTXTsKfTsKCi8qCiAqIEdsb2JhbCBzdHJ1Y3R1cmVzIGVuZCBoZXJlIAogKi8KCgovKgogKiBHbG9iYWwgdmFyaWFibGVzIHN0YXJ0IGhlcmUgCiAqLwoKLyoKICogVmFyaWFibGVzIGZvciB0aGUgY2FsY3VsYXRlZCB2YWx1ZXMsIGZpbGxlZCBpbiB1cGRhdGVfc3RhdHMJCiAqIE5lZWQgdG8gYmUgZ2xvYmFsIHNpbmNlIHdlIG5lZWQgdGhlbSBpbiBtb3JlIHRoYW4gb25lIGZ1bmN0aW9uIAogKi8Kc3RhdGljIHVsb25nCXN3YXBpbjsKc3RhdGljIHVsb25nCXN3YXBvdXQ7CnN0YXRpYyB1bG9uZwlibG9ja3NfcmVhZDsKc3RhdGljIHVsb25nCWJsb2Nrc193cml0ZTsKc3RhdGljIHVsb25nCWludGVycnVwdHM7CnN0YXRpYyB1bG9uZwljb250ZXh0X3N3OwoKLyoKICogU2luY2UgTUlCIHdhbnRzIENQVV9TWVNURU0sIHdoaWNoIGlzIENQVV9LRVJORUwgKyBDUFVfV0FJVCAKICovCnN0YXRpYyBsb25nCSBjcHVfcGVyY1tDUFVfU1RBVEVTXTsKCi8qCiAqIEhvdyBtYW55IHNuYXBzaG90cyB3ZSBoYXZlIGFscmVhZHkgdGFrZW4sIG5lZWRlZCBmb3IgdGhlIGZpcnN0IAogKiBQT0xMX0lOVEVSVkFMICogUE9MTF9WQUxVRVMgc2Vjb25kcyBvZiBhZ2VudCBydW5uaW5nIAogKi8Kc3RhdGljIHVuc2lnbmVkIGludCBudW1iZXJfb2Zfc25hcHNob3RzOwoKLyoKICogVGhlIHBsYWNlIHRvIHN0b3JlIHRoZSBzbmFwc2hvdHMgb2Ygc3lzdGVtIGRhdGEgaW4gCiAqLwpzdGF0aWMgc3RydWN0IGNwdV9zdGF0X3NuYXBzaG90IHNuYXBzaG90W1BPTExfVkFMVUVTICsgMV07CgovKgogKiBBbmQgb25lIGZvciB0aGUgcmF3IGNvdW50ZXJzLCB3aGljaCB3ZSBmaWxsIHdoZW4gdGhlIHJhdyB2YWx1ZXMgYXJlIAogKiByZXF1ZXN0ZWQsIGFzIG9wcG9zZWQgdG8gdGhlIGFic29sdXRlIHZhbHVlcywgd2hpY2ggYXJlIHRha2VuIGV2ZXJ5IAogKiBQT0xMX0lOVEVSVkFMIHNlY29uZHMgYW5kIGNhbGN1bGF0ZWQgb3ZlciBQT0xMX0lOVEVSVkFMICogUE9MTF9WQUxVRVMgdGltZSAKICovCnN0YXRpYyBzdHJ1Y3QgY3B1X3N0YXRfc25hcHNob3QgcmF3X3ZhbHVlczsKCi8qCiAqIEdsb2JhbCB2YXJpYWJsZXMgZW5kIGhlcmUgCiAqLwoKCi8qCiAqIEZ1bmN0aW9ucyBzdGFydCBoZXJlIAogKi8KCi8qCiAqIEZ1bmN0aW9uIHByb3RvdHlwZSAKICovCnN0YXRpYyB2b2lkCXVwZGF0ZV9zdGF0cyh1bnNpZ25lZCBpbnQgcmVnaXN0cmF0aW9uTnVtYmVyLCB2b2lkICpjbGllbnRhcmcpOwpzdGF0aWMgaW50CXRha2Vfc25hcHNob3Qoc3RydWN0IGNwdV9zdGF0X3NuYXBzaG90ICpjc3MpOwoKLyoKICogaW5pdF92bXN0YXRfYWl4NCBzdGFydHMgaGVyZSAKICogSW5pdCBmdW5jdGlvbiBmb3IgdGhpcyBtb2R1bGUsIGZyb20gcHJvdG90eXBlIAogKiBEZWZpbmVzIHZhcmlhYmxlcyBoYW5kbGVkIGJ5IHRoaXMgbW9kdWxlLCBkZWZpbmVzIHJvb3QgT0lEIGZvciAKICogdGhpcyBtb2R1bGUgYW5kIHJlZ2lzdGVycyBpdCB3aXRoIHRoZSBhZ2VudCAKICovCgpGaW5kVmFyTWV0aG9kIHZhcl9leHRlbnNpYmxlX3Ztc3RhdDsKCnZvaWQKaW5pdF92bXN0YXRfYWl4NCh2b2lkKQp7CgoJLyoKCSAqIFdoaWNoIHZhcmlhYmxlcyBkbyB3ZSBzZXJ2aWNlID8gCgkgKi8KCXN0cnVjdCB2YXJpYWJsZTIgZXh0ZW5zaWJsZV92bXN0YXRfdmFyaWFibGVzW10gPSB7CgkJe01JQklOREVYLCBBU05fSU5URUdFUiwgTkVUU05NUF9PTERBUElfUk9OTFksCiAgICAgICAgICAgICAgICAgdmFyX2V4dGVuc2libGVfdm1zdGF0LCAxLCB7TUlCSU5ERVh9fSwKCQl7RVJST1JOQU1FLCBBU05fT0NURVRfU1RSLCBORVRTTk1QX09MREFQSV9ST05MWSwKICAgICAgICAgICAgICAgICB2YXJfZXh0ZW5zaWJsZV92bXN0YXQsIDEsIHtFUlJPUk5BTUV9fSwKCQl7U1dBUElOLCBBU05fSU5URUdFUiwgTkVUU05NUF9PTERBUElfUk9OTFksCiAgICAgICAgICAgICAgICAgdmFyX2V4dGVuc2libGVfdm1zdGF0LCAxLCB7U1dBUElOfX0sCgkJe1NXQVBPVVQsIEFTTl9JTlRFR0VSLCBORVRTTk1QX09MREFQSV9ST05MWSwKICAgICAgICAgICAgICAgICB2YXJfZXh0ZW5zaWJsZV92bXN0YXQsIDEsIHtTV0FQT1VUfX0sCgkJe0lPU0VOVCwgQVNOX0lOVEVHRVIsIE5FVFNOTVBfT0xEQVBJX1JPTkxZLAogICAgICAgICAgICAgICAgIHZhcl9leHRlbnNpYmxlX3Ztc3RhdCwgMSwge0lPU0VOVH19LAoJCXtJT1JFQ0VJVkUsIEFTTl9JTlRFR0VSLCBORVRTTk1QX09MREFQSV9ST05MWSwKICAgICAgICAgICAgICAgICB2YXJfZXh0ZW5zaWJsZV92bXN0YXQsIDEsIHtJT1JFQ0VJVkV9fSwKCQl7U1lTSU5URVJSVVBUUywgQVNOX0lOVEVHRVIsIE5FVFNOTVBfT0xEQVBJX1JPTkxZLAogICAgICAgICAgICAgICAgIHZhcl9leHRlbnNpYmxlX3Ztc3RhdCwgMSwge1NZU0lOVEVSUlVQVFN9fSwKCQl7U1lTQ09OVEVYVCwgQVNOX0lOVEVHRVIsIE5FVFNOTVBfT0xEQVBJX1JPTkxZLAogICAgICAgICAgICAgICAgIHZhcl9leHRlbnNpYmxlX3Ztc3RhdCwgMSwge1NZU0NPTlRFWFR9fSwKCQl7Q1BVVVNFUiwgQVNOX0lOVEVHRVIsIE5FVFNOTVBfT0xEQVBJX1JPTkxZLAogICAgICAgICAgICAgICAgIHZhcl9leHRlbnNpYmxlX3Ztc3RhdCwgMSwge0NQVVVTRVJ9fSwKCQl7Q1BVU1lTVEVNLCBBU05fSU5URUdFUiwgTkVUU05NUF9PTERBUElfUk9OTFksCiAgICAgICAgICAgICAgICAgdmFyX2V4dGVuc2libGVfdm1zdGF0LCAxLCB7Q1BVU1lTVEVNfX0sCgkJe0NQVUlETEUsIEFTTl9JTlRFR0VSLCBORVRTTk1QX09MREFQSV9ST05MWSwKICAgICAgICAgICAgICAgICB2YXJfZXh0ZW5zaWJsZV92bXN0YXQsIDEsIHtDUFVJRExFfX0sCgkJe0NQVVJBV1VTRVIsIEFTTl9DT1VOVEVSLCBORVRTTk1QX09MREFQSV9ST05MWSwKICAgICAgICAgICAgICAgICB2YXJfZXh0ZW5zaWJsZV92bXN0YXQsIDEsIHtDUFVSQVdVU0VSfX0sCgkJe0NQVVJBV1NZU1RFTSwgQVNOX0NPVU5URVIsIE5FVFNOTVBfT0xEQVBJX1JPTkxZLAogICAgICAgICAgICAgICAgIHZhcl9leHRlbnNpYmxlX3Ztc3RhdCwgMSwge0NQVVJBV1NZU1RFTX19LAoJCXtDUFVSQVdJRExFLCBBU05fQ09VTlRFUiwgTkVUU05NUF9PTERBUElfUk9OTFksCiAgICAgICAgICAgICAgICAgdmFyX2V4dGVuc2libGVfdm1zdGF0LCAxLCB7Q1BVUkFXSURMRX19LAoJCXtDUFVSQVdXQUlULCBBU05fQ09VTlRFUiwgTkVUU05NUF9PTERBUElfUk9OTFksCiAgICAgICAgICAgICAgICAgdmFyX2V4dGVuc2libGVfdm1zdGF0LCAxLCB7Q1BVUkFXV0FJVH19LAoJCXtDUFVSQVdLRVJORUwsIEFTTl9DT1VOVEVSLCBORVRTTk1QX09MREFQSV9ST05MWSwKICAgICAgICAgICAgICAgICB2YXJfZXh0ZW5zaWJsZV92bXN0YXQsIDEsIHtDUFVSQVdLRVJORUx9fSwKCQl7SU9SQVdTRU5ULCBBU05fQ09VTlRFUiwgTkVUU05NUF9PTERBUElfUk9OTFksCiAgICAgICAgICAgICAgICAgdmFyX2V4dGVuc2libGVfdm1zdGF0LCAxLCB7SU9SQVdTRU5UfX0sCgkJe0lPUkFXUkVDRUlWRSwgQVNOX0NPVU5URVIsIE5FVFNOTVBfT0xEQVBJX1JPTkxZLAogICAgICAgICAgICAgICAgIHZhcl9leHRlbnNpYmxlX3Ztc3RhdCwgMSwge0lPUkFXUkVDRUlWRX19LAoJCXtTWVNSQVdJTlRFUlJVUFRTLCBBU05fQ09VTlRFUiwgTkVUU05NUF9PTERBUElfUk9OTFksCiAgICAgICAgICAgICAgICAgdmFyX2V4dGVuc2libGVfdm1zdGF0LCAxLCB7U1lTUkFXSU5URVJSVVBUU319LAoJCXtTWVNSQVdDT05URVhULCBBU05fQ09VTlRFUiwgTkVUU05NUF9PTERBUElfUk9OTFksCiAgICAgICAgICAgICAgICAgdmFyX2V4dGVuc2libGVfdm1zdGF0LCAxLCB7U1lTUkFXQ09OVEVYVH19LAoJCS8qCgkJICogRnV0dXJlIHVzZTogCgkJICoge0VSUk9SRkxBRywgQVNOX0lOVEVHRVIsIE5FVFNOTVBfT0xEQVBJX1JPTkxZLAogICAgICAgICAgICAgICAgICogIHZhcl9leHRlbnNpYmxlX3Ztc3RhdCwgMSwge0VSUk9SRkxBRyB9fSwKCQkgKiB7RVJST1JNU0csIEFTTl9PQ1RFVF9TVFIsIE5FVFNOTVBfT0xEQVBJX1JPTkxZLAogICAgICAgICAgICAgICAgICogIHZhcl9leHRlbnNpYmxlX3Ztc3RhdCwgMSwge0VSUk9STVNHIH19CgkJICovCgl9OwoKCS8qCgkgKiBEZWZpbmUgdGhlIE9JRCBwb2ludGVyIHRvIHRoZSB0b3Agb2YgdGhlIG1pYiB0cmVlIHRoYXQgd2UncmUgCgkgKiByZWdpc3RlcmluZyB1bmRlcm5lYXRoIAoJICovCglvaWQJCQkgdm1zdGF0X3ZhcmlhYmxlc19vaWRbXSA9IHsgTkVUU05NUF9VQ0RBVklTX01JQiwgMTEgfTsKCgkvKgoJICogcmVnaXN0ZXIgb3Vyc2VsdmVzIHdpdGggdGhlIGFnZW50IHRvIGhhbmRsZSBvdXIgbWliIHRyZWUgCgkgKiBMSU5URUQgVHJ1c3QgbWUsIEkga25vdyB3aGF0IEknbSBkb2luZyAKCSAqLwoJUkVHSVNURVJfTUlCKCJ1Y2Qtc25tcC92bXN0YXQiLCBleHRlbnNpYmxlX3Ztc3RhdF92YXJpYWJsZXMsIHZhcmlhYmxlMiwKCQkJCSB2bXN0YXRfdmFyaWFibGVzX29pZCk7CgoJLyoKCSAqIFN0YXJ0IHdpdGggc29tZSB1c2VmdWwgZGF0YSAKCSAqLwoJdXBkYXRlX3N0YXRzKDAsIE5VTEwpOwoKCS8qCgkgKiB1cGRhdGVfc3RhdHMgaXMgcnVuIGV2ZXJ5IFBPTExfSU5URVJWQUwgc2Vjb25kcyB1c2luZyB0aGlzIHJvdXRpbmUgCgkgKiAoc2VlICdtYW4gc25tcF9hbGFybScpIAoJICogVGhpcyBpcyBvbmx5IGV4ZWN1dGVkIG9uY2UgdG8gZ2V0IHNvbWUgdXNlZnVsIGRhdGEgaW4gdGhlIGJlZ2lubmluZyAKCSAqLwoJaWYgKHNubXBfYWxhcm1fcmVnaXN0ZXIoNSwgTlVMTCwgdXBkYXRlX3N0YXRzLCBOVUxMKSA9PSAwKSB7CgkJc25tcF9sb2coTE9HX1dBUk5JTkcsCgkJCQkgInZtc3RhdF9haXg0IChpbml0KTogc25tcF9hbGFybV9yZWdpc3RlciBmYWlsZWQuXG4iKTsKCX0KCS8qCgkgKiBUaGlzIGlzIHRoZSBvbmUgdGhhdCBydW5zIHVwZGF0ZV9zdGF0cyBldmVyeSBQT0xMX0lOVEVSVkFMIHNlY29uZHMgCgkgKi8KCWlmIChzbm1wX2FsYXJtX3JlZ2lzdGVyKFBPTExfSU5URVJWQUwsIFNBX1JFUEVBVCwgdXBkYXRlX3N0YXRzLCBOVUxMKQoJCT09IDApIHsKCQlzbm1wX2xvZyhMT0dfRVJSLAoJCQkJICJ2bXN0YXRfYWl4NCAoaW5pdCk6IHNubXBfYWxhcm1fcmVnaXN0ZXIgZmFpbGVkLCBjYW5ub3Qgc2VydmljZSByZXF1ZXN0cy5cbiIpOwoJfQoKfQkvKiBpbml0X3Ztc3RhdF9haXg0IGVuZHMgaGVyZSAqLwoKLyoKICogRGF0YSBjb2xsZWN0aW9uIGZ1bmN0aW9uIHRha2Vfc25hcHNob3Qgc3RhcnRzIGhlcmUgCiAqIEdldCBkYXRhIGZyb20ga2VybmVsIGFuZCBzYXZlIGludG8gdGhlIHNuYXBzaG90IHN0cnV0Y3MgCiAqIEFyZ3VtZW50IGlzIHRoZSBzbmFwc2hvdCBzdHJ1Y3QgdG8gc2F2ZSB0by4gR2xvYmFsIGFueXdheSwgYnV0IGxvb2tzIG5pY2VyIAogKi8Kc3RhdGljIGludAp0YWtlX3NuYXBzaG90KHN0cnVjdCBjcHVfc3RhdF9zbmFwc2hvdCAqY3NzKQp7CgkvKgoJICogVmFyaWFibGVzIHN0YXJ0IGhlcmUgCgkgKi8KCgkvKgoJICogSGlnaCByZXNvbHV0aW9uIHRpbWUgY291bnRlciAKCSAqLwoJc3RydWN0IHRpbWV2YWwJCXRwOwoJdW5zaWduZWQgbG9uZyBsb25nCWN1cnJlbnRfdGltZTsKCgkvKgoJICogc2VlIGxpYnBlcmZzdGF0LmgsIGhvbGRzIENQVS9tZW1vcnkgZGF0YSAKCSAqLwoJcGVyZnN0YXRfY3B1X3RvdGFsX3QJY3M7CglwZXJmc3RhdF9tZW1vcnlfdG90YWxfdAltczsKCgkvKgoJICogVGhlIHVzdWFsIHN0dWZmIHRvIGNvdW50IG9uLCBlcnIsIGJ5IAoJICovCglpbnQJCQlpOwoKCS8qCgkgKiBWYXJpYWJsZXMgZW5kIGhlcmUgCgkgKi8KCgkvKgoJICogRnVuY3Rpb24gc3RhcnRzIGhlcmUgCgkgKi8KCgkvKgoJICogR2V0IHRpbWUgCgkgKi8KCWdldHRpbWVvZmRheSgmdHAsIChzdHJ1Y3QgdGltZXpvbmUgKilOVUxMKTsKCWN1cnJlbnRfdGltZSA9IHRwLnR2X3NlYyAqICh1bnNpZ25lZCBsb25nIGxvbmcpMTAwMDAwMCArIHRwLnR2X3VzZWM7CgoJLyoKCSAqIElmIHdlIGhhdmUganVzdCBnb3R0ZW4gdGhlIGRhdGEsIHJldHVybiB0aGUgdmFsdWVzIGZyb20gbGFzdCBydW4gKHNraXAgaWYtY2xhdXNlKSAKCSAqIFRoaXMgaGFwcGVucyBvbiBhIHNubXB3YWxrIHJlcXVlc3QuICBObyBuZWVkIHRvIHJlYWQgdGhlIHBlcmZzdGF0IGFnYWluIAoJICogaWYgd2UganVzdCBkaWQgaXQgbGVzcyB0aGFuIDIgc2Vjb25kcyBhZ28gCgkgKiBKdW1wcyBpbnRvIGlmLWNsYXVzZSBlaXRoZXIgd2hlbiBzbmFwc2hvdCBpcyBlbXB0eSBvciB3aGVuIHRvbyBvbGQgCgkgKi8KCglpZiAoKGNzcy0+Y3NzX3RpbWUgPT0gMCkKCQl8fCAoY3VycmVudF90aW1lID4gY3NzLT5jc3NfdGltZSArIDIwMDAwMDApKSB7CgkJLyoKCQkgKiBNYWtlIHN1cmUgd2UgY2xlYW4gdXAgYmVmb3JlIHdlIHB1dCBuZXcgZGF0YSBpbnRvIHNuYXBzaG90IAoJCSAqLwoJCW1lbXNldChjc3MsIDAsIHNpemVvZiAqY3NzKTsKCgkJLyoKCQkgKiBVcGRhdGUgdGltZXIgCgkJICovCgkJY3NzLT5jc3NfdGltZSA9IGN1cnJlbnRfdGltZTsKCgkJaWYoKHBlcmZzdGF0X2NwdV90b3RhbCgocGVyZnN0YXRfaWRfdCAqKU5VTEwsICZjcywgc2l6ZW9mKHBlcmZzdGF0X2NwdV90b3RhbF90KSwgMSkgPiAwKSAmJgoJCQkocGVyZnN0YXRfbWVtb3J5X3RvdGFsKChwZXJmc3RhdF9pZF90ICopTlVMTCwgJm1zLCBzaXplb2YocGVyZnN0YXRfbWVtb3J5X3RvdGFsX3QpLCAxKSA+IDApKSB7CgkJCWNzcy0+Y3NzX2NwdXMgPSBjcy5uY3B1czsKCQkJY3NzLT5jc3Nfc3dhcGluID0gbXMucGdzcGluczsKCQkJY3NzLT5jc3Nfc3dhcG91dCA9IG1zLnBnc3BvdXRzOwoJCQljc3MtPmNzc19ibG9ja3NfcmVhZCA9IGNzLnN5c3JlYWQ7CgkJCWNzcy0+Y3NzX2Jsb2Nrc193cml0ZSA9IGNzLnN5c3dyaXRlOwoJCQljc3MtPmNzc19pbnRlcnJ1cHRzID0gY3MuZGV2aW50cnMgKyBjcy5zb2Z0aW50cnM7CgkJCWNzcy0+Y3NzX2NvbnRleHRfc3cgPSBjcy5wc3dpdGNoOwoJCQljc3MtPmNzc19jcHVbQ1BVX1VTRVJdID0gY3MudXNlcjsKCQkJY3NzLT5jc3NfY3B1W0NQVV9TWVNURU1dID0gY3Muc3lzOwoJCQljc3MtPmNzc19jcHVbQ1BVX0lETEVdID0gY3MuaWRsZTsKCQkJY3NzLT5jc3NfY3B1W0NQVV9XQUlUXSA9IGNzLndhaXQ7CgkJfQoJfQoKCS8qCgkgKiBBbGwgZW5naW5lcyBydW5uaW5nIGF0IHdhcnAgc3BlZWQsIG5vIHByb2JsZW1zIChpZiB0aGVyZSBhcmUgYW55IGVuZ2luZXMsIHRoYXQgaXMpIAoJICovCglyZXR1cm4gKGNzLm5jcHVzID4gMCA/IDAgOiAtMSk7Cn0JLyogdGFrZV9zbmFwc2hvdCBlbmRzIGhlcmUgKi8KCi8qCiAqIFRoaXMgZ2V0cyBjYWxsZWQgZXZlcnkgUE9MTF9JTlRFUlZBTCBzZWNvbmRzIHRvIHVwZGF0ZSB0aGUgc25hcHNob3RzLgogKiBJdCB0YWtlcyBhIG5ldyBzbmFwc2hvdCBhbmQgZHJvcHMgdGhlIG9sZGVzdCBvbmUuICBUaGlzIHdheSB3ZSBtb3ZlCiAqIHRoZSB0aW1lIHdpbmRvdyBzbyB3ZSBhbHdheXMgdGFrZSB0aGUgdmFsdWVzIG92ZXIgCiAqIFBPTExfSU5URVJWQUwgKiBQT0xMX1ZBTFVFUyBzZWNvbmRzIGFuZCB1cGRhdGUgdGhlIGRhdGEgdXNlZCBldmVyeQogKiBQT0xMX0lOVEVSVkFMIHNlY29uZHMgCiAqIFRoZSBhbGFybSB0aW1lciBpcyBpbiB0aGUgaW5pdCBmdW5jdGlvbiBvZiB0aGlzIG1vZHVsZSAoc25tcF9hbGFybV9yZWdpc3RlcikgCiAqLwovKgogKiBBUkdTVVNFRDAgCiAqLwpzdGF0aWMgdm9pZAp1cGRhdGVfc3RhdHModW5zaWduZWQgaW50IHJlZ2lzdHJhdGlvbk51bWJlciwgdm9pZCAqY2xpZW50YXJnKQp7CgkvKgoJICogVGhlIHRpbWUgYmV0d2VlbiB0aGUgc2FtcGxlcyB3ZSBjb21wYXJlIAoJICovCgl1bnNpZ25lZCBsb25nIGxvbmcgdGltZV9kaWZmOwoKCS8qCgkgKiBFYXNpZXIgdG8gdXNlIHRoZXNlIHRoYW4gdGhlIHNuYXBzaG90cywgc2hvcnQgaGFuZCBwb2ludGVycyAKCSAqLwoJc3RydWN0IGNwdV9zdGF0X3NuYXBzaG90ICpjc3Nfb2xkLCAqY3NzX25ldzsKCgkvKgoJICogVGhlIHVzdWFsIHN0dWZmIHRvIGNvdW50IG9uLCBlcnIsIGJ5IAoJICovCglpbnQJCQkgaTsKCgkvKgoJICogVGhlIHN1bSBvZiB0aGUgQ1BVIHRpY2tzIHRoYXQgaGF2ZSBwYXNzZWQgb24gdGhlIGRpZmZlcmVudCBDUFUgc3RhdGVzLCBzbyB3ZSBjYW4gY2FsY3VsYXRlIAoJICogdGhlIHBlcmNlbnRhZ2VzIG9mIGVhY2ggc3RhdGUgCgkgKi8KCXVuc2lnbmVkIGxvbmcgbG9uZyBjcHVfc3VtID0gMDsKCglERUJVR01TR1RMKCgidWNkLXNubXAvdm1zdGF0X2FpeDQuYzp1cGRhdGVfc3RhdHMiLAoJCQkJInVwZGF0aW5nIHN0YXRzXG4iKSk7CgoJLyoKCSAqIFRha2UgdGhlIGN1cnJlbnQgc25hcHNob3QgCgkgKi8KCWlmICh0YWtlX3NuYXBzaG90KCZzbmFwc2hvdFswXSkgPT0gLTEpIHsKCQlzbm1wX2xvZyhMT0dfV0FSTklORywKCQkJCSAidm1zdGF0X2FpeDQgKHVwZGF0ZV9zdGF0cyk6IFNvbWV0aGluZyB3ZW50IHdyb25nIHdpdGggdGFrZV9zbmFwc2hvdC5cbiIpOwoJCXJldHVybjsKCX0KCgkvKgoJICogRG8gd2UgaGF2ZSBzb21lIGRhdGEgd2UgY2FuIHVzZSA/ICBBbiBpc3N1ZSByaWdodCBhZnRlciB0aGUgc3RhcnQgb2YgdGhlIGFnZW50IAoJICovCglpZiAobnVtYmVyX29mX3NuYXBzaG90cyA+IDApIHsKCQkvKgoJCSAqIEh1aCwgdGhlIG51bWJlciBvZiBDUFVzIGNoYW5nZWQgZHVyaW5nIHJ1biB0aW1lLiAgVGhhdCBpcyBpbmRlZWQgcy50aC4gd29ydGggbm90aW5nLCB3ZSAKCQkgKiBvdXRwdXQgYSBodW1vcm91cyAobW9yZSBvciBsZXNzKSBzeXNsb2cgbWVzc2FnZSBhbmQgbmVlZCB0byByZXRha2UgdGhlIHNuYXBzaG90cyAKCQkgKi8KCQlpZiAoc25hcHNob3RbMF0uY3NzX2NwdXMgIT0gc25hcHNob3RbMV0uY3NzX2NwdXMpIHsKCQkJaWYgKHNuYXBzaG90WzBdLmNzc19jcHVzID4gc25hcHNob3RbMV0uY3NzX2NwdXMpIHsKCQkJCXNubXBfbG9nKExPR19OT1RJQ0UsCgkJCQkJCSAidm1zdGF0X2FpeDQgKHVwZGF0ZV9zdGF0cyk6IENvb2wgISBOdW1iZXIgb2YgQ1BVcyBpbmNyZWFzZWQsIG11c3QgYmUgaG90LXBsdWdnYWJsZS5cbiIpOwoJCQl9IGVsc2UgewoJCQkJc25tcF9sb2coTE9HX05PVElDRSwKCQkJCQkJICJ2bXN0YXRfYWl4NCAodXBkYXRlX3N0YXRzKTogTG9zdCBhdCBsZWFzdCBvbmUgQ1BVLCBSSVAuXG4iKTsKCQkJfQoJCQkvKgoJCQkgKiBNYWtlIGFsbCBzbmFwc2hvdHMgYnV0IHRoZSBjdXJyZW50IG9uZSBpbnZhbGlkIAoJCQkgKi8KCQkJbnVtYmVyX29mX3NuYXBzaG90cyA9IDE7CgkJCS8qCgkJCSAqIE1vdmUgdGhlIGN1cnJlbnQgb25lIGluIHRoZSAiZmlyc3QiIFsxXSBzbG90IAoJCQkgKi8KCQkJbWVtbW92ZSgmc25hcHNob3RbMV0sICZzbmFwc2hvdFswXSwgc2l6ZW9mIHNuYXBzaG90WzBdKTsKCQkJLyoKCQkJICogRXJhc2UgdGhlIGN1cnJlbnQgb25lIAoJCQkgKi8KCQkJbWVtc2V0KCZzbmFwc2hvdFswXSwgMCwgc2l6ZW9mIHNuYXBzaG90WzBdKTsKCQkJLyoKCQkJICogVHJ5IHRvIGdldCBhIG5ldyBzbmFwc2hvdCBpbiBmaXZlIHNlY29uZHMgc28gd2UgY2FuIHJldHVybiBzLnRoLiB1c2VmdWwgCgkJCSAqLwoJCQlpZiAoc25tcF9hbGFybV9yZWdpc3Rlcig1LCBOVUxMLCB1cGRhdGVfc3RhdHMsIE5VTEwpID09IDApIHsKCQkJCXNubXBfbG9nKExPR19XQVJOSU5HLAoJCQkJCQkgInZtc3RhdF9haXg0ICh1cGRhdGVfc3RhdHMpOiBzbm1wX2FsYXJtX3JlZ2lzdGVyIGZhaWxlZC5cbiIpOwoJCQl9CgkJCXJldHVybjsKCQl9CgoJCS8qCgkJICogU2hvcnQgaGFuZCBwb2ludGVycyAKCQkgKi8KCQljc3NfbmV3ID0gJnNuYXBzaG90WzBdOwoJCWNzc19vbGQgPSAmc25hcHNob3RbbnVtYmVyX29mX3NuYXBzaG90c107CgoJCS8qCgkJICogSG93IG11Y2ggdGltZSBoYXMgcGFzc2VkIGJldHdlZW4gdGhlIHNuYXBzaG90cyB3ZSBnZXQgdGhlIHZhbHVlcyBmcm9tID8gCgkJICovCgkJdGltZV9kaWZmID0KCQkJKHNuYXBzaG90WzBdLmNzc190aW1lIC0KCQkJIHNuYXBzaG90W251bWJlcl9vZl9zbmFwc2hvdHNdLmNzc190aW1lKSAvIDEwMDA7CgoJCURFQlVHTVNHVEwoKCJ1Y2Qtc25tcC92bXN0YXRfYWl4NC5jOnVwZGF0ZV9zdGF0cyIsCgkJCQkJInRpbWVfZGlmZjogJWxsZFxuIiwgdGltZV9kaWZmKSk7CgoJCS8qCgkJICogc3dhcGluIGFuZCBzd2Fwb3V0IGFyZSBpbiBwYWdlcywgTUlCIHdhbnRzIGtCL3Msc28gd2UganVzdCBuZWVkIHRvIGdldCBrQiBhbmQgc2Vjb25kcyAKCQkgKiBGb3IgdGhlIG90aGVycyB3ZSBuZWVkIHRvIGdldCB2YWx1ZSBwZXIgc2Vjb25kIAoJCSAqIGdldHBhZ2VzaXplKCkgcmV0dXJucyBwYWdlc2l6ZSBpbiBieXRlcyAKCQkgKi8KCQkvKgoJCSAqIExJTlRFRCBjYXN0IG5lZWRlZCwgcmVhbGx5IAoJCSAqLwoJCXN3YXBpbiA9CgkJCSh1aW50X3QpICgoY3NzX25ldy0+Y3NzX3N3YXBpbiAtIGNzc19vbGQtPmNzc19zd2FwaW4pICoKCQkJCQkgIGdldHBhZ2VzaXplKCkgLyAxMDI0IC8gdGltZV9kaWZmKTsKCQkvKgoJCSAqIExJTlRFRCBjYXN0IG5lZWRlZCwgcmVhbGx5IAoJCSAqLwoJCXN3YXBvdXQgPQoJCQkodWludF90KSAoKGNzc19uZXctPmNzc19zd2Fwb3V0IC0gY3NzX29sZC0+Y3NzX3N3YXBvdXQpICoKCQkJCQkgIGdldHBhZ2VzaXplKCkgLyAxMDI0IC8gdGltZV9kaWZmKTsKCQkvKgoJCSAqIExJTlRFRCBjYXN0IG5lZWRlZCwgcmVhbGx5IAoJCSAqLwoJCWJsb2Nrc19yZWFkID0KCQkJKHVpbnRfdCkgKChjc3NfbmV3LT5jc3NfYmxvY2tzX3JlYWQgLSBjc3Nfb2xkLT5jc3NfYmxvY2tzX3JlYWQpIC8KCQkJCQkgIHRpbWVfZGlmZik7CgkJLyoKCQkgKiBMSU5URUQgY2FzdCBuZWVkZWQsIHJlYWxseSAKCQkgKi8KCQlibG9ja3Nfd3JpdGUgPQoJCQkodWludF90KSAoKGNzc19uZXctPmNzc19ibG9ja3Nfd3JpdGUgLSBjc3Nfb2xkLT5jc3NfYmxvY2tzX3dyaXRlKSAvCgkJCQkJICB0aW1lX2RpZmYpOwoJCS8qCgkJICogTElOVEVEIGNhc3QgbmVlZGVkLCByZWFsbHkgCgkJICovCgkJaW50ZXJydXB0cyA9CgkJCSh1aW50X3QpICgoY3NzX25ldy0+Y3NzX2ludGVycnVwdHMgLSBjc3Nfb2xkLT5jc3NfaW50ZXJydXB0cykgLwoJCQkJCSAgdGltZV9kaWZmKTsKCQkvKgoJCSAqIExJTlRFRCBjYXN0IG5lZWRlZCwgcmVhbGx5IAoJCSAqLwoJCWNvbnRleHRfc3cgPQoJCQkodWludF90KSAoKGNzc19uZXctPmNzc19jb250ZXh0X3N3IC0gY3NzX29sZC0+Y3NzX2NvbnRleHRfc3cpIC8KCQkJCQkgIHRpbWVfZGlmZik7CgoJCS8qCgkJICogTG9vcCB0aHJ1IGFsbCB0aGUgQ1BVX1NUQVRFUyBhbmQgZ2V0IHRoZSBkaWZmZXJlbmNlcyAKCQkgKi8KCQlmb3IgKGkgPSAwOyBpIDwgQ1BVX1NUQVRFUzsgaSsrKSB7CgkJCWNwdV9zdW0gKz0gKGNzc19uZXctPmNzc19jcHVbaV0gLSBjc3Nfb2xkLT5jc3NfY3B1W2ldKTsKCQl9CgoJCS8qCgkJICogTm93IGNhbGN1bGF0ZSB0aGUgYWJzb2x1dGUgcGVyY2VudGFnZSB2YWx1ZXMgCgkJICogTG9va3Mgc29tZXdoYXQgY29tcGxpY2F0ZWQgc29tZXRpbWVzIGJ1dCB0cmllcyB0byBnZXQgYXJvdW5kIHVzaW5nIGZsb2F0cyB0byBpbmNyZWFzZSBzcGVlZCAKCQkgKi8KCQlmb3IgKGkgPSAwOyBpIDwgQ1BVX1NUQVRFUzsgaSsrKSB7CgkJCS8qCgkJCSAqIFNpbmNlIHdlIGRvbid0IHJldHVybiBmcmFjdGlvbnMgd2UgdXNlICsgMC41IHRvIGdldCBiZXR3ZWVuIDk5IGFuZCAxMDEgcGVyY2VudCBhZGRpbmcgdGhlIHZhbHVlcyAKCQkJICogdG9nZXRoZXIsIG90aGVyd2lzZSB3ZSB3b3VsZCBnZXQgbGVzcyB0aGFuIDEwMCBtb3N0IG9mIHRoZSB0aW1lIAoJCQkgKi8KCQkJLyoKCQkJICogTElOVEVEIGhhcyB0byBiZSAnbG9uZycgCgkJCSAqLwoJCQljcHVfcGVyY1tpXSA9CgkJCQkobG9uZykgKCgoY3NzX25ldy0+Y3NzX2NwdVtpXSAtIGNzc19vbGQtPmNzc19jcHVbaV0pICogMTAwICsKCQkJCQkJIChjcHVfc3VtIC8gMikpIC8gY3B1X3N1bSk7CgkJfQoJCS8qICJzeXN0ZW0iIGlzICJrZXJuZWwiLCB3ZSBoYXZlIHRvIGFkZCAid2FpdCIgdG8gZ2V0IHRoZSBjb3JyZWN0IHZhbHVlICovCgkJY3B1X3BlcmNbQ1BVX1NZU1RFTV0gKz0gY3B1X3BlcmNbQ1BVX1dBSVRdOwoJfQoKCS8qCgkgKiBNYWtlIHRoZSBjdXJyZW50IG9uZSB0aGUgZmlyc3Qgb25lIGFuZCBtb3ZlIHRoZSB3aG9sZSB0aGluZyBvbmUgcGxhY2UgZG93biAKCSAqLwoJbWVtbW92ZSgmc25hcHNob3RbMV0sICZzbmFwc2hvdFswXSwKCQkJKHNpemVfdCkgKCgoY2hhciAqKSAmc25hcHNob3RbUE9MTF9WQUxVRVNdKSAtCgkJCQkJICAoKGNoYXIgKikgJnNuYXBzaG90WzBdKSkpOwoKCS8qCgkgKiBFcmFzZSB0aGUgY3VycmVudCBvbmUgCgkgKi8KCW1lbXNldCgmc25hcHNob3RbMF0sIDAsIHNpemVvZiBzbmFwc2hvdFswXSk7CgoJLyoKCSAqIE9ubHkgaW1wb3J0YW50IG9uIHN0YXJ0IHVwLCB3ZSBrZWVwIHRyYWNrIG9mIGhvdyBtYW55IHNuYXBzaG90cyB3ZSBoYXZlIHRha2VuIHNvIGZhciAKCSAqLwoJaWYgKG51bWJlcl9vZl9zbmFwc2hvdHMgPCBQT0xMX1ZBTFVFUykgewoJCW51bWJlcl9vZl9zbmFwc2hvdHMrKzsKCX0KfQkJCQkJCQkgICAvKiB1cGRhdGVfc3RhdHMgZW5kcyBoZXJlICovCgovKgogKiAqdmFyX2V4dGVuc2libGVfdm1zdGF0IHN0YXJ0cyBoZXJlIAogKiBUaGUgZ3V0cyBvZiB0aGUgbW9kdWxlLCB0aGlzIHJvdXRpbmUgZ2V0cyBjYWxsZWQgdG8gc2VydmljZSBhIHJlcXVlc3QgCiAqLwp1bnNpZ25lZCBjaGFyICoKdmFyX2V4dGVuc2libGVfdm1zdGF0KHN0cnVjdCB2YXJpYWJsZSAqdnAsCgkJCQkJICBvaWQgKiBuYW1lLAoJCQkJCSAgc2l6ZV90ICogbGVuZ3RoLAoJCQkJCSAgaW50IGV4YWN0LAoJCQkJCSAgc2l6ZV90ICogdmFyX2xlbiwgV3JpdGVNZXRob2QgKiogd3JpdGVfbWV0aG9kKQp7CgkvKgoJICogTmVlZGVkIGZvciByZXR1cm5pbmcgdGhlIHZhbHVlcyAKCSAqLwoJc3RhdGljIGxvbmcJIGxvbmdfcmV0OwoJc3RhdGljIGNoYXIJIGVycm1zZ1szMDBdOwoKCS8qCgkgKiBzZXQgdG8gMCBhcyBkZWZhdWx0IAoJICovCglsb25nX3JldCA9IDA7CgoJLyoKCSAqIGdlbmVyaWMgY2hlY2sgd2hldGhlciB0aGUgb3B0aW9ucyBwYXNzZWQgbWFrZSBzZW5zZSBhbmQgd2hldGhlciB0aGUgCgkgKi8KCS8qCgkgKiByaWdodCB2YXJpYWJsZSBpcyByZXF1ZXN0ZWQgCgkgKi8KCWlmIChoZWFkZXJfZ2VuZXJpYyh2cCwgbmFtZSwgbGVuZ3RoLCBleGFjdCwgdmFyX2xlbiwgd3JpdGVfbWV0aG9kKSAhPQoJCU1BVENIX1NVQ0NFRURFRCkgewoJCXJldHVybiAoTlVMTCk7Cgl9CgoJLyoKCSAqIFRoZSBmdW5jdGlvbiB0aGF0IGFjdHVhbGx5IHJldHVybnMgcy50aC4gCgkgKi8KCXN3aXRjaCAodnAtPm1hZ2ljKSB7CgljYXNlIE1JQklOREVYOgoJCWxvbmdfcmV0ID0gMTsKCQlyZXR1cm4gKCh1X2NoYXIgKikgKCZsb25nX3JldCkpOwoJY2FzZSBFUlJPUk5BTUU6CQkJLyogZHVtbXkgbmFtZSAqLwoJCXNwcmludGYoZXJybXNnLCAic3lzdGVtU3RhdHMiKTsKCQkqdmFyX2xlbiA9IHN0cmxlbihlcnJtc2cpOwoJCXJldHVybiAoKHVfY2hhciAqKSAoZXJybXNnKSk7CgljYXNlIFNXQVBJTjoKCQlyZXR1cm4gKCh1X2NoYXIgKikgKCZzd2FwaW4pKTsKCWNhc2UgU1dBUE9VVDoKCQlyZXR1cm4gKCh1X2NoYXIgKikgKCZzd2Fwb3V0KSk7CgljYXNlIElPU0VOVDoKCQlyZXR1cm4gKCh1X2NoYXIgKikgKCZibG9ja3Nfd3JpdGUpKTsKCWNhc2UgSU9SRUNFSVZFOgoJCXJldHVybiAoKHVfY2hhciAqKSAoJmJsb2Nrc19yZWFkKSk7CgljYXNlIFNZU0lOVEVSUlVQVFM6CgkJcmV0dXJuICgodV9jaGFyICopICgmaW50ZXJydXB0cykpOwoJY2FzZSBTWVNDT05URVhUOgoJCXJldHVybiAoKHVfY2hhciAqKSAoJmNvbnRleHRfc3cpKTsKCWNhc2UgQ1BVVVNFUjoKCQlyZXR1cm4gKCh1X2NoYXIgKikgKCZjcHVfcGVyY1tDUFVfVVNFUl0pKTsKCWNhc2UgQ1BVU1lTVEVNOgoJCXJldHVybiAoKHVfY2hhciAqKSAoJmNwdV9wZXJjW0NQVV9TWVNURU1dKSk7CgljYXNlIENQVUlETEU6CgkJcmV0dXJuICgodV9jaGFyICopICgmY3B1X3BlcmNbQ1BVX0lETEVdKSk7CgljYXNlIENQVVJBV1VTRVI6CgkJdGFrZV9zbmFwc2hvdCgmcmF3X3ZhbHVlcyk7CgkJLyoKCQkgKiBMSU5URUQgaGFzIHRvIGJlICdsb25nJyAKCQkgKi8KCQlsb25nX3JldCA9CgkJCShsb25nKSAocmF3X3ZhbHVlcy5jc3NfY3B1W0NQVV9VU0VSXSAvIHJhd192YWx1ZXMuY3NzX2NwdXMpOwoJCXJldHVybiAoKHVfY2hhciAqKSAoJmxvbmdfcmV0KSk7CgkJLyoKCQkgKiBXZSBhcmUgbWlzc2luZyBDUFVSQVdOSUNFLCBBSVggZG9lcyBub3QgYWNjb3VudCBmb3IgdGhpcyBpbiB0aGUga2VybmVsIHNvIHRoaXMgT0lEIGNhbiBub3QgCgkJICogYmUgcmV0dXJuZWQuICBBbHNvLCB0aGVzZSB2YWx1ZXMgd2lsbCByb2xsIG92ZXIgc29vbmVyIG9yIGxhdGVyIGFuZCB0aGVuIHJldHVybiBpbmFjY3VyYXRlIGRhdGEgCgkJICogYnV0IHRoZSBNSUIgd2FudHMgSW50ZWdlcjMyIHNvIHdlIGNhbm5vdCBwdXQgYSBjb3VudGVyIGhlcmUgCgkJICogKEhhcyBiZWVuIGNoYW5nZWQgdG8gQ291bnRlcjMyIGluIHRoZSBsYXRlc3QgTUlCIHZlcnNpb24hKSAKCQkgKi8KCWNhc2UgQ1BVUkFXU1lTVEVNOgoJCXRha2Vfc25hcHNob3QoJnJhd192YWx1ZXMpOwoJCS8qCgkJICogTElOVEVEIGhhcyB0byBiZSAnbG9uZycgCgkJICovCgkJbG9uZ19yZXQgPQoJCQkobG9uZykgKChyYXdfdmFsdWVzLmNzc19jcHVbQ1BVX1NZU1RFTV0gKwoJCQkJCSByYXdfdmFsdWVzLmNzc19jcHVbQ1BVX1dBSVRdKSAvIHJhd192YWx1ZXMuY3NzX2NwdXMpOwoJCXJldHVybiAoKHVfY2hhciAqKSAoJmxvbmdfcmV0KSk7CgljYXNlIENQVVJBV0lETEU6CgkJdGFrZV9zbmFwc2hvdCgmcmF3X3ZhbHVlcyk7CgkJLyoKCQkgKiBMSU5URUQgaGFzIHRvIGJlICdsb25nJyAKCQkgKi8KCQlsb25nX3JldCA9CgkJCShsb25nKSAocmF3X3ZhbHVlcy5jc3NfY3B1W0NQVV9JRExFXSAvIHJhd192YWx1ZXMuY3NzX2NwdXMpOwoJCXJldHVybiAoKHVfY2hhciAqKSAoJmxvbmdfcmV0KSk7CgljYXNlIENQVVJBV1dBSVQ6CgkJdGFrZV9zbmFwc2hvdCgmcmF3X3ZhbHVlcyk7CgkJLyoKCQkgKiBMSU5URUQgaGFzIHRvIGJlICdsb25nJyAKCQkgKi8KCQlsb25nX3JldCA9CgkJCShsb25nKSAocmF3X3ZhbHVlcy5jc3NfY3B1W0NQVV9XQUlUXSAvIHJhd192YWx1ZXMuY3NzX2NwdXMpOwoJCXJldHVybiAoKHVfY2hhciAqKSAoJmxvbmdfcmV0KSk7CgljYXNlIENQVVJBV0tFUk5FTDoKCQl0YWtlX3NuYXBzaG90KCZyYXdfdmFsdWVzKTsKCQkvKgoJCSAqIExJTlRFRCBoYXMgdG8gYmUgJ2xvbmcnIAoJCSAqLwoJCWxvbmdfcmV0ID0KCQkJKGxvbmcpIChyYXdfdmFsdWVzLmNzc19jcHVbQ1BVX1NZU1RFTV0gLyByYXdfdmFsdWVzLmNzc19jcHVzKTsKCQlyZXR1cm4gKCh1X2NoYXIgKikgKCZsb25nX3JldCkpOwoJY2FzZSBJT1JBV1NFTlQ6CgkJbG9uZ19yZXQgPSAobG9uZykgKHJhd192YWx1ZXMuY3NzX2Jsb2Nrc193cml0ZSk7CgkJcmV0dXJuICgodV9jaGFyICopICgmbG9uZ19yZXQpKTsKCWNhc2UgSU9SQVdSRUNFSVZFOgoJCWxvbmdfcmV0ID0gKGxvbmcpIChyYXdfdmFsdWVzLmNzc19ibG9ja3NfcmVhZCk7CgkJcmV0dXJuICgodV9jaGFyICopICgmbG9uZ19yZXQpKTsKCWNhc2UgU1lTUkFXSU5URVJSVVBUUzoKCQlsb25nX3JldCA9IChsb25nKSAocmF3X3ZhbHVlcy5jc3NfaW50ZXJydXB0cyk7CgkJcmV0dXJuICgodV9jaGFyICopICgmbG9uZ19yZXQpKTsKCWNhc2UgU1lTUkFXQ09OVEVYVDoKCQlsb25nX3JldCA9IChsb25nKSAocmF3X3ZhbHVlcy5jc3NfY29udGV4dF9zdyk7CgkJcmV0dXJuICgodV9jaGFyICopICgmbG9uZ19yZXQpKTsKCgkJLyoKCQkgKiByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZSAKCQkgKi8KCQkvKgoJCSAqIGNhc2UgRVJST1JGTEFHOgoJCSAqIHJldHVybigodV9jaGFyICopICgmbG9uZ19yZXQpKTsKCQkgKiBjYXNlIEVSUk9STVNHOgoJCSAqIHJldHVybigodV9jaGFyICopICgmbG9uZ19yZXQpKTsKCQkgKi8KCWRlZmF1bHQ6CgkJc25tcF9sb2coTE9HX0VSUiwKCQkJCSAidm1zdGF0X2FpeDQ6IEVycm9yIGluIHJlcXVlc3QsIG5vIG1hdGNoIGZvdW5kLlxuIik7Cgl9CglyZXR1cm4gKE5VTEwpOwp9CQkJCQkJCSAgIC8qICp2YXJfZXh0ZW5zaWJsZV92bXN0YXQgZW5kcyBoZXJlICovCgovKgogKiBGdW5jdGlvbnMgZW5kIGhlcmUgCiAqLwoKLyoKICogUHJvZ3JhbSBlbmRzIGhlcmUgCiAqLwo=