LyoKICogc25tcF92YXJzLmMgLSByZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBuYW1lZCB2YXJpYWJsZS4KICovCi8qKgogKiBAYWRkdG9ncm91cCBsaWJyYXJ5CiAqCiAqIEB7CiAqLwovKiBQb3J0aW9ucyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb3B5cmlnaHQocykuICBTZWUKICogdGhlIE5ldC1TTk1QJ3MgQ09QWUlORyBmaWxlIGZvciBtb3JlIGRldGFpbHMgYW5kIG90aGVyIGNvcHlyaWdodHMKICogdGhhdCBtYXkgYXBwbHk6CiAqLwovKiBQb3J0aW9ucyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb3B5cmlnaHQocykuICBTZWUKICogdGhlIE5ldC1TTk1QJ3MgQ09QWUlORyBmaWxlIGZvciBtb3JlIGRldGFpbHMgYW5kIG90aGVyIGNvcHlyaWdodHMKICogdGhhdCBtYXkgYXBwbHk6CiAqLwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCUNvcHlyaWdodCAxOTg4LCAxOTg5LCAxOTkwIGJ5IENhcm5lZ2llIE1lbGxvbiBVbml2ZXJzaXR5CglDb3B5cmlnaHQgMTk4OQlUR1YsIEluY29ycG9yYXRlZAoKCQkgICAgICBBbGwgUmlnaHRzIFJlc2VydmVkCgpQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgYW5kIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLApwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0CmJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbgpzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIENNVSBhbmQgVEdWIG5vdCBiZSB1c2VkCmluIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUKd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLgoKQ01VIEFORCBUR1YgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsCklOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8KRVZFTlQgU0hBTEwgQ01VIE9SIFRHViBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUgpDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GClVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUgpPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SClBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoKICogUG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBjb3B5cmlnaHRlZCBieToKICogQ29weXJpZ2h0IKkgMjAwMyBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAqIFVzZSBpcyBzdWJqZWN0IHRvIGxpY2Vuc2UgdGVybXMgc3BlY2lmaWVkIGluIHRoZSBDT1BZSU5HIGZpbGUKICogZGlzdHJpYnV0ZWQgd2l0aCB0aGUgTmV0LVNOTVAgcGFja2FnZS4KICovCgovKgogKiBhZGRpdGlvbnMsIGZpeGVzIGFuZCBlbmhhbmNlbWVudHMgZm9yIExpbnV4IGJ5IEVyaWsgU2Nob2VuZmVsZGVyCiAqIChzY2hvZW5mckBpYnIuY3MudHUtYnMuZGUpIDE5OTQvMTk5NS4KICogTGludXggYWRkaXRpb25zIHRha2VuIGZyb20gQ01VIHRvIFVDRCBzdGFjayBieSBKZW5uaWZlciBCcmF5IG9mIE9yaWdpbgogKiAoamJyYXlAb3JpZ2luLWF0LmNvLnVrKSAxOTk3CiAqLwovKgogKiBQb3J0aW9ucyBvZiB0aGlzIGZpbGUgYXJlIGNvcHlyaWdodGVkIGJ5OgogKiBDb3B5cmlnaHQgqSAyMDAzIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICogVXNlIGlzIHN1YmplY3QgdG8gbGljZW5zZSB0ZXJtcyBzcGVjaWZpZWQgaW4gdGhlIENPUFlJTkcgZmlsZQogKiBkaXN0cmlidXRlZCB3aXRoIHRoZSBOZXQtU05NUCBwYWNrYWdlLgogKi8KCi8qCiAqIFhYWFdXVyBtZXJnZSB0b2RvOiBpbmNsL2V4Y2wgcmFuZ2UgY2hhbmdlcyBpbiBkaWZmZXJlbmNlcyBiZXR3ZWVuCiAqIDEuMTk0IGFuZCAxLjE5OSAKICovCgojaW5jbHVkZSA8bmV0LXNubXAvbmV0LXNubXAtY29uZmlnLmg+CiNpZiBIQVZFX1NZU19QQVJBTV9ICiNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KI2VuZGlmCiNpZiBIQVZFX1NUUklOR19ICiNpbmNsdWRlIDxzdHJpbmcuaD4KI2VuZGlmCiNpZiBIQVZFX1NURExJQl9ICiNpbmNsdWRlIDxzdGRsaWIuaD4KI2VuZGlmCiNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxmY250bC5oPgojaW5jbHVkZSA8ZXJybm8uaD4KCiNpZiBUSU1FX1dJVEhfU1lTX1RJTUUKIyBpbmNsdWRlIDxzeXMvdGltZS5oPgojIGluY2x1ZGUgPHRpbWUuaD4KI2Vsc2UKIyBpZiBIQVZFX1NZU19USU1FX0gKIyAgaW5jbHVkZSA8c3lzL3RpbWUuaD4KIyBlbHNlCiMgIGluY2x1ZGUgPHRpbWUuaD4KIyBlbmRpZgojZW5kaWYKI2lmIEhBVkVfU1lTX1NPQ0tFVF9ICiMgaW5jbHVkZSA8c3lzL3NvY2tldC5oPgojZW5kaWYKI2lmIEhBVkVfU1lTX1NUUkVBTV9ICiMgICBpZmRlZiBzeXN2NVVuaXhXYXJlNwojICAgICAgZGVmaW5lIF9LTUVNVVNFUiAxIC8qIDxzeXMvc3RyZWFtLmg+IG5lZWRzIHRoaXMgZm9yIHF1ZXVlX3QgKi8KIyAgIGVuZGlmCiNpbmNsdWRlIDxzeXMvc3RyZWFtLmg+CiNlbmRpZgojaWYgSEFWRV9TWVNfU09DS0VUVkFSX0gKIyBpbmNsdWRlIDxzeXMvc29ja2V0dmFyLmg+CiNlbmRpZgojaWYgSEFWRV9ORVRJTkVUX0lOX0gKI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KI2VuZGlmCiNpZiBIQVZFX05FVElORVRfSU5fU1lTVE1fSAojaW5jbHVkZSA8bmV0aW5ldC9pbl9zeXN0bS5oPgojZW5kaWYKI2lmIEhBVkVfTkVUSU5FVF9JUF9ICiNpbmNsdWRlIDxuZXRpbmV0L2lwLmg+CiNlbmRpZgojaWZkZWYgTkVUU05NUF9FTkFCTEVfSVBWNgojaWYgSEFWRV9ORVRJTkVUX0lQNl9ICiNpbmNsdWRlIDxuZXRpbmV0L2lwNi5oPgojZW5kaWYKI2VuZGlmCiNpZiBIQVZFX1NZU19RVUVVRV9ICiNpbmNsdWRlIDxzeXMvcXVldWUuaD4KI2VuZGlmCiNpZiBIQVZFX05FVF9ST1VURV9ICiNpbmNsdWRlIDxuZXQvcm91dGUuaD4KI2VuZGlmCiNpZiBIQVZFX05FVElORVRfSVBfVkFSX0gKI2luY2x1ZGUgPG5ldGluZXQvaXBfdmFyLmg+CiNlbmRpZgojaWZkZWYgTkVUU05NUF9FTkFCTEVfSVBWNgojaWYgSEFWRV9ORVRORVRTTk1QX0VOQUJMRV9JUFY2X0lQNl9WQVJfSAojaW5jbHVkZSA8bmV0aW5ldDYvaXA2X3Zhci5oPgojZW5kaWYKI2VuZGlmCiNpZiBIQVZFX05FVElORVRfSU5fUENCX0gKI2luY2x1ZGUgPG5ldGluZXQvaW5fcGNiLmg+CiNlbmRpZgojaWYgSEFWRV9JTkVUX01JQjJfSAojaW5jbHVkZSA8aW5ldC9taWIyLmg+CiNlbmRpZgoKI2luY2x1ZGUgPG5ldC1zbm1wL25ldC1zbm1wLWluY2x1ZGVzLmg+CiNpbmNsdWRlIDxuZXQtc25tcC9hZ2VudC9uZXQtc25tcC1hZ2VudC1pbmNsdWRlcy5oPgojaW5jbHVkZSA8bmV0LXNubXAvYWdlbnQvbWliX21vZHVsZXMuaD4KI2luY2x1ZGUgPG5ldC1zbm1wL2FnZW50L2FnZW50X3N5c09SVGFibGUuaD4KI2luY2x1ZGUgImtlcm5lbC5oIgoKI2luY2x1ZGUgIm1pYmdyb3VwL3N0cnVjdC5oIgojaW5jbHVkZSAic25tcGQuaCIKI2luY2x1ZGUgImFnZW50eC9hZ2VudHhfY29uZmlnLmgiCiNpbmNsdWRlICJhZ2VudHgvc3ViYWdlbnQuaCIKI2luY2x1ZGUgIm5ldC1zbm1wL2FnZW50L2FsbF9oZWxwZXJzLmgiCiNpbmNsdWRlICJhZ2VudF9tb2R1bGVfaW5jbHVkZXMuaCIKI2luY2x1ZGUgIm5ldC1zbm1wL2xpYnJhcnkvY29udGFpbmVyLmgiCgojaWYgZGVmaW5lZChORVRTTk1QX1VTRV9PUEVOU1NMKSAmJiBkZWZpbmVkKEhBVkVfTElCU1NMKQojaW5jbHVkZSA8b3BlbnNzbC9zc2wuaD4KI2luY2x1ZGUgPG9wZW5zc2wveDUwOXYzLmg+CiNpbmNsdWRlIDxuZXQtc25tcC9saWJyYXJ5L2NlcnRfdXRpbC5oPgojZW5kaWYKCiNpbmNsdWRlICJzbm1wX3BlcmwuaCIKCiNpZm5kZWYgIE1JTgojZGVmaW5lICBNSU4oYSxiKSAgICAgICAgICAgICAgICAgICAgICgoKGEpIDwgKGIpKSA/IChhKSA6IChiKSkKI2VuZGlmCgpzdGF0aWMgY2hhciAgICAgZG9uZV9pbml0X2FnZW50ID0gMDsKCnN0cnVjdCBtb2R1bGVfaW5pdF9saXN0ICppbml0bGlzdCA9IE5VTEw7CnN0cnVjdCBtb2R1bGVfaW5pdF9saXN0ICpub2luaXRsaXN0ID0gTlVMTDsKCi8qCiAqIG1pYiBjbGllbnRzIGFyZSBwYXNzZWQgYSBwb2ludGVyIHRvIGEgb2lkIGJ1ZmZlci4gIFNvbWUgbWliIGNsaWVudHMKICogKiAobmFtZWx5LCB0aG9zZSBmaXJzdCBub3RpY2VkIGluIG1pYklJL3ZhY20uYykgbW9kaWZ5IHRoaXMgb2lkIGJ1ZmZlcgogKiAqIGJlZm9yZSB0aGV5IGRldGVybWluZSBpZiB0aGV5IHJlYWxseSBuZWVkIHRvIHNlbmQgcmVzdWx0cyBiYWNrIG91dAogKiAqIHVzaW5nIGl0LiAgSWYgdGhlIG1hc3RlciBhZ2VudCBkZXRlcm1pbmVkIHRoYXQgdGhlIGNsaWVudCB3YXMgbm90IHRoZQogKiAqIHJpZ2h0IG9uZSB0byB0YWxrIHdpdGgsIGl0IHdpbGwgdXNlIHRoZSBzYW1lIG9pZCBidWZmZXIgdG8gcGFzcyB0byB0aGUKICogKiByZXN0IG9mIHRoZSBjbGllbnRzLCB3aGljaCBtYXkgbm90IGxvbmdlciBiZSB2YWxpZC4gIFRoaXMgc2hvdWxkIGJlCiAqICogZml4ZWQgaW4gYWxsIGNsaWVudHMgcmF0aGVyIHRoYW4gdGhlIG1hc3Rlci4gIEhvd2V2ZXIsIGl0cyBub3QgYQogKiAqIHBhcnRpY3VsYXJpbHkgZWFzeSBidWcgdG8gdHJhY2sgZG93biBzbyB0aGlzIHNhdmVzIGRlYnVnZ2luZyB0aW1lIGF0CiAqICogdGhlIGV4cGVuc2Ugb2YgYSBmZXcgbWVtY3B5J3MuCiAqLwojZGVmaW5lIE1JQl9DTElFTlRTX0FSRV9FVklMIDEKCmV4dGVybiBuZXRzbm1wX3N1YnRyZWUgKnN1YnRyZWVzOwoKLyoKICogICAgICBFYWNoIHZhcmlhYmxlIG5hbWUgaXMgcGxhY2VkIGluIHRoZSB2YXJpYWJsZSB0YWJsZSwgd2l0aG91dCB0aGUKICogdGVybWluYXRpbmcgc3Vic3RyaW5nIHRoYXQgZGV0ZXJtaW5lcyB0aGUgaW5zdGFuY2Ugb2YgdGhlIHZhcmlhYmxlLiAgV2hlbgogKiBhIHN0cmluZyBpcyBmb3VuZCB0aGF0IGlzIGxleGljb2dyYXBoaWNseSBwcmVjZWRlZCBieSB0aGUgaW5wdXQgc3RyaW5nLAogKiB0aGUgZnVuY3Rpb24gZm9yIHRoYXQgZW50cnkgaXMgY2FsbGVkIHRvIGZpbmQgdGhlIG1ldGhvZCBvZiBhY2Nlc3Mgb2YgdGhlCiAqIGluc3RhbmNlIG9mIHRoZSBuYW1lZCB2YXJpYWJsZS4gIElmIHRoYXQgdmFyaWFibGUgaXMgbm90IGZvdW5kLCBOVUxMIGlzCiAqIHJldHVybmVkLCBhbmQgdGhlIHNlYXJjaCB0aHJvdWdoIHRoZSB0YWJsZSBjb250aW51ZXMgKGl0IHdpbGwgcHJvYmFibHkKICogc3RvcCBhdCB0aGUgbmV4dCBlbnRyeSkuICBJZiBpdCBpcyBmb3VuZCwgdGhlIGZ1bmN0aW9uIHJldHVybnMgYSBjaGFyYWN0ZXIKICogcG9pbnRlciBhbmQgYSBsZW5ndGggb3IgYSBmdW5jdGlvbiBwb2ludGVyLiAgVGhlIGZvcm1lciBpcyB0aGUgYWRkcmVzcwogKiBvZiB0aGUgb3BlcmFuZCwgdGhlIGxhdHRlciBpcyBhIHdyaXRlIHJvdXRpbmUgZm9yIHRoZSB2YXJpYWJsZS4KICoKICogdV9jaGFyICoKICogZmluZFZhcihuYW1lLCBsZW5ndGgsIGV4YWN0LCB2YXJfbGVuLCB3cml0ZV9tZXRob2QpCiAqIG9pZCAgICAgICpuYW1lOyAgICAgICAgICBJTi9PVVQgLSBpbnB1dCBuYW1lIHJlcXVlc3RlZCwgb3V0cHV0IG5hbWUgZm91bmQKICogaW50ICAgICAgbGVuZ3RoOyAgICAgICAgIElOL09VVCAtIG51bWJlciBvZiBzdWItaWRzIGluIHRoZSBpbiBhbmQgb3V0IG9pZCdzCiAqIGludCAgICAgIGV4YWN0OyAgICAgICAgICBJTiAtIFRSVUUgaWYgYW4gZXhhY3QgbWF0Y2ggd2FzIHJlcXVlc3RlZC4KICogaW50ICAgICAgbGVuOyAgICAgICAgICAgIE9VVCAtIGxlbmd0aCBvZiB2YXJpYWJsZSBvciAwIGlmIGZ1bmN0aW9uIHJldHVybmVkLgogKiBpbnQgICAgICB3cml0ZV9tZXRob2Q7ICAgT1VUIC0gcG9pbnRlciB0byBmdW5jdGlvbiB0byBzZXQgdmFyaWFibGUsCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdGhlcndpc2UgMAogKgogKiAgICAgVGhlIHdyaXRlVmFyIGZ1bmN0aW9uIGlzIHJldHVybmVkIHRvIGhhbmRsZSByb3cgYWRkaXRpb24gb3IgY29tcGxleAogKiB3cml0ZXMgdGhhdCByZXF1aXJlIGJvdW5kYXJ5IGNoZWNraW5nIG9yIGV4ZWN1dGluZyBhbiBhY3Rpb24uCiAqIFRoaXMgcm91dGluZSB3aWxsIGJlIGNhbGxlZCB0aHJlZSB0aW1lcyBmb3IgZWFjaCB2YXJiaW5kIGluIHRoZSBwYWNrZXQuCiAqIFRoZSBmaXJzdCB0aW1lIGZvciBlYWNoIHZhcmJpbmQsIGFjdGlvbiBpcyBzZXQgdG8gUkVTRVJWRTEuICBUaGUgdHlwZQogKiBhbmQgdmFsdWUgc2hvdWxkIGJlIGNoZWNrZWQgZHVyaW5nIHRoaXMgcGFzcy4gIElmIGFueSBvdGhlciB2YXJpYWJsZXMKICogaW4gdGhlIE1JQiBkZXBlbmQgb24gdGhpcyB2YXJpYWJsZSwgdGhpcyB2YXJpYWJsZSB3aWxsIGJlIHN0b3JlZCBhd2F5CiAqIChidXQgKm5vdCogY29tbWl0dGVkISkgaW4gYSBwbGFjZSB3aGVyZSBpdCBjYW4gYmUgZm91bmQgYnkgYSBjYWxsIHRvCiAqIHdyaXRlVmFyIGZvciBhIGRlcGVuZGVudCB2YXJpYWJsZSwgZXZlbiBpbiB0aGUgc2FtZSBQRFUuICBEdXJpbmcKICogdGhlIHNlY29uZCBwYXNzLCBhY3Rpb24gaXMgc2V0IHRvIFJFU0VSVkUyLiAgSWYgdGhpcyB2YXJpYWJsZSBpcyBkZXBlbmRlbnQKICogb24gYW55IG90aGVyIHZhcmlhYmxlcywgaXQgd2lsbCBjaGVjayB0aGVtIG5vdy4gIEl0IG11c3QgY2hlY2sgdG8gc2VlCiAqIGlmIGFueSBub24tY29tbWl0dGVkIHZhbHVlcyBoYXZlIGJlZW4gc3RvcmVkIGZvciB2YXJpYWJsZXMgaW4gdGhlIHNhbWUKICogUERVIHRoYXQgaXQgZGVwZW5kcyBvbi4gIFNvbWV0aW1lcyByZXNvdXJjZXMgd2lsbCBuZWVkIHRvIGJlIHJlc2VydmVkCiAqIGluIHRoZSBmaXJzdCB0d28gcGFzc2VzIHRvIGd1YXJhbnRlZSB0aGF0IHRoZSBvcGVyYXRpb24gY2FuIHByb2NlZWQKICogZHVyaW5nIHRoZSB0aGlyZCBwYXNzLiAgRHVyaW5nIHRoZSB0aGlyZCBwYXNzLCBpZiB0aGVyZSB3ZXJlIG5vIGVycm9ycwogKiBpbiB0aGUgZmlyc3QgdHdvIHBhc3Nlcywgd3JpdGVWYXIgaXMgY2FsbGVkIGZvciBldmVyeSB2YXJiaW5kIHdpdGggYWN0aW9uCiAqIHNldCB0byBDT01NSVQuICBJdCBpcyBub3cgdGhhdCB0aGUgdmFsdWVzIHNob3VsZCBiZSB3cml0dGVuLiAgSWYgdGhlcmUKICogd2VyZSBlcnJvcnMgZHVyaW5nIHRoZSBmaXJzdCB0d28gcGFzc2VzLCB3cml0ZVZhciBpcyBjYWxsZWQgaW4gdGhlIHRoaXJkCiAqIHBhc3Mgb25jZSBmb3IgZWFjaCB2YXJiaW5kLCB3aXRoIHRoZSBhY3Rpb24gc2V0IHRvIEZSRUUuICBBbiBvcHBvcnR1bml0eQogKiBpcyB0aHVzIHByb3ZpZGVkIHRvIGZyZWUgdGhvc2UgcmVzb3VyY2VzIHJlc2VydmVkIGluIHRoZSBmaXJzdCB0d28gcGFzc2VzLgogKiAKICogd3JpdGVWYXIoYWN0aW9uLCB2YXJfdmFsLCB2YXJfdmFsX3R5cGUsIHZhcl92YWxfbGVuLCBzdGF0UCwgbmFtZSwgbmFtZV9sZW4pCiAqIGludCAgICAgIGFjdGlvbjsgICAgICAgICBJTiAtIFJFU0VSVkUxLCBSRVNFUlZFMiwgQ09NTUlULCBvciBGUkVFCiAqIHVfY2hhciAgICp2YXJfdmFsOyAgICAgICBJTiAtIGlucHV0IG9yIG91dHB1dCBidWZmZXIgc3BhY2UKICogdV9jaGFyICAgdmFyX3ZhbF90eXBlOyAgIElOIC0gdHlwZSBvZiBpbnB1dCBidWZmZXIKICogaW50ICAgICAgdmFyX3ZhbF9sZW47ICAgIElOIC0gaW5wdXQgYW5kIG91dHB1dCBidWZmZXIgbGVuCiAqIHVfY2hhciAgICpzdGF0UDsgICAgICAgICBJTiAtIHBvaW50ZXIgdG8gbG9jYWwgc3RhdGlzdGljCiAqIG9pZCAgICAgICpuYW1lICAgICAgICAgICBJTiAtIHBvaW50ZXIgdG8gbmFtZSByZXF1ZXN0ZWQKICogaW50ICAgICAgbmFtZV9sZW4gICAgICAgIElOIC0gbnVtYmVyIG9mIHN1Yi1pZHMgaW4gdGhlIG5hbWUKICovCgpsb25nICAgICAgICAgICAgbG9uZ19yZXR1cm47CiNpZm5kZWYgaWJtMDMyCnVfY2hhciAgICAgICAgICByZXR1cm5fYnVmWzI1OF07CiNlbHNlCnVfY2hhciAgICAgICAgICByZXR1cm5fYnVmWzI1Nl07ICAgICAgICAvKiBuZWUgNjQgKi8KI2VuZGlmCgppbnQgICAgICAgICAgICAgY2FsbGJhY2tfbWFzdGVyX251bSA9IC0xOwoKI2lmZGVmIE5FVFNOTVBfVFJBTlNQT1JUX0NBTExCQUNLX0RPTUFJTgpuZXRzbm1wX3Nlc3Npb24gKmNhbGxiYWNrX21hc3Rlcl9zZXNzID0gTlVMTDsKCnN0YXRpYyB2b2lkCl9pbml0X2FnZW50X2NhbGxiYWNrX3RyYW5zcG9ydCh2b2lkKQp7CiAgICAvKgogICAgICogYWx3YXlzIHJlZ2lzdGVyIGEgY2FsbGJhY2sgdHJhbnNwb3J0IGZvciBpbnRlcm5hbCB1c2UgCiAgICAgKi8KICAgIGNhbGxiYWNrX21hc3Rlcl9zZXNzID0gbmV0c25tcF9jYWxsYmFja19vcGVuKDAsIGhhbmRsZV9zbm1wX3BhY2tldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldHNubXBfYWdlbnRfY2hlY2tfcGFja2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV0c25tcF9hZ2VudF9jaGVja19wYXJzZSk7CiAgICBpZiAoY2FsbGJhY2tfbWFzdGVyX3Nlc3MpCiAgICAgICAgY2FsbGJhY2tfbWFzdGVyX251bSA9IGNhbGxiYWNrX21hc3Rlcl9zZXNzLT5sb2NhbF9wb3J0Owp9CiNlbHNlCiNkZWZpbmUgX2luaXRfYWdlbnRfY2FsbGJhY2tfdHJhbnNwb3J0KCkKI2VuZGlmCgovKioKICogSW5pdGlhbGl6ZSB0aGUgYWdlbnQuICBDYWxscyBpbnRvIGluaXRfYWdlbnRfcmVhZF9jb25maWcgdG8gc2V0IHRoYSBhcHAncwogKiBjb25maWd1cmF0aW9uIGZpbGUgaW4gdGhlIGFwcHJvcHJpYXRlIGRlZmF1bHQgc3RvcmFnZSBzcGFjZSwKICogIE5FVFNOTVBfRFNfTElCX0FQUFRZUEUuICBOZWVkIHRvIGNhbGwgaW5pdF9hZ2VudCBiZWZvcmUgY2FsbGluZyBpbml0X3NubXAuCiAqCiAqIEBwYXJhbSBhcHAgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZSB0byBiZSByZWFkIGluLCBnZXRzIHN0b3JlZCBpbiBkZWZhdWx0CiAqICAgICAgICBzdG9yYWdlCiAqCiAqIEByZXR1cm4gUmV0dXJucyBub24temVybyBvbiBmYWlsdXJlIGFuZCB6ZXJvIG9uIHN1Y2Nlc3MuCiAqCiAqIEBzZWUgaW5pdF9zbm1wCiAqLwppbnQKaW5pdF9hZ2VudChjb25zdCBjaGFyICphcHApCnsKICAgIGludCAgICAgICAgICAgICByID0gMDsKCiAgICBpZigrK2RvbmVfaW5pdF9hZ2VudCA+IDEpIHsKICAgICAgICBzbm1wX2xvZyhMT0dfV0FSTklORywgImlnbm9yaW5nIGV4dHJhIGNhbGwgdG8gaW5pdF9hZ2VudCAoJWQpXG4iLCAKICAgICAgICAgICAgICAgICBkb25lX2luaXRfYWdlbnQpOwogICAgICAgIHJldHVybiByOwogICAgfQoKICAgIC8qCiAgICAgKiBnZXQgY3VycmVudCB0aW1lIChpZSwgdGhlIHRpbWUgdGhlIGFnZW50IHN0YXJ0ZWQpIAogICAgICovCiAgICBuZXRzbm1wX3NldF9hZ2VudF9zdGFydHRpbWUoTlVMTCk7CgogICAgLyoKICAgICAqIHdlIGhhbmRsZSBhbGFybSBzaWduYWxzIG91cnNlbHZlcyBpbiB0aGUgc2VsZWN0IGxvb3AgCiAgICAgKi8KICAgIG5ldHNubXBfZHNfc2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCAKCQkJICAgTkVUU05NUF9EU19MSUJfQUxBUk1fRE9OVF9VU0VfU0lHLCAxKTsKCiNpZmRlZiBORVRTTk1QX0NBTl9VU0VfTkxJU1QKICAgIHIgPSBpbml0X2ttZW0oIi9kZXYva21lbSIpID8gMCA6IC1FQUNDRVM7CiNlbmRpZgoKICAgIHNldHVwX3RyZWUoKTsKCiAgICBpbml0X2FnZW50X3JlYWRfY29uZmlnKGFwcCk7CgojaWZkZWYgVEVTVElORwogICAgYXV0b19ubGlzdF9wcmludF90cmVlKC0yLCAwKTsKI2VuZGlmCgogICAgX2luaXRfYWdlbnRfY2FsbGJhY2tfdHJhbnNwb3J0KCk7CiAgICAKICAgIG5ldHNubXBfaW5pdF9oZWxwZXJzKCk7CiAgICBpbml0X3RyYXBzKCk7CiAgICBuZXRzbm1wX2NvbnRhaW5lcl9pbml0X2xpc3QoKTsKICAgIGluaXRfYWdlbnRfc3lzT1JUYWJsZSgpOwoKI2lmIGRlZmluZWQoVVNJTkdfQUdFTlRYX1NVQkFHRU5UX01PRFVMRSkgfHwgZGVmaW5lZChVU0lOR19BR0VOVFhfTUFTVEVSX01PRFVMRSkKICAgIC8qCiAgICAgKiBpbml0aWFsaXplIGFnZW50eCBjb25maWdzCiAgICAgKi8KICAgIGFnZW50eF9jb25maWdfaW5pdCgpOwojaWYgZGVmaW5lZChVU0lOR19BR0VOVFhfU1VCQUdFTlRfTU9EVUxFKQogICAgaWYobmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0FQUExJQ0FUSU9OX0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBORVRTTk1QX0RTX0FHRU5UX1JPTEUpID09IFNVQl9BR0VOVCkKICAgICAgICBzdWJhZ2VudF9pbml0KCk7CiNlbmRpZgojZW5kaWYKCiAgICAvKgogICAgICogUmVnaXN0ZXIgY29uZmlndXJhdGlvbiB0b2tlbnMgZnJvbSB0cmFuc3BvcnQgbW9kdWxlcy4gIAogICAgICovCiNpZmRlZiBORVRTTk1QX1RSQU5TUE9SVF9VRFBfRE9NQUlOCiAgICBuZXRzbm1wX3VkcF9hZ2VudF9jb25maWdfdG9rZW5zX3JlZ2lzdGVyKCk7CiNlbmRpZgojaWZkZWYgTkVUU05NUF9UUkFOU1BPUlRfVURQSVBWNl9ET01BSU4KICAgIG5ldHNubXBfdWRwNl9hZ2VudF9jb25maWdfdG9rZW5zX3JlZ2lzdGVyKCk7CiNlbmRpZgojaWZkZWYgTkVUU05NUF9UUkFOU1BPUlRfVU5JWF9ET01BSU4KICAgIG5ldHNubXBfdW5peF9hZ2VudF9jb25maWdfdG9rZW5zX3JlZ2lzdGVyKCk7CiNlbmRpZgoKI2lmZGVmIE5FVFNOTVBfRU1CRURERURfUEVSTAogICAgaW5pdF9wZXJsKCk7CiNlbmRpZgoKI2lmIGRlZmluZWQoTkVUU05NUF9VU0VfT1BFTlNTTCkgJiYgZGVmaW5lZChIQVZFX0xJQlNTTCkKICAgIC8qKiBpbml0IHNlY25hbWUgbWFwcGluZyAqLwogICAgbmV0c25tcF9jZXJ0c19hZ2VudF9pbml0KCk7CiNlbmRpZgoKI2lmZGVmIFVTSU5HX0FHRU5UWF9TVUJBR0VOVF9NT0RVTEUKICAgIC8qCiAgICAgKiBkb24ndCBpbml0IGFnZW50IG1vZHVsZXMgZm9yIGEgc3ViLWFnZW50CiAgICAgKi8KICAgIGlmIChuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfQVBQTElDQVRJT05fSUQsIAoJCQkgICAgICAgTkVUU05NUF9EU19BR0VOVF9ST0xFKSA9PSBTVUJfQUdFTlQpCiAgICAgICAgcmV0dXJuIHI7CiNlbmRpZgoKIyAgaW5jbHVkZSAiYWdlbnRfbW9kdWxlX2luaXRzLmgiCgogICAgcmV0dXJuIHI7Cn0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZW5kIGluaXRfYWdlbnQoKSAqLwoKb2lkICAgICAgICAgICAgIG51bGxPaWRbXSA9IHsgMCwgMCB9OwppbnQgICAgICAgICAgICAgbnVsbE9pZExlbiA9IHNpemVvZihudWxsT2lkKTsKCnZvaWQKc2h1dGRvd25fYWdlbnQodm9pZCkgewoKICAgIC8qIHByb2JhYmx5IHNvbWUgb2YgdGhpcyBjYW4gYmUgY2FsbGVkIGFzIHNodXRkb3duIGNhbGxiYWNrICovCiAgICBzaHV0ZG93bl90cmVlKCk7CiAgICBjbGVhcl9jb250ZXh0KCk7CiAgICBuZXRzbm1wX2NsZWFyX2NhbGxiYWNrX2xpc3QoKTsKICAgIG5ldHNubXBfY2xlYXJfdGRvbWFpbl9saXN0KCk7CiAgICBuZXRzbm1wX2NsZWFyX2hhbmRsZXJfbGlzdCgpOwogICAgc2h1dGRvd25fYWdlbnRfc3lzT1JUYWJsZSgpOwogICAgbmV0c25tcF9jb250YWluZXJfZnJlZV9saXN0KCk7CiAgICBjbGVhcl9zZWNfbW9kKCk7CiAgICBjbGVhcl9zbm1wX2VudW0oKTsKICAgIGNsZWFyX2NhbGxiYWNrKCk7CiAgICBzaHV0ZG93bl9zZWNtb2QoKTsKICAgIG5ldHNubXBfYWRkcmNhY2hlX2Rlc3Ryb3koKTsKI2lmZGVmIE5FVFNOTVBfQ0FOX1VTRV9OTElTVAogICAgZnJlZV9rbWVtKCk7CiNlbmRpZgoKICAgIGRvbmVfaW5pdF9hZ2VudCA9IDA7Cn0KCgp2b2lkCmFkZF90b19pbml0X2xpc3QoY2hhciAqbW9kdWxlX2xpc3QpCnsKICAgIHN0cnVjdCBtb2R1bGVfaW5pdF9saXN0ICpuZXdpdGVtLCAqKmxpc3Q7CiAgICBjaGFyICAgICAgICAgICAqY3A7CiAgICBjaGFyICAgICAgICAgICAqc3Q7CgogICAgaWYgKG1vZHVsZV9saXN0ID09IE5VTEwpIHsKICAgICAgICByZXR1cm47CiAgICB9IGVsc2UgewogICAgICAgIGNwID0gKGNoYXIgKikgbW9kdWxlX2xpc3Q7CiAgICB9CgogICAgaWYgKCpjcCA9PSAnLScgfHwgKmNwID09ICchJykgewogICAgICAgIGNwKys7CiAgICAgICAgbGlzdCA9ICZub2luaXRsaXN0OwogICAgfSBlbHNlIHsKICAgICAgICBsaXN0ID0gJmluaXRsaXN0OwogICAgfQoKICAgIGNwID0gc3RydG9rX3IoY3AsICIsIDoiLCAmc3QpOwogICAgd2hpbGUgKGNwKSB7CiAgICAgICAgbmV3aXRlbSA9IChzdHJ1Y3QgbW9kdWxlX2luaXRfbGlzdCAqKSBjYWxsb2MoMSwgc2l6ZW9mKCppbml0bGlzdCkpOwogICAgICAgIG5ld2l0ZW0tPm1vZHVsZV9uYW1lID0gc3RyZHVwKGNwKTsKICAgICAgICBuZXdpdGVtLT5uZXh0ID0gKmxpc3Q7CiAgICAgICAgKmxpc3QgPSBuZXdpdGVtOwogICAgICAgIGNwID0gc3RydG9rX3IoTlVMTCwgIiwgOiIsICZzdCk7CiAgICB9Cn0KCmludApzaG91bGRfaW5pdChjb25zdCBjaGFyICptb2R1bGVfbmFtZSkKewogICAgc3RydWN0IG1vZHVsZV9pbml0X2xpc3QgKmxpc3RwOwoKICAgIC8qCiAgICAgKiBhIGRlZmluaXRpdmUgbGlzdCB0YWtlcyBwcmlvcml0eSAKICAgICAqLwogICAgaWYgKGluaXRsaXN0KSB7CiAgICAgICAgbGlzdHAgPSBpbml0bGlzdDsKICAgICAgICB3aGlsZSAobGlzdHApIHsKICAgICAgICAgICAgaWYgKHN0cmNtcChsaXN0cC0+bW9kdWxlX25hbWUsIG1vZHVsZV9uYW1lKSA9PSAwKSB7CiAgICAgICAgICAgICAgICBERUJVR01TR1RMKCgibWliX2luaXQiLCAiaW5pdGlhbGl6aW5nOiAlc1xuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZV9uYW1lKSk7CiAgICAgICAgICAgICAgICByZXR1cm4gRE9fSU5JVElBTElaRTsKICAgICAgICAgICAgfQogICAgICAgICAgICBsaXN0cCA9IGxpc3RwLT5uZXh0OwogICAgICAgIH0KICAgICAgICBERUJVR01TR1RMKCgibWliX2luaXQiLCAic2tpcHBpbmc6ICAgICAlc1xuIiwgbW9kdWxlX25hbWUpKTsKICAgICAgICByZXR1cm4gRE9OVF9JTklUSUFMSVpFOwogICAgfQoKICAgIC8qCiAgICAgKiBpbml0aWFsaXplIGl0IG9ubHkgaWYgbm90IG9uIHRoZSBiYWQgbGlzdCAoYmFkIG1vZHVsZSwgbm8gYm9uZSkgCiAgICAgKi8KICAgIGlmIChub2luaXRsaXN0KSB7CiAgICAgICAgbGlzdHAgPSBub2luaXRsaXN0OwogICAgICAgIHdoaWxlIChsaXN0cCkgewogICAgICAgICAgICBpZiAoc3RyY21wKGxpc3RwLT5tb2R1bGVfbmFtZSwgbW9kdWxlX25hbWUpID09IDApIHsKICAgICAgICAgICAgICAgIERFQlVHTVNHVEwoKCJtaWJfaW5pdCIsICJza2lwcGluZzogICAgICVzXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlX25hbWUpKTsKICAgICAgICAgICAgICAgIHJldHVybiBET05UX0lOSVRJQUxJWkU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbGlzdHAgPSBsaXN0cC0+bmV4dDsKICAgICAgICB9CiAgICB9CiAgICBERUJVR01TR1RMKCgibWliX2luaXQiLCAiaW5pdGlhbGl6aW5nOiAlc1xuIiwgbW9kdWxlX25hbWUpKTsKCiAgICAvKgogICAgICogaW5pdGlhbGl6ZSBpdCAKICAgICAqLwogICAgcmV0dXJuIERPX0lOSVRJQUxJWkU7Cn0KLyoqICBAfSAqLwoK