LyoKICogc25tcF92YXJzLmMgLSByZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBuYW1lZCB2YXJpYWJsZS4KICovCi8qKgogKiBAYWRkdG9ncm91cCBsaWJyYXJ5CiAqCiAqIEB7CiAqLwovKiBQb3J0aW9ucyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb3B5cmlnaHQocykuICBTZWUKICogdGhlIE5ldC1TTk1QJ3MgQ09QWUlORyBmaWxlIGZvciBtb3JlIGRldGFpbHMgYW5kIG90aGVyIGNvcHlyaWdodHMKICogdGhhdCBtYXkgYXBwbHk6CiAqLwovKiBQb3J0aW9ucyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb3B5cmlnaHQocykuICBTZWUKICogdGhlIE5ldC1TTk1QJ3MgQ09QWUlORyBmaWxlIGZvciBtb3JlIGRldGFpbHMgYW5kIG90aGVyIGNvcHlyaWdodHMKICogdGhhdCBtYXkgYXBwbHk6CiAqLwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCUNvcHlyaWdodCAxOTg4LCAxOTg5LCAxOTkwIGJ5IENhcm5lZ2llIE1lbGxvbiBVbml2ZXJzaXR5CglDb3B5cmlnaHQgMTk4OQlUR1YsIEluY29ycG9yYXRlZAoKCQkgICAgICBBbGwgUmlnaHRzIFJlc2VydmVkCgpQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgYW5kIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLApwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0CmJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbgpzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIENNVSBhbmQgVEdWIG5vdCBiZSB1c2VkCmluIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUKd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLgoKQ01VIEFORCBUR1YgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsCklOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8KRVZFTlQgU0hBTEwgQ01VIE9SIFRHViBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUgpDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GClVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUgpPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SClBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoKICogUG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBjb3B5cmlnaHRlZCBieToKICogQ29weXJpZ2h0IKkgMjAwMyBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAqIFVzZSBpcyBzdWJqZWN0IHRvIGxpY2Vuc2UgdGVybXMgc3BlY2lmaWVkIGluIHRoZSBDT1BZSU5HIGZpbGUKICogZGlzdHJpYnV0ZWQgd2l0aCB0aGUgTmV0LVNOTVAgcGFja2FnZS4KICovCgovKgogKiBhZGRpdGlvbnMsIGZpeGVzIGFuZCBlbmhhbmNlbWVudHMgZm9yIExpbnV4IGJ5IEVyaWsgU2Nob2VuZmVsZGVyCiAqIChzY2hvZW5mckBpYnIuY3MudHUtYnMuZGUpIDE5OTQvMTk5NS4KICogTGludXggYWRkaXRpb25zIHRha2VuIGZyb20gQ01VIHRvIFVDRCBzdGFjayBieSBKZW5uaWZlciBCcmF5IG9mIE9yaWdpbgogKiAoamJyYXlAb3JpZ2luLWF0LmNvLnVrKSAxOTk3CiAqLwovKgogKiBQb3J0aW9ucyBvZiB0aGlzIGZpbGUgYXJlIGNvcHlyaWdodGVkIGJ5OgogKiBDb3B5cmlnaHQgqSAyMDAzIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICogVXNlIGlzIHN1YmplY3QgdG8gbGljZW5zZSB0ZXJtcyBzcGVjaWZpZWQgaW4gdGhlIENPUFlJTkcgZmlsZQogKiBkaXN0cmlidXRlZCB3aXRoIHRoZSBOZXQtU05NUCBwYWNrYWdlLgogKi8KCi8qCiAqIFhYWFdXVyBtZXJnZSB0b2RvOiBpbmNsL2V4Y2wgcmFuZ2UgY2hhbmdlcyBpbiBkaWZmZXJlbmNlcyBiZXR3ZWVuCiAqIDEuMTk0IGFuZCAxLjE5OSAKICovCgojaW5jbHVkZSA8bmV0LXNubXAvbmV0LXNubXAtY29uZmlnLmg+CiNpZiBIQVZFX1NZU19QQVJBTV9ICiNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KI2VuZGlmCiNpZiBIQVZFX1NUUklOR19ICiNpbmNsdWRlIDxzdHJpbmcuaD4KI2VuZGlmCiNpZiBIQVZFX1NURExJQl9ICiNpbmNsdWRlIDxzdGRsaWIuaD4KI2VuZGlmCiNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxmY250bC5oPgojaW5jbHVkZSA8ZXJybm8uaD4KCiNpZiBUSU1FX1dJVEhfU1lTX1RJTUUKIyBpZmRlZiBXSU4zMgojICBpbmNsdWRlIDxzeXMvdGltZWIuaD4KIyBlbHNlCiMgIGluY2x1ZGUgPHN5cy90aW1lLmg+CiMgZW5kaWYKIyBpbmNsdWRlIDx0aW1lLmg+CiNlbHNlCiMgaWYgSEFWRV9TWVNfVElNRV9ICiMgIGluY2x1ZGUgPHN5cy90aW1lLmg+CiMgZWxzZQojICBpbmNsdWRlIDx0aW1lLmg+CiMgZW5kaWYKI2VuZGlmCiNpZiBIQVZFX1dJTlNPQ0tfSAojIGluY2x1ZGUgPHdpbnNvY2suaD4KI2VuZGlmCiNpZiBIQVZFX1NZU19TT0NLRVRfSAojIGluY2x1ZGUgPHN5cy9zb2NrZXQuaD4KI2VuZGlmCiNpZiBIQVZFX1NZU19TVFJFQU1fSAojICAgaWZkZWYgc3lzdjVVbml4V2FyZTcKIyAgICAgIGRlZmluZSBfS01FTVVTRVIgMSAvKiA8c3lzL3N0cmVhbS5oPiBuZWVkcyB0aGlzIGZvciBxdWV1ZV90ICovCiMgICBlbmRpZgojaW5jbHVkZSA8c3lzL3N0cmVhbS5oPgojZW5kaWYKI2lmIEhBVkVfU1lTX1NPQ0tFVFZBUl9ICiMgaW5jbHVkZSA8c3lzL3NvY2tldHZhci5oPgojZW5kaWYKI2lmIEhBVkVfTkVUSU5FVF9JTl9ICiNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CiNlbmRpZgojaWYgSEFWRV9ORVRJTkVUX0lOX1NZU1RNX0gKI2luY2x1ZGUgPG5ldGluZXQvaW5fc3lzdG0uaD4KI2VuZGlmCiNpZiBIQVZFX05FVElORVRfSVBfSAojaW5jbHVkZSA8bmV0aW5ldC9pcC5oPgojZW5kaWYKI2lmZGVmIE5FVFNOTVBfRU5BQkxFX0lQVjYKI2lmIEhBVkVfTkVUSU5FVF9JUDZfSAojaW5jbHVkZSA8bmV0aW5ldC9pcDYuaD4KI2VuZGlmCiNlbmRpZgojaWYgSEFWRV9TWVNfUVVFVUVfSAojaW5jbHVkZSA8c3lzL3F1ZXVlLmg+CiNlbmRpZgojaWYgSEFWRV9ORVRfUk9VVEVfSAojaW5jbHVkZSA8bmV0L3JvdXRlLmg+CiNlbmRpZgojaWYgSEFWRV9ORVRJTkVUX0lQX1ZBUl9ICiNpbmNsdWRlIDxuZXRpbmV0L2lwX3Zhci5oPgojZW5kaWYKI2lmZGVmIE5FVFNOTVBfRU5BQkxFX0lQVjYKI2lmIEhBVkVfTkVUTkVUU05NUF9FTkFCTEVfSVBWNl9JUDZfVkFSX0gKI2luY2x1ZGUgPG5ldGluZXQ2L2lwNl92YXIuaD4KI2VuZGlmCiNlbmRpZgojaWYgSEFWRV9ORVRJTkVUX0lOX1BDQl9ICiNpbmNsdWRlIDxuZXRpbmV0L2luX3BjYi5oPgojZW5kaWYKI2lmIEhBVkVfSU5FVF9NSUIyX0gKI2luY2x1ZGUgPGluZXQvbWliMi5oPgojZW5kaWYKCiNpbmNsdWRlIDxuZXQtc25tcC9uZXQtc25tcC1pbmNsdWRlcy5oPgojaW5jbHVkZSA8bmV0LXNubXAvYWdlbnQvbmV0LXNubXAtYWdlbnQtaW5jbHVkZXMuaD4KI2luY2x1ZGUgPG5ldC1zbm1wL2FnZW50L21pYl9tb2R1bGVzLmg+CiNpbmNsdWRlICJrZXJuZWwuaCIKCiNpbmNsdWRlICJtaWJncm91cC9zdHJ1Y3QuaCIKI2luY2x1ZGUgInNubXBkLmgiCiNpbmNsdWRlICJhZ2VudHgvYWdlbnR4X2NvbmZpZy5oIgojaW5jbHVkZSAiYWdlbnR4L3N1YmFnZW50LmgiCiNpbmNsdWRlICJuZXQtc25tcC9hZ2VudC9hbGxfaGVscGVycy5oIgojaW5jbHVkZSAiYWdlbnRfbW9kdWxlX2luY2x1ZGVzLmgiCiNpbmNsdWRlICJuZXQtc25tcC9saWJyYXJ5L2NvbnRhaW5lci5oIgoKI2luY2x1ZGUgInNubXBfcGVybC5oIgoKI2lmbmRlZiAgTUlOCiNkZWZpbmUgIE1JTihhLGIpICAgICAgICAgICAgICAgICAgICAgKCgoYSkgPCAoYikpID8gKGEpIDogKGIpKQojZW5kaWYKCnN0YXRpYyBjaGFyICAgICBkb25lX2luaXRfYWdlbnQgPSAwOwoKc3RydWN0IG1vZHVsZV9pbml0X2xpc3QgKmluaXRsaXN0ID0gTlVMTDsKc3RydWN0IG1vZHVsZV9pbml0X2xpc3QgKm5vaW5pdGxpc3QgPSBOVUxMOwoKLyoKICogbWliIGNsaWVudHMgYXJlIHBhc3NlZCBhIHBvaW50ZXIgdG8gYSBvaWQgYnVmZmVyLiAgU29tZSBtaWIgY2xpZW50cwogKiAqIChuYW1lbHksIHRob3NlIGZpcnN0IG5vdGljZWQgaW4gbWliSUkvdmFjbS5jKSBtb2RpZnkgdGhpcyBvaWQgYnVmZmVyCiAqICogYmVmb3JlIHRoZXkgZGV0ZXJtaW5lIGlmIHRoZXkgcmVhbGx5IG5lZWQgdG8gc2VuZCByZXN1bHRzIGJhY2sgb3V0CiAqICogdXNpbmcgaXQuICBJZiB0aGUgbWFzdGVyIGFnZW50IGRldGVybWluZWQgdGhhdCB0aGUgY2xpZW50IHdhcyBub3QgdGhlCiAqICogcmlnaHQgb25lIHRvIHRhbGsgd2l0aCwgaXQgd2lsbCB1c2UgdGhlIHNhbWUgb2lkIGJ1ZmZlciB0byBwYXNzIHRvIHRoZQogKiAqIHJlc3Qgb2YgdGhlIGNsaWVudHMsIHdoaWNoIG1heSBub3QgbG9uZ2VyIGJlIHZhbGlkLiAgVGhpcyBzaG91bGQgYmUKICogKiBmaXhlZCBpbiBhbGwgY2xpZW50cyByYXRoZXIgdGhhbiB0aGUgbWFzdGVyLiAgSG93ZXZlciwgaXRzIG5vdCBhCiAqICogcGFydGljdWxhcmlseSBlYXN5IGJ1ZyB0byB0cmFjayBkb3duIHNvIHRoaXMgc2F2ZXMgZGVidWdnaW5nIHRpbWUgYXQKICogKiB0aGUgZXhwZW5zZSBvZiBhIGZldyBtZW1jcHkncy4KICovCiNkZWZpbmUgTUlCX0NMSUVOVFNfQVJFX0VWSUwgMQoKZXh0ZXJuIG5ldHNubXBfc3VidHJlZSAqc3VidHJlZXM7CgovKgogKiAgICAgIEVhY2ggdmFyaWFibGUgbmFtZSBpcyBwbGFjZWQgaW4gdGhlIHZhcmlhYmxlIHRhYmxlLCB3aXRob3V0IHRoZQogKiB0ZXJtaW5hdGluZyBzdWJzdHJpbmcgdGhhdCBkZXRlcm1pbmVzIHRoZSBpbnN0YW5jZSBvZiB0aGUgdmFyaWFibGUuICBXaGVuCiAqIGEgc3RyaW5nIGlzIGZvdW5kIHRoYXQgaXMgbGV4aWNvZ3JhcGhpY2x5IHByZWNlZGVkIGJ5IHRoZSBpbnB1dCBzdHJpbmcsCiAqIHRoZSBmdW5jdGlvbiBmb3IgdGhhdCBlbnRyeSBpcyBjYWxsZWQgdG8gZmluZCB0aGUgbWV0aG9kIG9mIGFjY2VzcyBvZiB0aGUKICogaW5zdGFuY2Ugb2YgdGhlIG5hbWVkIHZhcmlhYmxlLiAgSWYgdGhhdCB2YXJpYWJsZSBpcyBub3QgZm91bmQsIE5VTEwgaXMKICogcmV0dXJuZWQsIGFuZCB0aGUgc2VhcmNoIHRocm91Z2ggdGhlIHRhYmxlIGNvbnRpbnVlcyAoaXQgd2lsbCBwcm9iYWJseQogKiBzdG9wIGF0IHRoZSBuZXh0IGVudHJ5KS4gIElmIGl0IGlzIGZvdW5kLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBhIGNoYXJhY3RlcgogKiBwb2ludGVyIGFuZCBhIGxlbmd0aCBvciBhIGZ1bmN0aW9uIHBvaW50ZXIuICBUaGUgZm9ybWVyIGlzIHRoZSBhZGRyZXNzCiAqIG9mIHRoZSBvcGVyYW5kLCB0aGUgbGF0dGVyIGlzIGEgd3JpdGUgcm91dGluZSBmb3IgdGhlIHZhcmlhYmxlLgogKgogKiB1X2NoYXIgKgogKiBmaW5kVmFyKG5hbWUsIGxlbmd0aCwgZXhhY3QsIHZhcl9sZW4sIHdyaXRlX21ldGhvZCkKICogb2lkICAgICAgKm5hbWU7ICAgICAgICAgIElOL09VVCAtIGlucHV0IG5hbWUgcmVxdWVzdGVkLCBvdXRwdXQgbmFtZSBmb3VuZAogKiBpbnQgICAgICBsZW5ndGg7ICAgICAgICAgSU4vT1VUIC0gbnVtYmVyIG9mIHN1Yi1pZHMgaW4gdGhlIGluIGFuZCBvdXQgb2lkJ3MKICogaW50ICAgICAgZXhhY3Q7ICAgICAgICAgIElOIC0gVFJVRSBpZiBhbiBleGFjdCBtYXRjaCB3YXMgcmVxdWVzdGVkLgogKiBpbnQgICAgICBsZW47ICAgICAgICAgICAgT1VUIC0gbGVuZ3RoIG9mIHZhcmlhYmxlIG9yIDAgaWYgZnVuY3Rpb24gcmV0dXJuZWQuCiAqIGludCAgICAgIHdyaXRlX21ldGhvZDsgICBPVVQgLSBwb2ludGVyIHRvIGZ1bmN0aW9uIHRvIHNldCB2YXJpYWJsZSwKICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyd2lzZSAwCiAqCiAqICAgICBUaGUgd3JpdGVWYXIgZnVuY3Rpb24gaXMgcmV0dXJuZWQgdG8gaGFuZGxlIHJvdyBhZGRpdGlvbiBvciBjb21wbGV4CiAqIHdyaXRlcyB0aGF0IHJlcXVpcmUgYm91bmRhcnkgY2hlY2tpbmcgb3IgZXhlY3V0aW5nIGFuIGFjdGlvbi4KICogVGhpcyByb3V0aW5lIHdpbGwgYmUgY2FsbGVkIHRocmVlIHRpbWVzIGZvciBlYWNoIHZhcmJpbmQgaW4gdGhlIHBhY2tldC4KICogVGhlIGZpcnN0IHRpbWUgZm9yIGVhY2ggdmFyYmluZCwgYWN0aW9uIGlzIHNldCB0byBSRVNFUlZFMS4gIFRoZSB0eXBlCiAqIGFuZCB2YWx1ZSBzaG91bGQgYmUgY2hlY2tlZCBkdXJpbmcgdGhpcyBwYXNzLiAgSWYgYW55IG90aGVyIHZhcmlhYmxlcwogKiBpbiB0aGUgTUlCIGRlcGVuZCBvbiB0aGlzIHZhcmlhYmxlLCB0aGlzIHZhcmlhYmxlIHdpbGwgYmUgc3RvcmVkIGF3YXkKICogKGJ1dCAqbm90KiBjb21taXR0ZWQhKSBpbiBhIHBsYWNlIHdoZXJlIGl0IGNhbiBiZSBmb3VuZCBieSBhIGNhbGwgdG8KICogd3JpdGVWYXIgZm9yIGEgZGVwZW5kZW50IHZhcmlhYmxlLCBldmVuIGluIHRoZSBzYW1lIFBEVS4gIER1cmluZwogKiB0aGUgc2Vjb25kIHBhc3MsIGFjdGlvbiBpcyBzZXQgdG8gUkVTRVJWRTIuICBJZiB0aGlzIHZhcmlhYmxlIGlzIGRlcGVuZGVudAogKiBvbiBhbnkgb3RoZXIgdmFyaWFibGVzLCBpdCB3aWxsIGNoZWNrIHRoZW0gbm93LiAgSXQgbXVzdCBjaGVjayB0byBzZWUKICogaWYgYW55IG5vbi1jb21taXR0ZWQgdmFsdWVzIGhhdmUgYmVlbiBzdG9yZWQgZm9yIHZhcmlhYmxlcyBpbiB0aGUgc2FtZQogKiBQRFUgdGhhdCBpdCBkZXBlbmRzIG9uLiAgU29tZXRpbWVzIHJlc291cmNlcyB3aWxsIG5lZWQgdG8gYmUgcmVzZXJ2ZWQKICogaW4gdGhlIGZpcnN0IHR3byBwYXNzZXMgdG8gZ3VhcmFudGVlIHRoYXQgdGhlIG9wZXJhdGlvbiBjYW4gcHJvY2VlZAogKiBkdXJpbmcgdGhlIHRoaXJkIHBhc3MuICBEdXJpbmcgdGhlIHRoaXJkIHBhc3MsIGlmIHRoZXJlIHdlcmUgbm8gZXJyb3JzCiAqIGluIHRoZSBmaXJzdCB0d28gcGFzc2VzLCB3cml0ZVZhciBpcyBjYWxsZWQgZm9yIGV2ZXJ5IHZhcmJpbmQgd2l0aCBhY3Rpb24KICogc2V0IHRvIENPTU1JVC4gIEl0IGlzIG5vdyB0aGF0IHRoZSB2YWx1ZXMgc2hvdWxkIGJlIHdyaXR0ZW4uICBJZiB0aGVyZQogKiB3ZXJlIGVycm9ycyBkdXJpbmcgdGhlIGZpcnN0IHR3byBwYXNzZXMsIHdyaXRlVmFyIGlzIGNhbGxlZCBpbiB0aGUgdGhpcmQKICogcGFzcyBvbmNlIGZvciBlYWNoIHZhcmJpbmQsIHdpdGggdGhlIGFjdGlvbiBzZXQgdG8gRlJFRS4gIEFuIG9wcG9ydHVuaXR5CiAqIGlzIHRodXMgcHJvdmlkZWQgdG8gZnJlZSB0aG9zZSByZXNvdXJjZXMgcmVzZXJ2ZWQgaW4gdGhlIGZpcnN0IHR3byBwYXNzZXMuCiAqIAogKiB3cml0ZVZhcihhY3Rpb24sIHZhcl92YWwsIHZhcl92YWxfdHlwZSwgdmFyX3ZhbF9sZW4sIHN0YXRQLCBuYW1lLCBuYW1lX2xlbikKICogaW50ICAgICAgYWN0aW9uOyAgICAgICAgIElOIC0gUkVTRVJWRTEsIFJFU0VSVkUyLCBDT01NSVQsIG9yIEZSRUUKICogdV9jaGFyICAgKnZhcl92YWw7ICAgICAgIElOIC0gaW5wdXQgb3Igb3V0cHV0IGJ1ZmZlciBzcGFjZQogKiB1X2NoYXIgICB2YXJfdmFsX3R5cGU7ICAgSU4gLSB0eXBlIG9mIGlucHV0IGJ1ZmZlcgogKiBpbnQgICAgICB2YXJfdmFsX2xlbjsgICAgSU4gLSBpbnB1dCBhbmQgb3V0cHV0IGJ1ZmZlciBsZW4KICogdV9jaGFyICAgKnN0YXRQOyAgICAgICAgIElOIC0gcG9pbnRlciB0byBsb2NhbCBzdGF0aXN0aWMKICogb2lkICAgICAgKm5hbWUgICAgICAgICAgIElOIC0gcG9pbnRlciB0byBuYW1lIHJlcXVlc3RlZAogKiBpbnQgICAgICBuYW1lX2xlbiAgICAgICAgSU4gLSBudW1iZXIgb2Ygc3ViLWlkcyBpbiB0aGUgbmFtZQogKi8KCmxvbmcgICAgICAgICAgICBsb25nX3JldHVybjsKI2lmbmRlZiBpYm0wMzIKdV9jaGFyICAgICAgICAgIHJldHVybl9idWZbMjU4XTsKI2Vsc2UKdV9jaGFyICAgICAgICAgIHJldHVybl9idWZbMjU2XTsgICAgICAgIC8qIG5lZSA2NCAqLwojZW5kaWYKCnN0cnVjdCB0aW1ldmFsICBzdGFydHRpbWU7CgppbnQgICAgICAgICAgICAgY2FsbGJhY2tfbWFzdGVyX251bSA9IC0xOwoKI2lmZGVmIE5FVFNOTVBfVFJBTlNQT1JUX0NBTExCQUNLX0RPTUFJTgpuZXRzbm1wX3Nlc3Npb24gKmNhbGxiYWNrX21hc3Rlcl9zZXNzID0gTlVMTDsKCnN0YXRpYyB2b2lkCl9pbml0X2FnZW50X2NhbGxiYWNrX3RyYW5zcG9ydCh2b2lkKQp7CiAgICAvKgogICAgICogYWx3YXlzIHJlZ2lzdGVyIGEgY2FsbGJhY2sgdHJhbnNwb3J0IGZvciBpbnRlcm5hbCB1c2UgCiAgICAgKi8KICAgIGNhbGxiYWNrX21hc3Rlcl9zZXNzID0gbmV0c25tcF9jYWxsYmFja19vcGVuKDAsIGhhbmRsZV9zbm1wX3BhY2tldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldHNubXBfYWdlbnRfY2hlY2tfcGFja2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV0c25tcF9hZ2VudF9jaGVja19wYXJzZSk7CiAgICBpZiAoY2FsbGJhY2tfbWFzdGVyX3Nlc3MpCiAgICAgICAgY2FsbGJhY2tfbWFzdGVyX251bSA9IGNhbGxiYWNrX21hc3Rlcl9zZXNzLT5sb2NhbF9wb3J0Owp9CiNlbHNlCiNkZWZpbmUgX2luaXRfYWdlbnRfY2FsbGJhY2tfdHJhbnNwb3J0KCkKI2VuZGlmCgovKioKICogSW5pdGlhbGl6ZSB0aGUgYWdlbnQuICBDYWxscyBpbnRvIGluaXRfYWdlbnRfcmVhZF9jb25maWcgdG8gc2V0IHRoYSBhcHAncwogKiBjb25maWd1cmF0aW9uIGZpbGUgaW4gdGhlIGFwcHJvcHJpYXRlIGRlZmF1bHQgc3RvcmFnZSBzcGFjZSwKICogIE5FVFNOTVBfRFNfTElCX0FQUFRZUEUuICBOZWVkIHRvIGNhbGwgaW5pdF9hZ2VudCBiZWZvcmUgY2FsbGluZyBpbml0X3NubXAuCiAqCiAqIEBwYXJhbSBhcHAgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZSB0byBiZSByZWFkIGluLCBnZXRzIHN0b3JlZCBpbiBkZWZhdWx0CiAqICAgICAgICBzdG9yYWdlCiAqCiAqIEByZXR1cm4gUmV0dXJucyBub24temVybyBvbiBmYWlsdXJlIGFuZCB6ZXJvIG9uIHN1Y2Nlc3MuCiAqCiAqIEBzZWUgaW5pdF9zbm1wCiAqLwppbnQKaW5pdF9hZ2VudChjb25zdCBjaGFyICphcHApCnsKICAgIGludCAgICAgICAgICAgICByID0gMDsKCiAgICBpZigrK2RvbmVfaW5pdF9hZ2VudCA+IDEpIHsKICAgICAgICBzbm1wX2xvZyhMT0dfV0FSTklORywgImlnbm9yaW5nIGV4dHJhIGNhbGwgdG8gaW5pdF9hZ2VudCAoJWQpXG4iLCAKICAgICAgICAgICAgICAgICBkb25lX2luaXRfYWdlbnQpOwogICAgICAgIHJldHVybiByOwogICAgfQoKICAgIC8qCiAgICAgKiBnZXQgY3VycmVudCB0aW1lIChpZSwgdGhlIHRpbWUgdGhlIGFnZW50IHN0YXJ0ZWQpIAogICAgICovCiAgICBnZXR0aW1lb2ZkYXkoJnN0YXJ0dGltZSwgTlVMTCk7CiAgICBzdGFydHRpbWUudHZfc2VjLS07CiAgICBzdGFydHRpbWUudHZfdXNlYyArPSAxMDAwMDAwTDsKCiAgICAvKgogICAgICogd2UgaGFuZGxlIGFsYXJtIHNpZ25hbHMgb3Vyc2VsdmVzIGluIHRoZSBzZWxlY3QgbG9vcCAKICAgICAqLwogICAgbmV0c25tcF9kc19zZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIAoJCQkgICBORVRTTk1QX0RTX0xJQl9BTEFSTV9ET05UX1VTRV9TSUcsIDEpOwoKI2lmZGVmIE5FVFNOTVBfQ0FOX1VTRV9OTElTVAogICAgciA9IGluaXRfa21lbSgiL2Rldi9rbWVtIikgPyAwIDogLUVBQ0NFUzsKI2VuZGlmCgogICAgc2V0dXBfdHJlZSgpOwoKICAgIGluaXRfYWdlbnRfcmVhZF9jb25maWcoYXBwKTsKCiNpZmRlZiBURVNUSU5HCiAgICBhdXRvX25saXN0X3ByaW50X3RyZWUoLTIsIDApOwojZW5kaWYKCiAgICBfaW5pdF9hZ2VudF9jYWxsYmFja190cmFuc3BvcnQoKTsKICAgIAogICAgbmV0c25tcF9pbml0X2hlbHBlcnMoKTsKICAgIGluaXRfdHJhcHMoKTsKICAgIG5ldHNubXBfY29udGFpbmVyX2luaXRfbGlzdCgpOwoKI2lmIGRlZmluZWQoVVNJTkdfQUdFTlRYX1NVQkFHRU5UX01PRFVMRSkgfHwgZGVmaW5lZChVU0lOR19BR0VOVFhfTUFTVEVSX01PRFVMRSkKICAgIC8qCiAgICAgKiBpbml0aWFsaXplIGFnZW50eCBjb25maWdzCiAgICAgKi8KICAgIGFnZW50eF9jb25maWdfaW5pdCgpOwogICAgaWYobmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0FQUExJQ0FUSU9OX0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBORVRTTk1QX0RTX0FHRU5UX1JPTEUpID09IFNVQl9BR0VOVCkKICAgICAgICBzdWJhZ2VudF9pbml0KCk7CiNlbmRpZgoKICAgIC8qCiAgICAgKiBSZWdpc3RlciBjb25maWd1cmF0aW9uIHRva2VucyBmcm9tIHRyYW5zcG9ydCBtb2R1bGVzLiAgCiAgICAgKi8KI2lmZGVmIE5FVFNOTVBfVFJBTlNQT1JUX1VEUF9ET01BSU4KICAgIG5ldHNubXBfdWRwX2FnZW50X2NvbmZpZ190b2tlbnNfcmVnaXN0ZXIoKTsKI2VuZGlmCiNpZmRlZiBORVRTTk1QX1RSQU5TUE9SVF9VRFBJUFY2X0RPTUFJTgogICAgbmV0c25tcF91ZHA2X2FnZW50X2NvbmZpZ190b2tlbnNfcmVnaXN0ZXIoKTsKI2VuZGlmCiNpZmRlZiBORVRTTk1QX1RSQU5TUE9SVF9VTklYX0RPTUFJTgogICAgbmV0c25tcF91bml4X2FnZW50X2NvbmZpZ190b2tlbnNfcmVnaXN0ZXIoKTsKI2VuZGlmCgojaWZkZWYgTkVUU05NUF9FTUJFRERFRF9QRVJMCiAgICBpbml0X3BlcmwoKTsKI2VuZGlmCgojaWZkZWYgVVNJTkdfQUdFTlRYX1NVQkFHRU5UX01PRFVMRQogICAgLyoKICAgICAqIGRvbid0IGluaXQgYWdlbnQgbW9kdWxlcyBmb3IgYSBzdWItYWdlbnQKICAgICAqLwogICAgaWYgKG5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19BUFBMSUNBVElPTl9JRCwgCgkJCSAgICAgICBORVRTTk1QX0RTX0FHRU5UX1JPTEUpID09IFNVQl9BR0VOVCkKICAgICAgICByZXR1cm4gcjsKI2VuZGlmCgojICBpbmNsdWRlICJhZ2VudF9tb2R1bGVfaW5pdHMuaCIKCiAgICByZXR1cm4gcjsKfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBlbmQgaW5pdF9hZ2VudCgpICovCgpvaWQgICAgICAgICAgICAgbnVsbE9pZFtdID0geyAwLCAwIH07CmludCAgICAgICAgICAgICBudWxsT2lkTGVuID0gc2l6ZW9mKG51bGxPaWQpOwoKdm9pZApzaHV0ZG93bl9hZ2VudCh2b2lkKSB7CgogICAgLyogcHJvYmFibHkgc29tZSBvZiB0aGlzIGNhbiBiZSBjYWxsZWQgYXMgc2h1dGRvd24gY2FsbGJhY2sgKi8KICAgIHNodXRkb3duX3RyZWUoKTsKICAgIGNsZWFyX2NvbnRleHQoKTsKICAgIG5ldHNubXBfY2xlYXJfY2FsbGJhY2tfbGlzdCgpOwogICAgbmV0c25tcF9jbGVhcl90ZG9tYWluX2xpc3QoKTsKICAgIG5ldHNubXBfY2xlYXJfaGFuZGxlcl9saXN0KCk7CiAgICBuZXRzbm1wX2NvbnRhaW5lcl9mcmVlX2xpc3QoKTsKICAgIGNsZWFyX3NlY19tb2QoKTsKICAgIGNsZWFyX3NubXBfZW51bSgpOwogICAgY2xlYXJfY2FsbGJhY2soKTsKICAgIGNsZWFyX3VzZXJfbGlzdCgpOwogICAgbmV0c25tcF9hZGRyY2FjaGVfZGVzdHJveSgpOwoKICAgIGRvbmVfaW5pdF9hZ2VudCA9IDA7Cn0KCgp2b2lkCmFkZF90b19pbml0X2xpc3QoY2hhciAqbW9kdWxlX2xpc3QpCnsKICAgIHN0cnVjdCBtb2R1bGVfaW5pdF9saXN0ICpuZXdpdGVtLCAqKmxpc3Q7CiAgICBjaGFyICAgICAgICAgICAqY3A7CiAgICBjaGFyICAgICAgICAgICAqc3Q7CgogICAgaWYgKG1vZHVsZV9saXN0ID09IE5VTEwpIHsKICAgICAgICByZXR1cm47CiAgICB9IGVsc2UgewogICAgICAgIGNwID0gKGNoYXIgKikgbW9kdWxlX2xpc3Q7CiAgICB9CgogICAgaWYgKCpjcCA9PSAnLScgfHwgKmNwID09ICchJykgewogICAgICAgIGNwKys7CiAgICAgICAgbGlzdCA9ICZub2luaXRsaXN0OwogICAgfSBlbHNlIHsKICAgICAgICBsaXN0ID0gJmluaXRsaXN0OwogICAgfQoKICAgIGNwID0gc3RydG9rX3IoY3AsICIsIDoiLCAmc3QpOwogICAgd2hpbGUgKGNwKSB7CiAgICAgICAgbmV3aXRlbSA9IChzdHJ1Y3QgbW9kdWxlX2luaXRfbGlzdCAqKSBjYWxsb2MoMSwgc2l6ZW9mKCppbml0bGlzdCkpOwogICAgICAgIG5ld2l0ZW0tPm1vZHVsZV9uYW1lID0gc3RyZHVwKGNwKTsKICAgICAgICBuZXdpdGVtLT5uZXh0ID0gKmxpc3Q7CiAgICAgICAgKmxpc3QgPSBuZXdpdGVtOwogICAgICAgIGNwID0gc3RydG9rX3IoTlVMTCwgIiwgOiIsICZzdCk7CiAgICB9Cn0KCmludApzaG91bGRfaW5pdChjb25zdCBjaGFyICptb2R1bGVfbmFtZSkKewogICAgc3RydWN0IG1vZHVsZV9pbml0X2xpc3QgKmxpc3RwOwoKICAgIC8qCiAgICAgKiBhIGRlZmluaXRpdmUgbGlzdCB0YWtlcyBwcmlvcml0eSAKICAgICAqLwogICAgaWYgKGluaXRsaXN0KSB7CiAgICAgICAgbGlzdHAgPSBpbml0bGlzdDsKICAgICAgICB3aGlsZSAobGlzdHApIHsKICAgICAgICAgICAgaWYgKHN0cmNtcChsaXN0cC0+bW9kdWxlX25hbWUsIG1vZHVsZV9uYW1lKSA9PSAwKSB7CiAgICAgICAgICAgICAgICBERUJVR01TR1RMKCgibWliX2luaXQiLCAiaW5pdGlhbGl6aW5nOiAlc1xuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZV9uYW1lKSk7CiAgICAgICAgICAgICAgICByZXR1cm4gRE9fSU5JVElBTElaRTsKICAgICAgICAgICAgfQogICAgICAgICAgICBsaXN0cCA9IGxpc3RwLT5uZXh0OwogICAgICAgIH0KICAgICAgICBERUJVR01TR1RMKCgibWliX2luaXQiLCAic2tpcHBpbmc6ICAgICAlc1xuIiwgbW9kdWxlX25hbWUpKTsKICAgICAgICByZXR1cm4gRE9OVF9JTklUSUFMSVpFOwogICAgfQoKICAgIC8qCiAgICAgKiBpbml0aWFsaXplIGl0IG9ubHkgaWYgbm90IG9uIHRoZSBiYWQgbGlzdCAoYmFkIG1vZHVsZSwgbm8gYm9uZSkgCiAgICAgKi8KICAgIGlmIChub2luaXRsaXN0KSB7CiAgICAgICAgbGlzdHAgPSBub2luaXRsaXN0OwogICAgICAgIHdoaWxlIChsaXN0cCkgewogICAgICAgICAgICBpZiAoc3RyY21wKGxpc3RwLT5tb2R1bGVfbmFtZSwgbW9kdWxlX25hbWUpID09IDApIHsKICAgICAgICAgICAgICAgIERFQlVHTVNHVEwoKCJtaWJfaW5pdCIsICJza2lwcGluZzogICAgICVzXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlX25hbWUpKTsKICAgICAgICAgICAgICAgIHJldHVybiBET05UX0lOSVRJQUxJWkU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbGlzdHAgPSBsaXN0cC0+bmV4dDsKICAgICAgICB9CiAgICB9CiAgICBERUJVR01TR1RMKCgibWliX2luaXQiLCAiaW5pdGlhbGl6aW5nOiAlc1xuIiwgbW9kdWxlX25hbWUpKTsKCiAgICAvKgogICAgICogaW5pdGlhbGl6ZSBpdCAKICAgICAqLwogICAgcmV0dXJuIERPX0lOSVRJQUxJWkU7Cn0KLyoqICBAfSAqLwoK